前言

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

sequence to sequence介绍

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

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

而encoder模型把输入的序列数据转换为一个一定长度的矢量,这个矢量表示了这一个输入序列句子的整体意思。Encoder RNN模型如下图:

在得到encoder最后的隐层输出即得到输入序列数据的整体表达的矢量,将这一矢量作为decoder的第一个隐层状态,并将“SOS”(start of sequence)的编码作为decoder的第一个输入,然后依次将上一时刻的输出编码作为下一时刻的输入编码。从而把encoder的输出含义矢量转换为序列数据,从而实现两条序列的转换。一般的decoder如图所示。

整体的encoder-decoder模型工作原理如图。

注意力机制的decoder

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

整体网络结构

整体网络有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机制介绍

基于attention机制的中英文机器翻译相关推荐

  1. [深度学习] 自然语言处理 --- 基于Attention机制的Bi-LSTM文本分类

    Peng Zhou等发表在ACL2016的一篇论文<Attention-Based Bidirectional Long Short-Term Memory Networks for Relat ...

  2. 第22章针对Cloze Tests基于Attention机制的的MRC

    第22章:揭秘针对Cloze Tests基于Attention机制的的MRC领域开山之作:Teaching Machines to Read and Comprehend架构设计及完整源码实现 1,对 ...

  3. 基于Attention机制的BiLSTM语音情感识别研究与系统实现

    1.摘要 以往的情感分类大多是基于粗粒度进行的,针对七分类情感语料进行的研究不多,且最终的情感分类结果只包含一种情感,很少对多情感共存现象进行研究,因此不能完全体现用户情感的丰富性. 针对这些不足,本 ...

  4. 基于Attention机制的轻量级网络架构以及代码实现

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要10分钟 Follow小博主,每天更新前沿干货 导读 之前详细介绍了轻量级网络架构的开源项目,详情请看深度学习中的轻量级网络架构总结与代码实现 ...

  5. 第22章:针对Cloze Tests基于Attention机制的的MRC领域开山之作:Teaching Machines to Read and Comprehend架构设计及完整源码实现

    1,对Text提供精细化的语言理解能力和推理能力的MRC为何需要Neural Networks和Attention机制的支持? 2,基于大规模训练数据集的集特征工程和分类于一体的深度学习MRC 3,数 ...

  6. 【一起入门NLP】中科院自然语言处理作业四:RNN+Attention实现Seq2Seq中英文机器翻译(Pytorch)【代码+报告】

    这里是国科大自然语言处理的第四次作业,同样也是从小白的视角解读程序和代码,现在我们开始吧(今天也是花里胡哨的一天呢

  7. 《Effective Approaches to Attention-based Neural Machine Translation》—— 基于注意力机制的有效神经机器翻译方法

    目录 <Effective Approaches to Attention-based Neural Machine Translation> 一.论文结构总览 二.论文背景知识 2.1 ...

  8. 理解LSTM/RNN中的Attention机制

    转自:http://www.jeyzhang.com/understand-attention-in-rnn.html,感谢分享! 导读 目前采用编码器-解码器 (Encode-Decode) 结构的 ...

  9. NLP中的attention机制总结

    目录 1 attention机制原理 2 attention类型 2.1 按照是否可直接BP算法计算梯度进行分类 2.1.1 Soft attention 2.1.2 Hard attention 2 ...

最新文章

  1. 《题目与解读》红书 训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》
  2. SQL语句从入门到精通之笔记大全
  3. caffe中的batchNorm层(caffe 中为什么bn层要和scale层一起使用)
  4. Java IO5:管道流、对象流
  5. 流量节省模式 Android,这三种方法让你节省更多手机上网流量
  6. 机器学习数据集哪里找:最佳数据集来源盘点
  7. Flink 学习(一)
  8. matplotlib绘制图形
  9. https防止注入_【缺陷周话】第40期:JSON 注入
  10. [大数据之Spark]——Transformations转换入门经典实例
  11. 信息的哲学--从信息到数据存储,再到数据保护
  12. angularJs模版注入的两种方式
  13. 【Java】编程思想汇总ing
  14. Pandas速查手册中文版
  15. 通过PackageManager 获取未安装的apk的包名,应用名,图标等,有个小吭
  16. 梅科尔工作室-梁嘉莹-鸿蒙笔记1
  17. response.reset()
  18. Linux不用root权限安装nvcc
  19. 为什么总显示连接服务器失败怎么回事,为什么总是出现"与总服务器连接失败"的字样 – 手机爱问...
  20. 毕设记录1||不要守株待兔

热门文章

  1. 解决在谷歌浏览器上倍速播放视频适用B站 慕课MOOC 百度网盘(弃用) 谷歌内置播放器最高16倍速
  2. 设计模式——模板设计模式
  3. 【Python语法】X[:,0]和X[:,1] 什么意思?
  4. xml中使用 报错:XML Parser Error on line 35: 在实体引用中, 实体名称必须紧跟在 ‘‘ 后面。
  5. ProcessOn在线画流程图介绍
  6. Ceph剖析:Leader选举
  7. 流媒体播放器播放h264编码视频与h265编码视频哪个更清晰?
  8. 设计一个形状类(接口)Shape,方法:求周长和求面积
  9. python绘制幂函数曲线_基于matplotlib的yaxis力指数幂函数
  10. 朴素贝叶斯(西瓜数据集分类,社区恶意留言分类,垃圾邮件分类,新浪新闻分类),AODE分类器 代码实现