一、传统编码-解码机制
设输入序列${x^1,x^2,...,x^n}$,输出序列${y^1,y^2,...,y^m}$,encoder的隐向量为$h_1,h_2,...$,decoder的隐向量为$s_1,s_2,...$。
解码器的输入只有一个向量,该向量就是输入序列经过编码器的上下文向量$c$ 。
这种固定长度的上下文向量设计的一个关键而明显的缺点是无法记住长句子。通常,一旦完成了对整个输入的处理,便会忘记第一部分。注意力机制诞生了(Bahdanau et al,2015)来解决这个问题。
模型图 | 举例 |
二、Attention编码-解码机制
1.attention定义
attention是一种提升encoder-decoder模型效果的机制,一般称作attention mechanism。
(1)普通模式
用$X = [x_1, · · · , x_N]$表示$N$组输入信息,其中每个向量$x_i, i in [1, N]$都表示 一组输入信息。为了节省计算资源,不需要将所有信息都输入到神经网络,只需要从$X$中选择一些和任务相关的信息。注意力机制的计算可以分为两步:一是在所有输入信息上计算注意力分布,二是根据注意力分布来计算输入信息的加权平均。
注意力分布:为了从$N$个输入向量$[x_1, · · · , x_N]$中选择出和某个特定任务相关的 信息,我们需要引入一个和任务相关的表示,称为查询向量(Query Vector),并通过一个打分函数来计算每个输入向量和查询向量之间的相关性。
给定一个和任务相关的查询向量$q$,我们用注意力变量$z in [1, N]$来表示被选择信息的索引位置,即$z = i$表示选择了第$i$个输入向量。为了方便计算,我们采用一种“软性”的信息选择机制。首先计算在给定$q$和$X$下,选择第$i$个输入向量的概率$α_i$,
$egin{aligned} alpha_{i} &=p(z=i | X, mathbf{q}) \ &=operatorname{softmax}left(sleft(mathbf{x}_{i}, mathbf{q} ight) ight) \ &=frac{exp left(sleft(mathbf{x}_{i}, mathbf{q} ight) ight)}{sum_{j=1}^{N} exp left(sleft(mathbf{x}_{j}, mathbf{q} ight) ight)} end{aligned}$
其中$alpha_i$称为注意力分布(Attention Distribution),$s(x_i, q)$ 为注意力打分函数, 可以使用以下几种方式来计算:
- 加代模型 $quad sleft(mathbf{x}_{i}, mathbf{q} ight)=mathbf{v}^{mathrm{T}} anh left(W mathbf{x}_{i}+U mathbf{q} ight)$
- 点积模型 $quad sleft(mathbf{x}_{i}, mathbf{q} ight)=mathbf{x}_{i}^{mathrm{T}} mathbf{q}$
- 缩放点积模型 $quad sleft(mathbf{x}_{i}, mathbf{q} ight)=frac{mathbf{x}_{i}^{mathrm{T}} mathbf{q}}{sqrt{d}}$
- 双线性模型 $quad sleft(mathbf{x}_{i}, mathbf{q} ight)=mathbf{x}_{i}^{mathrm{T}} W mathbf{q}$
其中$W, U, v$为可学习的参数,$d$为输入向量的维度。理论上,加性模型和点积模型的复杂度差不多,但是点积模型在实现上可以更好地利用矩阵乘积,从而计算 效率更高。但当输入向量的维度 d 比较高,点积模型的值通常有比较大方差,从 而导致softmax函数的梯度会比较小。因此, 缩放点积模型可以较好地解决这个问题。双线性模型可以看做是一种泛化的点积模型。假设公式(8.5)中$W=U^{T}V$ ,双线性模型可以写为 $s(x_i, q) = x_i^{T}U^{T}Vq =(Ux)^{T}(Vq)$,即分别对$x$和$q$进行 线性变换后计算点积。相比点积模型,双线性模型在计算相似度时引入了非对称性。
加权平均:注意力分布$alpha_i$可以解释为在给定任务相关的查询$q$时,第$i$个输入向量受关注的程度。我们采用一种“软性”的信息选择机制对输入信息进行汇总,
$egin{aligned} operatorname{att}(X, mathbf{q}) &=sum_{i=1}^{N} alpha_{i} mathbf{x}_{i} \ &=mathbb{E}_{z sim p(z | X, mathbf{q})}left[mathbf{x}_{z} ight] end{aligned}$
(2)键值对模式
更一般地,我们可以用键值对(key-value pair)格式来表示输入信息,其中 “键”用来计算注意力分布αi,“值”用来计算聚合信息。
假设输入为 q,Memory 中以(k,v)形式存储需要的上下文。感觉在 Q&A 任务中,这种设置比较合理,Transformer 是采用的这种建模方式。k是question,v是answer,q是新来的question,看看历史memory中q和哪个k更相似,然后依葫芦画瓢,根据相似k对应的v,合成当前question的answer。
2.attention分类
按score函数不同分 | 按generate context vector函数分 |
|
(1)按score function分
解码器的输入是一个向量序列,长度为$m$。解码器位置$i$的输入是采用了attention机制的上下文向量$c_i$,不同位置的上下文向量不同。
通用模型图 |
|
(1)score function |
计算score有多种计算方法,其实本质就是度量两个向量的相似度。如果两个向量在同一个空间,那么可以使用 dot 点乘方式(或者 scaled dot product,scaled 背后的原因是为了减小数值,softmax 的梯度大一些,学得更快一些),简单好使。如果不在同一个空间,需要一些变换(在一个空间也可以变换),additive 对输入分别进行线性变换后然后相加,multiplicative 是直接通过矩阵乘法来变换。不同计算方法代表不同的attention模型$v_{alpha},W_{alpha}$为待学习的参数,$n$为向量的维度。 $$operatorname{score}left({mathbf{s}}_{i-1},{mathbf{h}}_{t} ight)=left{egin{array}{ll}frac{{mathbf{s}}_{i-1} cdot {mathbf{h}}_{t}}{left|{mathbf{s}}_{i-1} ight| imesleft|{mathbf{h}}_{t} ight|}, & ext { cosin } \{mathbf{s}}_{i-1} cdot {mathbf{h}}_{t}, & ext { dot } \ frac{s_{i-1} cdot {mathbf{h}}_{t}}{sqrt{n}}, & ext { scaled-dot } \ {mathbf{s}}_{i-1}^{T} mathbf{W}_{alpha} {mathbf{h}}_{t}, & ext { general } \ {mathbf{v}}_{alpha}^{T} anh left(mathbf{W}_{alpha}left[{mathbf{s}}_{i-1}: {mathbf{h}}_{t} ight] ight), & ext { concat / additive }end{array} ight.$$ |
(2)alignment function |
权重$alpha_{i,t}$刻画了:在对第$i$个输出进行解码时,第$t$个输入的重要程度。
计算权重的方法:首先计算$mathbf{s_{i-1}}$和$mathbf{h_t}$的相关性,然后对所有的$t=1,2,...,n$归一化即可得到权重系数。即:$e_{i,t}=operatorname{score}(mathbf{s_{i-1}},mathbf{h_t)}$,$alpha_{i,t}=frac{exp(e_{i,t})}{sum_{t'=1}^n{exp(e_{i,t'})}},t=1,2,...,n$
|
(3)generate context vector function |
上下文向量$c_i$由编码器的所有隐向量加权得到$c_i=sum^n_{t=1}{alpha_{i,t}h_t}$,其中$sum_{t=1}^n{alpha_{i,t}=1}$,$alpha_{i,t} geq 0$。 |
Additive Attention
|
(Additive Attention,又名 Bahdanau Attention) $$oldsymbol{h}_i = [overrightarrow{oldsymbol{h}}_i^ op; overleftarrow{oldsymbol{h}}_i^ op]^ op, i=1,dots,n$$ (1)score function $$ ext{score}(oldsymbol{s}_t, oldsymbol{h}_i) = mathbf{v}_a^ op anh(mathbf{W}_a[oldsymbol{s}_t; oldsymbol{h}_i])$$ (2)alignment function $$alpha_{t,i} = ext{align}(y_t, x_i) = frac{exp( ext{score}(oldsymbol{s}_{t-1}, oldsymbol{h}_i))}{sum_{i'=1}^n exp( ext{score}(oldsymbol{s}_{t-1}, oldsymbol{h}_{i'}))}$$ (3)generate context vector function $$mathbf{c}_t = sum_{i=1}^n alpha_{t,i} oldsymbol{h}_i$$ |
Content-base Attention | $$ ext{score}(oldsymbol{s}_t, oldsymbol{h}_i) = ext{cosine}[oldsymbol{s_t},oldsymbol{h}_i]$$ |
Location-base | $$ ext{score}(oldsymbol{s}_t, oldsymbol{h}_i) = ext{softmax}(mathbf{W}_a oldsymbol{s}_t)$$ |
General | $$ ext{score}(oldsymbol{s}_t, oldsymbol{h}_i) = oldsymbol{s}^T_t mathbf{W}_a oldsymbol{h}_i$$ |
Dot-Product Attention |
(1)score function 在memory中找相似:$e_i=a(q,k_i)$ (2)alignment function 计算attention权重,通常用softmax进行归一化:$alpha_i=softmax(e_i)$ (3)generate context vector function 根据attentionweight,得到输出向量:$c=sum_i alpha_i v_i$ |
Scaled Dot-Product | $$ ext{score}(oldsymbol{s}_t, oldsymbol{h}_i) = frac{oldsymbol{s}^T_t oldsymbol{h}_i}{sqrt{n}}$$ |
下图是Bahdanau Attention 和 Luong Attention的对比,这两个 Attention 就是整个 Attention 的奠基之作。
(2)按alignment function分
在 Soft Attention 中,又划分了 global/local attention(In this paper :《Effective Approaches to Attention-based Neural Machine Translation》)。
Global Attention | ||
global attention 是所有输入向量作为加权集合,使用 softmax 作为 alignment function。 | ||
Local Attention(半软半硬) |
$$egin{aligned} 其中${mathbf{v}}_{p}$,$mathbf{W}_{p}$为待学习的参数,$d$为人工指定的固定常量。 |
|
(1)为什么用Local? Basic Attention机制中在计算上下文向量$c_i$时,需要考虑编码器的所有隐向量(背后逻辑是要减小噪音,进一步缩小重点关注区域)。当输入序列较长时(如一段话或一篇文章),计算效率较低。Local Attention在计算上下文向量$c_i$时,只需要考虑编码器的部分隐变量:首选预测编码器端对齐的位置$p_i$,然后基于位置$p_i$选择一个窗口来计算上下文向量$c_i$。 (2)怎么用Local? 文中提了两个方案 local-m 和 local-p: local-m 基于的假设生硬简单,就直接 pass了。local-p 有一个预估操作,预计当前时刻应该关注输入序列(总长度为S)的什么位置 pt(引入了两个参数向量,vp,wp),然后在 alignment function 中做了一点儿调整,在 softmax 算出来的attention wieght 的基础上,加了一个以 pt 为中心的高斯分布来调整 alignment 的结果。 作者最后阐述 local-p + general(score-function 参考multiplicative attention 中的 general 版本)的方式效果是最好的。但从global/local 视角的分类来看,更常用的依然还是 global attention,因为复杂化的local attention 带来的效果增益感觉并不大。 |
虽然Local Attention可以提高计算效率,但是会带来两个问题: (1)编码器的输入序列长度$n$并不是很长时,计算量并没有显著减小。 (2)位置$p_i$的预测并不是非常准确,这就直接影响了计算attention的准确性。 从global/local 视角的分类来看,更常用的依然还是 global attention,因为复杂化的local attention 带来的效果增益感觉并不大。
|
(3)按generate context vector function分
《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》
Hard Attention | ||
hard attention 是一个随机采样,采样集合是输入向量的集合,采样的概率分布是alignment function 产出的 attention weight。因此,hard attention 的输出是某一个特定的输入向量。 | ||
Soft Attention | ||
soft attention 是一个带权求和的过程,求和集合是输入向量的集合,对应权重是 alignment function 产出的 attention weight。hard / soft attention 中,soft attention 是更常用的,因为它可导,可直接嵌入到模型中进行训练,hard attention 文中 suggests a Monte Carlo based sampling approximation of gradient。 |
3.attention的应用
3.1 Self-Attention
(1)为什么要Self-Attention?
可变长文本的向量表示方法一般有两种:
- Basic Combination:average,sum
- Neural Combination:RNN、CNN
RNN | CNN | |
特点 |
RNN 的长距离依赖比较 tricky:RNN 很强大(可以作为 encoder 对长度任意的序列进行特征抽取,基于特征抽取的能力可以胜任分类任务,另一方面可以作为Generators 学习 Language Model),其实核心就是长距离依赖(gate architectures - 线性操作让信息可以保持并流动,并选择性地让信息通过),可以对长度任意的序列进行表达,但是这种方式还是比较 tricky。并且这种序列建模方式,无法对具有层次结构的信息进行很好的表达。 RNN缺点: 并行化困难; 不能解决长距离依赖 |
CNN 在 NLP 中扮演了 n-gram 的 detector 角色,在层内可以并行。CNN works well,基于的假设是局部信息相互依赖。CNN 具有 Hierarchical Receptive Field,使得任意任意两个位置之间的长度距离是对数级别的。 CNN缺点: 长距离依赖需要很多层 |
模型图 |
|
|
所以有没有一种方法,能够做到既能又能还能?
- 相对于 CNN,要 constant path length 不要 logarithmic path length , 要 variable-sized perceptive field,不要固定 size 的 perceptive field;
- 相对于 RNN,考虑长距离依赖,还要可以并行!
这就是 self attention,下图可以看到 self-attention 和 convolution 有点儿神似,它摒弃了 CNN 的局部假设,想要寻找长距离的关联依赖。看下图就可以理解 self-attention 的这几个特点:
- constant path length & variable-sized perceptive field :任意两个位置(特指远距离)的关联不再需要通过 Hierarchical perceptive field 的方式,它的 perceptive field 是整个句子,所以任意两个位置建立关联是常数时间内的。
- parallelize : 没有了递归的限制,就像 CNN 一样可以在每一层内实现并行。
self-attention 借鉴 CNN中 multi-kernel 的思想,进一步进化成为 Multi-Head attention。每一个不同的 head 使用不同的线性变换,学习不同的 relationship。
(2)什么是Self-Attention?
self attention 计算三种 attention:
- 在encoder 端计算自身的 attention,捕捉input 之间的依赖关系。
- 在 decoder 端计算自身的 attention,捕捉output 之间的依赖关系。
- 将 encoder 端得到的 self attention 加入到 decoder 端得到的 attention中,捕捉输入序列的每个 input 和输出序列的每个 output 之间的依赖关系。
具体见transformer
(3)Multi-Head Attention
多头注意力(Multi-Head Attention)是利用多个查询$Q = [q_1, · · · , q_M]$,来
平行地计算从输入信息中选取多组信息。每个注意力关注输入信息的不同部分。
$operatorname{att}((K, V), Q)=operatorname{att}left((K, V), mathbf{q}_{1}
ight) oplus cdots oplus operatorname{att}left((K, V), mathbf{q}_{M}
ight)$
其中$oplus$表示向量拼接。
4. 其他Attention
4.1 Hierarchical Attention
《Hierarchical Attention Networks for Document Classification》,从 word attention 到 sentence attention
在之前介绍中,我们假设所有的输入信息是同等重要的,是一种扁平(Flat) 结构,注意力分布实际上是在所有输入信息上的多项分布。但如果输入信息本身具有层次(hierarchical)结构,比如文本可以分为词、句子、段落、篇章等不同粒度的层次,我们可以使用层次化的注意力来进行更好的信息选择[Yang et al., 2016]。
RNN 对序列建模,但是缺乏层次信息。而语言本身是具有层次结构,短语组成句子,句子组成篇章。因此研究者十分希望把语言中的这些层次结构在模型中得以体现,Hierarchical 的方式就出现了:从 word attention 到 sentence attention。
参考文献:
【1】深度学习和自然语言处理中的Attention和Memory机制 - 云+社区 - 腾讯云
【2】Attention and Memory in Deep Learning and NLP – WildML
【3】台大《应用深度学习》国语课程(2020) by 陈蕴侬_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
【4】huaxiaozhuan
【5】遍地开花的 Attention,你真的懂吗? - 知乎
【6】lkaiser.pdf
【7】Memory, attention, sequences - Towards Data Science
【8】一步步解析Attention is All You Need! - 简书