NLP-图解self-Attention
一、self-Attention是什么?
假设以下句子是我们要翻译的输入句子:
” The animal didn’t cross the street because it was too tired”
这句话中的“它”指的是什么?它指的是街道还是动物?这对人类来说是一个简单的问题,但对算法来说却不是那么简单。当模型处理 “it” 这个词时,self-attention 允许它把 “it” 和 “animal” 联系起来。
二、 self-Attention实现
第一步: 把输出进行编码得到词向量,构建三个矩阵分别来查询当前词跟其他词的关系,以及特征向量的表达。
通过将所有输入的词向量拼接到矩阵
X
X
X 中,并将其乘以我们训练的权重矩阵(
W
Q
W^Q
WQ、
W
K
W^K
WK、
W
V
W^V
WV)来做实现。
其中:
Q
:
q
u
e
r
y
Q:query
Q:query ,要去查询的
K
:
k
e
y
K:key
K:key , 等待被查的
V
:
v
a
l
u
e
V:value
V:value, 实际的特征信息
第二步: 计算每一个 token 和句子中的每一个 token的相关性。假设我们正在计算第一个单词“Thinking” 的相关性,需要用 “Thinking” 的查询向量
q
1
q_1
q1 分别和 “Thinking”与"Machines" 的 key 值做内积,内积越大,相关性越高。
第三步: 防止内积过大, 将上述结果除以 d k d_k dk 的平方根。然后通过 softmax 操作传递结果。Softmax 将分数归一化,因此它们都是正数并且加起来为 1, 表示分数的重要性。
其中:
d
k
d_k
dk 是
Q
Q
Q、
K
K
K 矩阵的列数,即句子的长度。
这个 softmax 分数决定了每个单词在这个位置上的表达量。显然,这个位置的单词将具有最高的 softmax 分数,但有时关注与当前单词相关的另一个单词很有用。
第四步 将每个 value 向量乘以 softmax 分数并求和。这里是保持我们想要关注的单词的值不变,并忽略不相关的单词(例如,通过将它们乘以像 0.001 这样的微小数字)。
总结: 每个词的Q会跟整个序列中每一个K计算得分,然后基于得分再分配特征。
三、 Multi-Head Attention实现
一组 Q 、 K 、 V Q、K、V Q、K、V 得到了一组当前词的特征表达,类似卷积神经网络中的filter能不能提取多种特征呢?
多头注意力层提供了多个“表示子空间”。正如我们接下来将看到的,通过多头注意力,我们有多组一组
Q
、
K
、
V
Q、K、V
Q、K、V 权重矩阵(Transformer 使用八个注意力头) . 这些集合中的每一个都是随机初始化的。在训练之后,每个集合用于将输入的词向量投影到不同的表示子空间中。
如果我们进行与上述相同的自注意力计算,只是使用不同的权重矩阵进行八次不同的计算,我们最终会得到八个不同的 Z 矩阵:
我们连接这些矩阵,然后将它们乘以一个额外的权重矩阵
W
O
W^O
WO,得到一个矩阵:
总结: