原文链接: https://blog.csdn.net/qq_41058526/article/details/80578932
attention 总结
参考:注意力机制(Attention Mechanism)在自然语言处理中的应用
Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射
,如下图。
在计算attention时主要分为三步:
- 第一步是将
query和每个key进行相似度计算得到权重
,常用的相似度函数有点积,拼接,感知机等; - 第二步一般是
使用一个softmax函数对这些权重进行归一化
; - 最后将
权重和相应的键值value进行加权求和得到最后的attention
。 - 目前在NLP研究中,key和value常常都是同一个,即key=value。
-
Attention在NLP中其实我觉得可以看成是一种自动加权,它可以把两个你想要联系起来的不同模块,通过加权的形式进行联系。目前
主流的计算公式
有以下几种:
通过设计一个函数将目标模块mt和源模块ms联系起来,然后通过一个soft函数将其归一化得到概率分布。 目前Attention在NLP中已经有广泛的应用。它有一个很大的优点就是可以可视化attention矩阵来告诉大家神经网络在进行任务时关注了哪些部分。不过在NLP中的attention机制和人类的attention机制还是有所区别,它基本还是需要
计算所有要处理的对象
,并额外用一个矩阵去存储其权重,其实增加了开销。而不是像人类一样可以忽略不想关注的部分,只去处理关注的部分。
一、传统encoder-decoder模型
encoder-decoder模型
也就是编码-解码模型。所谓编码,就是将输入序列转化成一个固定长度的向量;解码,就是将之前生成的固定向量再转化成输出序列。
具体实现的时候,编码器和解码器都不是固定的,可选的有CNN/RNN/BiRNN/GRU/LSTM等等,你可以*组合。比如说,你在编码时使用BiRNN,解码时使用RNN,或者在编码时使用RNN,解码时使用LSTM等等。
1.1 encoder
- 对于输入序列x=(x1,...,xTx)" role="presentation" style="position: relative;">x=(x1,...,xTx)x=(x1,...,xTx),其会将输入序列如图所示编码成一个context vector c ,encoder一般使用RNN,在RNN中,当前时间的隐藏状态是由上一时间的状态和当前时间输入决定的,也就是
ht=f(xt,ht−1)" role="presentation" style="position: relative;">ht=f(xt,ht−1)ht=f(xt,ht−1) - 获得了各个时间段的隐藏层以后,再将隐藏层的信息汇总,生成最后的语义向量 c,相当于把整个句子的信息都包含了,可以看成整个句子的一个语义表示。
c=q(ht,...,hTx)" role="presentation" style="position: relative;">c=q(ht,...,hTx)c=q(ht,...,hTx)
其中的f和q是非线性的函数
例如,在论文中有使用
q(ht,...,hTx)=hTx" role="presentation" style="position: relative;">q(ht,...,hTx)=hTxq(ht,...,hTx)=hTx
来简化计算
1.2 decoder
一般其作用为在给定context vector c和所有已预测的词{y1,...,yt−1}" role="presentation" style="position: relative;">{y1,...,yt−1}{y1,...,yt−1}去预测yt" role="presentation" style="position: relative;">ytyt,故t时刻翻译的结果y为以下的联合概率分布
-
在RNN中(如上图所示),t时刻隐藏状态st" role="presentation" style="position: relative;">stst为:
st=f(st−1,yt−1,c)" role="presentation" style="position: relative;">st=f(st−1,yt−1,c)st=f(st−1,yt−1,c)
-
而联合条件分布为:
p(y)=∏t=1Tp(yt|{y1,...,yt},c)=q(yt−1,st,c)" role="presentation">p(y)=∏t=1Tp(yt|{y1,...,yt},c)=q(yt−1,st,c)p(y)=∏t=1Tp(yt|{y1,...,yt},c)=q(yt−1,st,c)其中s是输出RNN中的隐藏层,C代表之前提过的语义向量,yt−1" role="presentation" style="position: relative;">yt−1yt−1表示上个时间段的输出,反过来作为这个时间段的输入。而q则可以是一个非线性的多层的神经网络,产生词典中各个词语属于yt" role="presentation" style="position: relative;">ytyt的概率。
1.3 存在问题:
使用传统编码器-解码器的RNN模型先用一些LSTM单元来对输入序列进行学习,编码为固定长度的向量表示;然后再用一些LSTM单元来读取这种向量表示并解码为输出序列。
采用这种结构的模型在许多比较难的序列预测问题(如文本翻译)上都取得了最好的结果,因此迅速成为了目前的主流方法。
这种结构在很多其他的领域上也取得了不错的结果。然而,它存在的一个问题在于:输入序列不论长短都会被编码成一个固定长度的向量表示,而解码则受限于该固定长度的向量表示。
这个问题限制了模型的性能,尤其是当输入序列比较长时,模型的性能会变得很差(在文本翻译任务上表现为待翻译的原始文本长度过长时翻译质量较差)。
“一个潜在的问题是,采用编码器-解码器结构的神经网络模型需要将输入序列中的必要信息表示为一个固定长度的向量,而当输入序列很长时则难以保留全部的必要信息(因为太多),尤其是当输入序列的长度比训练数据集中的更长时。”
二、加入attention
论文一:
参考博文:深度学习笔记(六):Encoder-Decoder模型和Attention模型
NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE
这篇论文中首次将attention用到了nlp领域,论文中提出了一个想法,目前机器翻译的瓶颈在于无论是多长的输入,大家的普遍做法都是将所有输入通过一些方法合并成一个固定长度的向量去表示这个句子,这会造成的问题是,如果句子很长,那么这样的方法去作为decoder的输入,效果并不会很好。
该论文提出的加入attention的模型:
相比于之前的encoder-decoder模型,attention模型最大的区别就在于它不在要求编码器将所有输入信息都编码进一个固定长度的向量之中。相反,此时编码器需要将输入编码成一个向量的序列,而在解码的时候,每一步都会选择性的从向量序列中挑选一个子集进行进一步处理。这样,在产生每一个输出的时候,都能够做到充分利用输入序列携带的信息。而且这种方法在翻译任务中取得了非常不错的成果。
1.1 编码(encoder)
此处并没有很多特殊,使用双向LSTM,第j个隐藏状态hj→" role="presentation" style="position: relative;">hj→hj→只能携带第j个单词本身以及之前的一些信息;而如果逆序输入,则hj←" role="presentation" style="position: relative;">hj←hj←包含第j个单词及之后的一些信息。如果把这两个结合起来,hj=[hj→,hj←]" role="presentation" style="position: relative;">hj=[hj→,hj←]hj=[hj→,hj←]就包含了第 j 个输入和前后的信息。
1.2 解码(decoder)
1.2.1 context vector c
解码过程与传统encoder-decoder模型相同,只不过context vector c
变为了ci" role="presentation" style="position: relative;">cici
其中的ci" role="presentation" style="position: relative;">cici是对每一个输入的{x1,...,xT}" role="presentation" style="position: relative;">{x1,...,xT}{x1,...,xT}encoder后的隐状态进行weighted sum(如上图所示)
ci=∑j=1Txaijhij" role="presentation" style="position: relative;">ci=∑Txj=1aijhijci=∑j=1Txaijhij
aij=exp(eij)∑k=1Txexp(eik)" role="presentation" style="position: relative;">aij=exp(eij)∑Txk=1exp(eik)aij=exp(eij)∑k=1Txexp(eik)
eij=a(sj−1,hi)" role="presentation" style="position: relative;">eij=a(sj−1,hi)eij=a(sj−1,hi)
- 注:hj" role="presentation" style="position: relative;">hjhj为encoder的隐状态,sj" role="presentation" style="position: relative;">sjsj为decoder的隐状态
aij" role="presentation" style="position: relative;">aijaij的值越高,表示第i个输出在第j个输入上分配的注意力越多,在生成第i个输出的时候受第j个输入的影响也就越大。
eij" role="presentation" style="position: relative;">eijeij :encoder i处隐状态和decoder j-1 处的隐状态的匹配 match,此处的 alignment model a 是和其他神经网络一起去训练(即 joint learning),其反映了hj" role="presentation" style="position: relative;">hjhj的重要性
1.2.2 其余部分
其余部分均与传统相同,y的联合概率分布
- 在RNN中(如上图所示),t时刻隐藏状态st" role="presentation" style="position: relative;">stst为:
st=f(st−1,yt−1,ci)" role="presentation" style="position: relative;">st=f(st−1,yt−1,ci)st=f(st−1,yt−1,ci)
1.3 注意力矩阵
之前已经提过,每个输出都有一个长为Tx的注意力向量,那么将这些向量合起来看,就是一个矩阵。对其进行可视化,得到如下结果
其中x轴表示待翻译的句子中的单词(英语),y轴表示翻译以后的句子中的单词(法语)。可以看到尽管从英语到法语的过程中,有些单词的顺序发生了变化,但是attention模型仍然很好的找到了合适的位置。换句话说,就是两种语言下的单词“对齐”了。因此,也有人把注意力模型叫做对齐(alignment)模型。而且像比于用语言学实现的硬对齐,这种基于概率的软对齐更加优雅,因为能够更全面的考虑到上下文的语境。
论文二、
Effective Approaches to Attention-based Neural Machine Translation
这篇论文的看点:扩展attention的计算方式
,还有就是局部的attention
方法
文中提出了两种注意力机制,global attention和local attention
- 1.global attention与论文一提到的模型很像,但做了简化
- 2.local attention是一种介于soft和hard attention之间的模型,他相对于global attention或者soft attention计算量更小,同时不像hard attention,local attention是可微分的
1.global attention
这和上一篇论文提出的attention的思路是一样的,它都是对源语言对所有词进行处理,不同的是在计算attention
矩阵值的时候,他提出了几种简单的扩展版本
。在他们最后的实验中general的计算方法效果是最好的。
对比论文一:
aij=exp(eij)∑k=1Txexp(eik)" role="presentation" style="position: relative;">aij=exp(eij)∑Txk=1exp(eik)aij=exp(eij)∑k=1Txexp(eik)
eij=a(sj−1,hi)=vaTtanh(Wasi−1+Uahj)" role="presentation" style="position: relative;">eij=a(sj−1,hi)=vTatanh(Wasi−1+Uahj)eij=a(sj−1,hi)=vaTtanh(Wasi−1+Uahj)
2.local attention
灵感来自于图像中的soft attention和hard attention,soft attention对于源图片中每一小块都进行权重的求和,计算较为费时,而hard attention则计算图像区域 a 在时刻 t 被选中作为输入decoder的信息的概率,有且仅有1个区域被选中,它不可微分,需更加复杂的处理。
local attention是一种介于soft和hard之间的方式,使用了一个人工经验设定的参数D去选择一个以pt" role="presentation" style="position: relative;">ptpt为中心,[pt−D,pt+D]" role="presentation" style="position: relative;">[pt−D,pt+D][pt−D,pt+D]为窗口的区域,进行对应向量的weighted sum,故不像global attention,local alignment vector at" role="presentation" style="position: relative;">atat的维数是固定的,不随输入序列长度变化而变化,它的维度固定为2D+1
此处使用了两种方法去选择pt" role="presentation" style="position: relative;">ptpt:
- 1.
单调对应(Monotonic alignment)
: 设定pt=t" role="presentation" style="position: relative;">pt=tpt=t - 2.
Predictive alignment
:- 使用ht" role="presentation" style="position: relative;">htht去预测pt" role="presentation" style="position: relative;">ptpt所在位置:
S为输入序列长度,此处保证了pt" role="presentation" style="position: relative;">ptpt一定落在输入序列内
vp,Wp" role="presentation" style="position: relative;">vp,Wpvp,Wp为权重矩阵
pt=S ∗sigmoid(vpTtanh(Wpht))" role="presentation" style="position: relative;">pt=S ∗sigmoid(vTptanh(Wpht))pt=S ∗sigmoid(vpTtanh(Wpht)) - 为了使得最后的
求和更加的偏好靠近位置
pt" role="presentation" style="position: relative;">ptpt附近的向量
,又在求和时加入了一个高斯函数,该函数u =pt" role="presentation" style="position: relative;">ptpt,使得pt" role="presentation" style="position: relative;">ptpt周围的向量得到的权重更大,(s即为一般公式中的x,pt" role="presentation" style="position: relative;">ptpt为u,pt" role="presentation" style="position: relative;">ptpt为高斯分布峰值)
at(s)=align(ht,hs′)exp(−(s−pt)22σ)" role="presentation" style="position: relative;">at(s)=align(ht,h′s)exp(−(s−pt)22σ)at(s)=align(ht,hs′)exp(−(s−pt)22σ)
此处依据经验σ=D2" role="presentation" style="position: relative;">σ=D2σ=D2
- 使用ht" role="presentation" style="position: relative;">htht去预测pt" role="presentation" style="position: relative;">ptpt所在位置:
3.模型具体实现
将隐状态ht" role="presentation" style="position: relative;">htht与ct" role="presentation" style="position: relative;">ctct进行拼接,产生输出
ht′=tanh(Wc[ct;ht])" role="presentation" style="position: relative;">h′t=tanh(Wc[ct;ht])ht′=tanh(Wc[ct;ht])
最后t时刻的输出
p(yt|y<t,x)=softmax(Wch′t)" role="presentation" style="position: relative;">p(yt|y<t,x)=softmax(Wch′t)p(yt|y<t,x)=softmax(Wch′t)
此处与论文一不同的点在于Input-feeding Approach
在机器翻译领域,都需要使用一个coverage set(覆盖集)去记录那些source words已经被翻译
- 论文一中使用的是ci" role="presentation" style="position: relative;">cici,其和上一个输出yi−1" role="presentation" style="position: relative;">yi−1yi−1,隐状态si−1" role="presentation" style="position: relative;">si−1si−1一起作为时间t的输入
- 本文中使用ht′" role="presentation" style="position: relative;">h′tht′作为输入,但是此处并未做对比试验比较两者的差别
4.结果比较
论文结果中,dot对于global更好,general对于local更好,-m表示Monotonic alignment,-p表示Predictive alignment
4.补充
关于soft attention和hard attention
1.Soft Attention Model
所谓Soft,意思是在求注意力分配概率分布的时候,对于输入句子X中任意一个单词都给出个概率,是个概率分布。
2.Hard Attention Model
既然Soft是给每个单词都赋予一个单词对齐概率,那么如果不这样做,直接从输入句子里面找到某个特定的单词,然后把目标句子单词和这个单词对齐,而其它输入句子中的单词硬性地认为对齐概率为0,这就是Hard Attention Model的思想。
Hard AM在图像里证明有用,但是估计在文本里面用处不大,因为这种单词一一对齐明显要求太高,如果对不齐对后续处理负面影响很大,所以你在NLP的文献里看不到用Hard AM的,估计大家都试过了,效果不好。
3.介于Soft 和Hard之间
Soft AM要求输入句子每个单词都要赋予单词对齐概率,Hard AM要求从输入句子中精确地找到一个单词来和输出单词对齐,那么可以放松Hard的条件,先找到Hard AM在输入句子中单词对齐的那个单词大致位置,然后以这个单词作为轴心,向左向右拓展出一个大小为D的窗口,在这个2D+1窗口内的单词内进行类似Soft AM的对齐概率计算即可。
论文三: ABCNN: Attention-Based Convolutional Neural Network for Modeling Sentence Pairs
这篇论文就提出了3中在CNN中使用attention的方法,是attention在CNN中较早的探索性工作。
- 传统的CNN在构建句对模型时如上图,通过每个单通道处理一个句子,然后学习句子表达,最后一起输入到分类器中。这样的模型在输入分类器前句对间是没有相互联系的,作者们就想通过设计
attention机制将不同cnn通道的句对联系起来
。 - 这篇文章介绍的是利用带注意力机制的卷积神经网络进行句子对建模。句子对建模是自然语言处理中的一个经典问题,在诸如答案选择(Answer Selection, AS)、 释义鉴定(Paraphrase Identification, PI)、文本继承(Textual Entailment, TE)等场景中都有应用。
- 之前的相关工作多局限于:
- (1) 设计针对特定场景的特定系统;
- (2) 对每个句子分开考虑,很少考虑句子之间的影响;
- (3) 依赖人工设计的繁杂特征。
- 该模型主要贡献有:
- (1) 可以应对多种场景的句子对建模问题,泛化能力强;
- (2) 利用注意力机制,在建模时考虑句子之间的影响;
- 之前的相关工作多局限于:
1.注意力机制
该论文提出了三种注意力机制
1.1 ABCNN-1
两个句子的向量表示s0,s1" role="presentation" style="position: relative;">s0,s1s0,s1进行match生成attention矩阵,在卷积之前
,加入attention矩阵,与表示矩阵s一起进行训练。
1.2 ABCNN-2
在卷积后
,对于卷积完成的两个矩阵,进行match,match后按照行和列的求和生成两个矩阵各自的权重,再使用权重对其进行
1.3 ABCNN-3
对于1和2的共同使用
2.效果(3>2>1)
本文提出了三种用于卷积神经网络的注意力机制来进行句子对建模,并在三个常见任务上达到了较好的效果,体现了方法的泛化能力。同时也作者也指出,在三个任务上,两层注意力网络并不会明显优于一层注意力网络,可能是由于相关数据集较小的原因。总的来说,在自然语言处理的相关任务上,卷积神经网络上的注意力机制研究相比长短时记忆网络(LSTM)来说还相对较少,本文是一个较为不错的实现方式。
论文四:attention is all you need
参考:一文读懂「Attention is All You Need」| 附代码实现
自然语言处理中的自注意力机制(Self-attention Mechanism)
这篇论文主要亮点在于:
- 1.不同于以往主流机器翻译使用基于RNN的seq2seq模型框架,该论文用attention机制代替了RNN搭建了整个模型框架。
- 2.提出了多头注意力(Multi-headed attention)机制方法,在编码器和解码器中大量的使用了多头自注意力机制(Multi-headed self-attention)。
- 3.在WMT2014语料中的英德和英法任务上取得了先进结果,并且训练速度比主流模型更快。