1-Attention

1 Attention机制

​ 注意力机制,顾名思义,它的主要作用是让神经网络把“注意力”放在一部分输入上,即:区分输入的不同部分对输出的影响。

1.1 Encoder-Decoder框架

​ 在学习Attention之前,不得不先谈下Encoder-Decoder框架,因为目前大多数注意力模型附着在Encoder-Decoder框架下,当然,其实注意力模型可以看作一种通用的思想,本身并不依赖于特定框架,这点需要注意。
​ Encoder-Decoder框架可以看作是一种深度学习领域的研究模式,应用场景异常广泛。下图是文本处理领域里常用的Encoder-Decoder框架最抽象的一种表示。

encoder_decoder 图1 encoder-decoder抽象表示

​ 文本处理领域的Encoder-Decoder框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对<Source,Target>,我们的目标是给定输入句子Source,期待通过Encoder-Decoder框架来生成目标句子Target。Source和Target可以是同一种语言,也可以是两种不同的语言。而Source和Target分别由各自的单词序列构成:

image-20210329162952057

​ Encoder顾名思义就是对输入句子Source进行编码,将输入句子通过非线性变换转化为中间语义表示C:

image-20210329163606124

​ 对于解码器Decoder来说,其任务是根据句子Source的中间语义表示C和之前已经生成的历史信息y1,y2,…,yi-1来生成i时刻要生成的单词yi:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZUiJkwpg-1618551519672)(https://raw.githubusercontent.com/mazhihao1122/imageBed/main/image-20210329163632962.png)]

​ 每个yi都依次这么产生,那么看起来就是整个系统根据输入句子Source生成了目标句子Target。
如果Source是中文句子,Target是英文句子,那么这就是解决机器翻译问题的Encoder-Decoder框架;如果Source是一篇文章,Target是概括性的几句描述语句,那么这是文本摘要的Encoder-Decoder框架;如果Source是一句问句,Target是一句回答,那么这是问答系统或者对话机器人的Encoder-Decoder框架。由此可见,在文本处理领域,Encoder-Decoder的应用领域相当广泛。
Encoder-Decoder框架的弊端
​ 编码器-解码器模型虽然非常经典,但是局限性也很大。最大的局限性是编码器和解码器之间唯一的联系是一个固定长度的语义向量C。也就是说,编码器要将整个序列的信息压缩成一个固定长度的向量。它存在三个弊端:

  1. 对于编码器来说,语义向量C可能无法完全表示整个序列的信息。
  2. 对于编码器来说,先输入到网络的序列携带的信息可能会被后输入的序列覆盖掉,输入的序列越长,这种现象就越严重。
  3. 对于解码器来说,在解码的时候,对于输入的每个单词的权重是一致的。

​ 以上三个弊端使得在解码的时候解码器一开始可能就没有获得输入序列足够多的信息,自然解码的准确率也就不高。所以,在NMT(Neural Machine Translation,神经机器翻译)任务上,还添加了attention的机制。

1.2 Attention模型

​ 本节先以机器翻译作为例子讲解最常见的Soft Attention模型的基本原理,之后抛离Encoder-Decoder框架抽象出了注意力机制的本质思想。

Soft Attention模型

​ 图2展示的Encoder-Decoder框架没有体现出“注意力模型”,所以可以看作是注意力不集中的分心模型。观察下Target句子中每个单词的生成过程就知道了:

image-20210329170722039

​ 其中f是Decoder的非线性变换函数,可以看出,在生成目标句子的每一个单词时,用到的输入句子Source的语义编码C都是一样的。而语义编码C是由句子Source的每个单词经过Encoder 编码产生的,这意味着不论是生成哪个单词,y1,y2还是y3,其实句子Source中任意单词对生成某个目标单词yi来说影响力都是相同的,这是为何说这个模型没有体现出注意力的缘由。
​ 用机器翻译的例子来解释下分心模型,如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。在翻译“杰瑞”时,分心模型中的每个英文单词对于翻译目标单词“杰瑞”的贡献是相同的,这就不太合理了,显然“Jerry”对翻译成“杰瑞”更重要。
​ 没有引入注意力的模型在输入句子比较短的时候问题不大,但是如果输入句子比较长,此时Source序列的全部内容完全压缩成一个固定大小的中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息,这是Seq-to-Seq模型的主要瓶颈,这也是为何要引入注意力模型的重要原因
​ 上面的例子中,如果引入Attention模型的话,应该在翻译“杰瑞”的时候,体现出英文单词对于翻译成当前中文单词不同的影响程度,比如给出类似下面一个概率分布值:
(Tom,0.3)(Chase,0.2) (Jerry,0.5),每个英文单词的概率代表了翻译当前单词“杰瑞”时,注意力模型分配给不同英文单词的注意力大小。这对于正确翻译目标单词肯定是有帮助的,因为引入了新的信息。
​ 同理,目标句子中的每个单词都应该学会其对应的源语句子中单词的注意力分配概率信息。这意味着在生成每个单词yi的时候,原先都是相同的中间语义表示C会被替换成根据当前生成单词而不断变化的Ci。理解Attention模型的关键就是这里,即由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的Ci。增加了注意力模型的Encoder-Decoder框架理解起来如图3所示。

image-20210330113021330

​ 图3 引入Attention模型的Encoder-Decoder框架
​ 生成target句子中的单词的过程改为了下面的形式,即在decoder阶段解码一个token的时候,会使用不同的中间变量:

image-20210330114431345

而每个Ci可能对应着不同的Source句子单词的注意力分配概率分布,比如对于上面的英汉翻译来说,其对应的信息可能如下:

image-20210330125603564

其中,f2函数代表Encoder对输入英文单词的某种变换函数,比如如果Encoder是用的RNN模型的话,这个f2函数的结果往往是某个时刻输入xi后隐层节点的状态值;g代表Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,一般的做法中,g函数就是对构成元素加权求和,即下列公式:

image-20210330125728607

其中,Lx代表输入句子Source的长度,aij代表在Target输出第i个单词时Source输入句子中第j个单词的注意力分配系数,而hj则是Source输入句子中第j个单词的语义编码,假设Ci下标i就是上面例子所说的“ 汤姆” ,那么Lx就是3,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”)分别是输入句子每个单词的语义编码,对应的注意力模型权值则分别是0.6,0.2,0.2,所以g函数本质上就是个加权求和函数。如果形象表示的话,翻译中文单词“汤姆”的时候,数学公式对应的中间语义表示Ci的形成过程类似图4。

image-20210330130251227

​ 图4 Attention的形成过程
​ 还有一个问题,在生成Target句子中某个单词时,如“汤姆”的时候,如何知道Attention模型所需要的Source句子单词注意力分配概率呢,即上面所说的“汤姆”对应的输入句子Source中各个单词的概率分布:(Tom,0.6)(Chase,0.2) (Jerry,0.2) 是如何得到的呢?
为了便于说明,假设对图1的非Attentino模型的Encoder-Decoder框架进行细化,Encoder采用RNN模型,Decoder也采用RNN模型,是比较常见的一种模型配置,则图1的框架转换为图5。

image-20210330131651328 图5 RNN作为具体模型的Encoder-Decoder框架 那么下图可以方便的说明注意力分配概率分布值的通用计算过程。 image-20210330131815190 图6 注意力分配概率计算 对于采用RNN的Decoder来说,在时刻i,如果要生成yi单词,我们是可以知道Target在生成yi之前的时刻i-1时,decoder hidden state Hi-1的,而我们的目的是要计算生成yi时输入句子中的单词“Tom”、“Chase”、“Jerry”对yi的贡献度(权重),那么 可以通过F(hj,Hi-1)函数,计算i-1时刻decoder 隐藏状态Hi-1和输入句子Source中每个单词对应的隐层状态hj的分数,这个F函数在不同论文里可能会采取不同的方法(如点乘操作),然后函数F的输出经过Softmax进行归一化就得到了decoder当前token时,Source中不同token的权重。 一个动图理解下在时刻4的Attention和Ci的计算步骤:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tw7n8aTF-1618551519685)(https://raw.githubusercontent.com/mazhihao1122/imageBed/main/attention%E5%8A%A8%E5%9B%BE.gif)]

​ h1、h2、h3分别是在时刻=4时,Source中token1、token2、token3对应的Encoder阶段的hidden state,分别将h1、h2、h3与decoder阶段时刻=3时(4-1)的hidden state相乘(如果是在decode Target中的第一个token,则需要随机初始化一个hidden state),最后得到3个分数值,病进行softmax计算,得到的就是Source中三个token对decode当前Target token时的权重,把权重和h1、h2、h3分别加权和,得到的向量就是decode当前 token时Encoder输出的中间语义表示C4。
​ 知道了Ci的计算步骤,接下来就是Decoder阶段了,即通过下面的步骤进行计算:

image-20210330114431345

​ 在decode第一个token y1时,要先随机初始化一个C1;然后decode第二个token y2,此时可以按照上面的方法计算得到C2,并把上一个decode的输出y1和C2一起作为输入来decode y2。重复以上步骤,直到decode得到所有输出。

1.3 Attention机制的本质思想

​ 如果把Attention机制从上文讲述例子中的Encoder-Decoder框架中剥离,并进一步做抽象,可以更容易看懂Attention机制的本质思想。

image-20210330132958460 图9 Attention机制的本质思想 本质思想:将Source中的构成元素想象成是由一系列的

​ 图10 三阶段计算Attention过程
在第一个阶段,可以引入不同的函数和计算机制,根据Query和某个Key,计算两者的相似性/相关性,最常见的方法:求两者的向量点积,求两者的向量Cosine相似性或者通过再引入额外的神经网络来求值,即如下方式:

image-20210331161352592

第一阶段产生的分值根据具体产生的方法不同其数值取值范围也不一样,第二阶段引入类似SoftMax的计算方式对第一阶段的得分进行数值转换,一方面可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面也可以通过SoftMax的内在机制更加突出重要元素的权重。即一般采用如下公式计算:

image-20210331170800524

ai即为Valuei对应的权重系数,然后进行加权求和即可得到Attention的值:

image-20210331170923045

通过如上三个阶段的计算,即可求出针对Query的Attention数值,目前绝大多数具体的注意力机制计算方法都符合上述的三阶段抽象计算过程。
image-20210331170923045" style=“zoom:67%;” />

通过如上三个阶段的计算,即可求出针对Query的Attention数值,目前绝大多数具体的注意力机制计算方法都符合上述的三阶段抽象计算过程。
参考https://blog.csdn.net/jiaowoshouzi/article/details/89073944

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值