LSTMs and GRUs

机器翻译

对于情感分析这类还算简单的任务,你可以整理一个情感极性词典、编写一堆规则做出一个勉强能用的系统。但到了机器翻译这个高级应用,就无法完全依靠规则了。现代机器翻译手段都是基于统计的,在平行语料上学习语言知识。

传统机器翻译系统非常复杂,因为不同阶段用到了不同的机器学习方法。

传统统计机器翻译系统

定义一些符号:

原文$f$

译文$e$

机器翻译定义为找到使如下条件概率最大:

这里利用了贝叶斯公式。翻译模型$p(f|e)$,在平行语料上训练得到,语言模型$p(e)$在未对齐的原文语料上训练(是非常廉价的)。

公式描述的翻译过程如下:

第一步:对齐

找到原文中的哪个句子或短语翻译到译文中的哪个句子或短语。

对齐时,原文中可能有部分词语没有对应的译文:

也可能在译文中有部分词语没有对应的原文,根据模型不同,可能有一对多的对齐方式:

也可能有多对一的对齐方式:

还可能有多对多的对齐方式:

有时候还要通过句法分析,来进行不同颗粒度的对齐:

对齐之后

原文中每个单词都有多个备选单词,导致了许多短语的组合方式:

解码:在海量假设中搜索最佳选择

这是一个特别复杂的搜索问题,涉及到许多语言模型。

传统机器翻译

这还只是传统机器翻译系统的冰山一角,有许多细节没有涉及到,还需要大量的人肉特征工程,总之是非常复杂的系统。其中每个环节都是独立不同的机器学习问题。这些独立的模型各自为政,并不以一个统一的优化目标为最终目标。

而深度学习则提供了一个统一的模型,一个统一的最终目标函数。在优化目标函数的过程中,得到一个end to end的完整的joint模型。传统机器翻译系统与深度学习是截然相反的,对齐模型、词序模型、语言模型……一堆独立的模型无法联合训练。

深度学习来救场

也许可以直接用RNN来接受原文,预测译文“下一个单词”:

红圈所示特征表示必须能捕捉整个原文短语的语义,但是RNN无法记住太久之前的事情,大概五六个单词就到极限了。所以这不是个实用的模型。

softmax分类器中必须有个代表句子终止的“单词”,不然模型会无休止地输出下去。

但神经网络机器翻译模型没有这么简单,必须加一些拓展。

1、编码器和解码器训练不同的权值矩阵

红蓝代表不同的权值。

2、decoder中的隐藏层的输入来自3个方面:

这可以辅助训练softmax的权值矩阵,防止模型重复生成同一个单词。

上图还有一个复杂版本,表达的是同一个意思:

3、使用深度RNN

4、使用 bi-directional encoder

5、不再用 A B C→X Y作为训练实例,而是逆转原文词序:C B A→X Y。因为A更可能翻译为X,而梯度消失导致A无法影响输出,倒过来A离输出近一些。逆转词序不会带来“语法语义上的改变”,因为模型学习的就是如何从逆序的原文翻译顺序的译文。但相应的,C就离Y更远了

LSTM

RNN 存在的问题

误差项沿时间反向传播的公式:

LSTM结构示意图

LSTM前向计算公式

误差项沿时间的反向传递(误差的横向计算)

计算 t-1 时刻的误差项$\delta^{t-1}$

其中

经过推导可以得到

将误差项传递到上一层(误差的竖向计算)

权重梯度的计算

主要改进:更好的单元 GRU

前面我们讲了一种普通的LSTM,事实上LSTM存在很多变体,许多论文中的LSTM都或多或少的不太一样。在众多的LSTM变体中,GRU (Gated Recurrent Unit)也许是最成功的一种。它对LSTM做了很多简化,同时却保持着和LSTM相同的效果。因此,GRU最近变得越来越流行。

GRU的示意图

GRU的前向计算公式

GRU的训练算法比LSTM简单一些,,自行推导

RNN最新改进

softmax的问题:无法出新词

对分类问题来讲,你无法指望分类模型给你分出一个训练集中不存在的类。即便是训练集中存在的类,如果样本数很少,模型也很难预测出该类。

对于预测下一个单词的语言模型来讲,也是如此。比如某某女士巴拉巴拉,然后自我介绍说我叫某某。如果某某不存在于训练集中,则模型无法预测出某某。

虽然可以用字符级的模型,但代价实在太大。

用指针来解决问题

如果把某某替换为“向前数第10个单词”这样的指针,问题就迎刃而解了。

具体做法是,以前100个时刻的隐藏层作为输入,用一个softmax去计算前100个单词是pointer的概率,与原来的词表上的分布混合。

使用了pointer之后,困惑度下降了零点几个百分点:

总结

RNN很强大

有很多进行中的工作

GRU更强大

LSTM又更强大

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信