Attention is all you need
Transformer only based on attention mechanisms, dispensing CNN, RNN
Introduction and Background
-
RNN 必须将前一步生成的 h t − 1 h_{t - 1} ht−1 作为下一次 h t h_t ht 的输入,导致不能并行运行计算,效率低。
-
CNN 允许在输入输出位置上并行计算,提高效率,但是在不同位置之间的信号传递需要的 Number of operations 不同,会随着位置之间的距离增长而增长,复杂度高,对较长的序列难以建模。
-
Transformer 减少操作数到 constant ,但是由于平均处理注意力权重位置,会损失细节和局部特征的辨别能力,所以引入 多头注意力(Multi-Head Attention)
看作模拟 CNN 效果
-
Transformer 不需要序列对齐,又一个优势,处理长距离依赖关系更高效。
[!note]
长距离依赖:
- 自然语言中距离长,时间序列中距离长
- RNN难捕捉,会梯度消失
Model Architecture
Encoder-Decoder stacks
- encoder 将原始输入 ( x 1 , x 2 , . . . , x n ) (x_1,x_2,...,x_n) (x1,x2,...,xn) 映射成机器可以理解的向量 ( z 1 , z 2 , . . . , z n ) (z_1,z_2,...,z_n) (z1,z2,...,zn) ,decoder 拿到 encoder 的输入,生成一个长为 m 的序列 ( y 1 , y 2 , . . . , y m ) (y_1,y_2,...,y_m) (y1,y2,...,ym)
- decoder 类似 RNN ,是 auto-regressive,把前一次输出当作输入
Encoder
每个 Encoder 有 N 个 Layer,每个 Layer 有 2 个 sub-layers
- multi-head self-attention
- simple, position-wise fully connected feed-forward network
- sub-layer 之后都要 Add & norm ,即为一次残差连接和 Layer Norm
Decoder
每个 Decoder 有 N 个 Layer,每个 Layer 有 3 个 sub-layers,与 Encoder 有所不同
- 有一个 sub-layer 变成 Masked Multi-Head Attention ,遮蔽后面的信息。
- Inserts a third sub-layer,接收 encoder 的输出
Attention
Scaled Dot-Product Attention
简单的注意力机制,只计算点积。
-
为什么 ➗ d k \sqrt{d_k} dk ?
当 d k d_k dk 很大时,向量的长度较长,点积的值会比较大或比较小。比较大时,相对的差距大,最大值的 softmax 值接近 1,其他接近 0,计算梯度时梯度较小,造成梯度消失
Multi-Head Attention
将 queries,keys,values 线性投影 h 次,每次得到不同的投影维度,在合并起来做 Concat 得到结果
使模型可以关注来自不同子空间的信息,解决了平均化操作的抑制效果
Applications of Attention in Model
- 在 Encoder 中有一个 self-attention,key,query,value 来自同一个输入,完全一样。是一个 self-attention
- 在 Encoder-Decoder 层,queries 来自 Decoder 的输出,keys 和 values 来自 Encoder 层,这样可以提取我们想要的信息
- 在 Decoder 层,有一个 Masked Attention ,遮蔽后面的信息(把 weights 设置为 0 )
Position-wise Feed-Forward Networks
理解为一个 MLP,每次进行 Attention 操作得到输出之后再放入一个 MLP 中(每一个词都做一次),此时已经得到想要的信息,并且是可以并行处理的。
而使用 RNN 就必须要上一次的输出,不能并行,效率低了
Embedding and Softmax
Embedding
把输入和输出的 tokens 转换成维度为 d m o d e l d_{model} dmodel 的 vector
Softmax
转换 decoder 的输出,预测下一个 token 的概率
Positional Encoding
Why?
Attention 中没有时序信息,output 是 value 的加权和,与序列信息无关。如果把一句话打乱,经过 Attention 之后结果一万一样,所以需要位置编码
How?
How:RNN 把上一时刻的输出 作为下一个时刻的输入,来传递时序信息。
How:attention 在输入里面加入时序信息 --> add positional encoding to the input embeddings at the bottoms of the encoder and decoder stacks
Questions
-
softmax 层 为什么乘 d m o d e l \sqrt{d_{model}} dmodel
-
Why Layer Norm instead of Batch Norm