NLP系列 02 相似度以及 多种Attention机制

1,411 阅读3分钟

这篇文章引用了下边这些资料的图片和讲解内容

【李宏毅机器学习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中使用的方法。

image.png

Attention的几种类型

注意!!!:

self-Attention有3个可以训练的参数 WqWkWv W^{q},W^{k},W^{v}
multi-head self-Attention有4个可以训练的参数 WqWkWvW0 W^{q},W^{k},W^{v},W^{0}

RNN中加入Attention

比如下图中的对话机器人,就使用了Dot-product计算每一个Decoder和Encoder的Attention score,最终经过一层Softmax,预测出正确的输出。

image.png

具体的计算公式

image.png

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
首先将输入的词向量,分别乘以预先训练好的向量WqWkWvW_q W_k W_v,得到 q k v

WqWkWvW_q W_k W_v 也是self-Attention中唯3能学习的参数

image.png

q k 点乘,得到矩阵a

矩阵a其实就代表了q和k的相似度,a矩阵中的每一个数,代表了Attention score,也就是对应的权重(在value中的权重)。

image.png

矩阵a进入Softmax,也就是Softmax

注意!这里是对每列进行Softmax,也就是每列矩阵的合为1

image.png

a矩阵中的每一个Attention score值,代表了在value中的权重。
权重值越大的,最后得到的输出向量b,就和这个值对应的向量越相似,在结果b中的份额越大(不知道这样形容对不对)。

image.png

self-Attention的完整计算过程

image.png image.png

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的计算过程

image.png

q k v 的计算

q k v 的计算和self-Attention一样, 将输入的词向量,分别乘以预先训练好的向量WqWkWvW_q W_k W_v,得到 q k v

将q k v 均分

根据使用的head的数目h进一步把得到的 qikiviq^i k^i v^i均分。
比如h为2,那么均分为2份
比如原版为[0,1,1,0],均分为[0,1]和[1,0] ,也就是qi,1q^{i,1} qi,2 q^{i,2},k 和 v 也一样。

将q k v 对应相乘

这里也和self-Attention一样,但是会得到bi,1b^{i,1} bi,2 b^{i,2}

bi,1b^{i,1} bi,2 b^{i,2} 进行Concat操作,再乘上对应的W0 W^{0} 矩阵

image.png

bi,1b^{i,1} bi,2 b^{i,2} 进行Concat操作,再将其拼到一起,形成一个大的矩阵
再乘上对应的W0 W^{0} 矩阵,得到最终的结果。
因此,多头注意力机制要多一个可以训练的的参数矩阵W0 W^{0}