CS224n笔记(五)

NMT

全称:Neural Machine Translation。主要就是指用一个大型神经网络建模整个翻译过程的系统。与word2vec和word embedding一样,不要细究NMT与Seq2Seq的区别。

主要架构

抽象的架构就是一个encoder一个decoder.
NMT_1
在过去,传统的基于短语的翻译系统通过将源语句拆分成多个片段然后将其逐句翻译来执行他们的任务。 这导致了翻译产出的不流畅,并不像我们人类翻译的那样。 我们阅读整个源句子,理解它的意思,然后产生一个翻译。 神经机器翻译(NMT)模仿的就是这种方式!
NMT_2
具体而言,NMT系统首先使用编码器读取源句子来构建“思想”向量,表示句子含义的数字序列; 解码器然后处理句子向量以发出翻译,如图所示。这通常被称为编码器 - 解码器体系结构。

现结合之前提到过的RNN,来做encoder和decoder
NMT_3
实际使用的系统更加复杂:
NMT_4
这里的RNN可视作以原文为条件的conditional语言模型
NMT_5

RNN Encoder

NMT_6
最后一个隐藏层的状态Y是整个原文的总结。
常见的encoder 实际上加了一些extension,比如GPU或LSTM.

Decoder:递归语言模型

常见的做法是把encoder的最后一层(最后一个时刻)作为decoder的第一层,这样就必须用LSTM保持中期记忆。

另一种做法是将encoder最后一层喂给decoder的每一层,这样就不会有记忆丢失的后顾之忧了。
NMT_7

NMT的四大优势

  • 1.End-to-end training: 为优化同一个损失函数调整所有参数
    1. Distributed representation: 更好地利用词语、短语之间地相似性
    1. Better exploitation of context:利用更多上下文——原文和部分译文地上下文
  • 4.生成的文本更流畅:可能跟上述优势有关

NMT还避免了传统MT中的黑盒子模型。NMT也存在弱点:

  • 无法显示地利用语义或语法结构
  • 无法显式利用指代相消之类地结果

Attention

朴素encoder-decoder的问题是,只能用固定维度的最后一刻的encoder隐藏层来表示源语言Y,必须将此状态一直传递下去,这是个很麻烦的事情。事实上,早期的NMT在稍长一点的句子上效果就骤减.

Attention_1
解决方法是将encoder的历史状态视作随机读取内存,这样不仅增加了源语言的维度,而且增加了记忆的持续时间(LSTM只是短时记忆)。
这种机制也与人类译员的工作流程类似:不是先把长长的句子暗记于心再开始闭着眼睛翻译,而是草草扫一眼全文,然后一边查看原文一边翻译。这种”一边…一边”其实就是类似于预料对齐的过程,即找出哪部分原文对应哪部分译文。而NMT中的attention是隐式地对齐的.

词语对齐

传统的SMT中需要显式地做双语对齐:
Attention_2
而attention model是在翻译地过程中隐式地对齐

同时学习翻译和对齐

一个非常棒地可视化,显示attention model成功地对齐了法语和英语,其中一小段语序地调整也反应出来了:
Attention_3
打分
在下图问号时刻,究竟应该关注哪些时刻地encoder状态呢?关注地强度是多少呢?

有一种打分机制,以前一刻的decoder状态和某个encoder状态为参数,输出得分

Attention_4

Attention_5

Attention_6

Attention_7
然后softmax归一化分值转化为概率,这个概率称为对齐权值

Attention_8
这个概率也代表模型应该将多少比例的注意力放在一个历史状态上:
Attention_9
加权和得到一个context vector,作为条件之一生成decoder的当前状态:
Attention_10
而分数的获得,是通过attention function进行的。attention function有多种选择,其中流行的是中间这种。$W_a$给了两个向量更复杂的interaction,而最后一种根本没有interaction。
Attention_11
有一些观点认为模型不应该注意所有的事情,可能对长句子来讲比较有潜力:
Attention_12
但这些观点并没有取得更好的成绩:
Attention_13
句子特短的时候,模型们的得分都不高。这纯粹是因为预料中的短句子本来就语义隐晦,比如某个专有名词作为标题。而有attention的模型在句子很长的时候,效果依然没有下降,说明attention的重要性。

LSTM非常擅长生成自然的文本,但有时候译文与原文相去甚远,没有把注意力放在原文上。比如下面红色的名字不知道从哪里冒出来的:
Attention_14
加了attention好了很多,还是比不上人类,有时候会把同一个意思的词重复两遍。
Attention_15

更多attention

在图片标题生成研究中,模型通过对图片不同区域的attention生成了不同的词语:
Attention_16
如何保证不错过任何重要的区域呢?

Doubly attention

一种思路是同时注意原文和译文:
Doubly_attention

用旧模型的语言学思想拓展attention

可以里游泳IBM2等模型中的位置或fertility(丰富程度),因为一般而言一个词最多翻译为两三个词,如果生成了五六个词,那么模型可能在重复生成。

Attention_17

深入GRU

从正向传播和反向传播重新理解一遍GRU
GRU_1
从上图可以看到红线的反向传播过程中,红线会实现连乘多次的情况,这样会导致RNN的梯度消失。
而GRU额外添加一些捷径红线,允许梯度直接流过去,而不是以连乘的方式传递过去。

Update Gate

GRU_2
用来自适应学习应该把多少注意力放到前一个隐藏状态上。

Reset gate

GRU_3
自适应地删除不需要的连接。

RNN寄存器

GRU_4
朴素RNN读取所有寄存器,运算后存入所有寄存器,没有灵活性。

GRU寄存器

GRU_5
门多了之后,就可以灵活地选择读取部分寄存器,执行运算,写入部分寄存器。

Reset Gate起到决定要读哪些寄存器的目的,而Update Gate决定要写的寄存器。这里的“决定”其实是“强度”的意思,不是绝对的。

GRU与LSTM对比

GRU的隐藏状态$h_t$类似于LSTM的cell$c_t$,而LSTM中的隐藏状态$h_t$其实相当于一个暴露给外部世界的”显状态”.LSTM通过给cell加上tanh获得非线性的灵活性。
另外,观察$h_{t-1}$之前的系数,这里的$r_t$其实是”don’t reset gate”,$f_t$其实是”don’t forget gate”。
GRU_6

深入LSTM

宏观上的LSTM Cell:
LSTM_1
将所有操作都gate起来,方便遗忘甚至忽略一些信息,而不是把所有东西都塞到一起。
LSTM_2
New Memory Cell的计算是一个非线性的过程,与朴素RNN一模一样:
LSTM_3
最关键之处在于,Memory Cell的更新中有一个加法项直接来自上一刻的Cell,也就是说建立了ctct和ct−1ct−1的直接线性连接(与ResNet类似):
LSTM_4
类似于GRU中的加法,在反向传播的时候允许原封不动地传递残差,也允许不传递残差,总之是自适应的。

有了这些改进,LSTM的记忆可以比RNN持续更长的step(大约100):

训练技巧

  • 将递归权值矩阵初始化为正交
  • 将其他矩阵初始化为较小值
  • 将forget gate 偏置设为1:默认为不遗忘
  • 使用自适应的学习率算法: Adam、AdaDelta
  • 裁剪梯度的长度为小于1-5
  • 在Cell 中垂直应用Dropout而不是水平Dropout
  • 保持耐心,通常需要训练很长时间

Machine Translation 评测——BLEU

参考文献:《BLEU: a Method for Automatic Evaluation of Machine Translation 》
BLEU是目前最接近人类的评分指标。

BLEU的原理

需要以下几个概念:

  • N-gram
  • 惩罚因子
  • Bleu算法

N-gram
N-gram是一种统计语言模型,该模型可以将一句话表示n个连续的单词序列,利用上下文中相邻间的搭配信息,计算句子的概率,从而判断一句话是否通顺。

BLEU也是采用N-gram的匹配规则,通过它能够算出比较译文和参考译文之间n组词的相似的一个占比。最开始的做法是机器翻译的单词有多少出现在参考翻译中(出现过就记录一次,不管在参考文献中出现过几次),而分母即为机器翻译的单词组数。显然这是不够的。
举个例子错误例子:
BLEU_1
如果candidate是我们的machine translation, 这里有7个the,都出现在reference中过,因此分子为7,分母为7.这种初始评价标准显示这样的机器翻译很好,但实际上却是不尽如人意的。

改进的n-gram precision

专业一点,上面出现的错误可以理解为常用词干扰,比如the,on这样的词,所以极易造成翻译结果低劣,但评分结果却贼高的情况。

上述例子中用到的是uni-grams,我们还可以用bi-grams,…n-grams.

我们对前面的方法做出改进:

名词解释:对于一条机器翻译——

  • 1.$Count_{w_i}$:单词$w_i$的个数,如上表就是”the”的计数为7
  • 2.$Ref_j-Count_{w_i}$:词$w_i$在第j个参考翻译里出现的次数
  • 3.$Count_{w_ij}^{clip}$:被称为对于第j个参考翻译,$w_i$的截断计数
  • 4.$Count^{clip}$:w_i在所有参考翻译里的综合截断计数
    仍从上表可以看到,$Ref_1-Count_{‘the’}$=2,所以$Count_{‘the’,1}^{clip}=min(7,2)=2$,同理$Count_{‘the’,2}^{clip}=1$,所以综合计数$Count^{clip}=max(1,2)=2$
    分母保持不变仍未候选句子的n-gram个数,这里分母为7.

其实改进的n-gram精度得分可以用来衡量翻译评估的充分性和流畅性两个指标:一元组属于字符级别,关注的是翻译的充分性,就是衡量你的逐字逐句翻译能力;多元组上升到词汇级别,关注点是翻译的流畅性,词组准了,说话自然相对流畅。所以我们可以用多组多元精度得分来衡量

改进的n-gram precision在文本段落翻译评估中的使用

BLEU的处理办法其实还是一样,把多个句子当成一个句子罢了:

将多个改进的n-gram精度进行组合

组合多个n-gram的精度,我们能想到的就是加权平均。

首先,存在一个事实是,n-gram的增大,精度得分总体上呈指数下降,而且可以粗略地看成随n而指数级地下降。因此这里采用几何加权平均的方法,并且将各n-gram的作用视为等重要的,即取权重服从均匀分布。

其中$P_n$就是我们前面讲的改进的n-gram

译句较短惩罚(Sentence brevity penalty)

再仔细看改进n-gram精度测量,当译句比参考翻译都要长时,分母增大了,这就相对惩罚了译句较长的情况。译句较短就更严重了!比如说下面这样:
BLEU_2
显然短译句容易得高分,因此要设计一个有效的惩罚措施去控制。

首先确定一个名词叫”最佳匹配长度”,就是如果译句长度和任意一个参考翻译的长度相同,就认为它满足最佳匹配长度,这种情况下,就不惩罚了,惩罚因子设为1.

见上式,r是一个参考翻译的词数,c是一个机器翻译的词数,BP代表译句较短的惩罚值。由此,得到最终的BLEU公式:

这样的BLEU算法已经基本上可以快捷地给出相对有参考的评估分数了。

参考文献

1.CS224n笔记11 GRU和NMT的进一步话题
2.机器翻译自动评估-BLEU算法详解

-------------本文结束感谢您的阅读-------------

本文标题:CS224n笔记(五)

文章作者:Yif Du

发布时间:2018年12月12日 - 21:12

最后更新:2018年12月14日 - 15:12

原始链接:http://yifdu.github.io/2018/12/12/CS224n笔记(五)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。