系列介绍
最近看了一些Seq2Seq模型的文章。东西看杂了容易忘记,花点时间简单的整理一下。
这个Seq2Seq系列主要梳理关于Seq2Seq模型的几篇重要的文章的模型,分为三个内容分别是:Encoder-Decoder, Sequence to Sequence 和 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隐层状态
即前一时刻的隐状态和当前输入的非线性组合。其中 f(.) 是非线性函数,简单的 f(.) 可以是logistic sigmoid函数,复杂的可以是LSTM,GRU等基本的RNN单元。
通过训练RNN预测一个序列中的下一时刻的symbol,RNN可以得到序列的概率分布模型,即 t 时刻的条件分布
其中 j=1,...K 代表 t 时刻可以取值的symbol,
序列 X 的计算公式为
通过这迭代的方式来选取下一个时刻的symbol,可以用来生成全新的序列。
RNN Encoder–Decoder
!下面图片截至论文
有两个不同的RNN,一个作为Encoder,一个作为Decoder。Encoder将长度可变的输入序列表达成为固定长度的vector representation(即后面提到的 c ),模型的函数表达式为(给定一个序列的情况下生成另一个序列的概率):
y1,...,yT′ 是输出序列(比如翻译中的译文), x1,...,xT 是输入序列(原文),输入,输出序列的长度不固定,也不需要一样。
输入序列(比如原文句子中的单词)逐个输入到Encoder的RNN中,这部分的RNN输出不要,当输入序列输入完毕时保留RNN的最后的隐状态 c 。
Encoder端的某一时刻的隐层状态只与上一时刻的隐状态和当前的输入有关,即
此处用 c<t> 表示隐状态向量是为了与Decoder的隐状态 h<t> 相区分。
Decoder端隐状态的计算为:
此处 yt−1 是上一时刻decoder的输出(在decoder中上一时刻的输出作为下一时刻的输入),也即本时刻的输入。不同于encoder的是在公式中多了一项vector representation c ,
可能令人困惑的地是上面两个 f(.) 中参数的个数并不相同, c 作为额外的输入参数如何输入到RNN中。注意到
另外需要注意的是 f(.) 函数是一个输入为向量,输出也为向量的函数。
继续
t 时刻Decoder的输出为:
g(.) 为带softmax的激活函数(因为输出是概率分布)
模型训练的损失函数为:
作者接下来讲了RNN模型的内部,本文自己提了一个新的隐藏单元,包括remember门和forget门。就我感觉和LSTM区别不大。主要的是几个公式,直接上原文吧:
这四个公式可以说就是说了一下
f(.)
的具体实现。
至此模型部分就介绍完了。
额外的针对本文的SMT的一些细节说一点,以英文译法文为例。
设翻译用到的英文词的集合为
Ve
,即词典,词的个数记为
|Ve|
.
Encoder的每一时刻的输入就是英文句子中单词的one-hot向量
vt
,向量的维度为
|V|
。
在Encoder中先执行word embedding即
vt
(行向量)先乘上
|Ve|×d
维度的矩阵
W
,其中
Decoder的输出是
|Vf|
维的向量,
Vf
为用到的法语词汇的个数,每个维度代表一个法语单词。每个维度的取值都在0-1之间代表当前时刻取得这个词的概率。
然而,Decoder的下一时刻的输入是上一时刻的输出,显然将概率作为下一次的输入是不可取的。所以实际上在把上一时刻的输出作为下一时刻的输入之前,也对最有可能输出(概率最大的)的那个词做了一次word embedding。
本文完