从手撸机器翻译 学习原味Transformer

项目目标:目前Transformer凭借着其强大的性能成为机器翻译的主流方法之一。因此,本项目旨在调研综述目前基于Transformer的机器翻译的现状。然后基于Pytorch框架搭建一个Transformer的Baseline网络,同时在数据方面基于CMN中英文口语双语句对数据集进行汉语分词与词典建立,最后对Transformer进行训练。

(由于可以计算资源仅有GTX1050Ti,算力有限,仅能抽取少量数据进行训练,故其泛化能力有限,故本报告更多强调实现原理及其可行性)

  • 基于Encode-Decode的机器翻译研究:

1.1 机器翻译的发展历程

       语言翻译是人类不可避免面临的问题。机器翻译自1949年由Weaver提出后[1],规则的方法在20世纪前占据着主导地位,但是这种方法面临着不可避免的缺陷是:过分依赖语言学专家,规则的编写工作量大且主观性强,基本不可能覆盖所有的语言,尤其是结构比较自由的日常语言。随后20世纪90年代,Peter等人基于平行句对语料提出了著名的IBM模型[2],开创了统计机器学习的研究,再度引起了机器翻译的热潮。但是在复杂的概率模型中引入了各种简化或者人为设置的假定,使得统计机器学习并不能充分地利用语料。

       直到2013,深度学习被引入到机器翻译并得到了广泛的使用。据机器翻译会议的翻译任务(the Conference on Machine Translation, WMT)提交情况,2015年仅有1个机器翻译系统使用了神经机器翻译模型,而2017年基本所有的提交模型均为神经机器翻译模型。

       在2013年,Kalchbrenner等人首次提出实际意义上的神经网络Encode-Decode翻译模型[3],该模型包括两个主要部分:第一个部分为卷积网络,对源句子进行卷积编码;第二部分的任务是预测目标句子的长度,并解码产生目标句子。这是把在图像处理中应用广泛的CNN成果引入到机器翻译的重要案例。2014年,Sutskever等人[4]首次把多层长短时记忆网络(Long Short-Term Memory , LSTM)完成从英语到法语的翻译,第一个LSTM网络把源句子映射到低维稠密的固定长度的向量中,第二个LSTM网络的任务是把向量解码到目标语言中,LSTM网络的引入在一定程度上缓解了翻译长句子困难的问题,但在实际中仍然难以满足应用的需求。

       注意力机制的引出,通过直接的词到词的直接跳跃式的注意力方法,避免了RNN翻译时的遗忘问题,从根本上缓解了长句子带来的翻译困难。目前注意力机制已经广泛应用到了各个邻域与任务,在机器翻译中,目前具有以下三种主流的框架,分别是:堆叠式的注意力循环神经网络(Stacked RNN with attention)、自注意力机制(Self-attentional Transformer)及序列到序列的全卷积模型(Fully Convolutional Models)。

堆叠式的注意力循环神经网络由Bahdanau在2015年提出[5],其网络框架如图1(a)所示,其编码网络由正反两个方向的多层RNN网络堆叠而成,对网络的原句子X逐词正反连接形成低维向量,其注意力机制体现在其解码过程,对于其目标语言的当前翻译词yi,取决于原句子中所有的相关词汇,并通过权重来区分其重要性的差异。因为每个词的产生都直接取决于其源词汇,因此该模型在翻译长句子的表现上都达到当时的领先水平,此外,这种目标语言的产生原理非常明确,在可解释性上相对于一般的神经黑箱模型具有优势。但其网络框架不可避免地产生以下缺点:RNN是串行 的训练机制,导致其训练的时间明显多于并行计算,此外,每产生一个单词都需遍历前后向模型,限制了其在实时翻译的应用。

为解决上述串行计算困难的问题,2017年,Vaswani等人[6]提出了Transformer模型,其网络框架如图1(b),该模型的编码和解码过程均采用多头的自注意力机制,以此代替了RNN的功能并实行并行计算,基本单元块内采用了残差连接,以充分表达词之间的关系与句子的深层语义信息,编码网络与解码网络之间也通过注意力机制完成,每次翻译当前目标词均访问进深层提取的原句子所有相关词。但是这也不是完美的,注意力机制使用在整个句子中,尽管注意力机制理论上能够只关注与其相关的内容,但在实际中往往不会出现无关词“0注意力”情况,这将导致某些无关词干扰了正确的翻译,此外,这种全句子的注意力机制的点积运算复杂度与句子长度成二次方关系,导致其在使用长句子的训练时会产生较大的不必要计算量。

同为2017年,Gehring等人[7]通过全卷积的方式克服RNN不具备的并行计算功能,其网络框架如图1(c)所示,卷积操作具有局部感受野,经过多层卷积,建立卷积金字塔,相邻词汇可以在金字塔的底层建立联系,相距较远的词可以在金字塔顶部建立联系。当然,相对于自注意力机制,卷积所建立的关系需要付出更大的计算代价,而且与句子的长度成正比关系。

1.2 机器翻译面临的挑战

       尽管基于神经网络的机器翻译模型使得翻译质量得到了飞跃式的提升,但其依然存在着很多的不足与挑战[8]。首先,从翻译质量角度,目前大多数翻译系统的输入输出都是以句子为基本单位,单凭一个句子将不可避免地导致在某些词的翻译上存在歧义的现象,因此,目前其中一个很大的挑战是如何把段落或者文章作为翻译的基本单位,这将具有更加丰富的上下文信息来去除歧义。其次,从翻译效率角度,目前翻译模型的Decoder部分产生第i个目标语言词汇往往取决于其前i-1个词汇的翻译作为输入,这种串行机制极大地降低了翻译的效率,如何实现并行式的解码也是一个很重要的问题。另外,从翻译资源角度,训练一个泛化能力强大的翻译模型需要巨大的双语句对,然而在某些小众的语言很难存在这样的条件,如何用小样本训练出强大模型,是目前整个人工智能领域共同探讨的热门问题。最后,从实际应用上,目前的翻译模型主要处理纯文本任务,但在实际的场景中,文字通常会连同视频、图像或语言同时存在,大量的语义信息存在于多模态的数据中,如何实现多模态的数据融合实现更广义的机器翻译也是目前的热点研究问题之一。因此,Transformer并非机器翻译的“句号”,机器翻译依然有很长的路要走。

二、系统的实现:

       系统主要由训练数据预处理及Transformer的训练与测试两部分构成。

2.1 汉语分词与词典的生成

       训练数据预处理主要包括汉语分词以及双语词典的生成。本报告语料采用CMN英语-中文口语双语句对(见文件cmn.txt),其部分句对例子如图2所示。在Transformer翻译器训练之前,需要对双语句对进行汉语分词以及词典的生成处理(见文件get_data.ipy)。对于汉语分词问题,可采用基于规则的方法、由字构词的序列标注方法、基于神经网络的方法等,其研究甚为成熟,因此在本报告中直接调用jieba汉语分词工具。在完成汉语分词后,基于分词结果和英文单词依次建立双语字典,字典采用dict形式的存储方式,且使用       '<pad>': 0, '<bos>': 1, '<eos>': 2符号分别对补零,开始、终结符进行定义,最后使用pkl格式保存在目录\data\middle_data下。

图2 cmn部分英汉双语口语句对

2.2 Transformer 的主要原理与实现

2.2.1 Transformer子模块解读

       Transformer 的结构如图1(b)所示,其主要组成包括Encoder和Decoder,其核心为多头注意力机制。首先,对于注意力机制,其计算方法如下所示:

其中,q代表查询向量(Query),K代表键向量(Key),V代表值向量(Value),qKTdk代表求取查询向量与键向量的相似度并做标准化处理,但是上述公式不含有权重,无法有选择地重视某些系数的联系,因此attention机制需要在三个矩阵输入时对应乘上权重矩阵W。特别地,若Q, K, V采用同一个矩阵,则计算的是自注意力机制。多头注意力机制与上述注意力机制的区别在于:多头注意力机制对词向量的长度进行划分,独立求取乘积,再做矩阵粘合,这样的好处在于各部分的乘积是独立的,不同的头可以重视不同的语义信息,如句法结构、前后文语义等。其具体流程如图3所示。

图3 多头注意力机制

       基于上述多头注意力机制,则Encoder模块可以通过图4表示,其主要过程为:多头注意力机制对输入进行处理后进行残差连接与归一化,接着通过前馈网络进行非线性映射,所产生的结果依然通过残差连接与归一化。这样形成了一个基本的Encoder基本单元,通常地,会采用多个单元串联构建深层网络,有利于提出深层的语义信息。此外,残差连接有利于防止出现梯度消失的问题,而归一化有利于提高运行的速度。

图4 Encoder模块

       类似地,Decoder模块如图5所示,与Encoder不同的是,Decoder不仅使用已翻译的内容作为输入进行自注意力机制求解,还使用该结果作为查询向量与Encoder的输出进行注意力机制的求解,这样的好处在于不仅能关注到已翻译内容的联系性,还能直接获取目标语言与源语言的直接联系,从而避免了RNN所出现的遗忘问题。求解源语言与目标语言的注意力机制后,类似于Encoder进行全连接的前馈网络实现全局关系的建立于非线性映射。

图5 Decoder模块

       当然,除此之外,在源句子输入时需要对各个词的位置进行编码,以致于每个词在运算时不会丢失原处的位置信息,对位置编码的要求,理论上只要保证各个位置存在互异性即可,但在实际中通常采用Vaswani[6]等人所提出的编码方式,即:

PE(pos,2i)=sin⁡(pos/100002i/dmodel)

PE(pos,2i+1)=cos⁡(pos/100002i/dmodel)

通过上述式子计算得到位置的编码信息,对该信息进行可视化如图6所示,最后编码向量与原词汇向量进行叠加作为输入。

图6 可视化位置编码

2.2.2 Transformer的翻译机制

       Transformer的翻译机制是每次都把源语言句子整句以及已翻译的目标语言部分作为输入,目标语言的下一个单词作为预测输出,举个例子,翻译以下句对:

源语言:('<bos>', '我', '是', '一个',  '帅哥', '<eos>')

目标语言:('<bos>', 'i', 'am', 'a', ' handsome ', 'man', '<eos>', '<pad>', '<pad>')

则每次模型的输出依次为:

  • Encoder input: ('<bos>', '我', '是', '一个',  '帅哥', '<eos>')

Decoder input: ('<bos>', '<pad>', '<pad>', '<pad>', '<pad>', '<pad>', ''<pad>'', '<pad>', '<pad>')

  • Encoder input: ('<bos>', '我', '是', '一个',  '帅哥', '<eos>')

Decoder input: ('<bos>', 'i', '<pad>', '<pad>', '<pad>', '<pad>', ''<pad>'', '<pad>', '<pad>')

  • Encoder input: ('<bos>', '我', '是', '一个',  '帅哥', '<eos>')

Decoder input: ('<bos>', 'i', 'am', '<pad>', '<pad>', '<pad>', ''<pad>'', '<pad>', '<pad>')

……

  • Encoder input: ('<bos>', '我', '是', '一个',  '帅哥', '<eos>')

Decoder input: ('<bos>', 'i', 'am', 'a', ' handsome ', 'man', '<eos>', '<pad>', '<pad>')

2.2.3 Transformer的mask机制

       在编写Transformer时,由于原句子和目标句子在数据定义上需要分配固定的长度,因此句子中存在大量的<pad>来填补无用的存储空间。这导致在训练时使模型收敛到任意内容都自动翻译为<pad>的平凡解,如图7所示。

图7 模型收敛到<pad>的平凡解

这是我们所不希望的,因此,我们定义源句子与目标句子的对应矩阵W,源句子有填充符号<pad>,该字符并不需要被目标句子注意到,因为对于翻译没有作用。而W矩阵中,每一个目标句子字符,都有关于<pad>字符的注意力权重,这里只需要一个key_padding_mask矩阵(0/-inf),进行如下图8所示操作,即可消除目标句子对于源句子中<pad>的注意力权重:

图8 Mask机制

三、实现结果与分析:

      由于算力有限,训练中仅采用约1000个句对进行训练,泛化能力极为有限。因此,采用BLEU[9]等指标对翻译系统进行评价毫无意义,故本部分主要分析所遇到的问题及其原因。下述翻译模型模仿torch.nn.transformer进行编写,所用汉译英,英译汉模型分别训练时长约24小时收敛至可接受解。训练采用Adam优化器、NLLLose,初始步长为0.0001,使用学习率衰减为系数为:0.999。

3.1 Transformer 的训练所遇到的问题

       在具体实验中,进行汉语分词与Transformer的模型搭建并非难事。大多数时间都花费在超参数的整定与测试中,部分调参测试记录如图9所示。这些超参数主要包括:Batch的尺寸、学习率的大小与衰减、词向量的长度、Encoder/Decoder基本单元个数及全连接层的元素个数等。

图9 部分调参测试记录

       首先对于Batch_size,当其选择较大值时,一方面可能会导致其显卡内存溢出,在另一方面虽然模型训练的初期Loss能够相对于较小的Batch尺寸迅速下降,但当误差下降到一定程度时,其误差变得难以继续下降至收敛值。这是由于使用batch计算梯度时,反向传播算法使用的误差是整个Batch误差之和,导致模型收敛到一个折中的,而非局部最优值,而batch尺寸越大,这种折中难收敛的现象就越明显。理论上通过调节适配的学习率和足够的训练次数依然能达到收敛值,但是在实际实验中非常难。另外,当batch的尺寸很小(Batch Size=1)时,训练误差起伏变化较大,而且在一定的迭代次数后,常常返回Loss=nan(非数)。这是由于梯度爆炸造成的。因此,在训练时采用的batch为2。

       其次对于学习率的整定问题。较大的学习率导致收敛停滞,无法到达最优解。较小的学习率严重影响训练效率。因此,本实验中采用了早期采用较大学习率,并采用线性学习率衰减的方法导致后期较小的学习率。在Transformer原文中[6],采用了Warm up预热学习率[10],其学习率变化曲线如图10所示,由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。

图10 warm up学习率

       对于词向量的长度、Encoder/Decoder基本单元个数及全连接层的元素个数等直接决定了翻译模型的复杂度和训练的时间。其需遵守的原则是:模型的复杂度应与数据量相匹配,其关系如图11所示。当模型复杂度较高,而数据较少时,会出现过拟合的现象,在测试集的泛化性能下降。而模型复杂度太低时,将会导致欠拟合的现象,也不能获得很好的测试精度,甚至训练时都无法收敛到可接受解。因此需要反复测试对参数进行选择。

图11 模型复杂度与预测误差的关系

3.2 Transformer 的在给定句子测试表现

       由于训练数据较少,故完成训练后,无法用BLEU等指标进行测试。故选择给定一些句子测试模型的翻译能力。英译中测试如图11,中译英测试如图12所示。

图11英译中测试

       测试句子中,['<bos>', "I'm", 'busy', '.',  '<eos>'],['<bos>', 'Get', 'away', '!', '<eos>'], ['<bos>', 'Humor', 'me', '.',  '<eos>']都来自训练集的数据,且无论句子的长短都能得到正确的翻译,证明模型对训练集内容拟合情况较好。当把['<bos>', "I'm", 'busy', '.',  '<eos>'] 改为['<bos>', 'I', 'am', 'busy', '.',  '<eos>']时,后者从未从训练集出现,单也能得到较为良好的效果,证明模型有一定的泛化性能。然而把['<bos>', 'Get', 'away', '!', '<eos>'], ['<bos>', 'Humor', 'me', '.',  '<eos>']合并为一句话['<bos>', 'Get', 'away', '!', 'Humor', 'me', '.',  '<eos>']时,模型只能翻译前半部分,因为句子在获得前三个词后直接预测了结束符。这其实可以理解的,一方面,两句话在训练时是独立的,前一句话已完成的翻译的内容作为模型的输入确实很难预测到下一句话的起始单词,而结束符的概率会更大,另一方面,这也表现出了过拟合倾向。

图12中译英测试

       相比于英译中,无论从训练难度或者翻译质量来看,中译英的难度看似更大。在测试中选择了五句训练未曾出现的句子,观察其翻译质量有以下特点:①从语义角度,翻译的内容基本能实现意思的传达,这说明系统能够把词汇转化为低维稠密的连续表示,语义相似的词汇能够在该空间进行相近的表达。②在翻译时候会莫名地添加状语,如resently、yesterday等这是由于在训练数据中,大多数的语料都具备着状语,即大多数句子的句尾预测得到状语的概率非常大,故导致该现象。③在翻译中存在着大量的语法错误,如’is’, ‘is’, ‘dying’等,这是训练数据稀疏时表示学习模型固有的缺点,不像规则方法,表示模型更倾向于语义正确,若需确保句法正确还需要海量的数据继续训练。

四、总结:

       在本报告中,主要调研了以神经模型为主的机器翻译的发展历程、现状以及挑战。接着,本报告进行了汉语分词,并选择了Transformer作为神经翻译模型的实验对象对其原理进行了阐述。最后,针对Transformer的搭建、训练及其结果进行了讨论与分析。由于本人水平不精、计算资源有限,有很多问题尚待优化与提升,望助教老师批评指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值