放牧代码和思想
专注自然语言处理、机器学习算法
    恕不接待索要源码语料者、索求技术方案者、以及不Google的懒人。

CS224n笔记10 NMT与Attention

目录

hankcs.com 2017-06-27 下午3.45.05.png从NMT的历史谈到现代,讲解了attention机制的动机、原理及最新的拓展。通过实例展示谷歌翻译的变化,直言不讳指出其过度炒作。Manning今天还换上了新MBP,挺潮的。

机器翻译

  • 传统衡量机器对语言理解的测试之一

  • 同时涉及到语言分析与理解

  • 一个每年400亿美金的产业

  • 主要在欧洲,亚洲也在兴起

机器翻译的需求

  • Google每天翻译1000亿单词

  • Facebook研发了自己的翻译系统,因为通用的机器翻译系统无法适应社交领域

  • eBay用机器翻译来促进跨境交易

什么是NMT

用一个大型神经网络建模整个翻译过程的系统。

架构

抽象的架构就是一个encoder一个decoder:

hankcs.com 2017-06-27 下午3.17.59.png

NMT:青铜时代

80年代神经网络是个很边缘的领域,另外计算力也很有限。当时的NMT系统只是个玩具:词表四五十,固定的50个输入(二进制编码),固定的66个输出,一到三层隐藏层,150个单元……

hankcs.com 2017-06-27 下午3.33.17.png

90年代出现了一种类似RNN的更复杂的框架:

hankcs.com 2017-06-27 下午3.35.58.png

现代NMT模型

之前课上也提到过,一个RNN做encoder,另一个RNN做decoder:

2017-06-27_15-39-23.png

实际使用的系统更加复杂:

hankcs.com 2017-06-27 下午3.45.05.png

这里的RNN可视作以原文为条件的conditional语言模型

2017-06-27_15-47-58.png

RNN Encoder

hankcs.com 2017-06-27 下午3.51.08.png

最后一个隐藏层的状态Y是整个原文的总结。

常见的encoder实际上加了一些extension,比如GRU或LSTM。

Decoder:递归语言模型

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

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

hankcs.com 2017-06-27 下午3.59.24.png

MT的发展

基于短语的MT就是2016-11之前的Google翻译所采用的系统,其发展是缓慢的。神经网络兴起之后,出现了一种基于Syntax-based SMT(估计是换换词向量),发展也不快。但NMT的发展是最迅猛的:

2017-06-27_16-07-32.png

NMT的四大优势

  1. End-to-end training
    为优化同一个损失函数调整所有参数

  2. Distributed representation
    更好地利用词语、短语之间的相似性

  3. Better exploitation of context
    利用更多上下文——原文和部分译文的上下文

  4. 生成的文本更流畅
    可能跟上述优势有关

NMT还避免了传统MT中的黑盒子(reorder之类)模型。NMT也存在弱点

  • 无法显式利用语义或语法结构(依存句法分析完全用不上了,有些工作正在展开)

  • 无法显式利用指代相消之类的结果

可见太统一的闭环系统也有自己的烦恼啊。

统计/神经网络机器翻译

Manning说除了英语之外,学生中第二大语种是中文,而且他亮出了简体中文的例子,真是让人激动啊。他还特意在不同年份测试了google翻译的效果:

hankcs.com 2017-06-27 下午4.31.44.png

其中,13年有所进步,14-16年又退步了并且停滞了3年。直到2017年才有质的飞跃。

我觉得这个句子涉及到指代相消,MT系统很难消解损兵的“他们”。MT系统必须有这样的常识:兵力悬殊的两军对战,人数少的一方更容易失败。估计语料不足以给它这种知识。

NMT主要由工业界促进

2016-02 微软在Android和iOS上发布了离线NMT系统,这对境外旅游人士特别有帮助。

2016-08 Systran发布了NMT模型

2016-09 Google发布了NMT系统,大肆宣传了一番,并且overclaim比得上人工翻译质量。Manning真是直言不讳啊。

介绍Attention

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

Attention机制

hankcs.com 2017-06-27 下午5.43.49.png

解决方法是将encoder的历史状态视作随机读取内存,这样不仅增加了源语言的维度,而且增加了记忆的持续时间(LSTM只是短时记忆)。

这种机制也与人类译员的工作流程类似:不是先把长长的一个句子暗记于心再开始闭着眼睛翻译,而是草草扫一眼全文,然后一边查看原文一边翻译。这种“一边……一边……”其实类似于语料对齐的过程,即找出哪部分原文对应哪部分译文。而NMT中的attention是隐式地做对齐的。

词语对齐

传统的SMT中需要显式地做双语对齐:

hankcs.com 2017-06-27 下午5.50.02.png

而attention model是在翻译的过程中隐式地对齐。

同时学习翻译和对齐

一个非常棒的可视化,显示attention model成功地对齐了法语和英语,其中一小段语序的调整也反应出来了:

hankcs.com 2017-06-27 下午5.54.28.png

打分

在图示问号时刻,究竟应该关注哪些时刻的encoder状态呢?关注的强度是多少呢?

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

hankcs.com 2017-06-27 下午5.58.27.png

hankcs.com 2017-06-27 下午5.58.52.png

hankcs.com 2017-06-27 下午5.59.11.png

hankcs.com 2017-06-27 下午5.59.32.png

然后softmax归一化分值转化为概率,这个概率称为对齐权值(alignment weights):

hankcs.com-2017-06-27-下午6.00.23.png

这个概率也代表模型应该将多少比例的注意力放在一个历史状态上:

hankcs.com 2017-06-28 上午9.12.56.png

加权和得到一个context vector,作为条件之一生成decoder的当前状态:

hankcs.com 2017-06-28 上午9.14.58.png

而分数的获得,是通过attention function进行的。attention function有多种选择,其中流行的是中间这种。$W_a$给了两个向量更复杂的interaction,而最后一种根本没有interaction。

2017-06-28_09-20-16.png

有一些观点认为模型不应该注意所有的事情,可能对长句子来讲比较有潜力:

hankcs.com 2017-06-28 上午9.24.03.png

但这些观点并没有取得更好的成绩:

2017-06-28_09-27-50.png

句子特短的时候,模型们的得分都不高。这纯粹是因为语料中的短句子本来就语义隐晦,比如某个专有名词作为标题。而有attention的模型在句子很长的时候,效果依然没有下降,说明了attention的重要性。

LSTM非常擅长生成自然的文本,但有时候译文与原文相去甚远,没有把注意力放在原文上。比如下面红色的名字不知道从哪里冒出来的:

hankcs.com 2017-06-28 上午9.33.12.png

加了attention好了很多,还是比不上人类,有时候会把同一个意思的词重复两遍:

hankcs.com 2017-06-28 上午9.33.12.png

更多attention!覆盖范围

在图片标题生成研究中,模型通过对图片不同区域的attention生成了不同的词语:

hankcs.com 2017-06-28 上午9.38.26.png

如何保证不错过任何重要的区域呢?

Doubly attention

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

2017-06-28_09-42-10.png

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

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

hankcs.com 2017-06-28 上午9.50.27.png

decoder

模型能够在给定原文$ s $的情况下计算译文$ \bar{s} $的概率$ \mathbb{P}(\bar{s} | s) $之后,就来到传统的问题了,找出最可能的译文$ \bar{s}* $:

$$ \bar{s}* = \operatorname{argmax}_{\bar{s}}(\mathbb{P}(\bar{s} | s )) $$

在decoding的时候,朴素想法是生成所有的翻译,用语言模型打分,然后挑最大的。但译文数量是词表大小的指数函数,无法实现。

2017-06-28_10-03-00.png

Ancestral sampling

在时刻$t$,根据之前的词语生成当前词语$x_t$:

$$ x_t \sim \mathbb{P}( x_t | x_1, \ldots, x_n) $$

可以多次sample取最好的。

理论上完美无缺,但实践中只会产生高方差的差效果。你也不想同一个句子每次翻译结果都不一样。

Greedy Search

2017-06-28_21-54-06.png

不多想了,贪婪地选取当前最可能的那个单词:

$$ x_t = \operatorname{argmax}_{\tilde{x_t}} \mathbb{P}( \tilde{x_t} | x_1, \ldots, x_n) $$

缺点显而易见,不是全局最优,走错一步会影响后面的部分。

Beam search

2017-06-28_21-54-54.png

老生常谈了,从不搜索到贪婪搜索到柱搜索,随处可见。

每个时刻记录$k$个最可能的选项(剪枝),在其中进行搜索。

$$ \mathcal{H}_t = \{ (x_1^1, \ldots, x_t^1), \ldots, (x_1^K, \ldots, x_t^K) \} $$

然后递推$ \mathcal{H}_{t+1} $:

$$ \tilde{\mathcal{H}}_{t+1} = \bigcup_{k=1}^K \tilde{\mathcal{H}_{t+1}^k}$$

其中

$$ \tilde{\mathcal{H}_{t+1}^k} = \{ (x_1^k, \ldots, x_t^k, v_1), \ldots,  (x_1^k, \ldots, x_t^k, v_{|V|})\}$$

也就是说把词表中的词丢进入计算概率取前$K$个。

效果对比

hankcs.com 2017-06-28 下午10.01.15.png

采样要采50轮才得到比贪心搜索稍好的结果,但很小的柱搜索轻松超越了它们。另外,基于短语的MT常用的柱搜索大小是100到150,可见NMT的优势。

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » CS224n笔记10 NMT与Attention

分享到:更多 ()

评论 欢迎留言

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我的开源项目

HanLP自然语言处理包基于DoubleArrayTrie的Aho Corasick自动机