Attention is All You Need 阅读笔记
Attention is All You Need(NIPS 2017)
摘要
- 动机:RNN 并行性非常差
- Transformer 仅使用注意力机制,而不使用循环层 和 卷积层
- 面向机器翻译做了实验
背景
- 卷积神经网络难以对全局进行建模,而使用 Transformer 可以一次性看到所有的像素;但是卷积可以有多个输出通道,所以提出 Multi-Head
- Transformer 使用注意力机制来构建 Encoder-Decoder 模型
模型架构
- 整体架构:基于 Encoder-Decoder 架构,将 堆叠的 self-attention、point-wise、fully connected layer 放入编码器和解码器中
Encoder and Decoder Stacks
- Encoder:
- 编码器由 N = 6 N=6 N=6 个相同的层堆叠,每一个层有两个子层,分别是 multi-head self-attention mechanism(多头自注意力机制) 和 simple,position-wise fully connected feed-forward network(全连接网络),每一个子层使用一个残差连接,并使用 layer normalization
- 公式可以表示为 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)),因为残差的输入和输出的大小需要相同,所以把每一个层的输出维度 d m o d e l = 512 d_{model}=512 dmodel=512
- LayerNorm 和 BatchNorm 的区别:下图左边是 BatchNorm(按特征进行归一化),右边是 LayerNorm(按每个样本进行归一化)
- Decoder:
- 解码器由 N = 6 N=6 N=6 个相同的层堆叠,但是每一个层有三个子层,其中两个子层和编码器一样,而多出的第三个层在编码器的输出上使用了一个 masked multi-head attention,masked的存在是使得解码器在时刻 t 时看不见 t 之后的输入
Attention
- 注意力机制:Q、K、V。V 是由 Q 和 K 计算相似度而来。也就是说,给定一个 Query Q,通过和 Key K 计算相似度,就能够得到每一个 K 对应的 Value V 所对应的权重,并通过这些权重对 V 进行加权和。自注意力机制就是Q=K=V
- Scaled Dot-Product Attention:Transformer 使用这个模式的注意力机制,其中 Query,Key 维度为
d
k
d_k
dk(保证两者可以做内积),而 Value 维度为
d
v
d_v
dv,计算所 Query 和 Key 的点积,并且除以
d
k
\sqrt{d_k}
dk(做除法是为了把
d
k
d_k
dk 和函数进行解耦,使得训练过程稳定,相当于归一化),并且应用 softmax 函数来获取所有 Value 所对应的权重(非负并且相加为1)
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
- Multi-Head Attention:将 Q、K、V 使用线性层投影 h 次,然后再使用注意力机制,最后将其进行合并,再使用一个线性层投影回原来的样子
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O w h e r e h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O\\ where\space head_i=Attention(QW_i^Q,KW_i^K,VW_i^V) MultiHead(Q,K,V)=Concat(head1,...,headh)WOwhere headi=Attention(QWiQ,KWiK,VWiV)
其中 W i Q ∈ R d m o d e l × d k , W i K ∈ R d m o d e l × d k , W i V ∈ R d m o d e l × d v , W O ∈ R h d v × d m o d e l W_i^Q\in R^{d_{model}×d_k},W_i^K\in R^{d_{model}×d_k},W_i^V\in R^{d_{model}×d_v},W^O\in R^{hd_v×d_{model}} WiQ∈Rdmodel×dk,WiK∈Rdmodel×dk,WiV∈Rdmodel×dv,WO∈Rhdv×dmodel,并且本文中将 h = 8 h=8 h=8,并且 d k = d v = d m o d e l / h = 64 d_k=d_v=d_{model}/h=64 dk=dv=dmodel/h=64
Position-wise Feed-Forward Networks
- 就是一个单隐藏层全连接网络,但是注意力机制已经读取了整个输入序列,因为它已经包含了全局的序列信息,所以这个全连接网络对序列中的每一个点做全连接即可,公式为
F F N ( x ) = R e l u ( x W 1 + b 1 ) W 2 + b 2 FFN(x)=Relu(xW_1+b_1)W_2+b_2 FFN(x)=Relu(xW1+b1)W2+b2
Embeddings and Softmax
- 将每一个词编码为一个维度为 d m o d e l d_{model} dmodel 的向量,并且在embedding layer中将权重乘以 d m o d e l \sqrt{d_{model}} dmodel,相当于归一化
Positional Encoding
- Attention 不包含时序信息,所以在这一层中,将输入与下面的 PE 相加,就可以获得时序信息
P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}})\\ PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)