基于attention机制的中英文机器翻译

前言

为了准备3月中旬的复试,今天回顾整理一下大三下学期做的机器学习课程设计,当时做的是基于attention机制的中英文机器翻译。参考的资料是pytorch官网的英法文间的机器翻译。pytorch参考链接

sequence to sequence介绍

一般的机器翻译是通过sequence to sequence network序列到序列网络的简单而强大的想法实现的,其中两个RNN递归神经网络一起工作以将一个序列转换为另一个。编码器encoder网络将输入序列压缩成矢量,解码器decoder网络将该矢量展开为新的序列。

递归神经网络(RNN)是一个网络,它按照一个序列进行操作,并将其自己的输出用作后续步骤的输入。一个输入对应一个输出的个RNN网络难以用于序列的转换学习,因为转换前后的序列长度在通常情况下是不同的,比如“一 袋 苹果”这样一个包含三个词汇的中文句子对应了“a bags of apples”四个词汇的英文句子。

而encoder模型把输入的序列数据转换为一个一定长度的矢量,这个矢量表示了这一个输入序列句子的整体意思。Encoder RNN模型如下图:
图1:
在得到encoder最后的隐层输出即得到输入序列数据的整体表达的矢量,将这一矢量作为decoder的第一个隐层状态,并将“SOS”(start of sequence)的编码作为decoder的第一个输入,然后依次将上一时刻的输出编码作为下一时刻的输入编码。从而把encoder的输出含义矢量转换为序列数据,从而实现两条序列的转换。一般的decoder如图所示。
decoder
整体的encoder-decoder模型工作原理如图。
sequence to sequence

注意力机制的decoder

普通的decoder机制只是简单的把整个句子转化编码为一个矢量,这并不符合人翻译过程中“逐字翻译”的真实情况,而且缺乏对细节的学习,这些不足都成为了翻译效果无法提高的瓶颈。而Attention注意力机制decoder在翻译每个单词的过程中,分别“聚焦注意”在输入句子的不同部分。这一思路是由一组注意力权重实现的,在encoder输入原始句子的每个单词的时候分别计算注意力权重,将权重和编码器encoder各个状态的输出构成的矢量进行加权组合,从而得到包含句子的信息的矢量,每个encoder隐层状态单词对应的注意力权重越大,说明对这个词的关注力度越大这个矢量包含了对该输入待翻译句子不同词汇不同的专注度,形象化的图示如图。
attention加权相加

整体网络结构

整体网络有encoder编码器和带有attention机制的decoder解码器构成,编码器和解码器都是三层的gru网络,整体网络结构如图。embedding层网络将输入的标量转换为互相正交的矢量作为输入词汇的编码矢量,dropout层网络的作用是防止过拟合,在训练过程中会以一定的概率丢弃一些已经学习到的参数,softmax层网络将n维矢量归一化输出,这样输出的n维矢量的各个分量就能够表示概率。Bmm层网络是实现矢量按位相乘,即实现对编码器encoder状态的加权。Loss function选择多分类NLLLOSS函数,训练方式选择随机梯度下降SGD。如图所示,由注意力decoder的上一时刻隐层状态和当前时刻的encoder输入产生的embedded编码经过线性网络和softmax得到weights权重。通过整体网络结构的学习,会学习得到恰当的注意力权重和各个网络结构的参数。
此外,我通过分析注意力学习的结果,发现限制翻译效果的一个原因是对注意力权重的学习缺乏引导性,导致翻译有时候会出现“结巴”,前后重复已经翻译过的单词。我通过修改loss function,限制注意力权重均匀分布,避免出现同一个单词在翻译过程中被关注多次的情况,还有避免翻译过程中无焦点无关注的情况。
整体网络结构

实现细节

http://tatoeba.org/eng/downloads下载中文与英文翻译样本的数据集,由于中文不像英文句子原本就是各个单词由空格分开,而是多个单词连在一起,而且每个词包括的字未知,不易处理。故使用清华大学自然语言处理与社会人文计算实验室中文词法分析工具包THULAC对样本中文进行分词。在此基础上,对中英文样本进行过滤与格式规范化,受限于实现硬件条件的约束,如果使用全部样本进行训练,不仅难度较大而且花费时间过长,故只筛选出最大长度为10的句子,而且选取以“我 你 他 她 它 他们 她们 它们”人称开头的句子。将筛选完的句子预处理,对应地整理成对,全部统一成小写形式,英文由Unicode编码转换成ASCII编码节省空间与提高速度,并统计单词个数与对各个不同单词编号以方便表示。

每个gru网络均为三层网络,隐层维度为256。Gru网络属于rnn时间序列网络,encoder在编码一句中文的时候,每个时间点输出隐层状态,与注意力权重线性组合,表示此时对中文句子不同词汇的关注度。

注意力权重是由decoder的各个对应时间点的隐层状态与此时decoder输入的英文词汇编码由线性网络变换得到。由于实时进行翻译的句子有长有短,对应地,有的句子翻译过程中注意力权重比较长,有的比较短,为解决这个问题,把注意力权重设定为定长,由于encoder隐层状态长度不同,短的中文句子,后面隐层状态补0,不影响bmm的操作。

但是到目前为止,注意力权重完全是根据翻译结果正确与否,根据nllloss多分类loss function来优化的,其缺乏实际含义性和导向性。所以本文做出一定的改进。首先,根据中英文翻译的思路,翻译过的单词一般不需要再次翻译,即在翻译的过程中应该避免多次关注同一个词,理想状态应该是每个时刻关注不同的词汇,如果多次注意到同一个地方,可能会出现吞吞吐吐“结巴”的效果,而且无法翻译到整个句子。为解决这个问题,我对翻译一个句子的过程中产生的一系列的注意力矢量按位相乘,理想情况下,这些注意力矢量应该相互正交,所以以这个评判标准,将按位相乘的结果取二范数作为loss function的一部分,通过训练使得这个结果最小。同时,由于翻译句子有长有短,正如上述所说的,短的中文句子的注意力矢量后面几个分量并没有发挥作用,如果关注在此段分量上面则造成“无效的注意”,因此,与上面一样的思路,将翻译一个句子过程中产生的一系列注意力矢量按位相加起来,其后边无效字段的二范数也应该尽量小,将其作为loss function的一部分进行训练。

由于decoder每次翻译的时候都是讲上次输出的目标词汇作为下一时刻的输入,比如上一时刻输出了machine单词,下一时刻把machine作为输入,经过一系列注意力机制的计算,期望能够输出learning单词。但是存在一个问题是如果上一时刻输出的翻译结果是错误的,那么将这个错误的结果作为下一时刻的输入,将会导致后续的学习发生错误或者进行无意义的学习。因此引入了一个教师引导的机制,设定一个教师引导几率系数,每次学习训练的过程中,有一定的几率由教师引导学习。所谓教师引导学习,就是不管上一时刻的翻译是否正确,都将正确的答案作为下一时刻的输入,这将帮助网络更好的学习到词汇的对应关系,防止无效的学习。但是完全由教师引导学习的话,很难学习到关于序列的知识,因此也有一定的几率进行无教师引导的自主学习。该教师引导比例刚开始初始化为1,即完全由教师引导学习,随着训练次数的增加,教师引导比例将逐渐减低到零,即完全自主学习。教师引导比例降低的曲线可有多种选择:线性衰减、指数衰减、多项式形式衰减等,本经过实验对照,选择了指数衰减。生成模型之后使用无教师引导进行预测和翻译。

训练效果如下:
在这里插入图片描述
注意力示意图如图:
在这里插入图片描述
灰度值越高说明相关性越高,也就是注意力关注的程度越高。最左边一列标识表示输出的英文翻译,最上面一列标识表示输入的中文句子,行与列相交的元素表示在翻译该英文单词的时候对该中文单词的关注程度。
从图可以看出,改进前的注意力分布并不怎么好,很多时候都是关注在句子以外的部分,即“无效关注”。而改进后的注意力分布较为理想,而且可以看到在翻译第一个单词的时候对中文句子所有单词都有关注,可以理解为在翻译之前对整个中文句子进行了浏览,之后感兴趣的词汇分别进行关注。以“我来自中国。”为例子,机器翻译为“I am from china.”。观察他的注意力灰度矩阵,在翻译“i”的时候对整个中文句子都有关注,在翻译“am”和“from”的时候都关注在了“自”,在翻译“中国”的时候主要关注“china”,对句号“。”也有所关注。

尽管 RNN 在建模序列方面非常强大,但其序列性意味着该网络在训练时非常缓慢,因为长句需要的训练步骤更多,其循环结构也加大了训练难度。与基于 RNN 的方法相比,Transformer 不需要循环,而是并行处理序列中的所有单词或符号,同时利用自注意力机制将上下文与较远的单词结合起来。通过并行处理所有单词,并让每个单词在多个处理步骤中注意到句子中的其他单词,Transformer 的训练速度比 RNN 快很多,而且其翻译结果也比 RNN 好得多。
transformer
各种attention机制介绍

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页