参考
大白话浅谈注意力机制
64 注意力机制【动手学深度学习v2】
Attention机制详解(二)——Self-Attention与Transformer
Encoder-Decoder
架构
-
文本处理和语音识别的Encoder部分通常采用【RNN模型】
-
图像处理的Encoder一般采用【CNN模型】
Example
-
场景∶
输入的是英文句子:Tom chase Jerry .
翻译生成中文单词:“汤姆”,“追逐”,“杰瑞”。 -
信息Tom chase Jerry
-
有效信息
-
每次生成一个目标单词
-
每个目标单词的有效信息都不一样
比如对于“杰瑞”,最重要的信息应该是“Jerry"
-
-
分心模型
- y 1 = f ( C ) y_{1}= f(C) y1=f(C) y 2 = f ( C , y 1 ) y_{2}= f(C, y_{1}) y2=f(C,y1) y 3 = f ( C , y 1 , y 2 ) y_{3} = f(C, y_{1},y_{2}) y3=f(C,y1,y2)
- 在翻译“杰瑞”时,“Tom” " chase” " Jerry”三者贡献的注意力是一样的
-
引入注意力机制
-
- y 1 = f 1 ( C 1 ) y_{1}= f_{1}(C_{1}) y1=f1(C1) y 2 = f 1 ( C 2 , y 1 ) y_{2}= f_{1}(C_{2},y_{1}) y2=f1(C2,y1) y 3 = f 1 ( C 3 , y 1 , y 2 ) y_{3} = f_{1}(C_{3}, y_{1},y_{2}) y3=f1(C3,y1,y2)
-
而每个C可能对应着不同的源语句了单每的注意力分配慨率分布,l如对于上面的英汉翻崔来说,其对应的信息可能如下:
C 汤 姆 = g ( 0.6 ∗ f 2 ( " T o m " ) , 0.2 ∗ f 2 ( C h a s e ) , 0.2 ∗ f 2 ( " J e r r y " ) ) C_{汤姆}=g(0.6 * f2("Tom"),0.2 * f2(Chase),0.2 * f2("Jerry")) C汤姆=g(0.6∗f2("Tom"),0.2∗f2(Chase),0.2∗f2("Jerry"))
C 追 逐 = g ( 0.2 ∗ f 2 ( " T o m " ) , 0.7 ∗ f 2 ( C h a s e ) , 0.1 + f 2 ( " J e r r y " ) ) C_{追逐}=g(0.2 * f2("Tom"),0.7 * f2(Chase),0.1 + f2("Jerry")) C追逐=g(0.2∗f2("Tom"),0.7∗f2(Chase),0.1+f2("Jerry"))
C 杰 瑞 = g ( 0.3 ∗ f 2 ( " T o m " ) , 0.2 ∗ f 2 ( C h a s e ) , 0.5 ∗ f 2 ( " J e r r y " ) ) C_{杰瑞}=g(0.3 * f2("Tom"),0.2 * f2(Chase),0.5 * f2("Jerry")) C杰瑞=g(0.3∗f2("Tom"),0.2∗f2(Chase),0.5∗f2("Jerry"))
一般的做法中,g函数就是对构成元素加权求和
C i = Σ i = 1 L x a i j ⋅ h j C_{i}=\Sigma^{L_{x}}_{i=1}{a_{ij}·h_{j}}%,ay hj Ci=Σi=1Lxaij⋅hj
Attention机制本质思想
-
从概念上理解,把Attention仍然理解为【从大量信息中】【有选择地筛选出】【少量重要信息】并【聚焦到这些重要信息上】,【忽略大多不重要的信息】
-
从相似度、相关性角度理解
-
传统聚类︰将【样本】进行分类
-
Attention:将【特征】与目标进行相似度匹配
-
Attention机制的具体计算过程
步骤
-
根据Query和Key计算两者的相似性或者相关性
可以引人不同的函数和计算机制, 根据Query和某个,计算两者的相似性或者相关性
常见方法
-
求两者的【向量点积】
点积: S i m i l a r i t y ( Q u e r y , K e y i ) = Q u e r y ⋅ K e y i Similarity(Query,Key_{i}) = Query·Key_{i} Similarity(Query,Keyi)=Query⋅Keyi
-
求两者的向量【cosine相似性】
Cosine相似性: S i m i l a r i t y ( Q u e r y , K e y i ) = Q u e r y ⋅ K e y i ∣ ∣ Q u e r y ∣ ∣ ⋅ ∣ ∣ K e y i ∣ ∣ Similarity(Query,Key_{i}) = \frac{Query·Key_{i}}{ ||Query||·||Key_{i}|| } Similarity(Query,Keyi)=∣∣Query∣∣⋅∣∣Keyi∣∣Query⋅Keyi
-
引入额外的神经网络来求值
MLP网络:
S i m i l a r i t y ( Q u e r y , K e y i ) = M L P ( Q u e r y , K e y i ) Similarity(Query,Key_{i}) = MLP(Query,Key_{i}) Similarity(Query,Keyi)=MLP(Query,Keyi)
-
-
对1的原始分数进行softmax归—化处理
a i = S o f t m a x ( S i m i ) = e S i m i Σ j = 1 L x e S i m j a_{i}= Softmax(Sim_{i})=\frac{e^{Sim_{i}}}{\Sigma^{L_{x}}_{j=1}{e^{Sim_{j}}}} ai=Softmax(Simi)=Σj=1LxeSimjeSimi -
根据权重系数对Value进行加权求和
A t t e n t i o n ( Q u e r y , S o u r c e ) = Σ i = 1 L x a i ⋅ V a l u e i Attention(Query, Source)= \Sigma^{L_{x}}_{i=1}{a_{i}·Value_{i}} Attention(Query,Source)=Σi=1Lxai⋅Valuei
目前绝大多数具体的注意力机制计算方法
都符合上述的三阶段抽象计算过程
补充
注意力分数
-
α(x,xi):注意力权重(权重一般是一组大于等于零,相加和为 1 的数)
-
注意力分数:高斯核的指数部分(相当于是注意力权重归一化之前的版本)
-
上图所展示的是:假设已知一些 key-value 对和一个 query,首先将 query 和每一个 key 通过注意力分数函数 a 和 softmax 运算得到注意力权重(与 key 对应的值的概率分布),将这些注意力权重再与已知的 value 进行加权求和,最终就得到了输出
如何将 key 和 value 拓展到更高的维度
-
假设 query 是一个长为 q 的向量,ki 是长为 k 的向量,vi 是长为 v 的向量(这里 key 和 value 的长度可以不同)
-
其中 query 和 ki 的注意力权重(标量)是通过注意力评分函数 a 将两个向量映射成标量,再经过 softmax 运算得到的
掩蔽 softmax 操作(masked softmax operation)
softmax 操作用于输出一个概率分布作为注意力权重,但是在某些情况下,并非所有的值都应该被纳入到注意力汇聚中
-
在处理文本数据集的时候,为了提高计算效率,可能会采用填充的方式使每个文本序列具有相同的长度,便于以相同形状的小批量进行加载,因此可能会存在一些文本序列被填充了没有意义的特殊词源(比如“”词元)
-
因此,为了仅仅将有意义的词元作为值来获取注意力汇聚,可以指定一个有效序列长度(即词元的个数),任何超出有效长度的位置都被掩蔽并置于 0,便于在计算 softmax 的时候过滤掉超出指定范围的位置,这也就是掩蔽 softmax 操作
注意力分数函数 α 的设计
1、加性注意力(Additive attention)
-
当 query 和 key 是不同长度的矢量时,可以使用加性注意力作为注意力分数
-
可学参数( 3 个):
-
h:超参数
-
Wk:key 从 k map 到 h(将 key 向量的长度从 k 转化为 h)
-
Wq:query 从q map 到 h(将 query 向量的长度从 q 转化为 h)
-
Wk、Wq 都是矩阵,v 是向量
-
tanh:激活函数
-
上式中,k 是长为 k 的向量,q 是长为 q 的向量
-
等价于将 query 和 key 合并起来变成一个长度为 k+q 的向量,然后将其输入到一个隐藏层大小为 h ( h 是一个超参数),输出大小为 1 的但隐藏层的 MLP(没有偏置项),最终得到输出
-
优点是 key、value 向量可以是任意的长度,可以不同
2、缩放点积注意力(Scaled Dot-Product Attention)
- 使用点积可以得到计算效率更高i的评分函数,但是点积操作要求 query 和 key 具有相同的长度
针对 key 和 query 长度相同的情况
-
假设 query 和 key 的所有元素都是独立的随机变量,并且都满足零均值和单位方差,那么两个向量的点积的均值为 0 ,方差为 d
-
这里不需要学习任何东西,直接利用 <q,ki> 将 q 和 ki 做内积然后除以根号 d (除以根号 d 的目的是为了降低对 ki 的长度的敏感度,使得无论向量的长度如何,点积的方差在不考虑向量长度的情况下仍然是 1 )
总结
-
注意力分数是 query 和 key 的相似度(没有经过 normalize ),注意力权重是注意力分数的 softmax 结果( 0 到 1 之间的数)
-
两种常见的注意力分数的计算
-
有参数的版本:将 query 和 key 合并起来进入一个单隐藏层单输出的 MLP(在 query 和 key 向量长度不同的情况下)
-
无参数的版本:直接将 query 和 key 做内积(在 query 和 key 向量长度一定的情况下),效率更高
-