Seq2Seq模型及Attention机制

  • Seq2Seq模型
    • Encoder部分
    • Decoder部分
  • seq2seq模型举例
    • LSTM简单介绍
  • 基于CNN的seq2seq
  • Transformer
  • Attention机制

Seq2Seq模型

seq2seq模型主要分为三种:

  1. 一种是以rnn为基础的模型, 一般是LSTM+attention,顺序处理输入信息。
  2. 一种是以cnn为基础的模型,后面提到的Fairseq就属于这种。
  3. 一种是完全依靠attention的模型,如谷歌的transformer。

seq2seq模型虽然简单,但是特别经典,它的出现可以说给整个NLP带来个翻天覆地的变化。网上已经有很多人做了相关的总结,但是翻看起来还是感觉有点乱,于是想自己总结一个版本,方便自己回忆,也希望所写的内容能给大家带来帮助。由于平时都是直接拿来用,不需要在原理方面做推敲,所以公式部分就不详细介绍了,感兴趣的可以自己去阅读论文,下面只介绍相关原理及应用。

Seq2Seq,全称Sequence to Sequence。它是一种通用的Encoder——Decoder框架,可用于机器翻译、文本摘要、会话建模、图像字幕等场景中。其中Decoder部分的输出通常是不定长的,以机器翻译为例:将一句中文翻译成英文,那么这句英文的长度有可能会比中文短,也有可能会比中文长,所以输出的长度就不确定了。

如下图所示,输入的中文长度为4,输出的英文长度为2。下面的所有内容都以机器翻译为例。

Encoder部分

Encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码。

如下图,获取语义向量最简单的方式就是直接将最后一个输出的隐状态作为语义向量c。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。

下图c代表生成的语义向量,q函数代表相应的变换(线性变换等)

Decoder部分

Decoder部分就是根据Encoder部分输出的语义向量c来做解码工作。以翻译为例,就是生成相应的译文。

注意生成的序列是不定长的。而且上一时刻的输出通常要作为下一时刻的输入,如下图所示,预测y2时y1要作为输入。


得到语义向量c后,通常的做法是将c当做初始状态h0输入到Decoder中:


还有一种做法是将c当做每一步的输入:

一般而言在Decoder阶段上一步的输出会作为下一步的输入,如下所示:

seq2seq模型举例

下面是seq2seq架构的几个应用,希望能通过这几个例子对seq2seq架构有更深入的了解。

  1. 邮箱对话

    下面是一个收发邮件的例子,根据发来的消息生成相应的回复。

    左右两边各有四个LSTM单元(黄色蓝色方块,每个方块代表一个LSTM单元),得到的语义向量c当做初始状态h0输入到Decoder中:

LSTM简单介绍

下图是LSTM单元的组成结构,由四个门构成:

下图是3个LSTM单元相互连接(每个单元的结构都一样,上一个单元的输入会作为下一个单元的输入):

  1. 神经机器翻译

    图中结构比前面稍微复杂一点,单词没有直接输入到Encoder模块中,而是通过Embedding层生成对应的词嵌入(词向量),然后将生成的词嵌入输入到Encoder模块中,这是NLP中的常用的操作。实际上Decoder部分输入的单词也要先生成对应的词嵌入(见下一个例子)。

    得到的语义向量s当做初始状态h0输入到Decoder中,Decoder模块的输出并没有直接得到翻译结果,而是通过Softmax函数来生成,这也是NLP中的常用的操作。

    实际翻译过程就是这个样子,前面是为了让大家理解seq2seq的原理而把中间过程简化了。

  1. 神经机器翻译(双层LSTM)

    这个例子跟上一个类似,只是编解码部分都用了双层LSTM(LSTM有两个隐藏层),_ 是语句起始和结束标记。

  1. 生成对联

  1. c当做每一步的输入

    这张图在前面讲生成变长序列的时候已经看到了,这也是一个翻译例子,这个例子跟前面不同的地方是Encoder生成的语义向量c当做Decoder部分每一步的输入。

基于CNN的seq2seq

现在大多数场景下使用的Seq2Seq模型是基于RNN构成的,虽然取得了不错的效果,但也有一些学者发现使用CNN来替换Seq2Seq中的encoder或decoder可以达到更好的效果。最近,FaceBook发布了一篇论文:《Convolutional Sequence to Sequence Learning》,命名为fairseq,提出了完全使用CNN来构成Seq2Seq模型,用于机器翻译,超越了谷歌创造的基于LSTM机器翻译的效果。

代码地址:fairseq代码链接

RNN的链式结构,能够很好地应用于处理序列信息。但是,RNN也存在着劣势:

一个是由于RNN运行时是将序列的信息逐个处理,不能实现并行操作,导致运行速度慢;
另一个是传统的RNN并不能很好地处理句子中的结构化信息,或者说更复杂的关系信息。

相比之下,CNN的优势就凸显出来。最重要的一点是:CNN能够并行处理数据,计算更加高效。(当然后面的Transformer也可以并行化)。此外,CNN是层级结构,与循环网络建模的链式结构相比,层次结构提供了一种较短的路径来捕获词之间远程的依赖关系,因此也可以更好地捕捉更复杂的关系。

有关这篇文章的细节我会再抽时间整理出来。

Transformer

transformer也是seq2seq模型,但全程没有用到rnn或者cnn,它的Encoder部分和Decoder部分都使用了self-attention,感兴趣的可以点此链接阅读。

论文链接:《 Attention Is All You Need》

Attention机制

Attention机制在下一篇博客中,欢迎大家阅读!

Seq2Seq模型及Attention机制相关推荐

  1. seq2seq模型_直观理解并使用Tensorflow实现Seq2Seq模型的注意机制

    采用带注意机制的序列序列结构进行英印地语神经机器翻译 Seq2seq模型构成了机器翻译.图像和视频字幕.文本摘要.聊天机器人以及任何你可能想到的包括从一个数据序列到另一个数据序列转换的任务的基础.如果 ...

  2. [模型学习]Attention机制及其原理推导

    Attention的基本原理 Attention基本原理 在该公式中,X为输入矩阵 1.1 步骤1 注意力机制步骤1 首先,每一个输入向量分别和Wq, Wk, Wv矩阵相乘,得到对应的q, k, v向 ...

  3. 【TensorFlow实战笔记】对于TED(en-zh)数据集进行Seq2Seq模型实战,以及对应的Attention机制(tf保存模型读取模型)

    个人公众号 AI蜗牛车 作者是南京985AI硕士,CSDN博客专家,研究方向主要是时空序列预测和时间序列数据挖掘,获国家奖学金,校十佳大学生,省优秀毕业生,阿里天池时空序列比赛rank3.公众号致力于 ...

  4. 完全图解RNN、RNN变体、Seq2Seq、Attention机制

    完全图解RNN.RNN变体.Seq2Seq.Attention机制 本文作者:思颖 2017-09-01 18:16 导语:帮助初学者开启全新视角 雷锋网(公众号:雷锋网) AI科技评论按:本文作者何 ...

  5. seq2seq模型_具有注意力机制的seq2seq模型

    在本文中,你将了解: 为什么我们需要seq2seq模型的注意力机制? Bahdanua的注意力机制是如何运作的? Luong的注意力机制是如何运作的? 什么是局部和全局注意力? Bahdanua和Lu ...

  6. 【论文写作分析】之一 《基于混合注意力Seq2seq模型的选项多标签分类》

    [1] 参考论文信息   论文名称:<基于混合注意力Seq2seq模型的选项多标签分类>   发布期刊:<计算机工程与应用>   期刊信息:CSCD扩展   论文写作分析摘要: ...

  7. 理解LSTM/RNN中的Attention机制

    转自:http://www.jeyzhang.com/understand-attention-in-rnn.html,感谢分享! 导读 目前采用编码器-解码器 (Encode-Decode) 结构的 ...

  8. pytorch笔记:09)Attention机制

    刚从图像处理的hole中攀爬出来,刚走一步竟掉到了另一个hole(fire in the hole*▽*) 1.RNN中的attention pytorch官方教程:https://pytorch.o ...

  9. Seq2Seq中的Attention

    <Seq2Seq中的Attention>   Sequence to Sequence的结构在整个深度学习的进程中占有重要的角色,我在2017年做OCR的时候用这个,当时语音组做语音识别的 ...

最新文章

  1. iOS使用自签名证书实现HTTPS请求
  2. Flutter开发之布局-1-Column(15)
  3. python3.6小程序_python3.6 tkinter实现屏保小程序
  4. linux红外键盘映射表,linux下修改键盘映射
  5. 启动rocketmq_RocketMQ 部署启动指南-Docker 版
  6. 3Dslicer2:数据与帮助
  7. 人工智能中的局部搜索算法
  8. SonarQube 8.3.x中的Maven项目的测试覆盖率报告
  9. 你很棒的---自我管理方法,一生受用!!!
  10. java easyreport 导入excel、 txt 数据复合属性(二)
  11. linux创建脚本文件auto,linux 自动化部署脚本
  12. BP神经网络(手写数字识别)
  13. Spatial Pyramid的BOW和Pyramid HOG的多核
  14. rgb矩阵Android程序,Android ColorMatrixColorFilter
  15. JAVA集合系列(1):集合的整体框架
  16. J1939入门(一)
  17. 支付宝和微信的支付功能如何进行测试?
  18. Http Headers为何物
  19. Windows操作系统单网卡设置双IP
  20. HTML中空格怎么打出来?

热门文章

  1. 接口自动化测试项目实战
  2. 用户登录界面的测试用例
  3. 【AAAI 2021】多出口架构的知识蒸馏:Harmonized Dense Knowledge Distillation Training for Multi-Exit Architectures
  4. 【JavaSE与数据结构】栈与Stack类
  5. js中如何将字符串转化为时间,并计算时间差
  6. Microbiome | 宏基因组测序中减少样品中真核宿主的DNA污染
  7. jq处理数据库中的json数据
  8. 获取android已安装的应用PackageInfo启动第三方APP应用
  9. docker安装apollo
  10. GOP、IDR、CAR、BLA、RASL、RADL