admin 管理员组

文章数量: 1086948

[NIPS2017]Attention is all you need

原理源码讲解:
.html

这篇文章是火遍全宇宙,关于网上的解读也非常多,将自己看完后的一点小想法也总结一下。
看完一遍之后,有很多疑问,我是针对每个疑问都了解清楚后才算明白了这篇文章,可能写的不到位,只是总结下,下次忘记了便于翻查。
一:Q,K, V 到底是什么?
在传统的seq2seq框架下:
query: seq2seq模型中decode时隐层向量S t − 1 _{t-1} t−1​, 记作q t − 1 _{t-1} t−1​, Q就是多个query组成的矩阵Q
value: seq2seq模型中encode时的隐层向量h i _i i​,记作v i _i i​, V是输入序列中n个词的embedding矩阵
key: 对h i _i i​做了一次先行映射得到的向量, 记作k i _i i​,K同上
在本文的transformer下,结合文字和图:
(1) encoder self-attention
Q 就是input sequence( w 1 w_1 w1​, w 2 w_2 w2​, …, w i w_i wi​, …, w n w_n wn​)将其映射为word embedding后 ( x 1 x_1 x1​, x 2 x_2 x2​, …, x i x_i xi​, …, x n x_n xn​),Q= ( x 1 x_1 x1​, x 2 x_2 x2​, …, x i x_i xi​, …, x n x_n xn​),并且 K=V=Q
(2) decoder self-attention
当t=0时,decoder self-attention的Q是<bos>的embedding, 当t=j时,Q=(E < b o s > _{<bos>} <bos>​, E y 1 _{y1} y1​, …, E y j − 1 _{y_{j-1}} yj−1​​), 其中y j − 1 _{j-1} j−1​是t=j-1时刻decoder的输出. K=V=Q
(3) encoder-decoder self-attention
K=V是encoder的输出,将encoder的输出传给decoder, 这一操作使得decoder可以获取输入 X X X序列的信息, 类似于传统seq2seq中的decoder端的attention. Q是decoder self-attention的输出.

二: 怎么理解self-attention, 怎么做self-attention,为什么用self-attention?
(1) 在传统的 seq2seq 中的 encoder 阶段,针对输入 X X X = ( x 1 x_1 x1​, x 2 x_2 x2​, …, x i x_i xi​, …, x n x_n xn​),经过RNN或LSTM变换后得到序列的隐层状态 H H H = ( h 1 h_1 h1​, h 2 h_2 h2​, …, h i h_i hi​, …, h n h_n hn​),但是此篇文章抛弃了 RNN,encoder 过程就没了 hidden states,那拿什么做 self-attention 呢?input 的 sequence 共有 n 个 word,将每一个 word 映射成 embedding, 就得到 n 个 embedding,可以用 embedding 代替 hidden state 做 self-attention 。所以 Q 就是一个n行 d k d_k dk​列的矩阵,这个矩阵就是n个词的embedding,并且Q=K=V。那么为什么管Q 就是query呢?就是每次用一个词的embedding,去计算其与剩下的(n-1)个词的 embedding 的 match 程度(也就是 attention 的大小,这就是self-attention的意思了。

针对n个词,一共要做n轮这样的操作:

(2)首先将query 和每个key进行相似度计算得到权重,常用的相似度函数有点积拼接,感知机等
然后使用一个softmax函数对这些权重归一化,最后权重与相应的键值value进行加权求和得到attention后的context
(3) 句子中的每个词都要和该句子中的所有词进行attention计算,目的是学习句子内部的词以来关系,捕获句子的内部结构。
三:怎么理解 decoder self-attention中的Masked Multi-Head Attention

四:如何理解公式(1), 怎么理解缩放因子 1 d k \frac{1}{\sqrt{d_k}} dk​ ​1​?

公式(1)中的softmax( Q K T d k \frac{QK^T}{\sqrt{d_k}} dk​ ​QKT​) 就是类似 a i j a_{ij} aij​和 c i c_i ci​的计算,Q和K就相当于 e i j e_{ij} eij​计算中的 S i − 1 S_{i-1} Si−1​和 h j h_j hj​:


上图中的Q换成q, K换成k

参考文献:
源码解读:

=blogxgwz0




本文标签: NIPS2017Attention is all you need