谷歌神经机器翻译(GNMT)论文《Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation》描述了一种将深度学习融入产品的有趣方法。该论文和架构是不标准的,在很多情况下偏离学术论文中的架构。通过典型但计算密集型的调整,谷歌这个系统的重点是保证系统的实用性而并非追求顶尖结果。 架构 为了理解 GNMT 中使用的模型,我们将从传统的编码器-解码器机器翻译模型开始,持续变化该模型直到匹配 GNMT 中的模型。看起来,GNMT 进化的东西是改进准确率,同时维持实际产品化时的训练与预测速度。 V1:编码器-解码器 编码器-解码器架构开始了近期的神经机器翻译趋势,出现于数年前。如同名字中的含义,该架构包含两个组件:一个解码器和一个编码器。 一个词级的编码器-解码器机器翻译系统,如同下面所描述的: 采用一个循环神经网络,通常是 LSTM 来编码用语言 A(英语)写出的语句。 该 RNN 吐出一个隐态(hidden state),我们称之为 S。 该隐态有希望表征前面编码出的语句的所有内容。 然后 S 被应用到解码器,一个单词一个单词的生成 B 语言(德语)句子。
编码器-解码器展示了基于神经的机器翻译可能提供的潜力。即使有了如今复杂的神经机器翻译架构,大部分还是根据解码器-编码器架构分解出的产物。 该架构有两个主要的缺点,都和长度有关。第一个,像人类一样,该架构记忆有限。LSTM 最后的隐态,也就是 S,要死记硬背需要翻译的句子的全部内容。S 通常只有数百个 unit(读取:浮点数),atv,你越是尝试挤入固定维数向量,该神经网络也被迫有更多损失。可以将神经网络的这个过程看作是一种有损压缩,有时候这是很有用的。 第二,根据经验法则,神经网络越深,越难以训练。对循环神经网络而言,序列越长,神经网络随着时间维度越深。这造成了梯度的消失,也就是随着反向传输,循环神经网络学到的目标的梯度信号会消失。即使 RNN 是专门用来帮助防止梯度消失的,比如 LSTM,这仍然是个根本性的问题。 图:来自 Bahdanau 等人的论文 "Neural Machine Translation by Jointly Learning to Align and Translate" (2014),展示了在翻译得分(评分形式为 BLEU 得分)随着语句变长后的影响。 虽然它在短句上有效,但当句子变得更长时就开始失效了。记忆问题的一种解决方案是增加 LSTM 隐态的大小。不幸的是,如果我们这么做训练速度也变得不够现实了。随着增加 LSTM 的隐藏大小,参数的数量也次方数的增加。你会耗尽 GPU 的存储或训练时间过长。这种方法也无法解决梯度消失问题。 V2:基于注意力的编码解码器 我们如何解决上面那些问题?或许会尝试一个人类天生会使用的技能——反复关注源句的相关部分。如果你在翻译一条长句子,你可能会回头看一看源句,确定你捕捉到了所有细节信息。我们能让神经网络也做到这些。我们可以通过存储和指定 LSTM 之前的输出来增加神经网络的存储,同时不用改变 LSTM 的操作。此外如果我们知道对句子的某个特定部分感兴趣,那么注意力机制就会做一个「shortcut」,因此我们就能提供出一个无需遍历大量时间步的监督信号,而遍历时间步会导致梯度消失。这就类似于一个人在读完指环王所有的书后可能会回答的一个问题。如果我想问一个关于这本书开头的特定问题,比如夏尔袋底洞(Bag End),这个人就知道在这部系列小说的第一本中的哪一一页能找到答案。系列小说的长度不会影响你查找答案的能力。
简单来说(由于注意力机制已经很好地覆盖到其他地方)这个想法就是,一旦你有了从存储的编码器获取的 LSTM 输出,你就可以通过问询它们是如何与解码器端的电流计算相关的来查询每一条输出。编码器的每一条输出后面都会获得一个相关性得分,我们可以将这个相关性得分转换成一个概率分布,再通过 softmax 激活来归一。然后我们可以提取一个语境向量(context vector),这是一个编码器输出的加权求和,其结果取决于我们认为它们是如何相关的。 (责任编辑:本港台直播) |