Transformer中的Attention
Transformer中的Attention
Introduction
读attention is all you need该论文有感。
这篇论文是谷歌17年在机器翻译任务中提出的一种新的序列转换模型”Transformer“。传统的序列转换模型是用RNN和CNN做的,为了使这些模型表现的更好,通常还加入了attention,也就是注意力机制。本文提出的transformer模型,完全摒弃了RNN和CNN的结构,而是只依赖于attention机制,并且这种模型反而能够表现的更好,并且减少了训练时间,那么transformer的工作原理是什么,从下面讲起。
Encoder-Decoder
transformer的整个模型是这样子的,很复杂,我们一步一步的分解来看。
首先将这个模型看成是一个黑箱操作,在机器翻译中,就是输入一种语言,输出另一种语言
类似于通信系统中,发送者将上下文信息,采用能在空气中传播的信号传给接收者,这个过程就是广义上的编码,然后接收者根据事先约定好的信息,将这些信号还原成发送者的信息。
机器翻译中,将一种语言,这里是英语,也就是x1…xn的输入序列,通过encoder编码器转换成中间序列z1…zn,然后再通过decoder解码器产生输出序列y1…yn,翻译成汉语。这就是encoder-decoder框架
六个encoder和六个decoder组合起来就形成了transformer的结构
所有的编码器和解码器在结构上都是相同的,但它们没有共享参数。每个编码器都可以分解成两个子层
从编码器中输入的句子首先会经过一个自注意力层(self attention),这层帮助编码器在对每个单词编码时关注输入句子的其他单词,然后再经过一层前馈神经网络层。解码器中也有类似编码器中自注意力层和前馈神经网络层,除此之外,还插入了第三个子层,对编码器的输出执行Encoder-Decoder Attention。self-attention到底是什么,接下来进行介绍。
Attention
从宏观看
attention正如它的翻译“注意力”,类似于人的注意力机制,我们在第一次见一个陌生人时,第一关注的肯定是他的脸,然后才是身体的其他部位。这个图形象化的表明了人在看到一份报纸时,更多的会把注意力文本的标题以及文章的首句等位置。
深度学习中的attention机制,和人的选择性视觉注意力机制是类似的。
在机器翻译中,如果不使用注意力机制,“I am a student”,这句话翻译成汉语时,每个英文单词对翻译过来的“学生”这个中文单词的影响因子,也可以简单的理解为对它的贡献(权重),是一样的。很明显这里不太合理,事实上应该是“student”这个单词,在翻译时,对“学生”的影响最大。这样就引入了attention机制,也就是为每个单词加入了一个weight(权重)机制,体现英文单词对于翻译当前中文单词的不同的影响程度。这是通俗的注意力的意思。
本论文中使用到的self-attention模型,不是在由英语翻译成中文中加入的权重,而是在同一个英语句子内单词间产生的联系。例如,在翻译The animal didn’t cross the street because it was too tired时,“it”在这个句子是指什么呢?它指的是street还是这个animal呢?这对于人类来说是一个简单的问题,但是对于算法则不是。模型在处理单词“it”的时候,自注意力机制会允许“it”与“animal”建立联系。随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。也就是在self-attention中,输出序列也就是输入序列
当我们在编码器5中编码“it”这个单词时,注意力机制的部分会去关注“The Animal”,将它的表示的一部分编入“it”的编码中。
从微观看
微观上看,如何计算自注意力:
第一步,得到查询向量(query)、键向量(key)、值向量(value)。
输入序列中的单词通过词嵌入算法得到的词向量X(维数为512),分别乘以三个权重矩阵,,得到query,key, value三个向量。其中query,key,value的维数相同,都为64。
第二步,query向量,key向量的点积,除以key向量的维数的开方,经过softmax得到权值。
第三步,对所有单词的表示(即value向量)进行加权求和,得到输出Z,Z也就是一个注意力头
注:1.在实际计算中,将每个单词的query向量,key向量,value向量,拼到一起变成查询矩阵Q、键矩阵K、值矩阵V。
2.除以和softmax的操作都是为了使梯度更稳定,防止梯度消失。论文中将这种自注意力机制定义为“Scaled Dot-Product Attention”,这里的Scaled就是指缩放因子。
如何理解这三个向量和他们的计算?
正如query,key,value这三个单词的原本的意思,attention机制就是将所有单词的表示(V)加权求和,权重就是该词的表示(K)与被编码词表示(Q)的点积并通过softmax得到的。例如在翻译“I am a student”这个句子时,翻译到"I"的时候,我们就需要查询 整个英语句子对“I” 这个单词哪个影响最大,于是将“I”这个词的查询向量,分别乘以整个句子的每一个单词的键向量,得到的权重,再乘以每一个单词的值,这就将该单词,与所有单词对它的影响联系了起来。
Multi Head Attention
上文中输出了一个Z,也就是一个注意力头,而该论文中使用的Multi Head Attention,是一种多头的注意力机制,该机制扩展了模型专注于不同位置的能力。
首先,给出了注意力层的多个“表示子空间”,“多头”注意机制,论文中是head = 8,我们有多个查询/键/值权重矩阵集(Transformer使用八个注意力头,因此我们对于每个编码器/解码器有八个矩阵集合)。这些集合中的每一个都是随机初始化的,在训练之后,每个集合都被用来将输入词嵌入(或来自较低编码器/解码器的向量)投影到不同的表示子空间中,得到8个不同的查询向量/键向量/值向量,经过加权求和得到的八个zi(这里用z0,z1,z2,…,z7表示),拼到一起,乘以一个额外的权重矩阵,得到最终的Z矩阵。
Transformer
该结构图就是开头我们提到的Transformer的整体结构
首先,在encoder的self-attention中,Q、K、V都来自同一个地方(相等),他们是上一层encoder的输出。对于第一层encoder,它们就是word embedding和positional encoding相加得到的输入。
在decoder的self-attention中,Q、K、V都来自于同一个地方(相等),它们是上一层decoder的输出。对于第一层decoder,它们就是word embedding和positional encoding相加得到的输入。但是对于decoder,我们不希望它能获得下一个time step(即将来的信息),因此我们需要进行sequence masking。
在encoder-decoder attention中,Q来自于decoder的上一层的输出,K和V来自于encoder的输出,K和V是一样的。