基本信息
论文:《Attention Is All You Need》
作者:Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Lizhe Wanga,
Illia Polosukhin
年份: 2017
参考:沐神的讲解: https://www.bilibili.com/video/BV1pu411o7BE?spm_id_from=333.999.0.0
现状
主流的序列转录模型通常基于复杂的循环或者是包含encoder和decoder的卷积神经网络
通常在encoder和decoder之间使用注意力机制(Attention)的模型性能最好
存在的问题
-
循环神经网络 (Recurrent Neural Network, RNN)
RNN是时序的,第ttt个词的隐藏状态hth_tht 是由 前一个词的隐藏状态ht−1h_{t-1}ht−1 和 当前第ttt个词本身 一起决定的
也就是说,你在计算hth_tht时,必须保证先获得ht−1h_{t-1}ht−1(自回归)
(目的:把前面学到的历史信息,通过ht−1h_{t-1}ht−1放到当下,有效处理时序信息)
缺点:
(1)难以并行(RNN是一步一步计算的过程)
(2)内存问题(如果时序较长,则早期的时序信息,在后续可能会丢失,如果不想丢失则需要一个比较大的hth_tht,如果后面的每一个hth_tht都较大,又需要存下来,那么会导致内存开销大 -
卷积神经网络 (Convolutional Neural Networks, CNN)
替换RNN,并行计算所有输入输出位置的隐藏表示,减少时序计算
使用CNN做计算时,每次看一个比较小的窗口,如果你两个像素隔得远,则需要很多层卷积,一层一层上去,才能把两个隔得远的像素融合起来
缺点:对比较长的序列难以建模
优点:可以多个输出通道,一个输出通道可以去识别不一样的模式(Transformer也想有,所以提出多头注意力机制) -
Attention 注意力机制
Attention已经应用在编码器的解码器decoder里面,主要用于把编码器encoder的东西有效的传给解码器decoder,与RNN一起使用。注意力机制不同于卷积、全连接层、池化层,它显示的考虑随意线索,也就是带着明确要关注的点去进行模型训练。
随意线索被称之为查询(query)(也就是你想要干什么)
每一个输入是一个值(Value)和不随意线索(key)的对
通过key和 query的相似度有偏向性的选择某些输入,也就是确定value的权重注意力函数就是将一个QueryQueryQuery和一些Key−ValueKey-ValueKey−Value对映射成一个输出的函数,具体的说输出OutputOutputOutput是ValueValueValue的加权和,权重就是每一个ValueValueValue对印的KeyKeyKey和QueryQueryQuery的相似度的来的。具体如下:
-
Self-Attention 自注意力机制
self-attention的主要作用是找到每个向量和其他向量(包括自己)之间的关联程度。
本文主要思想
提出Transfomer,彻底抛弃RNN,完全基于注意力机制(第一个)
优点:并行度高,效果更好
模型架构
-
Transformer使用编码器和解码器架构
-
纯基于注意力机制(在编码器和解码器里堆叠使用自注意力机制,Pointer-wise,全连接层)。
原文图1
-
编码器
- 编码器由6个相同的层组成,每层都有两个子层,一个是多头注意力机制,另一个是基于位置的全连接前馈神经网络(也就是MLP)。
- 两个子层之间使用残差连接,也就是:LayerNorm(x+Sublayer(x))LayerNorm(x + Sublayer(x))LayerNorm(x+Sublayer(x))(当前层的输入+当前层的输出)
- 每一层的输出维度定为512(因为残差连接需要输入输出的大小是一致的)
-
解码器
- 解码器由6个相同的层组成,每层都有三个子层,一个是多头注意力机制,一个是基于位置的全连接前馈神经网络,还有一个Masked多头注意力机制(因为解码器是自回归的,也就是过去时候的输出,要作为当前时刻的输入,也就是在做当前的预测是,不能看到之后的上一层的输入,但是在注意力机制里,每一次都能看到完整的输入,所以要掩盖后面的信息)
Masked注意力机制:
在注意力机制,Q会和所有的K一直做运算,但是我们要保证在算输出的时候,对于K_t,来说只能用到K_1,…,K_t-1,而不能用到后面的
所以就加了一个mask(),对于后面的K,全部替换成一个非常大的负数,那么一个很大的负数进入softmax做指数运算的时候就会变成0,就会导致softmax出来的东西是没有用到后面的值的
- 多头注意力机制
- 目的:对于同一个key,value,query,希望抽取不同的信息
- 方式:使用不同的线性投影法将query、key、valuequery、key、valuequery、key、value进行hhh次投影,投影到一个低维,再做hhh次的注意力函数
- 对于每一个注意力函数的输出,并到一起,再投影回来得到最后的输出
xi,yix_i,y_ixi,yi
- 带掩码的多头注意力机制
因为解码器是自回归的,也就是过去时候的输出,要作为当前时刻的输入,也就是在做当前的预测是,不能看到之后的上一层的输入,但是在注意力机制里,每一次都能看到完整的输入,所以要掩盖后面的信息
方式:计算xix_ixi输出时,通过掩码是的当前序列长度为i - 基于位置的全连接前馈神经网络
- 将输入形状由(b,n,d)(b,n,d)(b,n,d)变换成 (bn,d)(bn,d)(bn,d)
- 作用两个全连接层
- 输出形状由(bn,d)(bn,d)(bn,d)变换成(b,n,d)(b,n,d)(b,n,d)
- 等价于两层核窗口为1的一维卷积层
- 信息传递
- 假设编码器中的输出是:y1,.......,yny_1,.......,y_ny1,.......,yn
- 将其作为解码器中第iii个Transformer块中多头注意力的key和value
- 它的query来自目标序列
- 意味着编码器和解码器中块的个数和输出维度都是一致的
预测
- 预测第t+1t+1t+1个输出时
- 解码器中输入前ttt个预测值
- 在自注意力中,前t个预测值作为key和value,第t个预测值作为query
总结
- Transformer是一个纯使用注意力机制的编码-解码器
- 编码器和解码器都有n个transformer块
- 每个块里面都是由多头注意力,基于位置的前馈神经网络,残差链接