现在很多研究的NLP问题都可以转换成一个Sequence to Sequence模型来解决,比如说机器翻译,智能问答,语音识别等。
Sequence to Sequence模型由一个encoder和一个decoder组成,encoder完成编码工作,将不同的输入编码成一个定长的向量,decoder则完成解码工作,对编码器的结果进行解码输出,例如在中英文翻译中,首先编码器将中文编码成一个向量表示,接着解码器把该向量解码成一个英文表示 ,完成翻译过程。

但是序列模型会有两个问题,不管输入有多长,它都会把它编码成一个固定长度的向量,若句子比较长,则编码结果会可能会损失较多想信息,这将不利于接下来的解码工作;其次在解码的时候,每个时刻的输出在解码过程中用到的上下文向量是相同的,没有做区分,这也会给解码带来问题。为了解决这样的问题,会给模型加入注意力机制(attention mechanism)。

RNN Encoder-Decoder

首先讲一下简单的RNN 编码解码器框架,给定输入x =( x1,x2,...,xT x_1,x_2,...,x_T),编码器会利用RNN将其转换成一个向量c:

ht=f(xt,ht−1) h_t = f(x_t,h_{t-1})
c=q(h1,h2,...,hT) c = q(h_1,h_2,...,h_T)

其中, ht h_t是t时刻的隐状态,c是由整个序列得到的向量表示。
接下来,解码器通过语言模型生产一个新的序列:

p(y)=∏t=1Tp(yt|y1,y2,...,yt−1,c) p(y) = \prod\limits_{t=1}^Tp(y_t|y_1,y_2,...,y_{t-1},c)
p(yt|y1,y2,...,yt−1,c)=g(yt−1,st,c) p(y_t|y_1,y_2,...,y_{t-1},c) = g(y_{t-1},s_t,c)

其中, yt y_t表示第t时刻预测的结果。一个形象的示意图如下:

如何加入注意力
由上面传统的解码过程,我们知道:

p(yt|y1,y2,...,yt−1,c)=g(yt−1,st,c) p(y_t|y_1,y_2,...,y_{t-1},c) = g(y_{t-1},s_t,c)

可以看到,在对每个时刻的输出做预测的时候,用到的上下文向量都是一样的,引入注意力机制后,我们希望实现的是在预测每个时刻的输出时用到的上下文是跟当前输出有关系的上下文,比如在翻译“知识就是力量”的时候,我们希望翻译“is”的时候关注的信息是“就是”,而不是其他无关的词。也就是:

p(yt|y1,y2,...,yt−1,c)=g(yt−1,st,ct) p(y_t|y_1,y_2,...,y_{t-1},c) = g(y_{t-1},s_t,c_t)
st=f(st−1,yt−1,ct) s_t = f(s_{t-1},y_{t-1},c_t)

ct c_t就是引入注意力的关键所在,为了加入注意力,我们新模型如下:

模型的下面是一个双向的RNN,也可以是单向的,这个不是加入注意力的关键,只不过在序列模型中,双向RNN可以更好地编码信息。具体如何理解该图,我们看下面,
在上面的定义中, ct c_t是引入注意力的关键所在,它的作用就是要起到将输出与相关输入联系起来,我们定义:

ci=∑j=1Tαijhj c_i = \sum\limits_{j=1}^T\alpha_{ij}h_j

其中, hj h_j是编码输入第j个位置的隐状态信息,这里针对双向RNN, hj=[hj→;hj←] h_j =[\overrightarrow {h_j};\overleftarrow {h_j}],即把前向后项RNN得到的隐状态向量进行拼接。权重 α \alpha很重要,它能够标识输入中的哪些词汇当前的输出关系比较大。我们定义权重 α \alpha:

αij=exp(eij)∑k=1Texp(eik) \alpha_{ij} = \frac{exp(e_{ij})}{\sum\limits_{k=1}^Texp(e_{ik})}

可以把 α \alpha理解为一个归一化的概率值,表示输入的第j个词对当前输出的关系概率。
上面 α \alpha的定义中引入了记号 eij e_{ij},

eij=a(si−1,hj) e_{ij} = a(s_{i-1},h_j)

它实际上是一个对齐模型,是一个嵌套在RNN中的一个前馈神经网络,在训练的时候一起被训练,如图:

对齐模型与整个模型放在一起训练,联合公式(1)和(2)可以得到权重 α \alpha,再结合隐状态序列 (h1,h2,...,hT) (h_1,h_2,...,h_T)就可以得到上下文向量序列,将其带入到解码过程就可以求得生成序列,每一步生成过程如下:

以上是序列模型引入注意力机制的基本思路,本质上还是利用输入隐状态序列 (h1,h2,...,hT) (h_1,h_2,...,h_T)增强了对句子有选择地记忆能力,这对解码过程是非常有帮助的。

参考:
【1】注意力机制在nlp应用调研
【2】Bahdanau,NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE ,2015.

序列模型中的注意力机制相关推荐

  1. 【Attention】深度学习中的注意机制:理解序列模型中的注意机制How Attention works in Deep Learning

    [学习资源] How Attention works in Deep Learning: understanding the attention mechanism in sequence model ...

  2. 在RNN模型中引入注意力机制(Attention)

    此前的文章介绍过Seq2seq模型,并将其用于机器翻译.Seq2seq模型的一个问题在于随着输入句子越来越长,更早输入的单词就很大可能会被忘掉.于是,随着输入句子中单词数变多,翻译质量就会很快劣化.改 ...

  3. 深度学习中的注意力机制(三)

    作者 | 蘑菇先生 来源 | NewBeeNLP原创出品 深度学习Attenion小综述系列: 深度学习中的注意力机制(一) 深度学习中的注意力机制(二) 目前深度学习中热点之一就是注意力机制(Att ...

  4. 深度学习中的注意力机制(二)

    作者 | 蘑菇先生 来源 | NewBeeNLP 目前深度学习中热点之一就是注意力机制(Attention Mechanisms).Attention源于人类视觉系统,当人类观察外界事物的时候,一般不 ...

  5. 深度学习中的注意力机制(一)

    作者 | 蘑菇先生 来源 | NewBeeNLP 头图 | CSDN下载自视觉中国 目前深度学习中热点之一就是注意力机制(Attention Mechanisms).Attention源于人类视觉系统 ...

  6. 一篇了解NLP中的注意力机制

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 转自 | AI小白入门(公众号ID: StudyForAI) 作者 | yuquanle,985在读硕 ...

  7. 可视化神经机器翻译模型(基于注意力机制的Seq2seq模型)

    可视化神经机器翻译模型(基于注意力机制的Seq2seq模型)   序列到序列模型是深度学习模型,在机器翻译.文本摘要和图像字幕等任务中取得了很大的成功.谷歌翻译在2016年底开始在生产中使用这样的模型 ...

  8. 【NLP】四万字全面详解 | 深度学习中的注意力机制(四,完结篇)

    作者 | 蘑菇先生 知乎 | 蘑菇先生学习记 深度学习Attention小综述系列: 四万字全面详解 | 深度学习中的注意力机制(一) 四万字全面详解 | 深度学习中的注意力机制(二) 四万字全面详解 ...

  9. 【NLP】四万字全面详解 | 深度学习中的注意力机制(三)

    NewBeeNLP原创出品 公众号专栏作者@蘑菇先生 知乎 | 蘑菇先生学习记 深度学习Attenion小综述系列: 四万字全面详解 | 深度学习中的注意力机制(一) 四万字全面详解 | 深度学习中的 ...

最新文章

  1. 《Java编程思想》第四版读书笔记 第十四章 类型信息
  2. 解决Please choose a writable location using the '-configuration' command line option
  3. python pathname_Python模块的定义,模块的导入,__name__用法实例分析
  4. 用户行为分析笔记(二):系统的整体架构
  5. Think in Java第四版 读书笔记9第15章 泛型
  6. ThinkPHP中的路由是什么意思?
  7. Python第三方库:jieba库与中文分词概述(全面详解)
  8. 基于混合策略改进的樽海鞘群算法
  9. rust执行cmd命令隐藏窗口
  10. 冰点还原8.57 官方中文版下载
  11. c语言写莫迪康通信,常用PLC通信协议有哪些?
  12. qt 飞扬青云_细数Qt开发的各种坑(欢迎围观)
  13. idea中Rebuild是什么意思
  14. [提醒]曾经犯的谜之错误
  15. Error instantiating servlet class com.web.SelectAllServlet 所有的servlet都不能运行,终于找到解决办法
  16. mysql数据库 头像字段_模仿陌陌八张头像的数据库,应该如何建表才合适?
  17. 如何在30分钟完成表格增删改查的前后端框架搭建
  18. Vue源码学习 - 组件化(三) 合并配置
  19. c语言知识地图,【程序设计论文】C语言程序设计翻转课堂研究(共3546字)
  20. 【Vue】详解Vue生命周期

热门文章

  1. linux重新做raid,Linux下做RAID和LVM
  2. vue脚手架使用pages快速构建一个多页应用
  3. 相似度计算(1)——余弦相似度
  4. secureCRT常用指令
  5. css文本溢出显示省略号
  6. angular的NG-ZORRO组件的使用心得
  7. 三大数据库优缺点分析
  8. 【OpenGL】高级片段着色器——在片段着色器中生成图像数据茹利亚集Julia set
  9. Docker——使用Dockerfile制作java程序镜像
  10. 游戏本天梯_Intel宣称游戏本性能碾压AMD:一看显卡有猫腻