文章目录(Table of Contents)
简介
本文会来介绍「注意力分数」的计算。特别的,这里我们会使用高维的 query
,key
和 value
来举例子。可以将「注意力分数」理解为 query
和 key
的相似度。
也就是,首先计算 query
和 key
的相似度,得到「注意力分数」,接着对「注意力分数」进行 softmax
。有两种常见的「注意力分数」的计算方式,分别是(1)「加性注意力」,将 query
和 key
合并起来放在单层 MLP
;(2)「内积注意力」,将 query
和 key
作内积运算;
参考资料
- Attention Mechanisms(注意力机制),本文的相关代码(包含「加性注意力」和「内积注意力」两个部分的代码);
- 动手学深度学习在线课程,包含完整的课程大纲;
- 65 注意力分数【动手学深度学习v2】,B 站视频;
注意力分数
回顾之前在一维数据的时候,计算 query
对应的 value
,使用如下的式子:
现在我们将数据扩展为高维,注意下面的 q
,k
,v
的长度可以全部不一样:
于是上面一维数据对应的式子会变为下面的式子:
上面式子中的 α(q, k_i)
可以写为下面的式子:
其中最关键的就是 a(q, k_i)
的计算(q
,k
的长度可能是不一样的)。下面会介绍两种常见的a(q, k_i)
的计算方式,分别是「加性注意力(Additive Attention)」和「内积注意力(Scaled Dot-Product Attention)」。
加性注意力(Additive Attention)
加性注意力介绍
首先介绍「加性注意力」。这里可以学习的参数有三个,分别是:
于是上面的a(q, k_i)
可以被写为下面的式子:
在上面的式子中,Wq
得到一个长度为 h
的向量。Wk
得到一个长度为 h
的向量。接着将这两者加起来,得到一个长度为 h
的向量。最后使用 w_v
与上面长度为 h
的向量相乘,输出大小为 1
的值。将上面的式子转换为流程图如下所示:
对于加性注意力,可以理解为将 key
和 query
首先并起来,然后放入一个隐藏层为 h
,输出大小为 1
的单隐藏层 MLP
。使用「加性的注意力」,q
,k
和 v
三者之间可以是不一样的。
加性注意力数值例子
下面看一个具体的「加性注意力」的例子。现在 batch size=2
,对于每一个 batch
,我们有:
- 两个
query
,每个query
向量长度是20
。 - 有
10
个key-value pair
,其中:key
为长度为2
的向量;value
为长度为4
的向量;
对于 key
,value
,query
的生成如下所示:
首先我们将 query
和 key
都转换为长度一样的向量,这里全部转换为长度为 16
的向量:
接着将 Wq
与 Wk
相加。相当于每一个 query
会和一个 key
计算一个向量。一共有 2
个 query
,每个 query
会和 10
个 key
得到一个向量:
下一步计算 tanh
的值,此时向量的大小是不会改变的:
接着我们计算 w_v × tanh(wq + wk)
的值,计算每个 key
和 query
的注意力分数。此时就会把上面长度为 16
的向量转换为程度为 1
的值:
最后我们对上面的「注意力分数」进行归一化即可,使得一个 query
对所有 key
的值求和为 1
。
Masked Softmax
当然另外一种常见的情况是 masked softmax
,也就是假设一些 key
是不会被用到的,于是归一化的时候可以不考虑这些值。下面的例子我们设置只考虑前面的两个 key-value pair
:
内积注意力(Scaled Dot-Product Attention)
内积注意力介绍
如果我们的 key
和 query
的长度是一样的,例如他们的长度都是 d
,那么 a(q, k_i)
可以被写为下面的式子:
在上面的式子中,除根号 d
是使得 a(q, k_i)
对向量长度不敏感。上面这个式子是没有可以学习的参数的。
我们可以进一步扩展上面的「内积注意力」,加入可以训练的参数,同时也是可以处理 key
和 query
长度不同的情况。于是「内积注意力」整体的结构如下图所示:
内积注意力数值例子
下面我们通过一个具体的例子来看一下「内积注意力」是如何进行计算的。
现在 batch size=2
,对于每一个 batch
,我们有:
- 两个
query
,每个query
向量长度是2
。 - 有
10
个key-value pair
,其中:key
为长度为2
的向量(这里query
和key
向量的长度是一样的);value
为长度为4
的向量;
对于 key
,value
,query
的生成如下所示:
接着我们计算 q × k / sqrt(d)
的值。此时每个query
和一个 key
会计算出一个相似度得分。
最后我们将上面的 scores
归一化即可,一个 query
对十个 key
的得分求和要是 1
:
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论