Seq2Seq模型及Attention机制


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。下面的所有内容都以机器翻译为例。
Seq2Seq模型及Attention机制
文章图片

Encoder部分 Encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码。
如下图,获取语义向量最简单的方式就是直接将最后一个输出的隐状态作为语义向量c。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。
下图c代表生成的语义向量,q函数代表相应的变换(线性变换等)
Seq2Seq模型及Attention机制
文章图片

Decoder部分 Decoder部分就是根据Encoder部分输出的语义向量c来做解码工作。以翻译为例,就是生成相应的译文。
注意生成的序列是不定长的。而且上一时刻的输出通常要作为下一时刻的输入,如下图所示,预测y2时y1要作为输入。
Seq2Seq模型及Attention机制
文章图片

得到语义向量c后,通常的做法是将c当做初始状态h0输入到Decoder中:
Seq2Seq模型及Attention机制
文章图片

还有一种做法是将c当做每一步的输入:
Seq2Seq模型及Attention机制
文章图片

一般而言在Decoder阶段上一步的输出会作为下一步的输入,如下所示:
Seq2Seq模型及Attention机制
文章图片

seq2seq模型举例 下面是seq2seq架构的几个应用,希望能通过这几个例子对seq2seq架构有更深入的了解。
  1. 邮箱对话
    下面是一个收发邮件的例子,根据发来的消息生成相应的回复。
    左右两边各有四个LSTM单元(黄色蓝色方块,每个方块代表一个LSTM单元),得到的语义向量c当做初始状态h0输入到Decoder中:
Seq2Seq模型及Attention机制
文章图片

LSTM简单介绍 下图是LSTM单元的组成结构,由四个门构成:
Seq2Seq模型及Attention机制
文章图片

下图是3个LSTM单元相互连接(每个单元的结构都一样,上一个单元的输入会作为下一个单元的输入):
Seq2Seq模型及Attention机制
文章图片

  1. 神经机器翻译
    图中结构比前面稍微复杂一点,单词没有直接输入到Encoder模块中,而是通过Embedding层生成对应的词嵌入(词向量),然后将生成的词嵌入输入到Encoder模块中,这是NLP中的常用的操作。实际上Decoder部分输入的单词也要先生成对应的词嵌入(见下一个例子)。
    得到的语义向量s当做初始状态h0输入到Decoder中,Decoder模块的输出并没有直接得到翻译结果,而是通过Softmax函数来生成,这也是NLP中的常用的操作。
    实际翻译过程就是这个样子,前面是为了让大家理解seq2seq的原理而把中间过程简化了。
Seq2Seq模型及Attention机制
文章图片

  1. 神经机器翻译(双层LSTM)
    这个例子跟上一个类似,只是编解码部分都用了双层LSTM(LSTM有两个隐藏层),_ 是语句起始和结束标记。
Seq2Seq模型及Attention机制
文章图片

  1. 生成对联
Seq2Seq模型及Attention机制
文章图片

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

基于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机制 【Seq2Seq模型及Attention机制】Attention机制在下一篇博客中,欢迎大家阅读!

    推荐阅读