NLP系列:attention和self-attention

一、背景介绍

随着self-attention在Transformer中的应用,attention技术自然语言处理任务中的应用越来越广泛,成为NLP的基础技术之一,本篇博文介绍attention的原理、计算方法以及应用。

二、attention

我们人脑的生物神经网络同样存在网络容量问题,人脑中的工作记忆大概只有几秒钟的时间,类似于循环神经网络中的隐状态。而人脑每个时刻接收的外界输入信息非常多,包括来自于视觉、听觉、触觉的各种各样的信息。单就视觉来说,眼睛每秒钟都会发送千万比特的信息给视觉神经系统。人脑在有限的资源下,并不能同时处理这些过载的输入信息。大脑神经系统有两个重要机制可以解决信息过载问题:注意力和记忆机制。比如我们在看一张图片时,并不会仔细观察图片的全部细节,而是将注意力集中在图片的某个或者某几个核心区域。

对于计算机来讲,在计算能力有限情况下,注意力机制(Attention Mechanism)作为一种资源分配方案,将有限的计算资源用来处理更重要的信息,是解决信息超载问题的主要手段。当神经网络再处理大量的输入信息时,也可以借鉴人脑的注意力机制,只选择一些关键信息进行处理,来提高神经网络的效率。

注意力一般分为两种:
自上而下有意识的注意力,称为聚焦式注意力(Focus attention):指的是有预定目的的、依赖任务的、主动有意识地聚焦于某一对象的注意力。【注意力机制】
自下而上无意识的注意力,称为基于显著性的注意力(Saliency attention),指的是由外界刺激驱动的注意,不需要主动干预,与任务无关。 【比如Max-Pooling、门控机制】

1、attention

为了从 N N N个输入向[ x 1 , ⋅ ⋅ ⋅ , x N x1 , · · · , xN x1,,xN]中选择出和某个特定任务相关的信息,我们需要引入一个和任务相关的表示,称为查询向量(Query Vector),并通过一个打分函数来计算每个输入向量和查询向量之间的相关性。给定一个和任务相关的查询向量 q q q,我们用注意力变量 z ∈ [ 1 , N ] z ∈ [1,N] z[1,N]来表示被选择信息的索引位置,即 z = i z = i z=i表示选择了第 i i i个输入向量。首先计算在给定 q q q X X X下,选择第 i i i个输入向量的概率 α ( i ) \alpha(i) α(i)
α ( i ) = p ( z = i ∣ X , q ) = s o f t m a x ( s ( x i , q ) ) = e x p ( s ( x i , q ) ) ∑ j = 1 N e x p ( s ( x i , q ) ) \alpha(i) = p(z=i | X, q) = softmax(s(x_i,q))=\frac{exp(s(x_i,q))}{\sum_{j=1}^{N}exp(s(x_i,q))} α(i)=p(z=iX,q)=softmax(s(xi,q))=j=1Nexp(s(xi,q))exp(s(xi,q))
其中 α ( i ) \alpha(i) α(i)称为注意力分布(Attention Distribution) s ( x i , q ) s(x_i,q) s(xi,q)为注意力打分函数,有以下几种:
加性模型: s ( x i , q ) = v T t a n h ( W x i + U q ) ) s(x_i,q)=v^{T}tanh(Wx_i+Uq)) s(xi,q)=vTtanh(Wxi+Uq))
点积模型: s ( x i , q ) = x i T q s(x_i,q)=x_i^{T}q s(xi,q)=xiTq
缩放点积模型: s ( x i , q ) = x i T q d s(x_i,q)=\frac{x_i^{T}q}{\sqrt{d}} s(xi,q)=d xiTq
双线性模型: s ( x i , q ) = x i T W q s(x_i,q)=x_i^{T}Wq s(xi,q)=xiTWq
其中 W , U , v W, U, v W,U,v为可学习的参数, d d d 为输入向量的维度。
理论上,加性模型和点积模型的复杂度差不多,但是点积模型可以更好地利用矩阵乘积,从而计算效率更高。当输入向量的维度 D D D比较高时,点积模型的值通常会有比较大的方差,会导致softmax函数的梯度比较小,缩放点积模型可以很好的解决这个问题(有比较复杂的数据推导和证明)。双线性模型是泛化的点积模型,假设双线性模型中的 W = U T V W=U^{T}V W=UTV,那么可以写为 s ( x i , q ) = x i T U T V q = ( U x i T ) T ( V q ) s(x_i,q)=x_i^{T}U^{T}Vq=(Ux_i^T)^T(Vq) s(xi,q)=xiTUTVq=(UxiT)T(Vq),即分别对 x x x q q q进行线性变换后计算点积,相比点积模型,双线性模型引入了非对称性。

注意力分布 α ( i ) \alpha(i) α(i)可以解释为在给定任务相关的查询 q q q时,第 i i i个输入向量受关注的程度。我们采用一种“软性”的信息选择机制对输入信息进行汇总(“硬性”选择机制比如直接选择得分最高的输入向量),如下图所示:
a t t ( X , q ) = ∑ i = 1 n α i x i att(X,q)=\sum_{i=1}^{n}\alpha_ix_i att(X,q)=i=1nαixi

2、attention的变体

  • 键值对注意力
    我们可以用键值对(key-value pair)格式来表示输入信息,其中“键”用来计算注意力分布 α ( i ) \alpha(i) α(i),“值”用来计算聚合信息。用 ( K , V ) = [ ( k 1 , v 1 ) , . . . , ( k N , v N ) ] (K,V)=[(k_1,v_1),...,(k_N,v_N)] (K,V)=[(k1,v1),...,(kN,vN)]表示N组输入信息,给定任务相关的查询向量 q q q时,注意力函数为:
    a t t ( ( K , V ) , q ) = ∑ i = 1 n α i v i = ∑ i = 1 n e x p ( s ( k i , q ) ) ∑ j e x p ( s ( k i , q ) ) v i att((K,V),q)=\sum_{i=1}^{n}\alpha_iv_i=\sum_{i=1}^{n}\frac{exp(s(k_i,q))}{\sum_{j}exp(s(k_i,q))}v_i att((K,V),q)=i=1nαivi=i=1njexp(s(ki,q))exp(s(ki,q))vi
  • 多头注意力
    多头注意力(Multi-Head Attention)是利用多个查询 Q = [ q 1 , ⋅ ⋅ ⋅ , q M ] Q = [q_1 , · · · , q_M ] Q=[q1,,qM],来平行地计算从输入信息中选取多组信息,每个注意力关注输入信息的不同部分。
    a t t ( ( K , V ) , q ) = a t t ( ( K , V ) , q 1 ) ⊕ . . . ⊕ a t t ( ( K , V ) , q M ) att((K,V),q)=att((K,V),q_1)\oplus...\oplus att((K,V),q_M) att((K,V),q)=att((K,V),q1)...att((K,V),qM)
    其中 ⊕ \oplus 表示向量拼接。

三、self-attention

self-attention是注意力机制在深度网络中的一种应用。

在人工智能领域,attention最早应用于计算机视觉,随后逐渐应用于自然语言处理,但仅担任RNN和CNN的辅助算法角色。直到Transformer出现,在核心结构中使用了self-attention,很好地解决了RNN和CNN在长距离信息关联和并行化运算中存在的问题,在模型训练速度和推理精度上均有大幅提升,才奠定了self-attention作为特征提取层的统治地位。

当使用神经网络来处理一个变长的向量序列时,我们通常可以使用卷积网络或循环网络进行编码来得到一个相同长度的输出向量序列,基于卷积或循环网络的序列编码都可以看做是一种局部的编码方式,只建模了输入信息的局部依赖关系。虽然循环网络理论上可以建立长距离依赖关 系,但是由于信息传递的容量以及梯度消失问题,实际上也只能建立短距离依赖关系,如果要建立输入序列之间的长距离依赖关系,可以使用以下两种方法:一种方法是增加网络的层数,通过一个深层网络来获取远距离的信息交互; 另一种方法是使用全连接网络,全连接网络是一种非常直接的建模远距离依赖的模型,但是无法处理变长的输入序列。不同的输入长度,其连接权重的大小也是不同的。 这时我们就可以利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(Self-Attention Model)。

根据上节内容,对于句子中的第 i i i个词,可以知道该词self-attention的计算方法:(键值对attention的应用,由给定 q q q变换成 q q q为句子的每一个词)
h i = a t t ( ( K , V ) , q i ) = ∑ j = 1 N α i j v j = ∑ j = 1 N s o f t m a x ( s ( k j , q i ) ) v j h_i=att((K,V),q_i)=\sum_{j=1}^{N}\alpha_{ij}v_j=\sum_{j=1}^{N}softmax(s(k_j,q_i))v_j hi=att((K,V),qi)=j=1Nαijvj=j=1Nsoftmax(s(kj,qi))vj
self-attention采用QKV的计算模式,如下图,其中红色字母表示矩阵的维度:

假设输入序列 X = [ x 1 , . . . , x N ] X=[x_1,...,x_N] X=[x1,...,xN],self_attention的输出序列与输入序列同维度,输出序列 H = [ h 1 , . . . , h N ] H=[h_1,...,h_N] H=[h1,...,hN],其计算过程如下:
(1)对于每个输入 x i x_i xi,先将其线性映射到三个不同的空间,得到 q i , k i , v i q_i,k_i,v_i qi,ki,vi
(2)对于每一个查询向量 q i q_i qi,利用上节介绍的键值对注意力机制,可以得到输出向量:
h i = a t t ( ( K , V ) , q i ) = ∑ j = 1 N α i j v j = ∑ j = 1 N s o f t m a x ( s ( k j , q i ) ) v j h_i=att((K,V),q_i)=\sum_{j=1}^{N}\alpha_{ij}v_j=\sum_{j=1}^{N}softmax(s(k_j,q_i))v_j hi=att((K,V),qi)=j=1Nαijvj=j=1Nsoftmax(s(kj,qi))vj
其中 i , j i,j i,j为输出和输入向量的位置, a l p h a i j alpha_{ij} alphaij表示第 i i i个输出关注到第 j j j个输入的权重。
如果使用缩放点积来作为注意力打分函数,那么输出向量为:
H = V s o f t m a x ( K T Q ( D k ) ) H=Vsoftmax(\frac{K^TQ}{\sqrt(D_k)}) H=Vsoftmax(( Dk)KTQ)

self-attention常常用多头注意力模型,何为头呢?头指的是 W Q , W K , W V W_Q, W_K, W_V WQ,WK,WV矩阵的数量,相当于计算机视觉领域的卷积核个数。CNN通过不同的卷集合提取不同方向的空间纹理特征,而self-attention使用multi-head提取不同人上下文语境下的语义信息特征。

self-attention可以作为神经网络中的一层来使用,既可以用来替换卷积层或者循环层,也可以和它们一起交替使用。但是self-attention仅仅是用了 q q q k k k的相关性,忽略了输入的位置信息,因此在使用时,一般需要加入位置编码信息来进行修正。

四、总结

本文介绍了self-attention的前身attention机制的由来以及计算原理,后续会继续介绍self-attention在Transformer中应用。

###################################### END ######################################

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值