推送第四日,量化投资与机器学习公众号将为大家带来一个系列的 Deep Learning 原创研究。本次深度学习系列的撰稿人为 张泽旺 ,DM-Master,目前在研究自动语音识别系统。希望大家有所收获,共同进步!
漫谈RNN之序列建模(机器翻译篇)
1.原理概述
序列学习其实是深度学习中的一个应用非常广泛的概念,例如语音识别、语言建模、机器翻译、机器作曲、机器写稿、自动对话、QA系统等都属于序列学习的领域,今天讲讲解如何运用序列建模的思想来构建一个端对端的机器翻译系统。
序列建模,顾名思义,处理的问题是有时序关联性的,因此这种情况下,普通的前馈式神经网络已经不适用这个问题了,取而代之的是具有循环记忆性的RNN网络,这里说的RNN是一种广泛的RNN概念,其内部记忆单元可以是原始的RNN或者是LSTM、GRU单元均可。由于RNN对于长时间建模问题表现没有LSTM好,因此本文中使用LSTM来建模。
通常来说,序列建模的输入数据长度与输出长度不一定相同。举个例子,就英汉机器翻译系统而言,英文中的“what's your name”是三个单词组成的序列,将它翻译成中文的话变成了“你叫什么名字”,它是六个汉字组成的序列,那么对于这种输入输出序列的长度是动态变化的情况,传统的RNN(或LSTM)建模显然是不行的,这个时候我们考虑的是把问题拆分为两个部分,即编码器和解码器,原因是,无论是汉语还是英语,两句话所对应的意义是一样的,那么当我们使用编码器对输入的英语序列进行特征编码,就相当于得到了这句话的意义,然后我们用汉语的解码器对这个意义进行解码并且用汉语的形式表达出来,这就得到了英译汉的结果。
具体来说,我们可以使用两个LSTM网络来分别作为编码和解码。编码的LSTM用来读取输入序列,每一时刻读取输入序列的一个单元,最终得到输入的特征编码分布;解码的LSTM根据特征编码分布从而得到解码输出。根据条件概率公式,我们可以得到下面的公式:
这里的x_1...x_T是输入序列,y_1...y_T'是输出序列,v是解码器的初始值x1...x_T,并且T和T'通常长度不一致。上式左边是我们需要求得的,而我们把它转换成右边的形式来计算,随后每一时刻解码器都会得到一个输出y_t,一直到输出<eos>即可停止解码。例如下图所示,这是一个由编码器输入ABC,再由解码器输出WXYZ的过程。
2.机器翻译实战
接下来我将讲解LSTM是如何具体在一个机器翻译系统中工作的,考虑如下一个英语-法语的翻译流程:
上图表示一个英-法翻译系统的结构,输入的是一句英语,经过机器翻译系统输出为一句法语。正如我们人脑翻译一句话一样,当我看到一句“what's your name”时,我的脑海中首先想的是它的具体含义,然后我才会根据这个含义,写出一句法语出来,这一思考流程正与上图中的编码和解码模块类似。
首先,我们大致浏览一下我们将要构建的基于LSTM的机器翻译系统,如下图所示,e是我们的一段待翻译英语句子,f是输出的翻译过后的法语句子。英语句子经过LSTM编码器得到特征表示,然后进入另一个LSTM解码器解码得到法语句子。这就是机器翻译系统的总体流程。
首先我们看下面的编码器部分,编码的过程如下:
得到了每句话的特征表示,我们不禁会想这个特征表示到底是什么样的?虽然是高维的特征,但是不同句子的特征表示是否有关联呢?有研究者在训练好了一个机器翻译系统之后,就将一些句子的特征向量保存了下来并做了主成分分析(PCA),将其降维到了2-D空间,如下图所示:
从上图可以看出,句子的特征向量确实可以反映句子之间的关联,例如,相似的句子在上图中靠的很近。
接下来看解码部分,根据输入句子的向量即可得到进行解码操作,具体流程如下:
构建好了编码LSTM和解码LSTM以后,接下来就是如何训练这个网络了。假设我们的训练数据集是由很多(X,Y)构成的,X_i是英语句子,Y_i是对应的法语句子。我们可以由机器翻译网络得到P(Y_i|X_i)的值,那么借助EM算法的思想,我们要构建它的负对数似然的形式,即
这里的N是训练对的大小,然后按照常规的梯度下降算法即可训练这个机器翻译网络。
总结:
近期文章预告:
《漫谈RNN之注意力机制》
《漫谈RNN之记忆网络》
《漫谈RNN之动态记忆网络》
《漫谈RNN之神经图灵机模型》
《漫谈RNN之无监督学习》