文章目录
引言
Transformer同样也是seq2seq模型。在注意力机制诞生后,诞生了多种改进的模型,但是这些模型一般都是把注意力机制与循环神经网络结合(包括一些改良的,如LSTM),但是这些模型有个弊端:RNN由于其顺序结构训练速度常常受到限制,就是并行计算能力不强。既然Attention模型本身可以看到全局的信息, 那么一个自然的疑问是我们能不能去掉RNN结构,仅仅依赖于Attention模型呢,这样我们可以使训练并行化(encoder端并行计算),同时拥有全局信息?为解决这一些问题,论文提出了一种仅基于注意力机制的模型,具有强大的并行计算性以及效果很好。
一、Structure of Transformers
Transformer模型的模型结构为encoder-decoder,
如下图,N个Encoder block组成encoder,N个Decoder block组成decoder。基于注意力机制的构造与基于RNN的不同,基于RNN的是在时间步上串联(在每个time step只能输入一个token),而基于注意力机制的是类似于桶状结构(一起将数据输入到模型中去)。
那么,在Transformer中encoder中的信息如何传给decoder?
将encoder的最后一个Block分别传给decoder中的每一个block,然后decoder进行输出生成。
二、Encoder Structure
以输入为:Thinking Machines为例,Thinking与Machines最开始输入是维度为vocab的one-hot向量,经过embedding层,转换成embedding size大小的向量,输入到self-Attention层中,得到 z z z,经过Feed Forward层将得到 r r r。 r r r将作为下一个encoder Block的input。
其中,Self-attention将在后面详细分析,这里介绍FFN。每一层经过attention之后,还会有一个FFN,这个FFN的作用就是空间变换。FFN包含了2层linear transformation层,中间的激活函数是ReLu。FFN的加入引入了非线性(ReLu激活函数),变换了attention output的空间, 从而增加了模型的表现能力。把FFN去掉模型也是可以用的,但是效果差了很多。
三、Self-attention and multi-head self-attention
Word2vec的基本思想:句子中相近的词之间是有联系的,比如今天后面经常出现上午、下午和晚上。所以Word2vec的基本思想是用词来预测词,skip-gram使用中心词预测周围词,cbow使用周围词预测中心词。那么,一个词的embedding有没有可能关系到周围词外的部分?Self-attention就是自己与自己计算一个相关性(权重),利用自己(句子/文本)内部的表征得到一个更好的表征。
1.Self-attention
Self-Attention的基本结构如下:
MatMul对应 Q K T QK^T QKT,Scale对应 d k \sqrt{d_k} dk,Mask是因为每一个batch的数据经过padding后变得等长,在计算attention score时,不希望padding部分参与softmax计算,此时,需要Mask使得padding部分权重为0(padding部分的得分为 − i n f -inf −inf)。第二个MatMul对应权重与vector标的的计算。
下面展示Self-attention内部是如何计算的
Q Q Q:标的
K K K:和别人计算的标的
V V V:加权的vector标的
对于self-attention来讲, Q ( Q u e r y ) , K ( K e y ) , V ( V a l u e ) Q(Query), K(Key), V(Value) Q(Que