雷锋网按:本文作者陈村,剑桥大学自然语言处理(NLP)组, 现为机器学习语义分析工程师。
Google Translate作为久负盛名的机器翻译产品,推出10年以来,支持103种语言,一直作为业界的标杆。
而在前不久,Google官方对翻译进行一次脱胎换骨的升级——将全产品线的翻译算法换成了基于神经网络的机器翻译系统(Nueural Machine Translation,NMT)。从Google官方发表的博文[1]和技术报告[2]中,我们有机会一窥究竟,这个全新的系统到底有什么神奇的地方?笔者借这篇文章,帮大家梳理一下机器翻译的发展历程,以及Google这次新系统的一些亮点。
机器翻译,即把某一种源语言(比如英文)翻译到最恰当的目标语言(比如中文)。
还在几年前,机器翻译界的主流方法都是Phrased-Based Machine Translation (PBMT),Google翻译使用的也是基于这个框架的算法。所谓Phrased-based,即翻译的最小单位由任意连续的词(Word)组合成为的词组(Phrase),比如下图中的“北风呼啸”。
PBMT是怎么把一句英文翻译成中文的呢?
首先,算法会把句子打散成一个个由词语组成的词组(中文需要进行额外的分词),如图中(1)所示;
然后,预先训练好的统计模型会对于每个词组,找到另一种语言中最佳对应的词组,如图中(2)所示;
最后,需要将这样“硬生生”翻译过来的目标语言词组,通过重新排序,让它看起来尽量通顺以及符合目标语言的语法,如图中(3)所示。
图片出处:Lopez, A. (2008). Statistical machine translation. ACM Computing Surveys, 40(3), 1–49.
传统的PBMT的方法,一直被称为NLP(Natural Language Processing,自然语言处理)领域的终极任务之一。因为整个翻译过程中,需要依次调用其他各种更底层的NLP算法,比如中文分词、词性标注、句法结构等等,最终才能生成正确的翻译。这样像流水线一样的翻译方法,一环套一环,中间任意一个环节有了错误,这样的错误会一直传播下去(error propagation),导致最终的结果出错。
因此,即使单个系统准确率可以高达95%,但是整个翻译流程走下来,最终累积的错误可能就不可接受了。
深度学习这几年火了之后,机器翻译一直是深度学习在NLP领域里成果最为卓越的方向之一。深度神经网络提倡的是end-to-end learning,即跳过中间各种子NLP步骤,用深层的网络结构去直接学习拟合源语言到目标语言的概率。
2014年,Cho et. al [3]和Sutskever et al. [4] 提出了Encoder-Decoder架构的神经网络机器翻译系统。如下图所示:
首先把源语言一个词一个词地输入Encoder,Encoder利用训练好的神经网络参数,把整个输入序列的信息存在一个隐层向量h中;h这个隐层,可以理解为包含了所有对输入源语言的描述;然后再由Decoder,利用训练好的神经网络参数,从隐层h中读取参数,再一个词一个词地输出目标语言。
NMT这样的过程直接学习源语言到目标语言,省去了训练一大堆复杂NLP子系统的依赖,依靠大量的训练数据(平行语聊库,比如同一本书的中文和英文版本),直接让深度神经网络去学习拟合。熟悉深度学习的朋友可能会意识到,这样的方法一个极大的优势就是省去了很多人工特征选择和调参的步骤。听说前两年,有个做神经网络图像处理的教授,在不太了解NLP的基础上,硬生生地搭建了一套可以匹敌传统PBMT的机器翻译系统,后者可是十几年来多少奋战在第一线的NLP同志一砖一瓦垒起来的啊。而且,相比于传统PBMT一个词组一个词组的独立翻译,NMT这样end-to-end翻译出来的语言更加自然流畅。
2015年,Yoshua Bengio团队进一步,加入了Attention的概念。稍微区别于上面描述的Encoder-Decoder方法,基于Attention的Decoder逻辑在从隐层h中读取信息输出的时候,会根据现在正在翻译的是哪个词,自动调整对隐层的读入权重。即翻译每个词的时候,会更加有侧重点,这样也模拟了传统翻译中词组对词组的对应翻译的过程。Attention模块其实也就是一个小型神经网络,嵌入在Encoder-decoder之间的,跟着整个神经网络训练的时候一起优化训练出来的。
Bengio团队的这个工作也奠定了后序很多NMT商业系统的基础,也包括Google这次发布的GNMT。
Google这次在算法上、尤其是工程上对学术界的NMT方法提出了多项改进,才促成了这次Google NMT系统的上线。
学术上的NMT虽然取得了丰硕的成果,但在实际的产品中NMT的效果却比不上PBMT。究其原因Google在技术报告[2]中总结了三点:
1、训练和预测的速度太慢。
要获得更好的模拟效果,就要用更深层的神经网络来拟合参数(下面会提到,GNMT用了8层的Stack LSTM来做Encoder)。这么复杂的神经网络在预测的时候就要耗费大量的资源,远远慢于PBMT的系统。并且在训练的时候拟合这么大规模的预料,可能要很久很久才能训练一次,这样不利于快速迭代改进调整模型参数。
2、NMT在处理不常见的词语的时候比较薄弱。
比如一些数字、或者专有名词。在传统PBMT系统中,可以简单地把这些词原封不动的copy到翻译句子中;但是在NMT中,这样的操作就无法有效的进行。
3、有时候NMT无法对输入源句子的所有部分进行翻译,这样会造成很奇怪的结果。
Google NMT的主要神经网络架构图如下:
仔细看,其实还是带Attenion的Encoder-Decoder逻辑。Encoder是由8层LSTM组成,最下面两层是一个双向LSTM,可以从前到后以及从后往前理解一遍输入的源语言输入。中间的蓝色模块就是Attention模块,负责对Encoder的逻辑进行加权平均输出到Decoder层。Decoder模块也是一个8层的LSTM,最终连接到Softmax层,一个词一个词输出最终的目标语言词语的概率分布。
算法上,论文中还提到了一些创新点。包括引入Wordpiece来对单词进行更细粒度的建模,来解决上面提到的不常见词语的问题;以及在Decoding结束之后,搜索最佳输出序列的时候,引入coverage penalty的概念,来鼓励Decoder输出更加完整的翻译句子,以解决有时候NMT有时候无法完整的翻译整句的情况。
工程上,报告里面着重谈到了几个性能优化的重点:
引入Risidual Connection
8层的LSTM堆叠起来,大大增加了神经网络的表达能力,在海量的数据下可以获得更好的模型效果。不过这样的堆叠会直接导致模型太庞大不可训练,在梯度反向传播的时候,很容易出现梯度弥散或梯度爆炸的问题。过去的研究证明[5],Residual Connection的方式,直接去学习残差可能会带来更好的效果,避免了深度网络中反向传播中出现的梯度反向传播可能会发生的问题。在上面的Google NMT架构图中,从倒数第三层开始都会引入Residual Connection。
大量的并行优化
与此同时,在工程上Google也进行了非常多的优化,来减少训练和实时翻译时候的延迟问题。比如训练数据的时候,数据会分成n等份,交给不同的GPU去异步训练,然后再汇总到统一的参数服务器;同时,Encoder和Decoder的不同层的LSTM会在不同的GPU上运行,因为更上一层的LSTM不必等到下一层的神经网络完全计算完毕再开始工作;即使对于最后的Softmax输出层,如果最后输出词的维度太大,也会划分到不同的GPU上并行处理。可谓不放过丝毫并行的机会。
底层基础计算平台的支持。Google NMT采用了自家的Tensorflow深度学习框架,并运行在Google专门为深度学习打造的TPU(Tensor Processing Unit)上,当年的AlphaGo也是由TPU提供支持。在对于模型参数的计算上,也大量应用了Quantized计算的技术:
由于神经网络参数涉及大量的耗时的浮点数运算,通过Quantization的方法,将模型参数由浮点数类型转换到一个更低精度(比如8bit),虽然会有一些精度的损失,但是可以大大减少计算量以及最终训练模型的体积。
从软件框架到定制硬件,相互配合,追求最极致的性能。在这篇报告里,有着长长的作者列表,最后赫然列着Google工程架构大神Jeffrey Dean的名字,他是当年一手创造了Map Reduce、Big Table等产品的Google奠基者之一。
Google这次的论文,基本框架仍然是带Attention模块的Encoder-Decoder。而且国内厂商,比如百度和搜狗,也发布了类似的神经网络机器翻译系统。百度早在去年,就发布“工业界第一款NMT系统”。不过,Google毕竟是机器翻译界的标杆,这次披露的论文也揭示了很多他们为了大规模商业化做出的努力,因此在业界引起了不小的震动。
注:[1]A Neural Network for Machine Translation, at Production Scale
[2] Wu, Y., Schuster, M., Chen, Z., Le, Q. V., Norouzi, M., Macherey, W., et al. (2016, September 26). Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation.
[3] Cho, K., van Merrienboer, B., Gulcehre, C., Bougares, F., Schwenk, H., and Bengio, Y. (2014a). Learning phrase representations using RNN encoder-decoder for statistical machine translation. In Proceedings of the Empiricial Methods in Natural Language Processing (EMNLP 2014).
[4] Sutskever, I., Vinyals, O., and Le, Q. (2014). Sequence to sequence learning with neural networks. In Advances in Neural Information Processing Systems (NIPS 2014).
[5] He, K., Zhang, X., Ren, S., & Sun, J. (1512). Deep residual learning for image recognition. arXiv preprint (2015).