论文阅读:《Neural Machine Translation by Jointly learning to Align and Translation》

Introduction

  • 前人的很多工作都是将神经网络作为传统机器翻译的部件,本篇论文是将神经网络作为一个独立的系统,该系统目标是直接将句子翻译为正确的译文。
  • 之前关于encoder-decoder模型的弊端是,将所有源句子的所有信息压缩为一个固定长度的向量。 该做法导致神经网络无法很好地处理训练集中的长句子。除此之外,已经有论文证明,基础的encoder-decoder模型随着输入句子长度增加,性能会越来越差。
  • 本论文模型利用源文本的位置信息和之前生成的目标词来生成下一个目标词。

Background

  • 背景知识是关于encoder-decoder模型,此处不再赘述。
  • 解码层最终计算的是整个目标语言(翻译后句子)针对每一个目标词的联合概率(公式中用乘积来表示)。解码层按照时间步产生结果,输出的是该时间步在整个目标语言词典中的概率分布,该分布通过RNN模型中的非线性函数产生。
    在这里插入图片描述
  • 实际训练中,我们并没有直接使用(公式(2))作为最终的目标函数,而是使用对数函数转换为累计求和的方式,即将公式(2)取log,因为log函数是自增的,所以不影响单调,仍然取最大值。来自论文:Sequence to Sequence Learning with Neural Networks
    在这里插入图片描述
    推导: log ⁡ p ( y ∣ x ) = ∑ t = 1 T y log ⁡ p ( y t ∣ { y 1 , y 2 , . . . , y t − 1 } , c ) \log p(y|x)= \sum_{t=1}^{T_y}\log p(y_t|\{y_1,y_2,...,y_{t-1}\},c) logp(yx)=t=1Tylogp(yt{y1,y2,...,yt1},c) J = 1 / ∣ S ∣ ∑ ( T , S ) ϵ S log ⁡ p ( y ∣ x ) J=1/|S| \sum_{(T,S) \epsilon S} \log p(y|x) J=1/S(T,S)ϵSlogp(yx)
    第一个公式是对于一条训练语料(一个<源序列,目标序列>对)的目标函数。第二个公式是对于一定规模的语料(不一定是所有训练集,比如一个mini-batch)的目标函数,使用了每条语料生成正确翻译的概率取log后求和,又进行了取平均。其中, ∣ S ∣ |S| S是指训练集的规模(大小,即文本条数)。总结一下:训练目标函数是要最大化正确翻译序列的概率(上面的J函数最大化);测试是要输出概率最大的翻译序列(实际代码是输出每个时刻概率分布中,对应概率最大的词)

Alignment model

  • 原文之所以称之为“对齐”,是因为在模型中,作者在预测目标词时,加入了encoder层不同权重的隐藏状态值,体现了输入的位置信息和输出的位置信息的匹配程度,即“对齐”。
  • 具体而言,对于每一个时间步 t t t的输出 y t y_t yt,先让上一个时间步 t − 1 t-1 t1时刻的decoder的隐状态 s t − 1 s_{t-1} st1和encoder所有时间步的隐状态 h j h_j hj通过一个小型的全连接神经网络(网络具体设计原文有介绍),之后使用softmax函数将输出归一化,即得到encoder层每个隐状态对应于当前输出时刻 t t t的权重 α t j \alpha_{tj} αtj(即注意程度或重要程度),最后使用求期望的方式,在整个encoder基础上得到 t t t时刻的语言编码 c t c_t ct在这里插入图片描述

Experiment

  • 作者训练了两种模型,一种是基本的encoder-deocder模型,另外一种是上文提到的加入“对齐”的模型。具体参数设置不再叙述。实验结果发现,本文提出的模型对于长句子仍能产生很好的效果。并且作者发现“注意力机制”在实际翻译中,注意联合前后信息,翻译结果理想。

Challenge

  • 注意力机制需要计算源文本中每个词对应的权重信息,这在大部分句子只有14-40个字的实验中没有发现很大弊端。但是,在其他的训练场景中,可能会受到限制(个人猜测,对于过长序列,复杂度过大,训练可能会进行困难)
  • 在机器翻译中,如何处理未知的,或出现频率极少的词。

该文章实现的代码链接:https://github.com/qingyue2014/PytorchNMT
个人认为,实现代码的过程很重要,能够帮你理清楚整个模型流程和细节,能扫除大部分的疑问。其中一个地方要注意一下,decoder第一个时刻的输入是encoder最后一个时刻的输出,decoder的初始化用的是encoder最后一个时刻的隐藏状态。但是实际上,encoder最后一个时刻的输出就是最后一个时刻结点的隐藏状态。
我参考了pytorch官网上机器翻译的例子,本人能力有限,如有错误,欢迎大家指出交流。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值