点击上方“中兴开发者社区”,关注我们
每天读一篇一线开发者原创好文
作者简介
作者戴硕是深度学习爱好者,主要关注NLP方向。这篇文章向对深度学习感兴趣的初学者介绍了机器翻译当前的现状,及其涉及的基本原理和流程。
本文只对相关应用作简要介绍,不涉及公式推导(本文部分图片来源于网络)。
1.机器翻译的发展
上世纪80年代之前,机器翻译主要依赖于语言学的发展,分析句法、语义、语用等;
之后,研究者开始将统计模型应用于机器翻译,这种方法是基于对已有的文本语料库的分析来生成翻译结果;
2012年至今,随着深度学习的兴起,神经网络开始被运用在机器翻译上,并在短短几年取得了非常大的成果。
2.神经网络机器翻译(Neural Machine Translation)
2013 年,Nal Kalchbrenner 和 Phil Blunsom 提出了一种用于机器翻译的新型端到端编码器-解码器结构。2014 年,Sutskever等开发了一种名叫序列到序列(seq2seq)学习的方法,google以此模型在其深度学习框架tensorflow的tutorial中给出了具体的实现方法,取得了很好的效果(见https://www.tensorflow.org/tutorials/seq2seq)。
2.1 (预)最快速度介绍神经网络
深度学习(名字很高大上),就是指多层神经网络。上图。
这是一个单层的神经网络,多层神经网络就是在中间再插入若干个隐层,每个隐层有若干个结点。但输入输出层都只有一层。
传统的编程是给了输入,确定每一个步骤,最后得到输出。神经网络的做法是给定已知的多组输入输出,称为训练样本,要做的步骤(即模型)是未知的,那怎么确定步骤(模型)呢?“回归/拟合”,用最简单的方程模型来打比方。。。直接上式子!
神经网络的训练过程与此相似,也是通过训练确定隐层结点中的若干个系数。只不过神经网络模型本身是非线性的,比较复杂。前馈、误差反向传播、梯度下降这些名词,都是训练过程中用到的方法。
2.2 基础的seq2seq模型
基础的Seq2Seq模型由Encoder、Decoder以及连接两者的中间状态向量三部分组成,Encoder通过学习输入,将其编码成一个固定大小的状态向量C,继而将C传给Decoder,Decoder再通过对状态向量C的学习来进行输出。
2.2.1 RNN与LSTM
Encoder、Decoder编解码器一般采用循环神经网络(Recurrent Neural Network,RNN)的变种——长短时记忆神经网络(Long Short-term Memory,LSTM)。LSTM与普通RNN的不同之处在于,对于长距离的状态存储有着较好的效果。见下图。
(a) 普通RNN
(b) LSTM
普通的多层神经网络(DNN)中隐层的状态信息h(就是隐层结点的输出形式的一种)独立的。
RNN在当前某一时刻的隐层状态信息ht受到来自前一时刻的隐层信息ht-1影响,即RNN能够保存之前的部分记忆。对于机器翻译来讲,例如输入”My coat is white, hers is blue”,使用RNN模型,翻译后半句时,前半句的”coat”就提供了一定的信息。但是这种记忆会随着序列间隔的增大而大幅减弱。具体原理这里不作详细说明。
LSTM的在每个隐层的单元中使用了加法器(门控思想)实现记忆的有选择存储,类似于我们对于小时候的记忆也是有选择的记住一样,从而大幅度地规避了使用RNN产生的问题。翻译”My coat is white, hers is blue”,翻译到”hers”,之前的”My coat”的信息就通过加法器的门控逐级保留了下来。
2.1.2 Encoder-Decoder模型
上图即为机器翻译中的基本seq2seq模型的基本结构,可以看到Encoder编码器接受输入(例如:我是学生),通过序列间状态的传递,得到状态信息C。然后将C分别输入到解码器当中得到翻译后的输出。
这种模型运用于机器翻译中存在一个问题,就是解码器中接受的信息C全局只有一个。如果翻译“我是学生”,当翻译到“学生”,其实并不需要关注之前的“我是”,而且翻译的句子如果很长,C是个有限的量,很难保存住所有信息。所以我们希望Encoder能有所侧重地输出给Decoder。类似于下图。
Decoder端可以在翻译序列的不同时刻接收不同的状态信息。这就是Attention机制。
2.2 Attention机制
Google的Tensorflow框架中使用了Luong在2015年提出的attention机制,上图中的Ci就可以表示为Encoder中每个hi的加权和。权重参数wi的确定又可以用到一个小的神经网络来训练。Attention机制的提出大幅提高了机器翻译的准确性。
3.Facebook与Google的较量
2017年5月,Facebook首次将卷积神经网络(CNN,现在在计算机视觉大行其道,背后又是一堆原理公式...)用于机器翻译,利用CNN的可并行化,再套上一堆RNN的优点,模型(名为Fairseq)训练速度快(提升9倍),翻译准确性又好(衡量指标BLEU)。
紧接着,一个月后,Google开始打脸,祭出一篇《Attention is all you need》。提出一种新的Attention机制,并舍弃CNN和RNN,直接建立翻译模型,BLEU继续提高。
这两种模型的原理,可以搜索相关论文。
4.一个完整的seq2seq模型的流程
前三部分是对当前NMT的相关研究的简要介绍。下面将给出一个完整的seq2seq模型的步骤说明,依然不涉及公式推导,但因为机器翻译属于自然语言处理(NLP)的一部分,所以会提到一些NLP的相关知识。
1) 获取到原始数据集,作训练样本,数据集中包含大量的英文——中文的翻译句子,分为train_source,train_target 两个文件。
I am a student 我是一名学生
You are so clever 你真聪明
...
2) 以单个单词为单位构造映射表,也可以称为词典库,key:value格式,key为索引。
{
0 : I,
1 : am
}
{
0 : 我,
1 : 是
}
3) 这样就可以转换成类似于a=[2, 45, 2, 5, 6]这样的索引向量形式。这些向量本身都是独立的,因此还需要把训练样本中各个单词之间的相关性都找出来这就是embedding,embedding是一个矩阵,原始的向量经过embedding矩阵的映射,转换成另一个向量。
经过映射得到的embed向量之间就有了相关性(至于原理,这又是一堆让人抓狂的公式)。比如,训练样本中出现”go”, ”went”, ”walk”就可以表示成具有相关性的三个向量,相关性的衡量有多种(余弦相似度...)。
4) 就此得到了向量化的训练样本,计算机就可以认识并处理。因为样本太大了,可能有几百万组,一次性全部训练,时间太长,并且效果也不好。所以将样本分为多组,每一组叫一个batch,按照batch进行训练。
5) 训练过程如下:
for i in 总训练轮数(100000次):
for j in batches(64个):
编码器(Encoder) 入参:训练样本输入train_source,隐层结点数,隐层层数
输出:编码器输出,隐层状态向量C
解码器(Decoder) 入参:训练样本输入train_target,隐层状态向量C
输出:预测输出
计算损失函数(误差,用于训练校正)
梯度下降法(对误差求偏导,求全局极值点,校正模型参数的具体方法)
不断寻找最优的模型参数
得到最优的模型参数
保存模型
6) 输入测试样本,”you are so handsome”,得到翻译输出“你真帅”。
5.总结
以上就是基本的seq2seq模型的翻译流程,seq2seq不止可以用在机器翻译领域,在语言生成等领域也有较好的应用效果。
本文力求以简洁的方式介绍机器翻译领域的深度学习,文中可能存在一些表述不太贴切的地方,欢迎指正。