Attention is all you need


title: “Attention is all you need” collection: publications permalink: https://arxiv.org/abs/1706.03762 time:20170112 citation:Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., Kaiser, L., & Polosukhin, I. (2017). Attention Is All You Need. arXiv preprint arXiv:1706.03762, 1-12. excerpt: ‘…’

Attention is all you need

[摘要]

  1. 主流的序列转录模型主要依赖于基于复杂的RNN或CNN的encoder-decoder中,在encoder和decoder之间用一个注意力机制连接。
  2. 提供一个简单的Transformer架构。
  3. 机器翻译上更快,更优质。

[结论]

  1. 展现了第一个完全依靠于注意力的序列转导模型Transformer,使用多头自注意力取代了循环层在encoder-decoder架构的地位
  2. 对于翻译工作,相较于RNN或者CNN,Transformer可以更快的被训练。
  3. 以后可以用到文本以外的方向,甚至可以扩展到让生成不那么时序化。
  4. 源码

导言

​ 以LSTM和GRN为代表的RNN是序列模型和转导问题领域的主流方法。他们主要是沿着输入和输出序列的时间步进行计算来生成隐藏状态${h_t}$,并且满足$h_t= f(h_{t-1},input_t)$。这样的方式不允许模型并行计算,尤其是由于内存容量的限制1,$\frac{batch}{h_t}$的大小也受限制。现在有一些文章研究fractorization tricks和conditional computation,z这两种方法显著提高计算效率。但是顺序计算的基本约束仍然不能被突破

​ 这篇论文提出一种避免循环计算的模型架构,Transformer 架构,完全依赖于注意力机制描绘输入输出的依赖关系。

相关工作

​ 一些工作如ByteNet、NeuralGPU等,提出使用CNN替代RNN来减少时序计算的计算量。但是CNN比较难以对长的序列进行建模2。但是Transformer的注意力机制可以解决这个问题。不得不承认CNN可以做多输出通道,每个通道用以识别不同的信息,因此Transformer中的Multi-Head Attention 可以让Transformer模拟CNN有多输出通道的效果。

​ Self-Attention 能够将一个序列中不同位置的信息关联起来,以便计算整个序列的代表,在文本理解等方面有较好的效果。

​ End-to-end Memory 基于循环注意力机制,已经在简单文本问答等方面有较好的效果。

​ Transformer是第一个只依赖于注意力机制的模型架构。

模型结构

​ 效果比较好的神经序列转导模型都是基于encoder-decoder架构来施展的。encoder将输入序列$(x_1,x_2,…,x_n)$映射到序列$Z=(z_1,…,z_n)$上。decoder基于序列$Z$,自回归地3,一次生成$(y_1,…,y_m)$序列中的一个。

​ Transformer 全局使用栈式的self-Attention 和point-wise,用全连接层连接encoder和decoder。

image-20240404135317698

Encoder 和Decoder

Encoder:$N$,$d_{model}$ 两个超参数

  • $N=6$个相同的层叠加而成。每个层有两个子层:Multi-Head Self-Attention层和 位置全连接前馈神经网络(本质就是一个MLP…… :()。
  • 每一个子层都使用了残差 和 nomalization4。因此每一个子层的输出都是 $LayerNorm(x+sublayer(x))$.
  • 简单起见(如,残差需要输入输出一样大小不一样的话需要做投影),每一个层的输出的维度$d_{model}$都是512。

Decoder:$N$.

  • $N=6$个相同的层叠加而成。每一个层有三个子层:Multi-Head Self-Attention层和 位置全连接前馈神经网络(本质就是一个MLP)、Masked Multi-Head Self-Attention(指基于encoder的输出进行多头自注意力)
  • 与encoder相似,每一个子层都有残差链接LayerNormalization.
  • Masked Multi-Head Self-Attention:修改了自注意力子层,目的是防止当前位置关注后续位置。

图中黄色的表示layerNorm,蓝色的表示BatchNorm。image-20240404165337195

为啥LayerNorm用的多?时序序列模型当中,样本的长度可能会发生变化。如果是BatchNorm,算均值是对有效值算的,如果样本长度变化比较大,小批量算的均值和方差的抖动比较大。而且需要记录全局样本的均值和方差。;如果是LayerNorm,对于每一个样本作均值和方差,相对来说,不管是样本长还是短,这个均值和方差比较稳定,

Attention

非常标准的,注意力函数被描述为query、(key,value)的形式,通过计算query 和key的相似度得到。

Scaled Dot-Product Attention

image-20240404142458680

$Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V$

  • 输入是$Q,K,V$.他们的维度分别为$d_k,d_k,d_v$.
  • 运算过程:
    • $Q$和所有的$K$点乘,再除以$\sqrt{d_k}$,通过softmax得到注意力权重
    • 计算$V$的以注意力权重为权重的加权平均。

和其他工作的区别:

两种常见的注意力函数是Additive attentionDot-product Attention.说实话,dot-product的思路和上面给的scaled dot-product的思路是一样的,除了scaled dot-product 多增加了一个$\frac{1}{\sqrt{d_k}}$。这样做的目的是,对于较大的$d_k$,dot-product的值可能会变大,这样子在softmax当中会被推入到梯度较小的区域,因此$\frac{1}{\sqrt{d_k}}$的目的就是为了消除这个效果。而additive attention使用一个单隐藏层的feed-forward网络计算。二者的复杂程度差不多,但是实践过程中dot-product更快一点(因为哦我们可以对矩阵乘法优化)。d_k 比较小的时候,两者的表现都差不多,但是d_k大的时候,additive 比dot-product表的好,推测是对于较大的$d_k$,dot-product的值可能会变大的原因。

模型的解释:

​ 模型图片中出现了Mask(opt)。其作用是在scale之后的结果如果比V长,我们需要屏蔽一部分值。在t时刻,$Q_t = [k_1,..,k_{t-1},…,k_n]$,我们期望t时刻的Q与t时刻之后的值无关,因此我们需要将t时刻之后的k屏蔽掉。一般做法是将其设置为非常小的数如1e-10,如此一来,经过softmax就会变成0.这样一来,计算output的时候,只是用了$V=[v_1,…,V_{t-1}]$.

Multi-Head Attention

image-20240404142506950

$\begin{align} Multihead(Q,K,V)=Concat(head_1,head_2,…,head_n)W^{O}\end{align}$

$\begin{align} where \space head_i =Attention(QW_i^Q,KW_i^K,VW_i^V) \end{align}$

  • 输入是$Q,K,V$.他们的维度分别为$d_k,d_k,d_v$.
  • 运算过程:
    • 对于$Q,K,V$,做一次线性层投影,投影到比较低的维度
    • 做h次的Scaled Dot-product Attention的计算
    • h个输出向量合并
    • 线性投影

作者发现,把整个的query、key、value投影到低维h次,再做h次的注意力函数,每个函数的结果并在一起,得到最终的输出 这样的方法比单头注意力函数好。好在哪?我们可以发现dot-product attention中没有可以学习的参数,为了继续使用dot-product attention,在这里可以先让$V,K,Q$投影到低维度(投影的w可以学习),h次的投影提供h次可以学习的机会,希望模型能够在投影之后的度量空间里面匹配不同的模式

作者将$h=8$,并且$d_k = d_v = d_{model}/h = 64$.这样子设置的目的是每个头都降维度了,总共的多头注意力机制的计算花销仍然是一个没有降维度的单头注意力机制的花销。

模型怎么使用的Attention

image-20240404135317698

encoder——Multi-Head Attention

自注意力机制:输入进去的$K,V,Q$是相等的。

假设句子的长度是n,经过嵌入层,输入的形状就是$n\times d$。Attention的输出和输入的V是一个形状的,每一个query会拿到一个输出,那么就会有n个输出。每个输出的形状都是d。因此总共输出的形状就是$n \times d$.输出本质上是V的加权和。由于这里是一个多头的Attention,会有h次的学习投影,会学习出h个不同的距离空间。

decoder:

  • Masked Multi-Head Attention

    自注意力机制:输入进去的$K,V,Q$是相等的。与encoder中几乎相同

    Masked 的目的是屏蔽掉与当前query无关的key、value

    输出是m个长为d的向量

  • Multi-Head Attention

    不再是自注意力。$K,V$来自编码器的输出(是n个长为d的向量)。$Q$来自decoder前一层的输出

    当前层的输出是编码器输出的V的加权和

Feed-Forward

事实上这个FF层就是一个全连接层MLP,被使用来对输入序列中一个词(position)作用一次.因为已经经过一次Attention,已经抓取到了我们当前词所感兴趣的信息了,所以在这里我们只需要MLP对每一个独立的点做运算就可以了

$FFN(x) = ReLU(xW_1 + b_1)W_2 + b_2$

  • 包含两个线性变换,在两个线性变换之间存在ReLU

  • $x$是$d_{model} = 512$维度,W_1 把$d_{model} = 512$ 扩展成$d_{ff}=2048$. W_2 又把$d_{ff}$扩展回去

Embedding & Softmax

  • 使用嵌入层可以将输入或者输出与$d_{model}$维的矩阵之间进行转换。在embedding层中,容易将单词学成比较小的向量(尤其是维度越大,权重值就越小),因此作者在这里考虑到之后要加一个PositionalEncoding(为了让两者规模相差不大),对嵌入层的权重乘了$\sqrt{d_{model}=512}$使之在±1之间。

  • 使用线性层和softmax可以降decoder的输出转化为下一个词的概率。

` In our model, we share the same weight matrix between the two embedding layers and the pre-softmax linear transformation`是为啥?这三个一样的权重为了训练简单。

Positional Encoding

Attention没有时序信息,只是简单的加权和。为了能够保证序列模型中还存在有序列信息,我们在这里考虑位置编码。

$PE_{(pos,2i)} = sin(\frac{pos}{10000^{\frac{2i}{d_{model}}}})$

$PE_{(pos,2i+1)} = cos(\frac{pos}{10000^{\frac{2i}{d_{model}}}})$

  • 思路使用周期不一样的值来表示距离。有点像2进制当中,不同的位的周期不一样。

为啥要self-Attention

下表中,N为序列长度,d为表示的维数,k为卷积核的大小,r为限制自主一的邻域大小。

image-20240404155529615

据说这篇文章的解释方面还是比较欠缺的。

实验

数据集准备

WMT 2014 English-German, 4.5M, byte-pair encoding5,shared source-target6

WMT 2014 English-French, 36M,……

硬件和实验设置

8 个英伟达 P100 GPU

对于基础模型,使用的是前面所说的超参数,最终达到的效果是每一个step只需要0.4 s。最终训练12h或者100000steps就可以了

对于大型的模型,一个step1s。最终训练3.5D 或300000steps就可以了

优化器

image-20240404162223717

学习率是根据模型的-0.5次方得到的(宽度越高,学习率会越低)。先有一个热身慢慢上升,然后再慢慢下降。学习率不用怎么调,其原因在于

  • Adam对学习率不敏感
  • 已经有学习率自动调整的模型了

正则

image-20240404162253983

Residual Dropout: 对于每一个子层的输出,并且在进入在进入残差之前、在进入layernorm之前进行0.1的dropout。在嵌入层加上位置参数的时候,也用了0.1的dropout。基本上,对于每一个带权重的层都加入了比较狠的dropout

Label Smoothing:对于softmax,即使是正确的值,也只可能是逼近于1,不可能完全近似等于1.因此可以把正确的阈值降到0.9.这里降的比较狠,降到了0.1。这样一来,模型的不确信度会增加,但是这样子可以提升精度和BLEU

结果

image-20240404163311053

基本上可以调参的有$N,d_{model},d_{ff}$,其他的都可以按比例算过来。

讨论

写作方面:简洁。几乎一句话讲一件事情。但是不建议。缺点在于没有讲为什么&设计理念&对文章的思考

Transformer架构:在图片语音video上取得非常大的进展。但是对他的理解还在初级阶段。Attention确实起到作用,但是MLP、ResNet也很重要。


跟李沐学AI:Transformer论文逐段精读【论文精读】

Download paper here

date: 2024-04-04

  1. 针对较长的序列,很早期的时序信息在后面可能会丢掉。如果不想要丢,那就得要$h_t$比较大,但是每一个时间步都要把这个较大的$h_t$都存下来的话,内存受不了 

  2. 假如一次的卷积核大小是3,前后两个序列信息相距较远,最终需要多次卷积才能将这两个序列信息关联起来。 

  3. 在生成下一个符号时,消耗之前生成的符号作为额外的输入.encoder可以不自回归,但是decoder只能是自回归 

  4. LayerNorm:对每一个样本做调整.BatchNorm是对特征进行调整. 25:37 

  5. 一个单词有不同种类的形式,如单三、过去式、完成式,如果考虑所有的形式会导致最终的单词表太大,因此只考虑词根。 

  6. 德语和英语的词汇创建在一个词典上。这样子做的目的在于,encoder和decoder的嵌入层可以共享权重