基本介绍
最早机器翻译是基于规则的词语翻译(rule based machine translation, RBMT),因为无法解决词语多重含义和句子结构多样性,这种方法现在已经不再使用。
几年前,机器翻译界的主流方法都是Phrased-Based Machine Translation (PBMT),当时Google 翻译使用的也是基于这个框架的算法。所谓Phrased-based,即翻译的最小单位由任意连续的词(Word)组合成为的词组(Phrase)。其本质上属于统计机器翻译Statistical Machine Translation (SMT),即基于概率统计而非基于规则来学习源语言到目标语言的映射函数。90年代提出的IBM model是统计机器翻译中的经典翻译模型,也是基于词的统计机器翻译系统的基础。IBM翻译模型共有5个复杂度依次递增的统计翻译模型,IBM model1是其中最简单的模型,也是其他模型进行计算的基础。IBM模型1仅仅考虑词对词的互译概率,模型2引入了词的位置变化概率,而模型3加入一词翻译成多词的概率。SMT在整个翻译过程中,需要依次调用其他各种更底层的 NLP 算法,比如中文分词、词性标注、句法结构等等,最终才能生成正确的翻译。这样像流水线一样的翻译方法,一环套一环,中间任意一个环节有了错误,这样的错误会一直传播下去(error propagation),导致最终的结果出错。
深度神经网络提倡的是端到端学习,即跳过中间各种子 NLP 步骤,用深层的网络结构去直接学习拟合源语言到目标语言的概率。最新成果来自于论文:“Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation”。该成果的评价是:“各种算法综合积累的成果,是过去几年自然语言处理领域好方法的集成,集成了Seq2Seq + Attention + Stack LSTM + Minimize Sentence Loss,方法学上的贡献不多,实验经验的贡献比较多”。本质上是在NMT(Neural Machine Translation)的基础上所做改进。
在众多的机器翻译自动评价方法中,2002年IBM提出的基于N-gram精确率的BLEU方法是目前采用最广泛的。BLEU测度的原理是计算待评价译文和一个或多个参考译文间的距离。距离是文本间n元相似度的平均,n=1,2,3(更高的值似乎无关紧要),即统计同时出现在系统译文和参考译文中的n元词的个数,最后把匹配到的n元词的数目除以系统译文的单词数目,得到评测结果。也就是说,如果待选译文和参考译文的2元(连续词对)或3元相似度较高,那么该译文的得分就较高。一般来说人的 BLEU 值在50-70之间。
(启示:在体验度量中,建议考虑一种方法和机制来进行自动评价模型的效果,该方法和机制可以不受网络设备端的约束,只是作为一种自动反馈)
虽然SMT现在被NMT取代,但从目前准确率来看差距并不是很大,因此还是有参考价值
思路分析
SMT
业务建模
该模型为噪声信道模型,它假定源语言中的句子f是由目标语言中的句子e经过含有噪声的信道编码后得到的。p(e)表示语言模型,即e是否像一个句子。p(f|e)表示翻译模型,即是否忠实于原文。至此,模型拆分为2个问题。首先,对于语言模型表示如下图
在实际中,常用马尔可夫假设来简化该问题,即下一个词仅仅依赖前面若干词,称为n-gram模型,n=1和2情况如下所示
P的计算是直接从语料库中统计得到,目前资料来看以trigram模型表现最佳。
(启示:对应体验度量,令A表示网络参数为A的概率,令B为体验为差的概率,那么目标表示为P(B|A)=P(A|B)P(B)/P(A),其中P(B)表示整体情况下体验为不好的概率,P(A)表示网络参数为A的概率,P(A|B)为体验不好网络参数为A的概率,该方法一般来说,难点在于如何得到P(A|B)和P(B))
一开始假定a是等概率(启示:这个在很多案例中可以见到,一开始使用最原始的假定,比如等概率,或者初始值为0等),
再定义t为单词翻译的概率,即
也就是
最后得到
当a知道时,按下列方法计算q和t即可,当然这是理想情况
实际上,更多的是当a不知道时,就出现一个问题,要学习到词到词的翻译概率,就必须知道单词对齐;要学习单词对齐,就得知道翻译概率,这种鸡生蛋的问题就需要用EM算法来逐步趋近(启示:更一般的,假设想估计A和B两个参数,在开始状态下二者都是未知的,但如果知道了A的信息就可以得到B的信息,反过来知道了B也就得到了A。可以考虑首先赋予A某种初值,以此得到B的估计值,然后从B的当前值出发,重新估计A的取值,这个过程一直持续到收敛为止。注:某些情况下可能无法得到满意结果)
(启示:SMT本质还是基于业务特性来考虑特征提取)
IBM Model 3,4,5及Model 6引入了“Fertility Model”,代表一个词翻译为若干词的概率,是基于model 1和model 2,在另一个展开式下的建模,这里暂不说明。
数据收集
受限于当时计算机的能力,虽然有百万级的语料库可用,但IBM的实验最多采用了117,000法英句对用于训练基于词的翻译模型,570,000英语句子用于训练2-gram语言模型。
(启示:如何降低数据获取代价)
数据准备
对句子中词语进行分词,目前分词方法主要有2种,一种是根据词典来机械分词,一种是根据统计概率来分词。
预处理的结果是生成双语分词之后的文件,需要注意的是对规则短语,比如数字、日期、网址等,进行泛化处理。
建模分析
算法核心是EM,属于生成模型。
模型评估
优点:隐结构可解释性高;利用局部特征和动态规划处理指数级结构空间;
缺点:线性模型难以处理高维空间中线性不可分的情况;需要人类专家设计隐式结构及相应的翻译过程;需要人类专家设计特征;离散表示带来严重的数据稀疏问题;难以处理长距离依赖。
NMT和GNMT
转变思路,从局部到整体,因为翻译是一个单词序列到另外一个单词序列,所以很适合使用Seq2Seq模型,这样可以排除人为构造各种特征(如SMT中的对齐隐变量),保留尽可能多信息减少损失。下面先介绍下NMT的设计。
业务建模
Nal Kalchbrenner和Edward Grefenstette在2013年提出基于“编码-解码结构”一种新的机器翻译框架,对于源语言句子,采用一个卷积神经网络把它映射成一个连续稠密的隐向量,再使用一个递归神经网络做为解码器,把这个隐向量解码成目标语言句子,因为RNN存在着“梯度消失”和“梯度爆炸”的问题,没办法捕获比较长时间的依赖关系。后来Kyunghyun Cho,Dzmitry Bahdanau,Yoshua Bengio改成分别采用一个RNN作为编码和解码器,第一个RNN把源语言句子映射成一个固定长度的输出隐向量,然后第二个RNN把固定的长度的隐向量解码成目标语言句子。与之前不同在于:1、编解码采用的都是单层的LSTM;2、提出了比LSTM结构更为简单的GRU单元,简化模型的训练。
从建模思路来看,句子属于变长数据,而且属于有顺序的数据(词语在句子中先后出现次序),所以使用RNN更合适,如下图所示
因为RNN中隐含层节点间存在连接,隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出,即神经元的输出可以在下一个时间戳直接作用到自身,展开来看形如
比如,如果一个序列正在处理一个由5个单词组成的句子,网络将会被展开成为一个5层的神经网络,每一层对应一个单词。
可以通过不断的将当前输入和历史输入组合将序列压缩为某个定长维度向量,RNN中参数使用BPTT算法求得。
两个 Recurrent Neural Networks (RNNs) 递归神经网络。一个用来处理输入的文本 (encoder network),一个用来生成翻译后的文本 (decoder network)。它们一个负责编码,将源语言编码成向量,一个负责解码,将向量解码为目标语言。其优点在于可以从生数据中学习特征,将语义相同句子汇聚,不同句子分开,还有利于LTSM捕获长距离依赖,解决稀疏问题。(启示:因为RNN可以处理变长输入和变长输出,还具有记忆功能)如下图所示,为了生成编码(橙色),我们将句子输入到RNN中,一次一个词(红色)。最后一个词处理之后的最终结果(橙色),就将是表示整个句子的数值:
这个过程的本质是seq2seq,除了机器翻译,该思想还可以应用在智能对话、文本摘要、代码补全。
所谓注意力,是指当解码器在生成单个目标语言词时,仅有小部分的源语言词是相关的,绝大多数源语言词都是无关的。采用双向循环神经网络编码器对源语言句子进行编码。在从隐层中读取信息输出的时候,会根据现在正在翻译的是哪个词,自动调整对隐层的读入权重。即翻译每个词的时候,会更加有侧重点,这样也模拟了传统翻译中词组对词组的对应翻译的过程。
数据收集
有大量可用于训练的数据,如中英文对照版本的书籍。神经网络需要海量的训练数据,至少是百万级的句对。Google是通过搜索大量的双语网页内容,将其作为语料库。
但是对于大多数语言来说,这些庞大的数据集是不存在的。这也是为什么机器翻译只能支持非常少的几种常用语言。比如谷歌翻译只懂得90种语言。所以现在有人又提出了另一种新方法:观察时态在不同语言中出现的形式。大多数语言会使用具体的字词组合来表示时态。所以他们提出的新方案就是人工识别出几种语言中表达时态的标志性字词,然后用数据挖掘技术来寻找其他译本中具有类似功能的字词。
数据准备
是否需要进行分词预处理,目前看和语种有关,不是必选项。相关的,GNMT引入Word piece来对单词进行更细粒度的建模,来解决不常见词语的问题。
在编码阶段,句子里每个词被转成向量,向量维度等于词汇表容量,里面只有一个1,其他都是0,但这个向量(One-hot Representation)的维度太大,所以需要压缩成Distributed representation。这个过程称为word2vec,具体方法是通过一个映射矩阵C,Si=C×Wi,映射到100-500维。该矩阵是语料库通过NNLM ( Neural Network Language Model,即神经网络语言模型)训练得到,当上下文数量为n的时候,是用前n-1个词语,也就是w(t-1) … w(t-n+1),来预测第t个词语w(t)。在神经网络中,用于计算的都是这些词的向量表示,如C(w(t-1)) 就是词语 w(t-1) 的向量表示。这里C(w(t-1))其实就是词向量,但不是最终的词向量,最终结果还需要多轮迭代计算。词语w转化为词向量C(w),就是根据词 w 的one-hot 形式,通过矩阵相乘得到,因为是one-hot所以相当于取矩阵的某一列。系数矩阵C,就是神经网络的参数,最初是随机的,随着训练的进行不断被更新。
具体的,Word2Vec实际上是两种不同的方法:Continuous Bag of Words (CBOW) 和 Skip-gram。CBOW的目标是根据上下文来预测当前词语的概率。Skip-gram刚好相反:根据当前词语来预测上下文的概率(如下图所示)
这两种方法都利用人工神经网络作为它们的分类算法。起初,每个单词都是一个随机 N 维向量。经过训练之后,该算法利用 CBOW 或者 Skip-gram 的方法获得了每个单词的最优向量。取一个适当大小的窗口做语境,输入层读入窗口内的词,将它们的向量(K维,初始随机)加和在一起,形成隐藏层K个节点。输出层是一个巨大的二叉树,叶节点代表语料里所有的词(语料含有V个独立的词,则二叉树有|V|个叶节点)。而这二叉树构建的算法就是Huffman树。这样,对于叶节点的每一个词,就会有一个全局唯一的编码,形如"010011",不妨记左子树为1,右子树为0。接下来,隐层的每一个节点都会跟二叉树的内节点有连边,于是对于二叉树的每一个内节点都会有K条连边,每条边上也会有权值。
Hierarchical Softmax用Huffman编码构造二叉树,借助了分类问题中使用一连串二分类近似多分类的思想。例如我们是把所有的词都作为输出,那么“桔子”、“汽车”都是混在一起。给定w_t的上下文,先让模型判断w_t是不是名词,再判断是不是食物名,再判断是不是水果,再判断是不是“桔子”。没有使用这种二叉树,而是直接从隐层直接计算每一个输出的概率——即传统的Softmax,就需要对|V|中的每一个词都算一遍,这个过程时间复杂 度是O(|V|)的。而使用了二叉树(如Word2vec中的Huffman树),其时间复杂度就降到了O(log2(|V|)),速度大大地加快了。
(启示:先将原始数据表示为最直接的形式,然后考虑压缩,这里只是对词向量降维,不涉及整个句子的降维)
建模分析
RNN属于生成模型。RNN的训练同样使用BP误差反向传播算法,不过有一点区别。如果将RNN进行网络展开,那么参数是共享的,而传统神经网络却不是的。并且在使用梯度下降算法中,每一步的输出不仅依赖当前步的网络,并且还以来前面若干步网络的状态。该学习算法称为Back propagation Through Time (BPTT)。结合前面RNN的展开图示,定义下面符号
其中存在关系
BPTT和BP算法类似都是使用梯度下降算法,不同在于BPTT需要对求损失函数对U、V、W的偏导数,而BP算法只对权重W求偏导数。
BPTT无法解决长时依赖问题(即当前的输出与前面很长的一段序列有关,一般超过十步就无能为力了),因为BPTT会带来所谓的梯度消失或梯度爆炸问题(the vanishing/exploding gradient problem),也就是后面时间的节点对于前面时间的节点感知力下降。有很多方法解决这个问题,如LSTM模型。在这个模型中,常规的神经元,即一个将S型激活应用于其输入线性组合的单位,被存储单元所代替。每个存储单元是与一个输入门,一个输出门和一个跨越时间步骤无干扰送入自身的内部状态相关联。
为了更好的理解,通过下图来对比RNN和LTSM
RNN与LSTM最大的区别在于LSTM中最顶层多了一条名为“cell state”的信息传送带,传送带本身是无法控制哪些信息是否被记忆,起控制作用的是下面将讲述的控制门(gate)。控制门的结构如下:主要由一个sigmoid函数跟点乘操作组成;sigmoid函数的值为0-1之间,点乘操作决定多少信息可以传送过去,当为0时,不传送,当为1时,全部传送;LSTM中有3个控制门:输入门,输出门,记忆门;
LSTM模型的思想是将RNN中的每个隐藏单元换成了具有记忆功能的cell(如上图所示),其余的跟RNN一样;
(1)输入节点(gc):与RNN中的一样,接受上一个时刻点的隐藏节点的输出以及当前的输入作为输入,然后通过一个tanh的激活函数;
(2)输入门(ic):起控制输入信息的作用,门的输入为上一个时刻点的隐藏节点的输出以及当前的输入,激活函数为sigmoid(原因为sigmoid的输出为0-1之间,将输入门的输出与输入节点的输出相乘可以起控制信息量的作用);
(3)内部状态节点(sc):输入为被输入门过滤后的当前输入以及前一时间点的内部状态节点输出,如图中公式;
(4)忘记门(fc):起控制内部状态信息的作用,门的输入为上一个时刻点的隐藏节点的输出以及当前的输入,激活函数为sigmoid(原因为sigmoid的输出为0-1之间,将内部状态节点的输出与忘记门的输出相乘可以起控制信息量的作用);
(5)输出门(oc):起控制输出信息的作用,门的输入为上一个时刻点的隐藏节点的输出以及当前的输入,激活函数为sigmoid(原因为sigmoid的输出为0-1之间,将输出门的输出与内部状态节点的输出相乘可以起控制信息量的作用);
模型评估
NMT克服了传统基于分词翻译的很多缺点,但是存在3个缺点:1速度慢:对大规模的数据集,训练的速度慢;推断 (即最后翻译) 的速度也慢,因为涉及到大量的参数;2准确率低,不稳健:无法处理罕见词;3有时候并不翻译所有输入的内容,即没有完全覆盖所有的输入文本。