资源链接:https://www.bilibili.com/video/BV1r4411
本节课主要介绍了机器翻译、seq2seq to seq2seq和注意力机制。
正课内容
机器翻译的任务
机器翻译(MT)是将一个句子x从一种语言( 源语言 )转换为另一种语言( 目标语言 )的句子y的任务,如下图:
早期的机器翻译
始于1950s,主要是俄语->英语,起因是冷战,系统主要是基于规则的,使用双语词典来讲俄语单词映射为对应的英语部分
中期:统计机器翻译/Statistical Machine Translation/SMT
- 时间:1990s-2010s
- 核心想法:从数据中学习概率模型。
- 假设我们正在翻译法语->英语。
- 我们想要找到最好的英语句子 y ,给定法语句子 x
- 使用Bayes规则将其分解为两个组件从而分别学习
P(x|y):翻译模型,分析单词和短语应该如何翻译,从并行数据中学习
P(y):语言模型,模型如何写出好英语,从单语数据中学习。之前也讲解过语言模型/ML
既然ML已经学过了/了解了,那么就是讨论翻译模型了~
如何学习翻译模型?
首先,需要大量的并行数据(例如成对的人工翻译的法语/英语句子)
其次,我们实际上想需要考虑P(x,a|y),其中a是对齐,即法语句子x和英语句子y之间的单词级对应关系
什么是对齐?
对齐是翻译句子中特定词语之间的对应关系,如下图所示:
注意:有些词是没有对应词的
对其是复杂的,可以多对一,一对多,多对多,一对一~如下图s所示:
学习P(x,a|y)是许多因素导致的,包括:
- 特定单词对齐的概率(也取决于发送位置)
- 特定单词具有特殊的概率(对应单词的数量)
- 等等
问题是:我们如何计算这个argmax?
首先我们思考:我们可以列举所有可能的 y 并计算概率。但是这样代价太大了,几乎不可行
正确答案:使用启发式搜索算法搜索最佳翻译,丢弃概率过低的假设,这个过程称为解码
SMT是一个巨大的研究领域
- 最好的系统非常复杂
- 数以百计的重要细节我们还没有提到
- 系统有许多分别设计子组件工程
- 很多功能需要设计特性来获取特定的语言现象
- 需要编译和维护额外的资源
- 比如等价短语表
- 需要大量的人力来维护
- 对于每一对语言都需要重复操作
后期:神经机器翻译/Neural Machine Translation/NMT
- 时间:2014-至今
- 神经机器翻译是利用单个神经网络进行机器翻译的一种方法
- 神经机器翻译架构称为sequence-to-sequence (又名seq2seq),它包含两个RNNs (解码RNN和编码RNN)
如何形容NMT出现对机器翻译世界带来的影响呢?如下图:
NMT结构
- 编码器RNN生成源语句的编码 ,源语句的编码为解码器RNN提供初始隐藏状态
- 解码器RNN是一种以编码为条件生成目标句的语言模型(可以设置生成多少次结束 或者 产生<END>作为结束)
注意:此图显示了测试时行为 -> 解码器输出作为下一步的输入
序列对序列是万能的!
具体说一下sequence-to-sequence 模型,该模型是序列到序列的意思,输入一段不等长序列然后生成一段不等长序列,之前我们计算时都是等长的序列生成下一个词,实际上不等长的才是应用最多的~
虽然有点夸张哈·~但是确实许多领域都可以用Sequence-to-sequence,例如:
- 序列到序列不仅仅对MT有用
- 许多NLP任务可以按照顺序进行表达
- 摘要(长文本 -> 短文本)
- 对话(前一句话 -> 下一句话)
- 解析(输入文本 -> 输出解析为序列)
- 代码生成(自然语言 -> Python代码)
- sequence-to-sequence 模型是 Conditional Language Model /条件语言模型的一个例子
- 语言模型,因为解码器正在预测目标句的下一个单词 y
- 有条件的,因为它的预测也取决于源句 x
- NMT直接计算
- 上式中最后一项为,给定到目前为止的目标词和源句 x ,下一个目标词的概率
问题 :如何培训NMT系统?
答案 :找一个大的平行语料库(所谓平行语料库就是平行语料库(Parallel Corpus)是指将源语文本及其译语文本进行检索并对照显示的语料库)
Seq2seq作为一个单一的系统被优化。反向传播运行在“端到端”中
贪婪解码
我们了解了如何生成(或“解码”)目标句子,通过对解码器的每个步骤使用 argmax,这就是贪婪解码,过程如下图所示:
这种方法存在一些问题:最大的问题就是没法回溯(还有一点就是思想是局部最优解,不一定是全剧最优解),如下图所示:(are翻译错了,但是没法返回到第二步)
如何解决这个问题呢?
穷举搜索解码
理想情况下,我们想要找到一个(长度为 T )的翻译 y 使其最大化,我们可以尝试计算所有可能的序列 y,这意味着在解码器的每一步 t ,我们遍历个可能的部分翻译,其中 V 是 vocab 大小,但是这种
的复杂性太高了!
束搜索解码
核心思想 :在解码器的每一步,跟踪 k 个最可能的部分翻译(我们称之为 hypotheses 假设 ,类似一种剪枝思想) ,k是Beam的大小(人为设定的,实际中大约是5到10)
假设 y1,y2,...,yt有一个分数,即它的对数概率,分数都是负数,分数越高越好,我们寻找得分较高的假设,跟踪每一步的 top k 个部分翻译
虽然束搜索不一定能找到最优解,但比穷举搜索效率高得多
束搜索实例
假设k=2,如下图所示,每次生成选取最大的和第二大的(因为k=2嘛,如果k=n则同一层选前n个最大的进行生成)再继续生成
束搜索解码:停止准则/何时停止
- 在贪心解码中,我们通常解码到模型产生一个<END>令牌
- 例如: <STRAT> he hit me with a pie <END>
- 在束搜索解码中,不同的假设可能在不同的时间步长上产生 $\text{}$ 令牌
- 当一个假设生成了<END>令牌,该假设完成
- 把它放在一边,通过 Beam Search 继续探索其他假设
- 通常我们继续进行束搜索解码,直到
- 我们到达时间步长 T (其中 T 是预定义截止时间点)
- 我们至少有 n 个已完成的假设(其中 n 是预定义截止次数点)
束搜索解码:选择最终结果
我们有完整的假设列表
如何选择得分最高的?
我们列表上的每个假设y1,y2,...,yt都有一个分数
假设参考语言模型,使用下述公式:
在此基础上,确实有道理,但是存在一个很严重的问题,就是较长的假设的评分会非常低,所以我们需要进行按长度标准化/平均化
NMT相比于SMT的优/劣势
优势:
更好的性能
更流利
更好地使用上下文
更好地使用短语相似性
单个神经网络端到端优化
没有子组件需要单独优化
对所有语言对使用相同的方法(SMT如果创建其他翻译系统,几乎是重新做)
劣势:
NMT的可解释性较差,难以调试
NMT很难控制,例如,不能轻松指定翻译规则或指南,存在安全问题
(其实就是因为神经网络类似一个黑盒,我们不知道其如何解释、生成的,也很难为他制定规则等)
如何评价NMT?
用BLEU /Bilingual Evaluation Understudy/进行评价
假定人工给出的译文为𝑟𝑒𝑓𝑒𝑟𝑒𝑛𝑐𝑒,机器翻译的译文为𝑐𝑎𝑛𝑑𝑖𝑑𝑎𝑡𝑒。
1、早起的BLEU算法
存在的问题:
如果一文为:the cat is on the tree,翻译结果:tree tree tree tree tree tree,tree,那么BLEU=1,这明显不合理的~
2、改进的𝐵𝐿𝐸𝑈算法 — 分子截断计数
上述早起算法,存在问题主要体现在分子上,所以对分子作如下改进:
其中,
,但一般情况下reference可能会有多个,,例如上述样例中的the,因此有
(简单理解就是看翻译结果在译文中出现的次数,但是对于同一个单词来说,只计算一次,且最大值如果超过在译文中该词数量,则令其为译文中该词出现的最大次数)
例如:上述例子结果BLEU=1/7,如果翻译结果为:the the the the the the the,则BLEU=2/7
3、继续改进的𝐵𝐿𝐸𝑈算法 — 引入𝑛−𝑔𝑟𝑎𝑚
在上面我们一直谈的都是对于单个单词进行计算(相当于1−𝑔𝑟𝑎𝑚),1−𝑔𝑟𝑎𝑚可以描述翻译的充分性,即逐字翻译的能力,但不能关注翻译的流畅性和上下文语义,因此引入了𝑛−𝑔𝑟𝑎𝑚,在这里一般𝑛不大于4。引入𝑛−𝑔𝑟𝑎𝑚后的公式如下:
很多时候在评价一个系统时会用多条𝑐𝑎𝑛𝑑𝑖𝑛𝑎𝑡𝑒来评价,因此上面式子中引入了一个候选集合𝑐𝑎𝑛𝑑𝑖𝑛𝑎𝑡𝑒𝑠。𝑝𝑛中的𝑛即𝑛−𝑔𝑟𝑎𝑚中的n。
接下来简单的理解下上面的式子,首先来看分子:
- 第一个∑描述的是各个𝑐𝑎𝑛𝑑𝑖𝑛𝑎𝑡𝑒的总和;
- 第二个∑描述的是一条𝑐𝑎𝑛𝑑𝑖𝑛𝑎𝑡𝑒中所有的𝑛−𝑔𝑟𝑎𝑚的总和;
- 𝐶𝑜𝑢𝑛𝑡𝑐𝑙𝑖𝑝(𝑛−𝑔𝑟𝑎𝑚)表示某一个𝑛−𝑔𝑟𝑎𝑚词的截断计数;
再来看分母,前两个∑和分子中的含义一样,𝐶𝑜𝑢𝑛𝑡(𝑛−𝑔𝑟𝑎𝑚′)表示𝑛−𝑔𝑟𝑎𝑚′在𝑐𝑎𝑛𝑑𝑖𝑛𝑎𝑡𝑒中的计数。
再进一步来看,实际上分母就是𝑐𝑎𝑛𝑑𝑖𝑛𝑎𝑡𝑒中𝑛−𝑔𝑟𝑎𝑚的个数,分子是出现在𝑟𝑒𝑓𝑒𝑟𝑒𝑛𝑐𝑒中的𝑐𝑎𝑛𝑑𝑖𝑛𝑎𝑡𝑒中𝑛−𝑔𝑟𝑎𝑚的个数。
举一个例子来看看实际的计算:
- 𝑐𝑎𝑛𝑑𝑖𝑛𝑎𝑡𝑒/译文:the cat sat on the mat
- 𝑟𝑒𝑓𝑒𝑟𝑒𝑛𝑐𝑒/翻译结果:the cat is on the mat
则结果为:
4、补充BLEU内容-添加对句子长度的乘法因子
在翻译时,若出现译文很短的句子时往往会有较高的BLEU值,因此引入对句子长度的乘法因子,其公式如下:
在这里c表示cadinate的长度,r表示reference的长度。将上面的整合在一起,得到最终的表达式:
其中表示不同的𝑛−𝑔𝑟𝑎𝑚n−gram的精度的对数的加权和
5、存在的问题
- BLEU很有用,但不完美
- 有很多有效的方法来翻译一个句子
- 所以一个好的翻译可以得到一个糟糕的BLEU score,因为它与人工翻译的n-gram重叠较低
意思就是:可能翻译的很好(语义接近),但是翻译结果的词在译文中所占很少
机器翻译的时间线
神经机器翻译于2014年从边缘研究活动到2016年成为领先标准方法
- 2014:第一篇 seq2seq 的文章发布
- 2016:谷歌翻译从 SMT 换成了 NMT
这是非常令人震撼的,由数百名工程师历经多年打造的SMT系统,在短短几个月内就被少数工程师训练过的NMT系统超越。
NMT依旧存在许多问题
- 许多困难仍然存在
- 词表外的单词处理
- 训练和测试数据之间的 领域不匹配
- 在较长文本上维护上下文
- 资源较低的语言对
- 使用常识仍然很难
- NMT在训练数据中发现偏差
- 无法解释的系统会做一些奇怪的事情
NMT的研究仍然在继续发展
NMT是NLP深度学习的核心任务
- NMT研究引领了NLP深度学习的许多最新创新
- 2019年:NMT研究将继续蓬勃发展
- 对于我们今天介绍的普通seq2seq NMT系统,有很多、很多的改进。
- 但有一个改进是如此不可或缺,那就是注意力~
注意力机制
上述的机器翻译过程中,我们可以发现Encoder RNN中输入到Decoder RNN更类似于橙色的那块,也就是最后一个词,而且根据RNN传递规则我们知道,输入到Decoder RNN中的更倾向于后面词语的内容,而不是前面的~而机器翻译则需要捕获全文信息~
注意力机制为上述问题提供了一个解决方案
核心理念 :在解码器的每一步,使用 与编码器的直接连接 来专注于源序列的特定部分
首先我们将通过图表展示,然后我们将用方程展示
将解码器部分的第一个结点与源语句中的每一个时间步的隐藏状态进行 Dot Product 得到每一时间步的分数
通过softmax将分数转化为概率分布,在这个解码器时间步长上,我们主要关注第一个编码器隐藏状态(“he”)
- 利用注意力分布对编码器的隐藏状态进行加权求和
- 注意力输出主要包含来自于受到高度关注的隐藏状态的信息
连接的注意力输出与解码器隐藏状态 ,然后用来计算,后续过程同上,具体过程如下:
上述讲的感觉不是很明白...结合一下动手学习深度学习的内容来理解下~
注意力机制的好处
- 注意力显著提高了NMT性能
- 这是非常有用的,让解码器专注于某些部分的源语句
- 注意力解决瓶颈问题 (也就是最初我们说的那个问题,只关注句子后面的词)
- 注意力允许解码器直接查看源语句;绕过瓶颈
- 注意力帮助消失梯度问题 (只是缓解)
- 提供了通往遥远状态的捷径
- 注意力提供了一些可解释性
- 通过检查注意力的分布,我们可以看到解码器在关注什么
- 我们可以免费得到(软)对齐
- 这很酷,因为我们从来没有明确训练过对齐系统
- 网络只是自主学习了对齐
注意力机制现在是一种常用的深度学习技巧
- 我们已经看到,注意力是改进机器翻译的序列到序列模型的一个很好的方法
- 然而 :您可以在许多体系结构(不仅仅是seq2seq)和许多任务(不仅仅是MT)中使用注意力机制
- 注意力的更一般定义
- 给定一组向量值和一个向量查询 ,注意力是一种根据查询,计算值的加权和的技术
- 我们有时说 query attends to the values
- 例如,在seq2seq + attention模型中,每个解码器的隐藏状态(查询)关注所有编码器的隐藏状态(值)
- 直觉
- 加权和是值中包含的信息的选择性汇总,查询在其中确定要关注哪些值
- 注意是一种获取任意一组表示(值)的固定大小表示的方法,依赖于其他一些表示(查询)。
注意力机制的变体
(这一部分我也没接触过,直接截取翻译版本的课件内容了)
(这个内容以后如果感兴趣的可以再详细了解~)