Attention is all you need阅读笔记

Attention is all you need阅读笔记

    • (一) Title
    • (二) Summary
    • (三) Research Object
    • (四) Problem Statement
    • (五) Method
      • 5.1 Transformer的架构
      • 5.2 注意力机制
      • 5.3 Multi-Head Attention
      • 5.4 Position-wise Feed-Forward Networks
    • (六) Experiements
    • (七) Conclusion
    • (八) Notes
      • 8.1 注意力机制的作用
      • 8.2 从循环神将网络到Attention背景溯源
      • 8.3 从宏观角度观察理解Transfomer
      • 8.4 一个sentence是怎么进行注意力的?
    • (九) Sentences

(一) Title

Attention is all you need阅读笔记_第1张图片
前言:我又来看老论文了,Transformer去年就在图像领域很火了,当时没有怎么了解这方面的内容,想着有时间的话,看看这方面的内容,要跟得上发展的步伐才行啊!首先先整理下Transformer原始论文中的内容(课上讲过),但是遗忘太多了。打算重新整理下再!不过这边笔记确实写的不好,等熟悉之后再重新修改修改!

(二) Summary

dominant sequence transduction models(显性序列显性转导模型)往往基于复杂的循环神经网络,或者卷积神经网络。并且包含着一个编码器和一个解码器。而注意力机制在编码器和解码器之间的引入能够提升模型的性能
本文中提出了完全基于注意力机制的Transformer,Transformer的优势:

  • 从而完全避免了循环和卷积网络。
  • 并行度更高
  • 训练时间更短

实验结果上的表现:

  • 在WMT 2014 English-to-German translation task上,提升了2BLEU
  • 在WMT 2014 English-to-French translation task上,训练时间缩短了,并且SOTA
  • 同时Transformer具有任务的可推广性

(三) Research Object

希望解决掉循环网络中由于隐状态导致的顺序问题,通过一种self-attention的方式以及非循环或者卷积的方式来实现。

(四) Problem Statement

循环神经网络中存在着一个问题: 隐状态 h t h_t ht是前一个时刻的状态 h t − 1 h_{t-1} ht1以及当前的时刻 t t t的一个函数,这种固有的顺序性使得并行性很难实现,而最近的工作是通过因子分解:factorization tricks以及条件计算:conditional computation.
另一个就是注意力机制成为循环网络的必备项,self-attention机制广泛应用于各种任务中

(五) Method

5.1 Transformer的架构

大多数的序列转导模型都具有编码-解码的结构。通过编码器将输入序列 ( x 1 , . . . , x n ) (x_1,...,x_n) (x1,...,xn)转换成连续表示 z = ( z 1 , z 2 , . . . , z n ) \mathbf{z} = (z_1,z_2,...,z_n) z=(z1,z2,...,zn)。然后给定 z \mathbf{z} z,解码器会生成一个输出序列 ( y 1 , . . . , y m ) (y_1,...,y_m) (y1,...,ym)
Transformer对于编码器和解码器来说,整体框架使用stacked self-attention and point-wise以及全连接层。
Attention is all you need阅读笔记_第2张图片

这里encoder是由 N = 6 N= 6 N=6个相同的层组成,每一个层都是由两个子层构成的,第一子层为: Multi-head self-attention mechanism。第二个子层是一个simple,position-wise fully connected feed-forward network。并且两个子层都采取了一种残差连接的方式,然后后面再跟着一个layer normalization。也就是每一个子层的输出都是:
O u t p u t = L a y e r N o r m ( x + S u b l a y e r ( x ) ) Output = LayerNorm(x+Sublayer(x)) Output=LayerNorm(x+Sublayer(x))
其中这个 S u b l a y e r ( x ) Sublayer(x) Sublayer(x)是子层以自己的功能实现的函数。这个地方为了能够使用残差连接,就要求 x x x S u b l a y e r ( x ) Sublayer(x) Sublayer(x)的维度是一样的。并且这个维度是512

解码器decoder也是由 N = 6 N=6 N=6个相同的层组成。在解码器中除了包含编码器中的两个子层之外,解码器还多插入了第三个子层,这第三个子层的作用是在encoder stack输出上进行multi-head attention。同时每一个子层都使用了residual connections,然后再进行Layer Normalization。同时还修改了decoder stack中的self-attention sub-layer 来prevent positions from attending to subsequent positions。这里的mask保证了计算的时候能够只依赖已知输出。

5.2 注意力机制

Attention is all you need阅读笔记_第3张图片

从上图中我们可以看出,输入为 Q , K , V Q,K,V Q,K,V分别对应着query查询,以及键值对。通过操作得到输出,这个输出实质上是对values的一个加权和,这个权重值的计算是由query以及对应的key的compatibility function函数计算得到.
这里需要对这些矩阵, Q ∈ R M × d , K ∈ R N × d , V Q \in R^{M \times d},K \in R^{N \times d},V QRM×d,KRN×d,V进行详细说明, Q Q Q可以看成是 M M M个维度为d的向量(也就是一个长度为M的sequence的向量表示)拼接而成,key可以看成是 N N N个维度为d的向量(长度为N的序列的向量表示),这样的话,计算 Q K T QK^T QKT的一个过程就是相当于是利用嵌入向量进行内积,然后得到实际上是每个word之间的一个相关程度。
attention的计算方式可以有加性attention以及点乘attention,以下的注意力指的是点乘attention,只不过这里多了一个缩放因子 1 d k \frac{1}{\sqrt{d_k}} dk 1,这里对于加性attention做一点补充,论文中提到加性注意力是通过带有一个隐层的feed-forward network计算compatibility function实现的,理论上和点乘attention相同,不过点乘attention更快,而且效率更高,更加方便使用矩阵运算。
在这里插入图片描述Attention is all you need阅读笔记_第4张图片
疑问是

  • 这里为什么有缩放因子 1 d k \frac{1}{\sqrt{d_{k}}} dk 1
    首先假设 Q , K Q,K Q,K中元素均值为0,方差为1.由上面的信息我们可以知道 A t t ( i , j ) = Q ( i ) K ( j ) T Att(i,j) = Q(i)K(j)^T Att(i,j)=Q(i)K(j)T,我们假设 Q ( i ) , K ( i ) Q(i),K(i) Q(i),K(i)中每一个元素都是相互独立的随机变量, Q ( i ) Q(i) Q(i)中的每一个元素和 K ( i ) K(i) K(i)中的每一个元素都是相互独立的,记作 Q ( i ) = [ X 1 , X 2 , . . . , X d ] , K ( j ) = [ Y 1 , Y 2 , . . . , Y d ] Q(i) = [X_1,X_2,...,X_d],K(j) = [Y_1,Y_2,...,Y_d] Q(i)=[X1,X2,...,Xd],K(j)=[Y1,Y2,...,Yd],那么 A t t ( i , j ) Q ( i ) K ( j ) T = X 1 Y 1 + X 2 Y 2 + . . . + X d Y d Att(i,j) Q(i)K(j)^T=X_1Y_1+X_2Y_2+...+X_dY_d Att(i,j)Q(i)K(j)T=X1Y1+X2Y2+...+XdYd.接着求均值
    E [ A t t ( i , j ) ] = E [ X 1 Y 1 + X 2 Y 2 + . . . + X d Y d ] = E [ X 1 ] E [ Y 1 ] + E [ X 2 ] E [ Y 2 ] + . . . + E [ X d ] E [ Y d ] = 0 \begin{aligned} E[Att(i,j)] &= E[X_1Y_1+X_2Y_2+...+X_dY_d] \\ &=E[X_1]E[Y_1]+E[X_2]E[Y_2]+...+E[X_d]E[Y_d] \\ &=0 \end{aligned} E[Att(i,j)]=E[X1Y1+X2Y2+...+XdYd]=E[X1]E[Y1]+E[X2]E[Y2]+...+E[Xd]E[Yd]=0
    然后求方差: V a r [ A t t ( i , j ) ] = E [ ( X 1 Y 1 + X 2 Y 2 + . . . + X d Y d ) 2 ] Var[Att(i,j)] = E[(X_1Y_1+X_2Y_2+...+X_dY_d)^2] Var[Att(i,j)]=E[(X1Y1+X2Y2+...+XdYd)2],当且仅当 E [ X 1 2 Y 1 2 ] E[X_1^2Y_1^2] E[X12Y12]形式时值不为0,对于 E [ X 1 Y 1 2 ] , E [ X 1 2 Y 1 ] , E [ X 1 Y 1 ] , E[X_1Y_1^2],E[X_1^2Y_1],E[X_1Y_1], E[X1Y12],E[X12Y1],E[X1Y1],值均为0,故
    V a r [ A t t ( i , j ) ] = E [ ( X 1 Y 1 + X 2 Y 2 + . . . + X d Y d ) 2 ] = E [ X 1 2 Y 1 2 ] + E [ X 2 2 Y 2 2 ] + . . . + E [ X d 2 Y d 2 ] = d \begin{aligned} Var[Att(i,j)] &= E[(X_1Y_1+X_2Y_2+...+X_dY_d)^2] \\ &=E[X_1^2Y_1^2]+E[X_2^2Y_2^2]+...+E[X_d^2Y_d^2]\\ &=d \end{aligned} Var[Att(i,j)]=E[(X1Y1+X2Y2+...+XdYd)2]=E[X12Y12]+E[X22Y22]+...+E[Xd2Yd2]=d
    因此假设不带着 1 d k = 1 d \frac{1}{\sqrt{d_{k}}} = \frac{1}{\sqrt{d}} dk 1=d 1时,得到的注意力系数将服从均值为0,方差为d分布,为了消除掉维度对注意力系数分布的影响,在每一项前面增加这个系数能够保证计算得到的注意力系数服从均值为0,方差为1的分布。
    这里又会引入一个新的问题:方差较大会对注意力系数造成什么影响呢?
    知乎的一篇文章中提到如果注意力系数的方差很大,那么 S o f t m a x ( A ) Softmax(A) Softmax(A)的分布会趋于陡峭,这里我对分布越陡峭持很大的怀疑态度,我们知道方差反应的是距离其均值的远近程度,方差越大,说明离其均值越远,我们知道概率密度函数在整个变量空间上的积分为1,那么,方差越大的很明显,分布应该是越不集中。就像高斯分布那样,方差越大,陡峭程度越小。这里知乎博主还提到这个缩放因子的目的在于使得 s o f t m a x ( A ) softmax(A) softmax(A)的分布“陡峭”程度与d解耦,从而使得训练过程中梯度值保持稳定的。论文中给出的解释是方差较大,得到 A t t ( i , j ) Att(i,j) Att(i,j)的值分布越大对应再取softmax之后,会使得当前的梯度值较小,不利于参数更新。
    如果对于整个Attention计算的过程还是不太清楚的话,可以参考8.4小节的内容

Attention的作用到底是什么呢?以及对应的query,key和value有怎么理解呢?

  • query对应的是需要被表达的序列(称为序列A),key和value对应的是用来表达A的序列(称为序列B)。其中key和query是在同一高维空间中的(否则无法用来计算相似程度),value不必在同一高维空间中,最终生成的output和value在同一高维空间中。
    从向量角度来看,对于一个词向量,使用query查询其和其他词向量之间的一个关系远近,然后根据关系远近选择值向量进行组合。
    这里其实Encoder部分中只存在self-attention,而Decoder部分中存在self-attention和cross-attention
    Attention is all you need阅读笔记_第5张图片
    【self-attention】encoder中的self-attention的query, key, value都对应了源端序列(即A和B是同一序列),decoder中的self-attention的query, key, value都对应了目标端序列。
    【cross-attention】decoder中的cross-attention的query对应了目标端序列,key, value对应了源端序列(每一层中的cross-attention用的都是encoder的最终输出)
    因此,这里就有一个问题了,编码器经过自注意力得到的output是怎么变成key和value的呢?还有就是这个目标端序列指的是什么?(比如机器翻译中目标端序列指的是翻译过去的语言嘛?)

decoder解码器部分的带mask的自注意力

5.3 Multi-Head Attention

这里作者在论文中指出,上面的self-attention不仅可以进行一次,通过并行着进行h次self-attention。对应着可以得到h个输出,然后将这h个输出concatenate起来,然后再经过一个权重矩阵进行投影得到最终的输出。
Multi-Head Attention的计算过程:
MultiHead ⁡ ( Q , K , V ) =  Concat  (  head  1 , … ,  head  h ) W O  where head  i =  Attention  ( Q W i Q , K W i K , V W i V ) \begin{aligned} \operatorname{MultiHead}(Q, K, V) &=\text { Concat }\left(\text { head }_{1}, \ldots, \text { head }_{\mathrm{h}}\right) W^{O} \\ \text { where head }_{\mathrm{i}} &=\text { Attention }\left(Q W_{i}^{Q}, K W_{i}^{K}, V W_{i}^{V}\right) \end{aligned} MultiHead(Q,K,V) where head i= Concat ( head 1,, head h)WO= Attention (QWiQ,KWiK,VWiV)
在上式中, W i Q ∈ R d moodel  × d k , W i K ∈ R d model  × d k , W i V ∈ R d model  × d v , W O ∈ R h d v × d model  W_{i}^{Q} \in \mathbb{R}^{d_{\text {moodel }} \times d_{k}}, W_{i}^{K} \in \mathbb{R}^{d_{\text {model }} \times d_{k}}, W_{i}^{V} \in \mathbb{R}^{d_{\text {model }} \times d_{v}},W^{O} \in \mathbb{R}^{h d_{v} \times d_{\text {model }}} WiQRdmoodel ×dk,WiKRdmodel ×dk,WiVRdmodel ×dv,WORhdv×dmodel ,并且在实验中 h = 8 , d k = d v = d m o d e l / h = 64 h=8,d_k=d_v=d_{model}/h = 64 h=8,dk=dv=dmodel/h=64关于Multi-Head的补充说明是,Multi-Head可以有不同的Q,K,V表示,最后再将其结构结合起来,不同的Q,K,V实际上代表了不同子空间的表示,利用multi-head attention将不同子空间以及不同位置的信息整合到一起,如下图所示:
Attention is all you need阅读笔记_第6张图片
Attention is all you need阅读笔记_第7张图片

从编码器和解码器的框架中,我们可以注意到,multi-head attention实际上是在3个不同的位置使用的:

  • 第一个multi-head部分(解码器的第二个子层),query来自解码器。key和value来自编码器,这里query来自解码器,解码器部分对应的输入应该是输出(机器翻译任务中的目标语言),接着需要找到的是输出部分和输入部分之间的相关关系。
    因此,这里query来自输出,查询其和输入之间的关系。构建的是输入和输出之间的注意力
  • 编码器部分的self-attention层,这个地方所有的key,query以及value都来自同一个地方(也就是前一级编码器的输出)
  • 解码器部分中的self-attention使用mask来去掉illegal connections,其实对于这里并不理解

这里有几个问题

  • Multi-Head Attention中计算每一个head使用的 Q , K , V Q,K,V Q,K,V是怎么通过输入的Embedding得到的呢?
  • 还有就是输入到decoder的 K , V K,V K,V是怎么得到的呢?
  • 在论文中提到,由于降低了每一个head的维度,总的计算消耗和使用full dimensionality的single-head attention是很相近的(之前好像有文章提到过Multi-head对输入进行分组来着),但是这个地方确实不是很清楚

5.4 Position-wise Feed-Forward Networks

在编码子层和解码子层中还有一个全连接feed-forward网络,主要是由两个线性变换以及中间加了一个ReLU激活函数
FFN ⁡ ( x ) = max ⁡ ( 0 , x W 1 + b 1 ) W 2 + b 2 \operatorname{FFN}(x)=\max \left(0, x W_{1}+b_{1}\right) W_{2}+b_{2} FFN(x)=max(0,xW1+b1)W2+b2
在Decoder最后需要接一个Linear还有softmax层得到预测的概率。
关于输入部分的Positional Encoding

由于在模型中没有recurrence和卷积,为了使模型能够充分利用序列的顺序,必须要在序列中插入相对或者绝对的位置信息。因此,在Encoder和Decoder部分的Embedding之后增加了positional encoding(位置编码)。这个位置编码和Embedding具有相同的维度,并且位置编码有不同的选择:可学习的或者固定的
这里作者使用的是不同频率的正弦和余弦函数:
P E ( p o s , 2 i ) = sin ⁡ ( p o s / 1000 0 2 i / d model  ) P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s / 1000 0 2 i / d model  ) \begin{aligned} P E_{(p o s, 2 i)} &=\sin \left(p o s / 10000^{2 i / d_{\text {model }}}\right) \\ P E_{(p o s, 2 i+1)} &=\cos \left(p o s / 10000^{2 i / d_{\text {model }}}\right) \end{aligned} PE(pos,2i)PE(pos,2i+1)=sin(pos/100002i/dmodel )=cos(pos/100002i/dmodel )
其中, p o s pos pos是位置, i i i表示维度。也就是说每一个维度对应着一个正弦波,波长范围从 2 π 2\pi 2π 10000 π 10000\pi 10000π.对于任何的偏移 k k k, P E p o s + k PE_{pos+k} PEpos+k能够表示成 P E p o s PE_{pos} PEpos的线性函数

(六) Experiements

这部分内容偷懒没有整理了

(七) Conclusion

在这项工作中,我们提出了Transformer,第一个完全基于注意力的序列转换模型,用multi-head attention取代了编码器-解码器架构中最常用的递归层。Transformer的扩展性太强了,在文章中也指出了可以将transform扩展到大型输入输出上来,包括图像,音频和视频
由于对序列模型的了解确实比较少,这篇文章读下来七七八八的,好多地方不是很理解,等到再看到后面论文还有代码,再过来回顾回顾

(八) Notes

8.1 注意力机制的作用

  • 利用注意力机制来连接编码器和解码器能够提升模型的表现性能

8.2 从循环神将网络到Attention背景溯源

Simple RNN

Attention is all you need阅读笔记_第8张图片整个模型都是由编码器encoder和解码器decoder组成,这里encoder是将整个源端序列(所有的输入序列)压缩成一个向量(encoder output)。而这个encoder output将作为decoder的initial states。也就是利用encoder output再经过解码器网络,得到对应的输出
这种方式存在的问题是:

  • 随着编码长度的增加,最终得到的encoder output会丢失掉之前很多的输入信息。
  • 随着decoder序列的增加,encoder output信息也会在解码过程中不断丢失。

为了解决decoder序列丢失输入信息的问题,有了Contextualized RNN

Attention is all you need阅读笔记_第9张图片
这里在decoder端每一个时间步都引入了context,这里的context实际上是对整个输入句子的一个encode,也就是encoded source sentence。这样就在decoder的每一个时间步结合了context信息。
但是这里依旧存在一个问题
每一个时间步对应的输入信息都是一样的,这个在机器翻译中其实是不合理的,因为输出是仅仅和某一些输入对应的。换句话说就是context对于每个timestep都是静态的,

因此,又有了注意力的方式:Contextualized RNN with soft align (Attention)

Attention is all you need阅读笔记_第10张图片
在每个timestep输入到decoder RNN结构中之前,会用当前的输入token的vector与encoder output中的每一个position的vector作一个"attention"操作这里不再引入固定的context,而是一种采取点乘的方式来得到context。这种方式在理论上能否说明可行性或者合理性呢? 还是说这个只是实验证实了他很好。

8.3 从宏观角度观察理解Transfomer

首先可以将Transformer看成是一个黑箱。在机器翻译中,就是输入一种语言,输出另一种语言.
Attention is all you need阅读笔记_第11张图片
而拆开Transformer这个黑箱,可以看成
Attention is all you need阅读笔记_第12张图片
编码组件部分由一堆编码器(encoder)构成(论文中是将6个编码器叠在一起——数字6没有什么神奇之处,你也可以尝试其他数字)。解码组件部分也是由相同数量(与编码器对应)的解码器(decoder)组成的。也就是如下图所示
Attention is all you need阅读笔记_第13张图片
接下来看编码器和解码器的具体组成为:
Attention is all you need阅读笔记_第14张图片
从编码器输入的句子首先会经过一个自注意力(self-attention)层,这层帮助编码器在对每个单词编码时关注输入句子的其他单词。(这里我觉得应该是句子中每一个单词相关性吧)
自注意力层的输出会传递到前馈(feed-forward)神经网络中。每个位置的单词对应的前馈神经网络都完全一样(译注:另一种解读就是一层窗口为一个单词的一维卷积神经网络)。

解码器中也有编码器的自注意力(self-attention)层和前馈(feed-forward)层。除此之外,这两个层之间还有一个注意力层,用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似)。

8.4 一个sentence是怎么进行注意力的?

我们首先将每个输入单词通过词嵌入算法转换为词向量。在这里插入图片描述
对每一个单词使用词嵌入的方式变换到特定的维度(dim = 512)上,我们知道在编码器阶段引入了residual connection,因此,输入和输出dim是相同的
Attention is all you need阅读笔记_第15张图片输入到最底层编码器中的是word的词嵌入向量。不过所有的编码器都有一个相同的特点,即它们接收一个向量列表,列表中的每个向量大小为512维。在底层(最开始)编码器中它就是词向量,但是在其他编码器中,它就是前一层编码器的输出(也是一个向量列表)。向量列表大小是我们可以设置的超参数——一般是我们训练集中最长句子的长度。在一个编码器中向量会经过两个子层,我们之分析词嵌入向量输入到第一个子层(自注意力层)的过程:
Attention is all you need阅读笔记_第16张图片
首先需要从每个单词的词向量中生成三个向量,也就是对于每一个单词,生成一个查询向量,键向量,以及值向量,注意这里还不是矩阵。这里是怎么生成3个向量的呢?是通过词嵌入与三个权重矩阵后相乘创建的。这些新向量在维度上比词嵌入向量更低。他们的维度是64,而词嵌入和编码器的输入/输出向量的维度是512. 但实际上不强求维度更小,这只是一种基于架构上的选择,这里对于不同的词向量使用的是相同的权重矩阵
q 1 / 2 = X 1 W Q , k 1 / 2 = X 1 W K , v 1 / 2 = X 1 W V q_{1/2} = X_1W^Q,k_{1/2} = X_1W^K,v_{1/2} = X_1W^V q1/2=X1WQ,k1/2=X1WK,v1/2=X1WV
将所有的 q i q_i qi组合起来得到 Q Q Q,同理将所有的 k i , v i k_i,v_i ki,vi组合起来得到 K , V K,V K,V矩阵。
现在我们具体分析自注意力到底在干什么?假设只有 q 1 , q 2 , k 1 , k 2 , v 1 , v 2 q_1,q_2,k_1,k_2,v_1,v_2 q1,q2,k1,k2,v1,v2,并且他们的维度为64.如下图所示
Attention is all you need阅读笔记_第17张图片
这些分数是通过打分单词(所有输入句子的单词)的键向量与“Thinking”的查询向量相点积来计算的。所以如果我们是处理位置最靠前的词的自注意力的话,第一个分数是q1和k1的点积,第二个分数是q1和k2的点积。
接着除以缩放因子进行归一化再做softmax如下表表示,我觉得这里表示的应该是当前词嵌入与其他词嵌入的相关性:
Attention is all you need阅读笔记_第18张图片
这个softmax分数决定了每个单词对编码当下位置(“Thinking”)的贡献。显然,已经在这个位置上的单词将获得最高的softmax分数,但有时关注另一个与当前单词相关的单词也会有帮助。基于这个softmax再对值向量进行加权,也就是希望关注语义上相关的单词,并弱化不相关的单词。如下图所示:
Attention is all you need阅读笔记_第19张图片
从上图中计算 0.88 × v 1 + 0.12 × v 2 = z 1 0.88 \times v_1+0.12 \times v_2 = z_1 0.88×v1+0.12×v2=z1也就是对应于第一个词向量的thinking(也就是第一个词向量的经过自注意力的最终输出),同理可以得到第二个词向量的thinking。
从整体矩阵操作上来看就是
Attention is all you need阅读笔记_第20张图片
接着就是传给前馈神经网络。

(九) Sentences

  • 在许多序列转导任务中,学习长程相关性是一个关键的挑战。影响学习这种依赖性的能力的一个关键因素是网络中前向和后向信号必须经过的路径长度。输入和输出序列中任何位置组合之间的路径越短,就越容易学习长程相关性。

参考文章:
[1] https://zhuanlan.zhihu.com/p/104393915
[2] https://blog.csdn.net/longxinchen_ml/article/details/86533005
[3] https://blog.csdn.net/black_shuang/article/details/95384597详细介绍了整个transformer的流程。

你可能感兴趣的:(深度学习,Transformer,论文简要笔记)