个人笔记使用,可能记得比较乱,是针对大量文章总结而成,方便自己理解和复习
〇、笔记一中对Encoder-Decoder Attention理解有误
此注意力中的输入Q K V
其中K V应该是从编码器得到的输出乘以decoder子层随机初始化的W_K和W_V得到的
Q是上一步self-attention的输出乘以decoder子层随机初始化的W_Q得到的
注意:Decoder端中每个Decoder子层都有两组Q K V对应两组不同的W_Q,W_K,W_V
一、前期分析笔记
二、Transformer整体框架
三、Transformer中的Self-attention
Multi-head attention与Scaled Dot-Product Attention
在Decoder端被称为Masked multi-head attention
Self-attention的字面理解:自注意力机制, Q K V都来自自身, 对输入本身做注意力。
在做自注意力处理之前,Q K V会先经过一个Linear层(乘以一个矩阵),线性变换,做维度变换:num_head * (d_q, d_k, d_v)
在做完点积注意力后,输出(多个z)要经过concat串联合并操作变成一个Z,因为Feed Forward一次只接收一个Z。
为什么会产生多个z呢?因为是多头注意力机制,一个头产生一个z,多个头就产生多个z。
多头怎样理解呢?其实就是人多好办事,每个人对同一个问题都有自己不同的看法,大致可能相同,但是具体肯定不同,所以就会有多个z。
而在点积注意力中,Q K V作为输入,首先就要打分,打什么分呢?打的是我们一句话中所有的单词对我们的原始输入向量x1这个单词的关注度,所以让Q与K做点乘,得到一个分值例如96;
为了保持我们的梯度稳定,用得到的分值除以K向量维度的平方根,统一降低这个分值,得到12(起到调节作用,使得内积不至于太大,太大的话 softmax 后梯度很小,就非 0 即 1 了,不够“soft‘’,不利于反向传播的进行。);
这只是某个其他单词对我们输入的单词x1的关注度的打分,对于所有单词对x1的关注度打分我们做一个softmax归一化,使分值和为1全为正数(防止梯度爆炸)。对于得到的这些新的分值,乘以对应的V(每个词都有对应的Q K V)得到对应的加权向量z(增大对需要关注的词的关注度,减小无关词的关注度)。 将所有词关于单词x1的加权向量z相加,得到单词x1最终的self-attention的输出Z.
以上是一个单词在一头下的情况,实际使用时,输入应该是一句话,得到的输出也是一个矩阵,所以以上过程就要对应一个矩阵的输入输出形式。
multi-head attention是通过h个不同的线性变换对Q,K,V进行投影,最后将不同的attention结果拼接起来(这跟 CNN 中的多个卷积核的思想是一致的)
四、Q K V
这三个才是真正的输入,因为每一个Encoder子层或Decoder子层都有对应的输入和输出,所以他们的输入都是Q K V。
Q K V就是由一个向量(也许是最初的输入向量或者是上一步的输出向量)乘以对应的W转换矩阵得到的。
这个W转换矩阵是随机初始化而来,通过不断的训练而进行调整,一个子层中一头有一组Q K V。
而每一个Q K V都对应一个W矩阵,所以一个子层一头中有三个W矩阵,分别是W_Q, W_K, W_V
Note: 在一般的attention模型中,Q就是decoder的隐层,K就是encoder的隐层,V也是encoder的隐层。所谓的self-attention就是取Q,K,V相同,均为encoder或者decoder的input embedding and positional embedding,更具体为“网络输入是三个相同的向量q, k和v,是word embedding和position embedding相加得到的结果"。(原文这段话其实有点没看懂,QKV相等?????是想说‘Q K V所对应的原输入是同一个’这个意思吗?)