由于在公众号上文本字数太长可能会影响阅读体验,因此过于长的文章,我会使用"[L1]"来进行分段。这系列将介绍Seq2Seq模型中的Beam Search算法。
a
Beam Search的应用场景
单隐层的神经网络被认为能够拟合所有的函数,所以在理论上我们的模型可以使得在训练样本上的损失为0,但这往往不是我们想要的,我们希望我们训练好的模型能够更好的预测未知的数据,而不是尽可能的拟合包含大量噪声的训练样本。所以设置了一个测试阶段来评估模型的好坏,当然根据我们的任务的不同评估模型标准也是不一样的。
比如我们比较熟悉的使用神经网络训练语言模型的任务中,语言模型中测试的标准就是给定目标句子上的perplexity(复杂度)值,perplexity值越小说明我们训练的语言模型越好,在机器翻译的应用中,真实应用的测试步骤和语言模型的测试步骤有所不同,机器翻译的测试方法是,让解码器在没有"正确答案"的情况下自主生成一个翻译句子,然后采用人工或者自动的方法对翻译句子的质量进行评测。自动生成翻译句子的步骤就是在解码的过程中,每一步预测的单词中概率最大的单词被选为这一步的输出,并复制到下一步的输入中,最终的输出序列就是我们最终的翻译结果。
▲机器翻译测试阶段的示意图
比如输入待翻译的句子"I love you",能够通过我训练好的seq2seq模型自动生成"我爱你"。
seq2seq Model的核心是:
其中
就是编码器的输入序列,也就是source sequence,
是解码器的输出序列,也就是target sequence。
那对应我们上面那个"I love you"翻译成"我爱你"的例子中,我们在测试阶段求的就是在source sequence是"I love you"的条件下,输出使
最大的target sequence也就是
序列,其中
属于target sequence词汇表
中的任意词项。然后人工方式对输出的
序列翻译的质量进行评估。
但是这里需要注意,因为我们是以单词为基元的,所以不可能直接输出是概率最大的序列,只能一个单词一个单词的输出,从seq2seq Model的核心式子中我们也可以看出输出
不仅与
有关,而且和前
的单词序列有关,也就是
有关。
如果在测试阶段,对于上面的"I love you"翻译成"我爱你"的例子中,我输入"I love you"(
)的时候,会输出一个词汇表词项的概率分布,比如"我"对应的词汇表词项概率值最大,我们就选择"我"为第一个位置的输出,也就是
,然后把"我"作为下一次的输入,又会输出一个词汇表的词项的概率分布,那比如"爱"对应的词汇表概率值最大,选择"爱"作为第二个位置的输出,也就是
,同理输出最后一个单词"你"。这也体现了对于输出
不仅与
有关,而且和前
的单词序列有关,也就是
有关,在解码器的输出可以写成
,
,
。
如果target sequence的词汇表的大小是
的话,那么对于解码器输出
来说,每输出概率最大的单词的搜索空间是
,对于
来说就是
,对于一般的输出
个序列的话,搜索空间就会是
,通常来说词汇表会很大,那可以看出如果
越长的话,没有任何的算法,直接去遍历的话,那这个效率会很低。
参考: 1.《tensorflow实战Google学习框架》 2.小象学院