公式可以表示为 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
解码器由 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)WOwhereheadi=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)