前言
cs224n 第十讲,又讲了一些关于机器翻译的内容
文章目录
神经机器翻译(NMT)
什么是NMT
神经机器翻译是用一个端到端的神经网络建模完成翻译过程的系统。如下图所示
NMT发展
80年代用神经网络做机器翻译还是很边缘的领域,但是我们现在用的很多算法都是当时提出来的,比如常见的反向传播算法。当时提出了encoder-decoder模型,但是还是很简单的模型,固定的输入输出(二进制表示),十分有限的输入输出数据,这也反映了当时计算资源的限制。
90年代一个叫Lonnie Chrisman的小伙开发了一个复杂的基于encoder-decoder结构的神经网络,叫RAAMS。这个模型已经很类似现在的RNN了。
现代的NMT模型就很多了,上一节课提到的基于RNN的encoder-decoder模型:
使用过程中再复杂一些:
可以将解码器看做一个条件递归语言模型,也就是说在源文编码Y的条件下进行解码。
通常我们使用encoder的最后一层的输出作为decoder模型的输入,这里存在的一个问题就是我们不想在decoder的过程中丢失太多信息,这里的一个做法就是decoder使用LSTM这种可以存储记忆的单元,另外一种就是将encoder的最后一层输出加到decoder的每一层中去,如下图所示。
老爷子接着吹嘘了一波神经机器翻译的发展之迅速,就是amazing~
NMT的四大优势
1.端到端的训练方式
可以根据一个loss函数同时优化所有参数
2.分布式表示
词、短语之间的分布式表示能够很好的表达词语之间的相似性
3.更好的利用上下文信息
4.NMT善于生成流畅的文本
NMT的缺点
1.黑箱操作
2.无法显示利用语义或语法结构(现在应该是有相关的工作研究了)
3.无法处理好高阶文本,如篇章结构、连接子句、回指等
统计\神经网络机器翻译
老爷子说中文是他们接触的第二多的语言,所以课程中用了中文进行了例子讲解,下图是在不同年份下得到的谷歌翻译结果
前期翻译的效果并不怎么样,到2017年才算是有了质的改变。当然最后一句还有翻译的有问题,但是已经比前几年的翻译进步了很多。
attention介绍和应用
attention介绍
问题:我们通常使用编码器的最后单元的输出Y作为译文的表示,整个解码过程中都依赖这个Y。这造成的问题就是当译文是长句时,翻译效果不如短句效果好,因为固定长度的Y无法将长句的信息很好的保存。
所以这就引出了attention机制,其主要原理就是在翻译不同单词时给予源文单词不同的权重,使得更关注于对应翻译的单词。这和我们人类翻译员做翻译时类似,翻译员在翻译时也不是看一遍直接翻译完成,而是在翻译过程中不断去回看源文,关注源文中不同的文字信息。
上一节课也讲到,传统的NMT在翻译之前需要先做到双语对齐,如下图所示。
但是现在融合attention的模型可以同时学习对齐和翻译。如下图所示,该图很好的展示了在翻译过程中注意力权重是如何进行变化的。
attention实现
课程中提到打分,其实也就是给不同的词赋予不同的权重,这里就不按照课程中的顺序进行记录。
上图中,score就是用来计算权重的公式,
h
t
h_t
ht和
h
‾
s
\overline{h}_s
hs分别代表decoder的隐层向量和encoder中的隐层向量。
h
t
h_t
ht是当前的译文,
h
‾
s
\overline{h}_s
hs是源文,该公式计算出当前译文与源文每个单词之间的权重,就能够知道源文哪个单词对于当前的译文更重要,其对应权重就是越高。score的计算方式有多种,比较流行的是中间的那种,老爷子说这种方法中的
W
a
W_a
Wa使得两个向量之间有了更多的交互。
得到相应权重后,先将权重
a
t
a_t
at进行归一化,然后将源文的每个单词与权重
a
t
a_t
at对应相乘,得到此时刻的上下文向量
c
t
c_t
ct
得到
c
t
c_t
ct后,将
c
t
c_t
ct作为条件之一生成decoder的当前状态。
全局和局部attention
上面讲的方法有一个问题,就是当序列长度很长时,该方法的计算复杂度就会很高。所以就有人提出了局部attention,也就是每次只将注意力放到一部分状态上的模型。
但是上述模型也没有取得特别好的结果,下图是Manning给出的一张实验对比图
图中传达的最重要的一个信息就是,当句子序列变长时,attention的存在会使得效果保持稳定。
下面是一些attention在翻译过程中表现良好的例子
但是attention翻译的句子也不是完美的,上面这张图中翻译的时候出现了翻译词重复的问题。
###The idea of coverage
这里的思想是为了不丢失每一个重要的部分。比如在图像领域,根据图片中的每一部分的场景生成对应的词语来描述这一副图片。
把这种思想引入神经机器翻译中,有一种思路是doubly attention。也就是同时在encoder和decoder上做attention,反映在下图中就是水平方向和竖直方向都做attention。
另外,Manning还讲到了一些其他的方法,但是也都没有细讲,比如fertility。为了防止attention模型过分注重某个词,使得翻译结果一直在重复。
decoder策略
几种生成译文的方法
穷举法
列出所有可能的译文组合,找出可能性最大的译文,这种方法显然计算量太大,不可能使用这种方式。
Ancestral sampling
祖先抽样,这种方法的思想就是根据当前已经生成的词语,基于模型的概率分布来生成现在的词语
x
t
x_t
xt,根据模型的概率分布一次随机采样一个词。
x
t
∼
P
(
x
t
∣
x
1
,
.
.
.
,
x
n
)
x_t \sim P(x_t|x_1,...,x_n)
xt∼P(xt∣x1,...,xn)
这种方法的缺陷是方差大,且因为每次都是随机选取单词,所以同一个句子每次的翻译效果都不一样
Greedy Search
贪心策略,每一次选择最可能的单词。也就是说,以t时刻之前的单词为条件,选取条件概率最大的单词作为当前t时刻的单词。
但是,走错一步就会影响后面的选择,不容易得到全局最优解。
Beam Search
每个时刻记录K个最可能的选项,也就是说依据概率最大原则,在t时刻生成K个单词序列。课程中的公式显得很复杂,举个例子简单说明这种相对最优的方法。
比如我们现在的字典大小为10000,K=3,要翻译如下句子
法语句子"Jane visite l'Afrique en septembre."
翻译1-Jane is visiting Africa in September.
翻译2-Jane is going to be visiting Africa in September.
第一步,通过模型计算得到第一个词的分布概率,选取前K个作为候选结果,比如下图中的‘in’,‘jane’,‘september’
第二步,根据已经选出来的K个词,考虑第二个词的条件概率,分别以‘in’,‘jane’,‘september’为条件,得到第二个词的概率分布。也就是说得到10000*K=30000个单词序列组合的概率分布,从中选取概率最大的前K个单词序列,比如是‘in september’,‘jane is’,‘jane visits’,这样不断循环下去,直到得到终止符号。
可以看出来,当K=1时,这种方法就是前面所说的贪心策略。
下面是课程中给出的三种方法对比结果
另外,课程中也讲到,K的选取也要在一定范围内。K值较小时,反向效果是随K值的增大而变好的,但是当K过于大后,就会使得模型效率下降,翻译性能降低。