传统的机器翻译系统在不同的阶段用了很多不同的独立算法,加上庞大的人工特征工程,整个模型非常复杂,代价高昂。而深度学习则提供了一个统一的模型,一个统一的最终目标优化函数,一个完整的end-to-end模型。
假定现在我们的任务是把"Echt dicke Kiste "f翻译为"Awesome sauce"。
首先来看这样一种简单的RNN模型:
上面的模型也被称为encoder-decoder模型。在这个RNN模型中,前面三个时刻的输入是我们的德语输入单词序列,这三个时刻的RNN成为encoder,后两个时刻的输出使我们想要的英语结果单词序列,这两个时刻的RNN被称为decoder。此模型的数学表达式为:
损失函数为cross-entropy:
由于encoder结束时模型需要记住前面所有单词的信息,但是实际上这种简单RNN只能记住五六个单词的信息,所以这个模型实用价值并不大。若想达到更好的性能,还需要一些拓展:
1.encoder和decoder使用不同的权值矩阵,也就是说,使用两个RNN模型来实现翻译的功能,两个RNN各司其职,可以在自己的位置上做的更精确些。
2.decoder的hidden-layer接收三个输入。除了本来就存在的前一时刻的hidden-layer的输出外,还要接收encoder的末尾输出和前一个的预测输出单词。这样,模型就变为:
3.把模型挖深,多加几层hidden-layer。由于更深的模型拥有更强的学习能力,所以通常能够提高预测的准确率,当然,同时也需要更大的语料库。
4.encoder使用双向RNN网络来提高精确度。
5.逆转原文词序,将任务变成任务。这种方法的直觉原因是A更有可能翻译为X,而由于梯度消失的存在,逆转词序可以在生成输出语句时降低错误率。
不过,以上拓展还不够,最主要的改进措施是改善神经元的模型。
Gated Recurrent Units
GRU使用了比原始RNN更复杂的神经元模型来达到更好的性能。尽管理论上RNN能够捕获长期的信息,但是实际上训练出一个能做到这样的模型是很难的。而GRU的设计可以使记忆保持更久,使得长期的信息得以保持。首先让我们来看GRU神经元的数学表达式:
还有示意图作为参考:
1.New Memory:新记忆与新输入xt和上一时刻的输出有关,也就是说,模型通过观察当前时刻的输入单词和上一时刻的输出来总结截止到目前为止的前文信息向量应该是什么样的。
2.Reset Gate:重置信号rt负责决定上一时刻的输出对于新记忆的生成有多重要,也就是计算一个权值。如果重置门发现上一时刻的输出与新记忆完全无关,那么它能够通过全部置0完全裁剪掉之前的信息。
3.Update Gate:根据和和xt计算的更新信号zt负责做最后的调节,决定当前时刻的输出的组成,即决定当前输出有多少来自上一时刻的输出,有多少来自当前的新记忆。如果zt很接近1,那么当前输出几乎完全等于前一时刻的输出,如果zt很接近0,那么当前输出几乎等于当前的新记忆。
4.Hidden state:隐藏状态ht,即单层时hidden-layer的输出,多层时是下一层layer的输入。
Long-Short-Term-Memories
LSTM的设计动机与GRU类似,但是结构有些不同。首先再来看数学表达式:
参考示意图:
1.New Memory:利用当前输入xt和前一时刻输出计算新记忆,其中已包含了当前输入的信息,要注意的是,new memory并不是此刻的记忆,而只是此刻记忆的一个来源。
2.Input Gate:输入门的功能在于衡量新单词对于此刻记忆的重要性,根据当前输入和前一时刻输出计算得到,它将作为权值直接作用于new memory来完成此功能。
3.Forget Gate:遗忘门的功能为衡量前一时刻的记忆对于当前记忆的重要性,根据当前的输入和前一时刻的输出计算得到,作为权值直接作用于前一时刻的记忆。
4.Final memory:这才是此刻的记忆,有两个来源,new memory和上一时刻的记忆,分别由两个权值,Input gate 和forget gate来操控其组成成分的分配。
5.Output/Exposure Gate:根据当前输入和前一刻输出来计算,用来把此刻的记忆和此刻的输出分开,在两者之间插入了一个门,因为记忆中包含着非常多的信息,并不是所有信息都需要在此刻输出中体现出来,某些信息可能只是对后文有影响。
可以看看是否能完全理解下图来验证自己懂没懂LSTM:
LSTM是序列标注、seq2seq任务的首选模型,与传统MT模型的比较:
对LSTM机器翻译的结果做一个可视化分析:
这是对最后一个时刻的hidden-layer的输出向量做PAC降维后的结果,发现无论词序如何,意义相同的句子在向量空间中更接近。
对于RNN来说,还有更多更复杂的模型:
这就像搭积木一样,不像该旅途模型那样有完备的理论解释,拿现有的单元拼凑一下,只要能获得更高的分数,就可以发paper了。
最后,还有一个很重要的问题,对于词表中在训练集中没有出现过的新词的处理。这其实也是softmax函数分类任务的共同问题,对softmax分类问题来讲,你无法指望分类模型给你分出一个训练集中不存在的类。即便是训练集中存在的类,如果样本数很少,模型也很难预测出该类。
解决方案被称为softmax与pointer的混合模型。pointer指的是指向输出词序列中相对于当前输出词的向前数若干个单词的指针,综合前文中单词出现的概率和原本的预测结果进行综合预测:
具体而言,假设取前100个单词进行预测,将当前时刻hidden-layer的输出与前面100个时刻的hidden-layer的输出作为输入,用一个单层神经网络和softmax函数计算这100个单词出现的概率,再与正常预测结果混合作为最终的预测概率:
从实践结果上来看,pointer确实降低了困惑度:
领取专属 10元无门槛券
私享最新 技术干货