系列介绍

最近看了一些Seq2Seq模型的文章。东西看杂了容易忘记,花点时间简单的整理一下。
这个Seq2Seq系列主要梳理关于Seq2Seq模型的几篇重要的文章的模型,分为三个内容分别是:Encoder-Decoder, Sequence to Sequence 和 attention mechanism.
三个系列的文章列举如下:

  1. Seq2seq系列(一):RNN Encoder-Decoder
  2. Seq2Seq系列(二):Sequence to Sequence
  3. Seq2Seq系列(三):attention mechanism

一来我本人不搞机器翻译,二来没时间,因此上述文章的实验部分,本文不会介绍,只是模型有涉及时会提到。有时间的话,我会再加上对Tensorflow中Seq2Seq的源码分析的文章。

Seq2Seq系列论文:
 [1]Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation
 [2]Sequence to Sequence Learning with Neural Networks
 [3]Neural Machine Translation by Jointly Learning to Align and Translate

其中[2]和[3]均引用[1],而[2]和[3]是相互引用,且[2]和[3]都是14年9月放到arXiv上面,两篇文章的作者没有重叠,我目前没分清谁先谁后了,暂时先不管。按照先Seq2Seq后attention机制来介绍。

上述论文是本系列将要介绍的内容,此外还有几篇Seq2Seq的论文贴出来如下:
 [4]A Neural Conversational Model
 [5]Grammar as a Foreign Language
简单整理,应该有漏掉,欢迎补充!


正文

系列第一篇介绍的是论文[1],这是一篇将Encoder-Decoder模型用于机器翻译的文章。下面内容中出现的变量无特别说明都是向量
模型部分,作者首先回顾了RNN模型。记输入向量序列为X=(x1,x2,...xT). t时刻,RNN隐层状态h<t>的更新公式为:

h<t>=f(h<t1>,xt)

即前一时刻的隐状态和当前输入的非线性组合。其中f(.)是非线性函数,简单的f(.)可以是logistic sigmoid函数,复杂的可以是LSTM,GRU等基本的RNN单元。
通过训练RNN预测一个序列中的下一时刻的symbol,RNN可以得到序列的概率分布模型,即t时刻的条件分布p(xt|xt1,...,x1),例如,对于多项分布可以使用softmax:
p(xt,j=1|xt1,...,x1)=exp(wjh<t>)Kj=1exp(wjh<t>)

其中j=1,...K代表t时刻可以取值的symbol,wj是权重矩阵W的第j行。
序列X的计算公式为
p(x)=t=1Tp(xt|xt1,...,x1)

通过这迭代的方式来选取下一个时刻的symbol,可以用来生成全新的序列。
RNN Encoder–Decoder
!下面图片截至论文
Seq2Seq系列(一):RNN Encoder-Decoder
有两个不同的RNN,一个作为Encoder,一个作为Decoder。Encoder将长度可变的输入序列表达成为固定长度的vector representation(即后面提到的c),模型的函数表达式为(给定一个序列的情况下生成另一个序列的概率):
p(y1,...,yT|x1,...,xT)

y1,...,yT是输出序列(比如翻译中的译文),x1,...,xT是输入序列(原文),输入,输出序列的长度不固定,也不需要一样。
输入序列(比如原文句子中的单词)逐个输入到Encoder的RNN中,这部分的RNN输出不要,当输入序列输入完毕时保留RNN的最后的隐状态c
Encoder端的某一时刻的隐层状态只与上一时刻的隐状态和当前的输入有关,即
c<t>=f(c<t1>,xt)

此处用c<t>表示隐状态向量是为了与Decoder的隐状态h<t>相区分。
Decoder端隐状态的计算为:
h<t>=f(h<t1>,yt1,c)

此处yt1是上一时刻decoder的输出(在decoder中上一时刻的输出作为下一时刻的输入),也即本时刻的输入。不同于encoder的是在公式中多了一项vector representation c, c来自于Encoder的最后的隐状态,作者认为它编码了整个输入序列,因此在解码的每一时刻都会作为一个输入项。
可能令人困惑的地是上面两个f(.)中参数的个数并不相同,c作为额外的输入参数如何输入到RNN中。注意到xt,yt1,c三个都是向量,完全可以把yt1,c连接起来作为一个向量为输入。在Tensorflow的Seq2Seq的源码部分,对于多个输入的处理与把yt1,c连接起来作为一个向量为输入的方式是的等效的。
另外需要注意的是f(.)函数是一个输入为向量,输出也为向量的函数。
继续
t时刻Decoder的输出为:
P(yt|yt1,yt2,...,y1,c)=g(h<t>,yt1,c)

g(.)为带softmax的**函数(因为输出是概率分布)

模型训练的损失函数为:

maxθ1Nn=1Nlogpθ(yn|xn)

作者接下来讲了RNN模型的内部,本文自己提了一个新的隐藏单元,包括remember门和forget门。就我感觉和LSTM区别不大。主要的是几个公式,直接上原文吧:

Seq2Seq系列(一):RNN Encoder-Decoder
这四个公式可以说就是说了一下f(.)的具体实现。
至此模型部分就介绍完了。

额外的针对本文的SMT的一些细节说一点,以英文译法文为例。
设翻译用到的英文词的集合为Ve,即词典,词的个数记为|Ve|.
Encoder的每一时刻的输入就是英文句子中单词的one-hot向量vt,向量的维度为|V|
在Encoder中先执行word embedding即vt(行向量)先乘上|Ve|×d维度的矩阵W,其中d是词向量的维度。再输入到RNN中去。
Decoder的输出是|Vf|维的向量,Vf为用到的法语词汇的个数,每个维度代表一个法语单词。每个维度的取值都在0-1之间代表当前时刻取得这个词的概率。
然而,Decoder的下一时刻的输入是上一时刻的输出,显然将概率作为下一次的输入是不可取的。所以实际上在把上一时刻的输出作为下一时刻的输入之前,也对最有可能输出(概率最大的)的那个词做了一次word embedding。
本文完

相关文章:

  • 2021-05-19
  • 2021-09-23
  • 2021-05-07
  • 2021-05-02
  • 2021-07-02
  • 2021-12-28
猜你喜欢
  • 2021-09-07
  • 2021-08-22
  • 2021-05-05
  • 2021-06-23
  • 2022-12-23
  • 2021-07-01
  • 2021-05-12
相关资源
相似解决方案