1.背景
首先,这篇博文整理自谷歌开源的神经机器翻译项目Neural Machine Translation (seq2seq) Tutorial。如果你直接克隆这个项目按照Tutorial中的说明操作即可,那么也就不用再往下看了。
而之所以写这篇博文的目的是,虽然Seq2Seq的原理并不太难,但是在用Tensorflow实现起来的时候却不那么容易。即使谷歌开源了源码,但是对于初学者来说面对复杂的工程结构文件,依旧是一头雾水(看来好几天,源码也没弄懂)。于是笔者就根据Tutorial中的说明以及各种摸索,终于搭建出了一个简单的翻译模型。下面就来大致介绍整个模型的搭建过程,数据的预处理,以及一些重要参数的说明等等。
由于笔者本身不搞自然语言这方面的内容,只是想学习这方面技术在Tensorflow中的使用,所以对于如何。
1.1 原理
Seq2Seq模型的主要原理如图p0105所示,先是一个Sequence通过RNN网络结构编码(左边蓝色部分)后得到 “thought vector"(图中白色矩形框,后称为中间向量),也就是说此时的中间向量包含了输入向量的所有信息,可以将其视为一个“加密”的过程。紧接着就是将中间向量再次喂给另外一个RNN网络对其进行解码(右边棕色部分),然后得到解码后的输出,可将其视为一个“解密”的过程。可能这个图太抽象了,我们再来进一步细化这个图:
如图p0106所示,输入部分以每个单词作为RNN对应每个时刻的输入,而输出部分呢则以RNN上一时刻的输出作为下一时刻的输入,直到输出为终止符"“为止。有没有发现,这同我们之间介绍的用LSTM来生成唐诗的原理一模一样? 但是呢请注意这个问题:在训练的时候我们并不能保证解码部分每个时刻的输出就是正确的。换句话说就是,假设第一个时刻的输出为“我”,然后接着将”我“喂给下一时刻,但此时预测的结果为”你好“,然后再把”你好“喂给下一时刻预测出”明天“,最后将”明天“喂给下一此时预测出”“结束。也就是最终预测的序列为 y ^ = \hat{y}= y^=" 我 你好 明天 " ,虽然这样也能同正确标签 y = y=