注意力机制
注意力提醒
由生物学中的现象引出注意力机制的由来。注意力可以基于自主性提示和非自主性提示两个方面来引出。
基于非自主性提示和自主性提示 有选择地引导注意力的焦点 之后通过两个实例来引出了注意力提醒的有关问题。
- 第一种情况下就类似与没有外界影响的条件下人自主选择时注意力所集中的地方。(类比于在卷积神经网络中的最大池化操作)
2. 第二种情况类似于在有外界引导的情况下,人的注意力所集中的地方会受到一定的影响。
注意力机制的引出
卷积、全连接、池化层都只考虑不随意线索(这也是注意力机制区别的地方。)
在注意力机制的背景下,自主性提示被称为查询(query)。 给定任何查询,注意力机制通过注意力汇聚(attention pooling) 将选择引导至感官输入(sensory inputs,例如中间特征表示)。
在注意力机制中,这些感官输入被称为值(value)。 更通俗的解释,每个值都与一个键(key)配对, 这可以想象为感官输入的非自主提示.可以通过设计注意力汇聚的方式, 便于给定的查询(自主性提示)与键(非自主性提示)进行匹配, 这将引导得出最匹配的值(感官输入)。
非注意力池化层
给定数据 (xi,yi),i = 1…n
- 平均池化是最简单的一个操作。
f ( x ) = 1 n ∑ i = 1 n y i f(x)=\frac{1}{n} \sum_{i=1}^{n} y_{i} f(x)=n1i=1∑nyi
显然,平均汇聚忽略了输入xi。 于是Nadaraya (Nadaraya, 1964)和 Watson (Watson, 1964)提出了一个更好的想法, 根据输入的位置对输出
yi进行加权:
f ( x ) = ∑ i = 1 n K ( x − x i ) ∑ i = 1 n K ( x − x j ) y i f(x)=\sum_{i=1}^{n} \frac{K\left(x-x_{i}\right)}{\sum_{i=1}^{n} K\left(x-x_{j}\right)} y_{i} f(x)=i=1∑n∑i=1nK(x−xj)K(x−xi)yi
非参数不需要学习任何东西
高斯核回归
K ( u ) = 1 2 π exp ( − u 2 2 ) K(u)=\frac{1}{\sqrt{2 \pi}} \exp \left(-\frac{u^{2}}{2}\right) K(u)=2π1exp(−2u2)
f ( x ) = ∑ i = 1 n exp ( − 1 2 ( x − x i ) 2 ) ∑ j = 1 n exp ( − 1 2 ( x − x j ) 2 ) y i = ∑ i = 1 n softmax ( − 1 2 ( x − x i ) 2 ) y i \begin{aligned} f(x) & =\sum_{i=1}^{n} \frac{\exp \left(-\frac{1}{2}\left(x-x_{i}\right)^{2}\right)}{\sum_{j=1}^{n} \exp \left(-\frac{1}{2}\left(x-x_{j}\right)^{2}\right)} y_{i} \\ & =\sum_{i=1}^{n} \operatorname{softmax}\left(-\frac{1}{2}\left(x-x_{i}\right)^{2}\right) y_{i} \end{aligned} f(x)=i=1∑n∑j=1nexp(−21(x−xj)2)exp(−21(x−xi)2)yi=i=1∑nsoftmax(−21(x−xi)2)yi
这种高斯核回归用于池化之中缺少可以学习的参数,在之后引入了参数的概念之后。便引出了参数化的注意力机制
参数化的注意力机制
在此基础上引入了可以用来学习的变量W
f ( x ) = ∑ i = 1 n softmax ( − 1 2 ( ( x − x i ) w ) 2 ) y i f(x)=\sum_{i=1}^{n} \operatorname{softmax}\left(-\frac{1}{2}\left(\left(x-x_{i}\right) w\right)^{2}\right) y_{i} f(x)=i=1∑nsoftmax(−21((x−xi)w)2)yi
余下部分将通过训练这个模型 (10.2.7)来学习注意力汇聚的参数。
一个更加通用的注意力汇聚(attention pooling)公式:其中的a(x,xi)称为注意力权重。
f ( x ) = ∑ i = 1 n α ( x , x i ) y i f(x)=\sum_{i=1}^{n} \alpha\left(x, x_{i}\right) y_{i} f(x)=i=1∑nα(x,xi)yi
之后学习的重点是对于不同权重的设计上
注意力分数
中间部分所得到的数值信息。注意力评分函数的重点在于关心如何设计注意力权重的值。
f ( x ) = ∑ i α ( x , x i ) y i = ∑ i = 1 n softmax ( − 1 2 ( x − x i ) 2 ) y i f(x)=\sum_{i} \alpha\left(x, x_{i}\right) y_{i}=\sum_{i=1}^{n} \operatorname{softmax}\left(-\frac{1}{2}\left(x-x_{i}\right)^{2}\right) y_{i} f(x)=i∑α(x,xi)yi=i=1∑nsoftmax(−21(x−xi)2)yi
其中a(x,xi)称为注意力权重 也就是softMax和其中包含的部分
− 1 2 ( x − x i ) 2 -\frac{1}{2}\left(x-x_{i}\right)^{2} −21(x−xi)2
是在选择高斯核情况下的注意力分数。也可以称为是注意力分数函数。
在注意力池化层中的计算可以写为:
f ( q , ( k 1 , v 1 ) , … , ( k m , v m ) ) = ∑ i = 1 m α ( q , k i ) v i ∈ R v f\left(\mathbf{q},\left(\mathbf{k}_{1}, \mathbf{v}_{1}\right), \ldots,\left(\mathbf{k}_{m}, \mathbf{v}_{m}\right)\right)=\sum_{i=1}^{m} \alpha\left(\mathbf{q}, \mathbf{k}_{i}\right) \mathbf{v}_{i} \in \mathbb{R}^{v} f(q,(k1,v1),…,(km,vm))=i=1∑mα(q,ki)vi∈Rv
α ( q , k i ) = softmax ( a ( q , k i ) ) = exp ( a ( q , k i ) ) ∑ j = 1 m exp ( a ( q , k j ) ) ∈ R \alpha\left(\mathbf{q}, \mathbf{k}_{i}\right)=\operatorname{softmax}\left(a\left(\mathbf{q}, \mathbf{k}_{i}\right)\right)=\frac{\exp \left(a\left(\mathbf{q}, \mathbf{k}_{i}\right)\right)}{\sum_{j=1}^{m} \exp \left(a\left(\mathbf{q}, \mathbf{k}_{j}\right)\right)} \in \mathbb{R} α(q,ki)=softmax(a(q,ki))=∑j=1mexp(a(q,kj))exp(a(q,ki))∈R
加性注意力(additive attention)
可学参数: W k ∈ R h × k , W q ∈ R h × q , v ∈ R h a ( k , q ) = v T tanh ( W k k + W q q ) \begin{array}{l} \text { 可学参数: } \mathbf{W}_{k} \in \mathbb{R}^{h \times k}, \mathbf{W}_{q} \in \mathbb{R}^{h \times q}, \mathbf{v} \in \mathbb{R}^{h}\\ a(\mathbf{k}, \mathbf{q})=\mathbf{v}^{T} \tanh \left(\mathbf{W}_{k} \mathbf{k}+\mathbf{W}_{q} \mathbf{q}\right) \end{array} 可学参数: Wk∈Rh×k,Wq∈Rh×q,v∈Rha(k,q)=vTtanh(Wkk+Wqq)
加性注意力的计算思路是:Wk和k相乘得到一个长为h的向量,同理wq和q相乘也可以得到一个长为h的向量。将这两个向量相加即可以得到长为h的向量。最后经过一个tanh激活函数得到的长度为h的向量于vT相乘最后就可以得到需要的注意力分数
将查询和键连结起来后输入到一个多层感知机(MLP)中, 感知机包含一个隐藏层,其隐藏单元数是一个超参数h。 通过使用tanh作为激活函数,并且禁用偏置项。
等价于将key和value合并起来后放入到一个隐藏大小为h输出大小为1的单隐藏层MLP。
缩放点积注意力(scaled dot-product attention)
如果query和key都是同样的长度 q , k i ∈ R d , 那么可以 a ( q , k i ) = ⟨ q , k i ⟩ / d \begin{array}{l} \text { 如果query和key都是同样的长度 } \mathbf{q}, \mathbf{k}_{i} \in \mathbb{R}^{d} \text {, 那么可以 }\\ a\left(\mathbf{q}, \mathbf{k}_{\mathbf{i}}\right)=\left\langle\mathbf{q}, \mathbf{k}_{\mathbf{i}}\right\rangle / \sqrt{d} \end{array} 如果query和key都是同样的长度 q,ki∈Rd, 那么可以 a(q,ki)=⟨q,ki⟩/d
在使用的过程中经常会用到向量化的版本,我们可以将向量化的版本改写为:
Q ∈ R n × d , K ∈ R m × d , \mathbf{Q} \in \mathbb{R}^{n \times d}, \mathbf{K} \in \mathbb{R}^{m \times d}, Q∈Rn×d,K∈Rm×d,
V ∈ R m × v 注意力分数: a ( Q , K ) = Q K T / d ∈ \mathbf{V} \in \mathbb{R}^{m \times v} 注意力分数: a(\mathbf{Q}, \mathbf{K})=\mathbf{Q K}^{T} / \sqrt{d} \in V∈Rm×v注意力分数:a(Q,K)=QKT/d∈
R n × m 注意力池化: f = softmax ( a ( Q , K ) ) V ∈ R n × v \mathbb{R}^{n \times m} 注意力池化: f=\operatorname{softmax}(a(\mathbf{Q}, \mathbf{K})) \mathbf{V} \in \mathbb{R}^{n \times v} Rn×m注意力池化:f=softmax(a(Q,K))V∈Rn×v
总结
:注意力分数是query和key的相似度,注意力权重是分数的softmax结果。
自注意力机制
qkv计算过程理解:
对于第一段语言序列模型,对自注意力机制中的self可以如下理解
self- attention 中的 self ,表示 query、key、value 都来自自己,每个 token 都能提取出自己的 query、key、value。
-
首先先将输入的单词嵌入(emb)到词向量token之中。(例如图中的 a1,a2,a3,a4)等。
-
然后我们从每一个token中提取出对于的q k v三个变量。
-
-
Q(query):模型从token中提取出的,对token的理解信息。用于主动与其他token计算相似程度。
-
K(key):模型从token中提取出的,与其他token的关系信息被用于与其他token计算相似程度
-
V(value):表示当前token的重要程度。
-
自注意力机制的计算过程
首先引出自注意力机制的计算公式。本质上就是缩放点积的注意力
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \operatorname{Attention}(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V Attention(Q,K,V)=softmax(dkQKT)V
w1,w2,w3都是可学习的参数,
计算的步骤:
- 并行的进行计算,将输入的token词向量组合成为一个词向量列表,在并行的于w1 w2 w3向量进行计算**从而得到 Q K V所对应的向量。如下图所示。计算出 Q K V
-
通过Q 和 K 运算 (q1 k1) (q2 k2)…得到对应的多个注意力分数。
-
经过SoftMax运算得到对应的注意力权重(有的也称为计算出了相似度分数)
-
最后我们得到的注意力权重向量与V 向量做向量的乘法得到的值在进行相加就可以得到最后的输出结果了。
整个计算的流程图如下所示
最后我们得到的向量[B1,B2,B3,B4]就类似于通过CNN或者其他的网络提取出来的特征向量。
位置编码
位置编码的由来主要原因自注意力机制没有位置信息的原因。
在论文中作者提出了两种编码方式,偶数位置的编码方式使用sin来生成,奇数位置的编码方式使用cos来进行生成。
P E ( p o s , 2 i ) = sin ( p o s / 1000 0 2 i / d model ) P E ( p o s , 2 i + 1 ) = cos ( p o s / 1000 0 2 i / d m o d e l ) \begin{array}{l} P E_{(p o s, 2 i)}=\sin \left(p o s / 10000^{2 i / d_{\text {model }}}\right) \\ P E_{(p o s, 2 i+1)}=\cos \left(p o s / 10000^{2 i / d_{\mathrm{model}}}\right) \end{array} PE(pos,2i)=sin(pos/100002i/dmodel )PE(pos,2i+1)=cos(pos/100002i/dmodel)
多头注意力(multihead attention)
在大多数的情况下多头注意力机制的实现并不会采用上图实现的机制,而是会采用均分的操作来进行实现的。
这个部分的计算和之前的注意力机制的计算完全相同。
最后一步讲对应位置的b进行concat连接运算。将拼接之后的结果乘以一个权重矩阵,就可以得到最后的输出值。
下面用双头注意力机制来举例进行实现
双头注意力机制的实现细节
首先将q k v 均分为两份(n)将均分过后的两个q k v中的第一部分,和第二部分分别整合起来形成两个头向量 head1和head2。
由此我们将head部分,分为了两个部分组成head1 head2
接着将每个head得到的结果进行concat拼接,比如下图中b1,1(head1 得到的b1)和b1,2(head2得到的b1)拼接在一起,b2,1(head1得到的b2)和b2,2(heαd2得到的b2)拼接在一起。
接着将拼接后的结果通过W0(可学习的参数)进行融合,如下图所示,融合后得到最终的结果b1,b2。
MultiHead ( Q , K , V ) = Concat ( head 1 , … , head h ) W O where head i = Attention ( Q W i Q , K W i K , V W i V ) \begin{array}{l} \operatorname{MultiHead}(Q, K, V)=\text { Concat }\left(\text { head }_{1}, \ldots, \text { head }_{h}\right) W^{O} \\ \text { where } \text { head }_{\mathrm{i}}=\operatorname{Attention}\left(Q W_{i}^{Q}, K W_{i}^{K}, V W_{i}^{V}\right) \end{array}\\ MultiHead(Q,K,V)= Concat ( head 1,…, head h)WO where head i=Attention(QWiQ,KWiK,VWiV)