详解注意力(Attention)机制
注意力机制在使用encoder-decoder结构进行神经机器翻译(NMT)的过程中被提出来,并且迅速的被应用到相似的任务上,比如根据图片生成一段描述性语句、梗概一段文字的内容。从一个高的层次看,允许decoder从多个上下文向量(context vector)中选取需要的部分,使得Encoder从只能将上下文信息压缩到固定长度的向量中这个束缚中解放出来,进而可以表示更多的信息。
目前,注意力机制在深度学习模型中十分常见,而不仅限于encoder-decoder层次结构中。值得一提的是,注意力机制可以仅应用在encoder上,以解决诸如文本分类或者表示学习的任务上。这种注意力机制的应用被称为自聚焦或者内部聚焦机制。
下面我们从神经机器学习(NMT)使用的encoder-decoder结构开始介绍聚焦机制,之后我们会介绍自聚焦机制。
1.1 Encoder-decoder聚焦机制
1.1.1 Encoder-decoder的简介
从一个抽象的层次上看,encoder将输入压缩成一个高维的上下文向量,而decoder则可以从这个上下文向量中产生输出。
在神经机器翻译(NMT)中,输入和输出都是单词的序列,分别表示为x=(x1,...,xTx)x = (x_1, ..., x_{T_x})x=(x1,...,xTx)和y=(y1,...,yTy)y=(y_1, ..., y_{T_y})y=(y1,...,yTy),xxx和yyy称为源句(source sentence)和目标句(target sentence)。当输入和输出都是句子序列时,这样的encoder-decoder结构也被成为是seq2seq模型。由于encoder-decoder结构处处可微的性质,模型中的参数集θ\thetaθ的最优解等效于在整个语料库上计算似然函数的最大值(MLE),这种训练的方式成为端到端(end-to-end)
argmaxθ{ ∑(x,y)∈corpuslogP(y∣x;θ)}argmax_\theta\{\sum _{(x,y)\in corpus} logP(y|x;\theta)\}argmaxθ{ (x,y)∈corpus∑logP(y∣x;θ)}
这里我们想要最大化的函数是预测正确单词的概率的对数。
1.1.2 Encoder
我们有很多种方法对源句子做嵌入(embedding),比如CNN、全连接等等。在机器翻译中通常使用深度RNN来实现。[论文][1]论文中首次使用了双向RNN,这个模型由两个深度RNN组成,除了使用的词嵌入矩阵之外的所有参数都不一样。第一个RNN从左到右处理输入的句子序列,而另外一个RNN从右到左处理输入的句子序列。得到的两个句子Embedding在RNN处理的每一步都合并成一个双向RNN的内部表示:ht=[ht⃗;ht←]h_t = [\vec {h_t};\overleftarrow{h_t}]ht=[ht;ht]
双向RNN在对source words进行编码时考虑了整个上下文的信息,而不仅仅是之前的信息。其结果是,hth_tht依赖于以某个词xtx_txt为中心的窗口的上下文,而单向的RNN下的hth_tht则依赖于单词xtx_txt及其之前出现的词汇。聚焦于xtx_txt附近的小窗口可能存在一些优势,但不一定是决定性的。事实上,Luong使用双向RNN获得了最高水平的结果。在下面的段落中,encoder的隐藏状态(hidden state)表示为ht⃗\vec {h_t}ht,也常称为annotations。
1.1.3 Decoder
与encoder可以使用不同的模型不同,神经机器学习中decoder通常只使用单向RNN(unidirectional RNN),这是因为常识下文本生成的过程也是单向的。decoder每一次生成一个新的词汇。
关键点 :让decoder只使用encoder的最近的annotation hTxh_{T_x}hTx促使encoder尽可能将信息压缩到hTxh_{T_x}hTx中。因为hTxh_{T_x}hTx是一个固定形状的向量,它能携带的信息是有限的,所有这个表示方法会丢失部分的信息。我们可以让decoder关注encoder的所有step产生的annotation hTih_{T_i}hTi的集合(h1,...,hTx)(h_1, ..., h_{T_x})(h1,...,hTx)来起到关注整个句子序列的目的。这样做的结果是encoder可以通过调整annotations的分布来保存更多的信息,而decoder能够决定哪一个step的annotation需要进行聚焦。
更加准确的说,目标句子y=(y1,...,yTy)y = (y_1, ..., y_{T_y})y=(y1,...,yT