这篇文章引用了下边这些资料的图片和讲解内容
【李宏毅机器学习2021】自注意力机制 (Self-attention) (上)_哔哩哔哩_bilibili
一文看懂 NLP 里的模型框架 Encoder-Decoder 和 Seq2Seq - 掘金 (juejin.cn)
USYD COM5046的部分课件插图
Attnetion is all your need 矩阵乘法核心思想(5):内积与外积 - 知乎 (zhihu.com) Attention 和self-attention - 知乎 (zhihu.com)
什么是Attention机制
先说结论:Attention就是权重,通过计算矩阵之间的相似度,可以算出这个权重,这个矩阵可以是词向量,也可以是Encoder和Decoder,以及经过RNN、LSTM编译的隐向量
计算相似度
Attention score 可以计算两个矩阵的相似度,如果两个向量相似度越高,那么Attention score越大。 点乘可以计算两个向量的余弦相似度(不懂请看引用列表里的:矩阵乘法核心思想(5):内积与外积)。
计算Attention score的几种方法
其中最常用的就是矩阵的点乘Dot-product(),这也是Self-Attention以及Transformer中使用的方法。
Attention的几种类型
注意!!!:
self-Attention有3个可以训练的参数
multi-head self-Attention有4个可以训练的参数
RNN中加入Attention
比如下图中的对话机器人,就使用了Dot-product计算每一个Decoder和Encoder的Attention score,最终经过一层Softmax,预测出正确的输出。
具体的计算公式
self-Attention
为了解释self-Attention和Attention的区别,这里举个例子:
这只蝴蝶真漂亮,停在花朵上,我很喜欢它
Attention:只能把“它”翻译为“it”
self-Attention:不仅知道“它”可以翻译为“it”,还知道“it”可以翻译为“这只蝴蝶”
即self-Attention不仅仅知道Encoder和Decoder的对应关系,还知道Encoder内部,和Decoder内部对应的关系。
关于Attention 和Self-Attention的具体区别,可以看下面这篇文章。
Attention 和self-attention - 知乎 (zhihu.com)
self-Attention具体的实现过程
这里使用了李宏毅老师的课件内容(链接请看引用部分)
q k v 的计算
q:query
k:key
v:value
首先将输入的词向量,分别乘以预先训练好的向量,得到 q k v
也是self-Attention中唯3能学习的参数
q k 点乘,得到矩阵a
矩阵a其实就代表了q和k的相似度,a矩阵中的每一个数,代表了Attention score,也就是对应的权重(在value中的权重)。
矩阵a进入Softmax,也就是Softmax
注意!这里是对每列进行Softmax,也就是每列矩阵的合为1
a矩阵中的每一个Attention score值,代表了在value中的权重。
权重值越大的,最后得到的输出向量b,就和这个值对应的向量越相似,在结果b中的份额越大(不知道这样形容对不对)。
self-Attention的完整计算过程
multi-head self-Attention 多头自注意力机制
multi-head self-attention是self-Attention的进阶版。
Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions.
multi-head的作用类似于CNN中不同的卷积核,multi-head可以联合来自不同head部分学习到的信息,可以更全面的知道输入词向量的特点。
multi-head self-Attention的计算过程
q k v 的计算
q k v 的计算和self-Attention一样, 将输入的词向量,分别乘以预先训练好的向量,得到 q k v
将q k v 均分
根据使用的head的数目h进一步把得到的 均分。
比如h为2,那么均分为2份
比如原版为[0,1,1,0],均分为[0,1]和[1,0] ,也就是和,k 和 v 也一样。
将q k v 对应相乘
这里也和self-Attention一样,但是会得到和
对和 进行Concat操作,再乘上对应的 矩阵
对和 进行Concat操作,再将其拼到一起,形成一个大的矩阵
再乘上对应的 矩阵,得到最终的结果。
因此,多头注意力机制要多一个可以训练的的参数矩阵