注意力机制(attention)学习记录
Posted 彭祥.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注意力机制(attention)学习记录相关的知识,希望对你有一定的参考价值。
前面曾经记录过注意力机制的学习过程,今天则是在学习的过程中对其有了其他的理解,便将其记录下来。
Attention Model 概述
深度学习里的Attention model其实模拟的是人脑的注意力模型,举个例子来说,当我们观赏一幅画时,虽然我们可以看到整幅画的全貌,但是在我们深入仔细地观察时,其实眼睛聚焦的就只有很小的一块,这个时候人的大脑主要关注在这一小块图案上,也就是说这个时候人脑对整幅图的关注并不是均衡的,是有一定的权重区分的。这就是深度学习里的Attention Model的核心思想。
Encoder-Decoder框架
在之前的学习中我们便引用了Encoder-Decoder这个模型,它用来解释这个例子是很合适的。
所谓encoder-decoder模型,又叫做编码-解码模型。这是一种应用于seq2seq问题的模型。seq2seq问题简单的说,就是根据一个输入序列x,来生成另一个输出序列y。常见的应用有机器翻译,文档提取,问答系统等。Encoder-Decoder模型中的编码,就是将输入序列转化成一个固定长度的向量;解码,就是将之前生成的固定向量再转化成输出序列。
Encoder-Decoder(编码-解码)是深度学习中非常常见的一个模型框架,比如无监督算法的auto-encoding就是用编码-解码的结构设计并训练的;比如这两年比较热的image caption的应用,就是CNN-RNN的编码-解码框架;再比如神经网络机器翻译NMT模型,往往就是LSTM-LSTM的编码-解码框架。因此,准确的说,Encoder-Decoder并不是一个具体的模型,而是一类框架。Encoder和Decoder部分可以是任意的文字,语音,图像,视频数据,模型可以采用CNN,RNN,BiRNN、LSTM、GRU等等。所以基于Encoder-Decoder,我们可以设计出各种各样的应用算法。
Encoder-Decoder框架可以看作是一种文本处理领域的研究模式,应用场景异常广泛,下图是文本处理领域里常用的Encoder-Decoder框架最抽象的一种表示:
对于句子对<X,Y>,我们的目标是给定输入句子X,期待通过Encoder-Decoder框架来生成目标句子Y。X和Y可以是同一种语言,也可以是两种不同的语言。而X和Y分别由各自的单词序列构成:
Encoder顾名思义就是对输入句子X进行编码,将输入句子通过非线性变换转化为中间语义表示C:
对于解码器Decoder来说,其任务是根据句子X的中间语义表示C和之前已经生成的历史信息y1, y2….yi-1来生成i时刻要生成的单词yi
但是Encoder-Decoder框架会有一个明显的缺点,Encoder会把输入句子X编码为一个固定长度的隐向量(语义编码c),会导致隐向量无法完全表示输入句子X的信息。可以从两个方面理解,1.隐向量的大小有限,无法表示语义丰富的句子,2.由于RNN类网络特点,网络会更加看中句子后面的信息,无法总揽全局。
最简单的解决思路就是把所有RNNcell的输出组合起来使用,而不只使用最后一个RNNcell的输出,这个可以做到充分利用句子信息,可以一定程度解决问题。但是一般越明确的网络学习目标可以获得越好的效果,如果可以获得每个RNNcell的输出的权重来加权编码,就可以更加明确学习目标提升学习效果。AttentionModel的思路就是如此。
如何设计网络,进行加权操作,并且使用合理的loss就是Attention Model的重难点,也是我们要学习理解的内容了。请继续往下看。
Attention Model
在Encoder-Decoder框架中,在预测每一个encode时对应的语义编码c都是一样的,也就意味着无论句子X中的每个单词对输出Y中的每一个单词的影响都是相同的。这样就会产生两个弊端:一是语义向量无法完全表示整个序列的信息,再者就是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了。输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有获得输入序列足够的信息, 那么解码的准确度自然也就要打个折扣了。
为了解决上面的弊端,就需要用到我们的Attention Model(注意力模型)来解决该问题。在机器翻译的时候,让生成词不是只能关注全局的语义编码向量c,而是增加了一个“注意力范围”,表示接下来输出词时候要重点关注输入序列中的哪些部分,然后根据关注的区域来产生下一个输出。模型结构如下:
此时生成目标句子单词的过程就成了下面的形式:
比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。在没加入Attention Model之前,生成的语义编码C是一致的,而加入之后,对应的语义编码可能如下:
上面的式子即下面的过程:hi作为每个cell(输入值)的输出。ai为对应的权重
其中,f2函数代表Encoder对输入英文单词的某种变换函数,比如如果Encoder是用的RNN模型的话,这个f2函数的结果往往是某个时刻输入xi后隐层节点的状态值;g代表Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,一般的做法中,g函数就是对构成元素加权求和,也就是常常在论文里看到的下列公式:
假设Ci中那个i就是上面的“汤姆”,那么Tx就是3(Tx代表的是编码器隐层输出的个数
),代表输入句子的长度,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”),对应的注意力模型权值分别是0.6, 0.2, 0.2,所以g函数就是个加权求和函数。如果形象表示的话,翻译中文单词“汤姆”的时候,数学公式对应的中间语义表示Ci的形成过程类似下图:
这里还有一个问题:生成目标句子某个单词,比如“汤姆”的时候,你怎么知道AM模型所需要的输入句子单词注意力分配概率分布值呢?就是说“汤姆”对应的概率分布:
即我们如何来计算我们的权重值:
此时的Encoder和Decoder都采用RNN模型,我们来看看现在的Encoder-Decoder模型结构:
用下图可以较为便捷地说明注意力分配概率分布值的通用计算过程:
对于采用RNN的Decoder来说,如果要生成Yi单词,在时刻t = i,我们是可以知道在生成Yi之前的隐层节点t = i时刻的输出值Hi的,而我们的目的是要计算生成Yi时的输入句子单词“Tom”、“Chase”、“Jerry”对Yi来说的注意力分配概率分布,那么可以用t = i时刻的隐层节点状态Hi去一一和输入句子中每个单词对应的RNN隐层节点状态hj进行对比,即通过函数F(hj, Hi)来获得目标单词Yi和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。绝大多数AM模型都是采取上述的计算框架来计算注意力分配概率分布信息,区别只是在F的定义上可能有所不同。
上述中提出的解决方法是对于每一个Decoder输出都加权Encoder的信息,以Tom chase Jerry,Encoder-Decoder “汤姆”,“追逐”,“杰瑞”为例子,不计算起止符号,输出为3个单元,输入为3个单元。有时输入单元与输出数目会不一致,这里我们假设输入为X,m个,输出为Y,n个。对于每个yj都会综合所有x的信息共m个,同时m个X的信息权重之和为1(因为每个yj由X决定)。一共有n个y,所以有n组,n*m个权重要计算。
论文中模型简述
在上面公式中 hj 是Encoder层的隐层第 j 时刻的输出,si−1 是Decoder层第 i−1 时刻隐层的输出。可以发现在计算 ci 的模型实际上是一个线性模型,而且 ci 事实上是Encoder层中各时刻隐层的输出的加权平均值。
Decoder层:采用了单向的RNN模型,第 i 时刻的隐层的输出是 si 。第 i 时刻的输出和 si,yi−1,ci 有关
因此引入Attention 机制,在机器翻译中,模型会自己去学得在不同时刻不同的权重系数 aij 。
1.通过使用softMax来归一化权重
2.由此公式可以得出是通过add方法,更准确的说是sum
3.权重表示是使用此公式,eij是重点,hj 是Encoder层的隐层第 j 时刻的输出,si−1 是Decoder层第 i−1 时刻隐层的输出,a是一种变换方式可以把hj与si-1数据组合利用并获得一个标量这个标量表示了hj与si-1的关联度,从而进行softmax操作。a是如何变换的还需要继续往下看。
4…权重如何优化,只要把权重表示好,使得网络可以通过前向传播,使用Encoder-Decoder框架的loss就可以把权重与其他网络参数优化好。
以下为总结:
Self Attention模型
通过上述对Attention本质思想的梳理,我们可以更容易理解本节介绍的Self Attention模型。Self Attention也经常被称为intra Attention(内部Attention),最近一年也获得了比较广泛的使用,比如Google最新的机器翻译模型内部大量采用了Self Attention模型。
在一般任务的Encoder-Decoder框架中,输入Source和输出Target内容是不一样的,比如对于英-中机器翻译来说,Source是英文句子,Target是对应的翻译出的中文句子,Attention机制发生在Target的元素Query和Source中的所有元素之间。而Self Attention顾名思义,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力计算机制。其具体计算过程是一样的,只是计算对象发生了变化而已,所以此处不再赘述其计算过程细节。
如果是常规的Target不等于Source情形下的注意力计算,其物理含义正如上文所讲,比如对于机器翻译来说,本质上是目标语单词和源语单词之间的一种单词对齐机制。那么如果是Self Attention机制,一个很自然的问题是:通过Self Attention到底学到了哪些规律或者抽取出了哪些特征呢?或者说引入Self Attention有什么增益或者好处呢?我们仍然以机器翻译中的Self Attention来说明,图11和图12是可视化地表示Self Attention在同一个英语句子内单词间产生的联系。
从两张图(图11、图12)可以看出,Self Attention可以捕获同一个句子中单词之间的一些句法特征(比如图11展示的有一定距离的短语结构)或者语义特征(比如图12展示的its的指代对象Law)。
很明显,引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。
但是Self Attention在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。除此外,Self Attention对于增加计算的并行性也有直接帮助作用。这是为何Self Attention逐渐被广泛使用的主要原因。
Self Attention其实就是把让Value充当Query,用来表示某个单词自身与此句子其他单词的关联权重。作用可以增强句子中长距离的依赖关系(这就解决了RNN的通病,长时间依赖问题)。
以上是关于注意力机制(attention)学习记录的主要内容,如果未能解决你的问题,请参考以下文章
Attention使用注意力机制的seq2seq 动手学深度学习v2