Attention & Transformer
注意力机制
参考书目&文章:https://zh.d2l.ai/ + https://zhuanlan.zhihu.com/p/454482273
本篇用于快速回忆相关概念。如有错误,欢迎批评指正。
注意力提示
生物学中的注意力提示
- 非自主性提示&自主性提示
- 非自主性:基于环境中物体的突出性和易见性。
- 自主性:受主观认知和意识的控制。
查询,键和值
参数化的全连接层->类似于人的感官输入->这是一种只使用非自主性提示的情况。
- 在注意力机制中,前述“自主性提示”称为“查询(query)”。
- 给定查询,注意力机制通过注意力汇聚(attention pooling),将选择引导至感官输入(sensory inputs, 例如中间特征;“感官输入”也被称之为“值 value”)。
- 通过设计注意力汇聚的方式,使给定的查询(自主性提示)与键(非自主性提示)进行匹配,引导得出最匹配的值(感官输入)。
注意力汇聚:Nadaraya-Watson 核回归
非参数注意力汇聚(attention pooling)
f ( x ) = ∑ i = 1 n α ( x , x i ) y i f(x) = \sum_{i=1}^{n} \alpha(x, x_{i}) y_{i} f(x)=i=1∑nα(x,xi)yi
α ( x , x i ) = K ( x − x i ) ∑ j = 1 n K ( x − x j ) \alpha(x, x_{i}) = \frac{ K( x - x_{i}) }{ \sum_{j=1}^{n} K(x - x_{j}) } α(x,xi)=∑j=1nK(x−xj)K(x−xi)
- 上述两个公式合并后,所描述的估计器即为Nadaraya-Watson核回归。
- 其中,x是查询, ( x i , y i ) (x_{i}, y_{i}) (xi,yi)是键值对, K是定义的核函数。
- 注意力汇聚是 y i y_{i} yi的加权平均。
- 对于任何查询,模型在所有键值对注意力权重都是一个有效的概率分布: 它们是非负的,并且总和为1。
- 若一个键 x i x_{i} xi越接近给定的查询 x x x,那么分配给这个键对应值 y i y_{i} yi的注意力权重就会越大, 也就“获得了更多的注意力”。
- Nadaraya-Watson核回归是一个非参数模型1
带参数注意力汇聚
- 非参数的Nadaraya-Watson核回归具有一致性的优点: 如果有足够的数据,此模型会收敛到最优结果。
- 我们还可以轻松地将可学习的参数集成到注意力汇聚中,下图以带参数w的高斯核为例:
注意力评分函数
- 高斯核指数部分可以视为注意力评分函数,简称评分函数(scoring function)。
掩蔽softmax操作
- 某些情况下,并非所有的值都应该被纳入到注意力汇聚中。 例如,为了高效处理小批量数据集,某些文本序列被填充了没有意义的特殊词元。 为了仅将有意义的词元作为值来获取注意力汇聚,可以指定一个有效序列长度(即词元的个数),以便在计算softmax时过滤掉超出指定范围的位置。
- 其中任何超出有效长度的位置都被掩蔽并置为0。被掩蔽的元素使用一个非常大的负值替换,从而其softmax输出为0。
加性注意力
a ( q , k ) = w v T t a n h ( W q q + W k k ) ∈ R a (\mathbf{q}, \mathbf{k}) = \mathbf{w}_{v}^{T} tanh (\mathbf{W}_q \mathbf{q} + \mathbf{W}_k \mathbf{k}) \in \mathbb{R} a(q,k)=wvTtanh(Wqq+Wkk)∈R
- 当查询和键是不同长度的矢量时,可用加性注意力作为评分函数,如上式:查询 q ∈ R q \mathbf{q} \in \mathbb{R}^{q} q∈Rq,键 k ∈ R k \mathbf{k} \in \mathbb{R}^{k} k∈Rk
- W q ∈ R h × q , W k ∈ R h × k , w v ∈ R h \mathbf{W}_q \in \mathbb{R}^{h \times q}, \mathbf{W}_k \in \mathbb{R}^{h \times k}, \mathbf{w}_{v} \in \mathbb{R}^{h} Wq∈Rh×q,Wk∈Rh×k,wv∈Rh
缩放点积注意力
- 使用点积可以得到计算效率更高的评分函数。点积操作要求查询和键具有相同的长度d。
- 假设查询和键的所有元素都是独立的随机变量, 并且都满足零均值和单位方差, 那么两个向量的点积的均值为0,方差为d。
- 为确保无论向量长度如何, 点积的方差在不考虑向量长度的情况下仍然是1, 故将点积除以 d \sqrt{d} d。
- 基于n个查询和m个键-值对计算注意力,查询和键的长度为d,值的长度为v,则最终缩放点积注意力为: s o f t m a x ( Q K T d ) V ∈ R n × v softmax(\frac{\mathbf{QK}^{T}}{\sqrt{d}})\mathbf{V} \in \mathbb{R}^{n \times v} softmax(dQKT)V∈Rn×v
多头注意力
- 当给定相同的查询、键和值的集合时,希望模型基于相同的注意力机制学习到不同的行为, 再将他们作为知识组合起来, 捕获序列内各种范围的依赖关系(如,短距依赖和长距依赖关系)。
自注意力和位置编码
比较卷积神经网络、循环神经网络和自注意力
- 顺序操作会妨碍并行计算,而任意的序列位置组合之间的路径越短,则能更轻松地学习序列中的远距离依赖关系。
- 如上图示卷积神经网络,序列长度为n,卷积核大小为k,则最大路径长度为 O ( n / k ) O(n/k) O(n/k)。 x 1 x_1 x1和 x 5 x_5 x5处于卷积核大小为3的双层卷积神经网络的感受野内。
- 自注意力中,查询、键和值都是
n
×
d
n \times d
n×d矩阵。 考虑缩放的点积注意力,其中
n
×
d
n \times d
n×d矩阵乘以
d
×
n
d \times n
d×n矩阵(这时进行了
n
2
d
n^2 d
n2d次乘法)。 之后输出的
n
×
n
n \times n
n×n矩阵乘以
n
×
d
n \times d
n×d矩阵(这时又进行了
n
2
d
n^2 d
n2d次乘法)。 因此,自注意力具有
O
(
n
2
d
)
O(n^2 d)
O(n2d)计算复杂性。 每个词元都通过自注意力直接连接到任何其他词元,故有个
O
(
1
)
O(1)
O(1)顺序操作可以并行计算, 最大路径长度也是
O
(
1
)
O(1)
O(1)
。 - 卷积神经网络和自注意力都拥有并行计算的优势, 且自注意力的最大路径长度最短。 但其计算复杂度是关于序列长度的二次方,所以在很长的序列中计算会非常慢。
位置编码
-
在处理词元序列时,自注意力因并行计算无法顺序操作而获得位置信息。 为克服这一问题,可在输入中添加位置编码(positional encoding)来注入绝对的或相对的位置信息。
-
对于位置编码,可能会有以下几种想法:
- 想法一:直接整数1,2,3,…依序对tokens进行编码,这样做有以下几点不便之处:模型可能遇见比训练时所用的序列更长的序列,不利于模型的泛化;模型的位置表示无界,随着序列长度的增加,位置值会越来越大。
- 想法二:将界限定为【0,1】,对该区间进行等间隔划分来一一匹配每个tokens,但当序列长度不同时,token间的相对距离是不一样的。
- 想法三:二进制向量标记位置,比如输入序列每个词元的维度d=2,序列为a1, a2, a3, a4, 则对应编码可以为00, 01, 10,11。这样编码出的位置向量,处在一个离散的空间中,不同位置间的变化是不连续的。
-
我们需要这样一种位置表示方式,满足:
(1)它能用来表示一个token在序列中的绝对位置;
(2)在序列长度不同的情况下,不同序列中token的相对位置/距离也要保持一致;
(3)可以用来表示模型在训练过程中从来没有看到过的句子长度。
(4)位置向量的值是有界的,且位于连续空间中。模型在处理位置向量时更容易泛化,即更好处理长度和训练数据分布不一致的序列.
(5)不同的位置向量是可以通过线性转换得到。 -
基于正弦函数和余弦函数的固定位置编码可以满足上述所有条件:
- 对于一含有n个词元,每个词元有d个维度(n行d列)的输入 X ∈ R n × d \mathbf{X} \in \mathbb{R}^{n \times d} X∈Rn×d,位置编码先构造其位置嵌入矩阵 P ∈ R n × d \mathbf{P} \in \mathbb{R}^{n \times d} P∈Rn×d,再与序列结合构成 X + P \mathbf{X} + \mathbf{P} X+P作为一个整体输入模型。
- 矩阵第i行的第2j列,第2j+1列上的元素表示为:
{ p i , 2 j = s i n ( i 1000 0 2 j / d ) p i , 2 j + 1 = c o s ( i 1000 0 2 j / d ) \begin{cases} p_{i,2j} = sin(\frac{i}{10000^{2j/d}}) \\ p_{i,2j+1} = cos(\frac{i}{10000^{2j/d}}) \end{cases} {pi,2j=sin(100002j/di)pi,2j+1=cos(100002j/di) - 从上述公式定义可以看出:
- 三角函数频率
ω
j
=
1
1000
0
2
j
/
d
\omega_{j} = \frac{1}{10000^{2j/d}}
ωj=100002j/d1。取出某一个向量/词元,频率随维度增加而变小。这其实也类似于二进制编码,越往低位走(越往左边走),频率变化的越慢。
- 三角函数频率
ω
j
=
1
1000
0
2
j
/
d
\omega_{j} = \frac{1}{10000^{2j/d}}
ωj=100002j/d1。取出某一个向量/词元,频率随维度增加而变小。这其实也类似于二进制编码,越往低位走(越往左边走),频率变化的越慢。
绝对位置信息
- 上图是长度为200、维度为150的序列转置后的位置矩阵PE(纵轴表示向量的维度d=150);下图是所在的位置向量中的第i个分量位置的sin/cos函数图像。两个图像的横轴都为词元位置p。
- 这个图貌似并不匹配前述公式,看个意思就行。
- 这个图没问题。
相对位置信息
- 这种位置编码还可以使模型学习得到输入序列中相对位置信息:
- 给定确定的位置偏移
δ
\delta
δ,根据线性投影原理,位置
i
+
δ
i+\delta
i+δ处的位置编码可以用位置
i
i
i处的位置编码来表示2:
- 给定确定的位置偏移
δ
\delta
δ,根据线性投影原理,位置
i
+
δ
i+\delta
i+δ处的位置编码可以用位置
i
i
i处的位置编码来表示2:
位置编码小结:Q&A
- 为什么频率要设置为如此小的值?( ω j = 1 1000 0 2 j / d \omega_{j} = \frac{1}{10000^{2j/d}} ωj=100002j/d1随j增大逐渐减小):极小的频率,使得d列个sin,cos函数绘制在d维空间中的高维图形中存在重合部分,也即不同位置的编码可能出现完全相同的结果!
举一个简单的例子,当只考虑sin函数,序列足够长,且序列中每个元素的维度d=3时,绘图如下所示:
- 输入矩阵为400*3,其实t取点没取好,应该类似于
t = linespace(1,400,400)
更好些,不过问题不大。- 绘制出了每一列的函数图像,当序列足够长,长到满足高于最低频率sin函数的一个周期长度时,就有可能存在不同位置完全一致的情况,如图标记点所示。
- 更一般的,我认为:只要保证各个维度上的正弦函数的周期的最小公倍数(也即公共周期)的长度小于序列长度,就不会有重合了。
-
为什么要同时引入sin和cos,而不是只用其中一种?:为了使其他的位置向量可以通过线性转换得到,见前述相对位置信息。
-
位置编码的重要性质:
-
两个位置编码的点积(dot product)仅取决于偏移量,也即两个位置编码的点积可以反应出两个位置编码间的距离。
-
性质二:位置编码的点积是无向的, P E t T ∗ P E t + Δ t = P E t T ∗ P E t − Δ t PE_{t}^{T} * PE_{t+\Delta t} = PE_{t}^{T} * PE_{t-\Delta t} PEtT∗PEt+Δt=PEtT∗PEt−Δt。由于cos函数的对称性,基于性质1,这一点即可证明。
-
-
别人关于位置编码喂入attention层的补充: