这里从一堆概率的乘积转化为一堆\(\log\)的求和的原因之一也是为了防止数值下溢。然后原文说是为了惩罚长序列,其实是为了惩罚短序列,在没有除以\(L^{\alpha}\)的时候,模型更倾向于输出短的序列,这个操作叫做规范化,如果\(\alpha=1\),则叫做完全规范化
那么调整超参数束宽的时候我们应该怎么调整呢?跟数据集一样,将\(k\)变大肯定没有问题,但是我们的时间是有限的,我们高效率的调整,应该是去发现到底是我们的RNN有问题还是我们的\(k\)设置的太小了。实际上,有一种比较简单的方法去做这件事情,我们利用RNN的功能是计算所有可能情况的概率和束搜索的功能是在所有可能的情况中选取概率最大的就好了
假设现在输入一个句子\(x\),一个好的翻译是\(y^*\),我们预测的翻译是\(\hat{y}\),那么我们只需要比较\(P(y^*|x)\)和\(P(\hat{y}|x)\)(不妨忽略规范化)
- \(P(y^*|x)>P(\hat{y}|x)\)
这证明RNN的计算功能是没有问题的,是\(k\)太小了 - \(P(y^*|x)≤P(\hat{y}|x)\)
这证明RNN是有问题的,我们需要调整RNN
上面的过程是对一个句子而言的,实际中我们将所有预测错误的句子全部进行上面的操作,然后去统计到底是RNN犯的错误更多还是\(k\)犯的错误更多,然后就可以进行调整了(如果是RNN犯的错误更多,我们还可以将RNN犯的错误进行归类,比如RNN的介词弄不好,我们就可以多找一点介词训练样本)
显然,上面的做法只要使用了束搜索都可以用,而不是局限于机器翻译