基本信息
论文:《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是时序的,第 t t t个词的隐藏状态 h t h_t ht 是由 前一个词的隐藏状态 h t − 1 h_{t-1} ht−1 和 当前第 t t t个词本身 一起决定的
也就是说,你在计算 h t h_t ht时,必须保证先获得 h t − 1 h_{t-1} ht−1(自回归)
(目的:把前面学到的历史信息,通过 h t − 1 h_{t-1} ht−1放到当下,有效处理时序信息)
缺点:
(1)难以并行(RNN是一步一步计算的过程)
(2)内存问题(如果时序较长,则早期的时序信息,在后续可能会丢失,如果不想丢失则需要一个比较大的 h t h_t ht,如果后面的每一个 h t h_t ht都较大,又需要存下来,那么会导致内存开销大 -
卷积神经网络 (Convolutional Neural Networks, CNN)
替换RNN,并行计算所有输入输出位置的隐藏表示,减少时序计算
使用CNN做计算时,每次看一个比较小的窗口,如果你两个像素隔得远,则需要很多层卷积,一层一层上去,才能把两个隔得远的像素融合起来
缺点:对比较长的序列难以建模
优点:可以多个输出通道,一个输出通道可以去识别不一样的模式(Transformer也想有,所以提出多头注意力机制) -
Attention 注意力机制
Attention已经应用在编码器的解码器decoder里面,主要用于把编码器encoder的东西有效的传给解码器decoder,与RNN一起使用。注意力机制不同于卷积、全连接层、池化层,它显示的考虑随意线索,也就是带着明确要关注的点去进行模型训练。
随意线索被称之为查询(query)(也就是你想要干什么)
每一个输入是一个值(Value)和不随意线索(key)的对
通过key和 query的相似度有偏向性的选择某些输入,也就是确定value的权重注意力函数就是将一个 Q u e r y Query Query和一些 K e y − V a l u e Key-Value Key−Value对映射成一个输出的函数,具体的说输出 O u t p u t Output Output是 V a l u e Value Value的加权和,权重就是每一个 V a l u e Value Value对印的 K e y Key Key和 Q u e r y Query Query的相似度的来的。具体如下:
-
Self-Attention 自注意力机制
self-attention的主要作用是找到每个向量和其他向量(包括自己)之间的关联程度。
本文主要思想
提出Transfomer,彻底抛弃RNN,完全基于注意力机制(第一个)
优点:并行度高,效果更好
模型架构
-
Transformer使用编码器和解码器架构
-
纯基于注意力机制(在编码器和解码器里堆叠使用自注意力机制,Pointer-wise,全连接层)。
原文图1
-
编码器
- 编码器由6个相同的层组成,每层都有两个子层,一个是多头注意力机制,另一个是基于位置的全连接前馈神经网络(也就是MLP)。
- 两个子层之间使用残差连接,也就是: L a y e r N o r m ( x + S u b l a y e r ( 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,希望抽取不同的信息
- 方式:使用不同的线性投影法将 q u e r y 、 k e y 、 v a l u e query、key、value query、key、value进行 h h h次投影,投影到一个低维,再做 h h h次的注意力函数
- 对于每一个注意力函数的输出,并到一起,再投影回来得到最后的输出
x i , y i x_i,y_i xi,yi
- 带掩码的多头注意力机制
因为解码器是自回归的,也就是过去时候的输出,要作为当前时刻的输入,也就是在做当前的预测是,不能看到之后的上一层的输入,但是在注意力机制里,每一次都能看到完整的输入,所以要掩盖后面的信息
方式:计算 x i x_i xi输出时,通过掩码是的当前序列长度为i - 基于位置的全连接前馈神经网络
- 将输入形状由 ( b , n , d ) (b,n,d) (b,n,d)变换成 ( b n , d ) (bn,d) (bn,d)
- 作用两个全连接层
- 输出形状由 ( b n , d ) (bn,d) (bn,d)变换成 ( b , n , d ) (b,n,d) (b,n,d)
- 等价于两层核窗口为1的一维卷积层
- 信息传递
- 假设编码器中的输出是: y 1 , . . . . . . . , y n y_1,.......,y_n y1,.......,yn
- 将其作为解码器中第
i
i
i个Transformer块中多头注意力的key和value
- 它的query来自目标序列
- 意味着编码器和解码器中块的个数和输出维度都是一致的
预测
- 预测第 t + 1 t+1 t+1个输出时
- 解码器中输入前
t
t
t个预测值
- 在自注意力中,前t个预测值作为key和value,第t个预测值作为query
总结
- Transformer是一个纯使用注意力机制的编码-解码器
- 编码器和解码器都有n个transformer块
- 每个块里面都是由多头注意力,基于位置的前馈神经网络,残差链接