赞
踩
从transformer开始,nlp的模型渐渐开始成为了transformer一族的天下,所以想写一个系列聊一聊在nlp中那些运用transformer的模型。
作为这个系列的第一篇,就从大名鼎鼎的transformer结构开始。
最早提出transformer的文章是attention is all you need,研究的nlp的任务是翻译,自然而然就借鉴了seq2seq的翻译结构,有了编码器(encoder)和解码器(decoder)。
正如下面的图所展示的那样,一个完整的transformer结构是由六个解码器和六个解码器组成,其中六个编码器堆叠而成,最后一层的编码器会将输出输入到每个解码器中。
六个编码器的结构都是一样的,主要是由:
后面会一个个来介绍。
六个解码器的结构都是一样的,主要是由:
从上面的介绍可以直观看到,整个transformer模型中,大量出现了一个结构:多头自注意力机制(multi-head attention),为什么叫他“多头”呢,因为他是由很多相似结构的scaled dot-product attention 拼接起来的,直观的展开如下图。
首先,我们来介绍最基本的组成单元:scaled dot-product attention。这部分的输入会有三个:q (query),k (key),v (value)。
假设我们的任务是将 亚热带(中文) 翻译成 아열대 (韩文),scaled dot-product attention的计算流程如下:
将整个过程用公式表示的话,如下:
既然已经知道了scaled dot-product attention的结构,那么多头自注意力机制是如何由前者构成的呢?很简单,我们会有h个scaled dot-product attention结构,每个结构中的映射(project)矩阵(三个灰色的矩阵WVi,WKi,WQi)不共享,这样就可以得到h个最终的表示矩阵,将这些结果拼接起来,得到一个seq_length X h dv的矩阵,然后乘以矩阵Wo(维度是h dv X dmodel ),这样就可以得到一个多头自注意力输出矩阵,维度大小为:seq_length X dmodel。在attention is all you need中,h的设置是8,dmodel=512,dk=dv=dmodel/h=64。这样即可以学习到h个不同的映射矩阵,同时计算消耗也和只有一个单头的dk=dv=512的计算复杂度一致。
在transformer中会有三种多头自注意力机制的应用:
看完了transformer的关键结构多头自注意力的介绍,接下来,我们按照模型实际的层,一层层来看一下transformer这个encoder-decoder结构的情况。
Embedding的作用和在word2vec的模型中一致,但是比较有意思的是下图圈出来的三个部分:output embedding、input embedding以及pre-softmax linear transformation是共享参数的,也就是对于input & output而言,共享embedding意味着这是一个双语的词表(因为transformer使用的是翻译任务)。
我参考了一下其他博客的意见总结下来,共享参数的作用如下:
Embedding + postion encoding之后就输入到多头自注意力机制。
Decoder部分比较特别的地方是会有一个masked multi-head attention,我自己理解,这部分是在训练的时候模仿实际推断的场景而设计的结构。在实际的推断过程之中,一句话的推断会经过decoder好几轮,比如“亚热带”的翻译,会先有一个表示句首的字符(比如start)作为outputs输入到decoder,得到第一个翻译的对应字符,随后将start+对应字符输入到decoder,得到第二个翻译的对应字符,以此类推,一直到结束翻译。而在训练的过程中,为了模仿这种效果,在masked multi-head attention中,在自注意力的过程中会对要预测的词以及其左边的词做一个mask,以防信息的泄露,也就是说只能与前文的表征进行自注意力。
上面结构图中黄色的部分,表示的公式为LayerNorm(x + Sublayer(x))。这里需要关注两个点:
也就是上面结构图的蓝色的部分。
以上就是我对transformer结构的全部解读。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。