本节课内容:
介绍一个新的任务:机器翻译
介绍一个新的神经架构:序列到序列的模型
介绍一种新的神经技术:注意力,用于提升序列到序列的模型
第一部分:之前的机器翻译方法
1950s:系统是基于规则实现的,使用一个双语字典进行映射查询
1990s-2010s:基于统计的机器翻译,也叫SMT
主要思想:从数据中学习一个概率模型
假设我们从法语翻译成英语:对于输入的法语x,找到最好的英语翻译y
使用贝叶斯准则把这个概率分解成两部分:
第一部分P(x|y):从平行数据中构建单词和短语应该如何被翻译
第二部分P(y):是一个语言模型,比如n-gram,RNN等。从单词数据中构建如何写出流利的英语
如何学习模型P(y|x)呢?
需要大量的平行数据。
我们实际上需要考虑的是:
P(x,a|y)
a是一中对应关系,比如法语句子x和英语句子y之间的单词级对应。
注意:有些单词是没有对应关系的,比如中文的“的”在英语中没有对应的词。
对应关系是复杂的,可能是多对一,一对多,多对多
学习P(x,a|y)是多种因素的结合:
特定单词对齐的概率(也取决于单词的位置)
特定单词有特定含义的概率
我们可以采用穷举的办法计算概率,但是代价太大了。
解决方案:采用启发式搜索的办法搜索最好的翻译,抛弃概率低的假设,也称为解码。
有巨大的搜索区域
要构建效果最好的系统很复杂。
比如需要做许多特征工程的工作,许多已有成果需要维护等
第二部分:神经机器翻译
神经机器翻译是使用单一的神经网络完成机器翻译。
该神经网络架构也叫序列到序列的模型seq2seq,涉及到两个RNN.
编码器根据源句子产生编码
解码器RNN是一个生成目标句子的语言模型
编码器为解码器提供了最初的隐层状态。
序列到序列的模型可以应用于多种场景:
- 摘要抽取
- 对话系统
- 句子解析
- 代码生成
神经机器翻译是一个条件语言模型的例子。
说它是语言模型是因为解码器预测了目标句子的下一个单词
说它是条件是因为它的预测是基于源句子x的。
如何训练一个神经机器翻译系统呢?
在解码器生成目标单词时计算计算损失,将损失加起来。
解码器是采用贪婪的算法生成目标单词的。在解码器的每一步取argmax最大可能性的那个单词。这个方法有什么问题吗?
问题就是:
没办法返回上一步,重新作出决策。
穷举搜索解码
理想情况下 ,我们找到一个翻译y最大化以下式子。
我们可以计算出所有可能的y,这意味着在解码器的每一个阶段t,我们计算Vt种可能的翻译,V是词汇表的长度。
O(Vt)的复杂度代价太大了!
定向搜索解码
思想:在解码器的每个阶段,追踪k个最有可能的翻译,我们把它称为假设。
每个假设y1,y2,y3...,yt都有一个分数
分数都是负数的,分数越高越好。
每次搜索计算所有的分数,取前k个最好的分数,其他的丢弃。
在贪心搜索中,通常是产生<end>标识符就停止搜索。在定向搜索中,不能的假设会在不同的阶段产生<end>标识符,当产生了end标识符,就停止搜索,也可以设置成完成了n个可能的假设之后就停止。
在定向搜索中我们是如何获得分数的呢?
产生的问题:越长的假设分数越低。
解决办法:标准化:
比起数据统计机器翻译,神经机器翻译有很多优势:
- 更好的性能
- 更流畅
- 更有效的利用上下文
- 更好的利用句子的相似性
一个单独的神经网络是被端到端优化的,没有一个子组件被单独优化。
需要更少的人力:不需要特征工程,统一方法可以应用于所有的语言模型
神经机器翻译的劣势:
可解释性差,难以调试
难控制,比如对于翻译很难应用规则和指导
如何评价机器翻译?
BLEU:Bilingual Evaluation Understudy
BLEU比较把机器翻译结果和人工翻译结果进行比较,基于以下模型计算相似度分数:
n-gram 精度
为太短的系统翻译增加惩罚。
BLEU指标是有用的但是也是不完美的。
有许多有效的办法来翻译一个句子,所以好的翻译可能BLEU的得分比较低,因为与人类翻译没有重复的地方。
机器翻译还存在的问题:
超出词汇表之外的单词没办法翻译
训练数据和测试数据不匹配
有些语言的语料库比较少
等等。
2019年,神经机器翻译又有了新的突破。
其中一个是注意力机制.
第三部分:注意力机制
神经机器翻译的瓶颈:
从编码器的最后一个状态获取所有源句子的信息,也就是说解码器关于信息的来源只有编码器的最后一个状态,这样没有办法获取的关于句子的完整信息。
注意力机制提供了一个解决方案:
在解码器的每个阶段,与编码器的每个阶段直接连接,如下图所示,采用了点乘。
如将解码器的第一个阶段与编码器的每个阶段进行点乘,计算出分数,使用softmax得到一个分布,如下面的例子中发现he的分数最高,因此解码器的第一个阶段将会更多的关注he这个阶段提供的信息,结合这个信息生成了he。
其他单词的生成也是采用类似的做法。有时候也会使用前一个阶段的注意力结果来生成当前阶段的单词。
步骤:
- 有编码器的隐藏层状态h1,...hn
- 在阶段t,有解码器的隐层状态st,通过以下式子获得注意力分数:
- 使用softmax函数来获得注意力分布at,at是一个向量,和为1
- 通过at和隐层状态的乘积,再求和获得注意力输出at。
- 最终将注意力输出at和解码器的隐层状态st连接起来,像之前的步骤一样处理得到输出y。
注意力机制是一种很好的办法
- 提高了神经机器翻译的性能:使得解码器专注于源的某一个部分
- 解决了之前提到的瓶颈问题:允许解码器直观的看到源
- 对解决梯度消失问题有帮助:直接与距离较远的状态相连
- 提供了一些可解释性:
- 通过注意力分布,我们能看到解码器更关注编码器的什么部分
- 自己学习单词翻译之间的对齐方式
注意力机制的定义:
给定一组向量vectors,和一个查询向量query,注意力机制是一种根据query计算vectors的权重和。在上面的例子中编码器的隐层状态hi就是vectors,解码器的隐层状态si就是query。
关于e的计算不只有点乘,还有其他方法: