Attention机制

        注意机制最早由Bahdanau等人于2014年提出(统计机器翻译中的对齐过程[NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE, Bahdanau D et al. 2014]),该机制存在的目的是为了解决RNN中只支持固定长度输入的瓶颈(as sentences grow longer, the amount of information needing to be carried forward will also grow, and therefore a fixed size embedding may be insufficient)。论文作者提出了一个用于翻译任务的结构,Seq2Seq中的编码器被替换为一个双向循环网络BiRNN(bidirectional RNN),解码部分使用了attention模型。

        Attention Mechanism广泛应用于机器翻译、语音识别、图像标注(Image Caption)等很多领域,因为Attention给模型赋予了区分辨别的能力,例如,在机器翻译、语音识别应用中,为句子中的每个词赋予不同的权重,使神经网络模型的学习变得更加灵活(soft),同时Attention本身可以做为一种对齐关系,解释翻译输入/输出句子之间的对齐关系,解释模型到底学到了什么知识,为我们打开深度学习的黑箱。

        在注意机制中,我们的源序列x=(x1,x2,…,xt)分别被正向与反向地输入了模型中,进而得到了正反两层隐节点,语境向量c则由RNN中的隐节点h通过不同的权重a加权而成。简单的说,这种模型在产生输出的时候,还会产生一个“注意力范围”表示接下来输出的时候要重点关注输入序列中的哪些部分,然后根据关注的区域来产生下一个输出,如此往复。

Attention机制统一示意图

此处输入图片的描述

Note: 图中的ci就是x1-x4的编码向量的某种加权平均而来,而其中的权重就是所谓的各种attention。

        相比于之前的encoder-decoder模型[深度学习:Seq2seq模型],attention模型最大的区别就在于它不在要求编码器将所有输入信息都编码进一个固定长度的向量之中。相反,此时编码器需要将输入编码成一个向量的序列,而在解码的时候,每一步都会选择性的从向量序列中挑选一个子集进行进一步处理。这样,在产生每一个输出的时候,都能够做到充分利用输入序列携带的信息。

Bahdanau Attention模型

[NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE, Bahdanau D et al. 2014]论文中的attention机制解析:

解码decoder

       解码部分使用了attention模型。attention思想就是根据当前解码“状态”判断输入序列的权重分布:(解码隐层)s_i-1先跟每个(编码隐层)h_j分别计算得到一个数值e_ij,然后使用softmax得到i时刻的输出在T_x个(编码)输入隐藏状态中的注意力分配向量a_ij(也就是计算ci的权重)。后面再根据这个attention权重算每次输出前的c_i,再算解码隐藏层s_i,最后算出输出y_i。

将seq2seq模型中定义的条件概率写作

 具体算法公式

 

示意图

QQ截图20161015223332.jpg-20.6kB

Note:
1 eij表示一个对齐模型,用于衡量encoder端的位置j个词,对于decoder端的位置i个词的对齐程度(影响程度),换句话说:decoder端生成位置i的词时,有多少程度受encoder端的位置j的词影响。 这里用的是最经典的加性注意力additive attention机制 (Bahdanau et al., 2015)。additive attention在 d_k 很小的时候和dot-product结果相似,在d_k大的时候,如果不进行缩放则表现更好。但dot-product的计算速度更快,进行缩放后可减少影响。

2 权重αij的值越高,表示第i个输出在第j个输入上分配的注意力越多,在生成第i个输出的时候受第j个输入的影响也就越大。

3 这里的条件概率与每个目标输出yi相对应的内容向量ci有关,而在传统的方式中,只有一个内容向量C。内容向量ci是由编码时的所有encoder中的(而不只是最后一个隐层C了)隐藏向量序列按权重相加得到的。

4 公式中f的具体形式是,即GRU模型[Cho et al. (2014a).]。

当然也可以用其它的比如r-net中的门限注意力,即等形式。

5 输出y_i的计算公式:

This can be understood as having a deep output (Pascanu et al., 2014) with a single maxout hidden layer (Goodfellow et al., 2013)

复杂度分析:对于解码O(m)的每一步:第1步中有O(n)次attention,第2步一次softmax,第3步O(n)次加和。 

attention模型的图解(也叫soft attention)

其中 alpha_0^1 是 h_0^1对应的权重,算出所有权重后会进行softmax和加权,得到 c^0 。decoding阶使用attention的输出结果c^0,c^1作为rnn的输入(或者说前一轮输出+c_i当成输入来说也成吧)。

Attention机制的KQV表达

如果把attention剥离出来去看的话,其实是以下的机制:

输入是query(Q), key(K), value(V),输出是attention value。

如果与之前的模型对应起来的话,query就是decoder的隐层(如 zi或者si) ,key就是encoder的隐层(如 hi ),value也是encoder的隐层。模型通过Q和K的匹配计算出权重,再结合V得到输出。因此attention可由以下方式表示:

这种机制其实做的是寻址(addressing),模仿中央处理器与存储交互的方式将存储的内容读出来[李宏毅课程]。

编码encoder

编码就比较普通了,只是传统的单向的RNN中,数据是按顺序输入的,因此第j个隐藏状态hj只能携带第j个单词本身以及之前的一些信息;而如果逆序输入,则hj包含第j个单词及之后的一些信息。如果把这两个结合起来,hj=[hj,hj]就包含了第j个输入和前后的信息。

Nallapati Attention模型

[Abstractive Text Summarization using Sequence-to-sequence RNNs and
Beyond Nallapati et al. (2016)]论文中的attention机制:

解码decoder具体算法公式

[Get To The Point: Summarization with Pointer-Generator Networks]论文中的[base model]。

编码encoder

一般用双向lstm。

主流的attention方法

      attention表示源端与目标的对齐程度,计算attention的函数即解码里的a(s,h)的几种常见的计算方式:

[目前主流的attention方法都有哪些?]

其它改进的attention方法参考[线性Attention的探索:Attention必须有个Softmax吗?]

[A Family of Attention Mechanisms]

Note:

1 加性模型又称concat。

2 权值网络映射又称General或者双线性模型。

2 d_k大的时候,如果不进行缩放则加性模型表现更好;但dot-product的计算速度更快,进行缩放后可减少影响(由于softmax使梯度过小)。[深度学习:transformer模型]

Attention Mechanism的变型

3.1 Soft/Hard Attention

两种Attention Mechanism都有各自的优势,但目前更多的研究和应用还是更倾向于使用Soft Attention,因为其可以直接求导,进行梯度反向传播。

alignment/soft_align_attention

soft attention:传统attention,可被嵌入到模型中去进行训练并传播梯度。

ESIM模型计算句子蕴含关系时的local inference 之前需要将两句话进行 alignment,就是使用 soft_align_attention。

怎么做呢,首先计算两个句子 word 之间的相似度,得到2维的相似度矩阵,这里会用到 torch.matmul。

然后才进行两句话的 local inference。用之前得到的相似度矩阵,结合 a,b 两句话,互相生成彼此相似性加权后的句子,维度保持不变。这里有点绕,用下面的代码解释吧。

fusion操作:在 local inference 之后,进行 Enhancement of local inference information。这里的 enhancement 就是计算 a 和 align 之后的 a 的差和点积, 体现了一种差异性吧,更利用后面的学习。

[esim: local inference modeling]

hard attention

hard attention:不计算所有输出,依据概率对encoder的输出采样,在反向传播时需采用蒙特卡洛进行梯度估计。具体地:Hard Attention是一个随机的过程。Hard Attention不会选择整个encoder的输出作为其输入,Hard Attention会依概率Si来采样输入端的隐状态一部分来进行计算,而不是整个encoder的隐状态。为了实现梯度的反向传播,需要采用蒙特卡洛采样的方法来估计模块的梯度。

关键词提取的硬自注意力机制:取N个权重最高的词并按权重大小排序,把每一个词的embedding表示拼接输入一个全链接层后得到句子的表示。

[Keyword-Attentive Deep Semantic Matching]

[意图识别/场景识别/知识定位与识别]

3.2 Global/Local Attention

global attention:传统attention,对所有encoder输出进行计算

local attention:介于soft和hard之间,会预测一个位置并选取一个窗口进行计算

具体地:

Global Attention:传统的Attention model一样。所有的hidden state都被用于计算Context vector 的权重,即变长的对齐向量at,其长度等于encoder端输入句子的长度。

Global Attention模型示意图

在t时刻,首先基于decoder的隐状态ht和源端的隐状态hs,计算一个变长的隐对齐权值向量at,其计算公式如下:

其中,score是一个用于评价ht与hs之间关系的函数,即对齐函数,一般有三种计算方式,我们在上文中已经提到了。公式如下:

得到对齐向量at之后,就可以通过加权平均的方式,得到上下文向量ct。

Local Attention:Global Attention有一个明显的缺点就是,每一次,encoder端的所有hidden state都要参与计算,这样做计算开销会比较大,特别是当encoder的句子偏长,比如,一段话或者一篇文章,效率偏低。因此,为了提高效率,Local Attention应运而生。

Local Attention是一种介于Kelvin Xu所提出的Soft Attention和Hard Attention之间的一种Attention方式,即把两种方式结合起来。其结构如图6所示。

图6 Local Attention模型示意图

Local Attention首先会为decoder端当前的词,预测一个source端对齐位置(aligned position)pt,然后基于pt选择一个窗口,用于计算背景向量ct。Position pt的计算公式如下:

其中,S是encoder端句子长度,vp和wp是模型参数。此时,对齐向量at的计算公式如下:

总之,Global Attention和Local Attention各有优劣,在实际应用中,Global Attention应用更普遍,因为local Attention需要预测一个位置向量p,这就带来两个问题:1、当encoder句子不是很长时,相对Global Attention,计算量并没有明显减小。2、位置向量pt的预测并不非常准确,这就直接计算的到的local Attention的准确率。

3.3 Self Attention

传统attention是计算Q和K之间的依赖关系,而self attention则分别计算Q和K自身的依赖关系。

Self Attention与传统的Attention机制非常的不同:传统的Attention是基于source端和target端的隐变量(hidden state)计算Attention的,得到的结果是源端的每个词与目标端每个词之间的依赖关系。但Self Attention不同,它分别在source端和target端进行,仅与source input或者target input自身相关的Self Attention,捕捉source端或target端自身的词与词之间的依赖关系;然后再把source端的得到的self Attention加入到target端得到的Attention中,捕捉source端和target端词与词之间的依赖关系。因此,self Attention Attention比传统的Attention mechanism效果要好,主要原因之一是,传统的Attention机制忽略了源端或目标端句子中词与词之间的依赖关系,相对比,self Attention可以不仅可以得到源端与目标端词与词之间的依赖关系,同时还可以有效获取源端或目标端自身词与词之间的依赖关系,如图7所示。

图7 self attention可视化实例,图片摘自《深度学习中的注意力机制》,张俊林

方法1:transformer里面的self-attention。

这里Q=K=V = Wq*Q=Wk*K=Wv*V=都是一样的,可参考[深度学习:transformer模型]

[Self-Attention,Q&A和源码深挖]

方法2:A Structured Self-Attentive Sentence Embedding
同Induction Network中提到的self-attention mechanism

self-attention mechanism, which takes the whole LSTM hidden states H = (h1, h2, ..., hT ). as input, and outputs a vector of weights a:

Note: a的维度[1, d_a] * ([d_a,2u] * [2u, T]) = [1, T],这里1如果换成r,结果就是一个矩阵,捕捉句子多个成分;另外,这不就是一个mlp吗[EMPIRICAL ANALYSIS OF UNLABELED ENTITY PROBLEM...]

The final representation e of the text is the weighted sum of H:

[A Structured Self-Attentive Sentence Embedding]

[Induction Networks for Few-Shot Text Classification][论文原文Induction Networks for Few-Shot Text Classification]

2.4 Hierarchical Attention

Zichao Yang等人在论文《Hierarchical Attention Networks for Document Classification》提出了Hierarchical Attention用于文档分类。Hierarchical Attention构建了两个层次的Attention Mechanism,第一个层次是对句子中每个词的attention,即word attention;第二个层次是针对文档中每个句子的attention,即sentence attention。网络结构如图10所示。

图10 Hierarchical Attention结构示意图

整个网络结构由四个部分组成:一个由双向RNN(GRU)构成的word sequence encoder,然后是一个关于词的word-level的attention layer;基于word attention layar之上,是一个由双向RNN构成的sentence encoder,最后的输出层是一个sentence-level的attention layer。

2.5 Attention over Attention

Yiming Cui与2017年在论文《Attention-over-Attention Neural Networks for Reading Comprehension》中提出了Attention Over Attention的Attention机制,结构如图11所示。

图11 Attention over Attention结构示意图

两个输入,一个Document和一个Query,分别用一个双向的RNN进行特征抽取,得到各自的隐状态h(doc)和h(query),然后基于query和doc的隐状态进行dot product,得到query和doc的attention关联矩阵。然后按列(colum)方向进行softmax操作,得到query-to-document的attention 值a(t);按照行(row)方向进行softmax操作,得到document-to-query的attention值b(t),再按照列方向进行累加求平均得到平均后的attention值b(t)。最后再基于上一步attention操作得到a(t)和b(t),再进行attention操作,即attention over attention得到最终query与document的关联矩阵。

2.6 Multi-step Attention:ConvS2S

2017年FaceBook 人工智能实验室的Jonas Gehring等人在论文《Convolutional Sequence to Sequence Learning》提出了完全基于CNN来构建Seq2Seq模型,论文中还采用了多层Attention Mechanism,来获取encoder和decoder中输入句子之间的关系,结构如下。

    Multi-step Attention结构示意图

完全基于CNN的Seq2Seq模型需要通过层叠多层来获取输入句子中词与词之间的依赖关系,特别是当句子非常长的时候,我曾经实验证明,层叠的层数往往达到10层以上才能取得比较理想的结果。针对每一个卷记得step(输入一个词)都对encoder的hidden state和decoder的hidden state进行dot product计算得到最终的Attention 矩阵,并且基于最终的attention矩阵去指导decoder的解码操作。

这里还用到了Position Embeddings,加入位置向量,给予模型正在处理哪一位置的信息,e = (w1 + p1, . . . , wm + pm)。transformer可能是学这个的吧。

[Convolutional Sequence to Sequence Learning]

[《Convolutional Sequence to Sequence Learning》阅读笔记]

2.7 Multi-dimensional Attention

传统的Attention往往是一维的,如下图所示(a)所示。《Coupled Multi-Layer Attentions for Co-Extraction of Aspect and Opinion Terms》提出了Multi-dimensional attention把一维的Attention扩展到多维,如下图(b)所示。

多维Attention可以捕捉输入多个维度重要性,具有更强的描述能力。如上图所示,输入序列“Fish burger is the best dish it tastes fresh”,每个输入token的Attention由两个部分concat而成,比如,计算h8(tastes)关于Aspect的Attention时,Attention分为Aspect的Attention u(t~a)和Opinion的Attention u(t~p),计算公式如下:

当m=a时,m-=p,当m=p时,m-=a。Attention同时考虑了输入token作为Aspect和Opinion的重要程度。Multi-dimension Attention捕捉多维度的Attention,为了避免Attention过于集中,对Attention加入F范数约束:

使Attention集中序列的不同部分。

2.8 Memory-based Attention

Memory机制在NLP中应用也比较广泛,比如对话系统中。Memory-based Attention借用了这一思想,假设输入为q,Memory中以(k,v)形式存储着我们需要的上下文。基于Attention的计算公式,得出Memory-based Attention的计算公式如下:

例如在QA问题中,Memory-based Attention可以通过不停地迭代地更新Memory来将注意力转移到答案所在的位置,如下图所示:

初始q为问题question,然后计算a与memory中k的Attention关系,得到此时最相关的C,将q与c拼接到一起作为新的q,再次计算C,不停地迭代,直到得到最终的答案。

[模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理、分类及应用]

某小皮

from: -柚子皮-_机器学习MachineLearning,Linux,Python-CSDN博客

ref: [【NLP】Attention原理和源码解析]**

[Tensorflow源码解读(一):Attention Seq2Seq模型]

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐