主课的最后一讲,我们来看看非常出名的 Seq2Seq 模型和注意力机制,这些都是 RNN 得以在机器翻译、语音识别、自然语言处理领域大放异彩的重要原因。
更新历史
- 2019.10.25: 完成初稿
Seq2Seq 结构
因为 Sequence to sequence 实在不太好翻译,后面统一叫 seq2seq。我们先来看如下场景:我想要把一个法语句子(Jane visite I’Afrique en Septembre)翻译成一个英语句子(Jane is visiting Africa in September),我们用诸如 $x^{<1>}$ 表示输入句子的单词,$y^{<1>}$ 表示输出句子的单词,要如何训练出一个神经网络来通过 x 得到 y 呢?就可以用 seq2seq 模型,如下图所示:
编号 1 的网络叫做编码网络(encoder network),是一个 RNN 结构(单元可以是 GRU 或 LSTM),每次只向该网络中输入一个法语单词,全部输入后,网络会输出一个向量 A 来代表这个输入序列(可以理解为对这句话做了 encoding)。然后我们再建立一个解码网络(decoder network),也就是编号 2 的部分,用前面编码网络输出的向量 A 作为输入,会解码出一个新的句子,这样就完成了翻译。
我们甚至可以输入一张图片,这样一来就变成了看图说话,如下图所示:
注:Image captioning 的模型称为 Image to Sequence,但思路是和 seq2seq 类似的。
选择最可能的句子 Pick the Most Likely Sentence
仔细观察 seq2seq 模型的后半部分,就会发现这和前面我们提到的语言模型很相似,都是一对多的模式。这里有一个差别在于 seq2seq 的 decoder 被称为条件语言模型(conditional language model),为什么说是条件,因为 seq2seq 的 decoder 的输出取决于输入,而不是像语言模型直接从 $a^{<0>}$ 开始,如下图所示(注意紫色网络与语言模型的输入的差别):
因为语言模型只是对应各个单词输出的概率,我们实际上是可以得到各种英文翻译所对应的可能性的,如下图:
我们要找的就是在 x(法语)的前提下,找到使 P 最大的 y(英语)的句子,这就涉及到如何在一个概率搜索空间中进行检索的问题,一般采用集束搜索(Beam Search),这个我们后面再详细介绍。
说到搜索,为什么我们不能用最简单的贪心搜索?也就是每次都选择概率最大的词呢?简单来说就是每一步的最优并不能使得整句话最优,下面就是一个可能的反例:
比如我们要选择 is 后面的单词,因为 is going to 在英语中是更加常用的表达,going 的概率很可能比 visiting 要大,但是显然第一句翻译会比后面的更好。
所以,我们还是老老实实学习一下 Beam Search。
集束搜索 Beam Search
我们用一个实际的例子来看看 Beam Search 的工作原理,我们的词表如下图所示(绿色部分是 encoder,紫色部分是 decoder):
我们想要找到输入 x 之后,第一个输出的 y,也就是 $y^{<1>}$ 是多少。和贪婪搜索只看概率最大的不同,Beam Search 会看多个选择,这个数量由 Beam Width 参数确定,这里我们设为 3,也就是一次会考虑 3 个选择。针对 $y^{<1>}$,我们选出最有可能的三个单词:in, jane, september(注意,这里的紫色箭头实际上是一个 softmax 层,会输出 10000 个概率值,我们选前 3 个存起来)。
接着我们要选择第二个单词,从 in 开始,这里我们选择的并不是 in 后面最大概率的词,而是和 in 一起出现概率最大的词组。第一步有 3 个选择,第二步拼起来就有 3x10000 种选择,我们再挑出其中概率最大的三组(图上 456 标记出来的)。然后我们再看下一步:
通过这样的方式,我们可以不断求出更长的条件概率,公式转化下就可以得到在 x 的条件下,使 y 条件最大的单词组合。
改进集束搜索 Refinements to Beam Search
上面提到的集束搜索,本质是最大化 $P(y^{<1>}…y^{
一般来说这些概率值都远小于 1,一直乘下去的话,会造成数值下溢出(numerical underflow),所以实践中我们会对上面的公式取 log,变成求和来进行概率最大化。
另外,如果有一个很长的句子,那么在求和中会倾向于更短的翻译(因为多乘一个概率小于 1 的值,实际上很可能降低概率),所以我们可以改为求解每个单词的概率取对数的平均,就避免了对短句子的倾向,这就是长度归一化。
在实践中,相比于直接除以输出句子的单词总数 $T_y$,我们一般会在 $T_y$ 加上指数 a,比如 0.7(当 a 为 1 的时候相当于常规的长度归一化)。这里的 a 的值目前暂时没有理论验证,但是效果不错,所以也是一个需要调整的超参数。
集束搜索误差分析 Error Analysis in Beam Search
集束搜索是一种近似搜索算法,也被称为启发式搜索算法,问题在于,如果没搜索对,我们要如何判断是 RNN 模型的问题,还是集束搜索本身参数设置的问题呢?所以我们需要对集束搜索进行误差分析。
还是用 Jane visite I’Afrique en septembre 作为例子,人工翻译为 Jane visits Africa in September,我们记为 $y^$;而假设 RNN 模型输出的结果是 Jane visited Africa last September,记为 $\hat{y}$。注意,RNN 实际上是一个编码器和解码器,计算的就是 $P(y|x)$,所以我们直接把人工的翻译放到解码器的部分,计算出 $P(y^|x)$,然后再计算出 $P(\hat{y}|x)$,有了这两个值我们就可以比较了,如下图所示:
简单来说就是如果真实的翻译在网络中的概率比机翻的高,那么是集束搜索的锅,因为本来应该搜索到的,应对方法就是把 Beam Width 调大一些;反之,则是 RNN 模型的锅,因为模型对更好的句子的预估值反而低,应对方法就是看看模型本身有没有哪里可以改进。
另外一下,评价机器翻译有一个指标叫做 BLEU(bilingual evaluation understudy) 分数,详情这里不展开,但是分数越高,说明翻译得越好。
直观理解注意力模型 Attention Model Intuition
注意力模型现在已经是深度学习中最重要的思想之一,我们这一节会来简单了解下。
先来看看机器翻译中一个很突出的问题:长句翻译。在我们的网络中,绿色的部分需要读入整个句子并记忆,然后传递给后面的紫色网络生成翻译。对比下人类如何进行翻译的,并不是一下看全部,而是一点一点往后翻译的。正因如此,我们可以看到在句子越来越长的时候,Bleu 得分会急剧下降。
而注意力模型可以看作是对人类翻译的模仿,能够让一个神经网络只注意到一部分的输入句子,从而更好地利用上下文进行翻译。
注意力模型 Attention Model
关于注意力模型的介绍,可以参考 这里,我个人感觉要比课程本身说明得更加清晰,这里就不再赘述。
课程的最后两部分是语音识别相关的,因为我做得比较少,这里就不再记录。