来源:Coursera吴恩达深度学习课程
回忆一下,在这五门课中的第三门课3-2 Coursera吴恩达《构建机器学习项目》 第二周课程笔记-机器学习策略(2)中,我们讲解了误差分析是如何能够帮助集中时间做项目中最有用的工作,束搜索算法(beam search)是一种近似搜索算法(an approximate search algorithm),也被称作启发式搜索算法(a heuristic search algorithm),它不总是输出可能性最大的句子,它仅记录着B为前3或者10或是100种可能。那么如果束搜索算法出现错误会怎样呢?
接下来我们将会学习到误差分析和束搜索算法是如何相互起作用的,以及怎样发现是束搜索算法出现了问题,需要花时间解决,还是你的RNN模型出了问题,要花时间解决。我们先来看看如何对束搜索算法进行误差分析。
举个例子,如上图所示,对于法语“Jane visite l'Afrique en septembre”来说,在机器翻译的开发集(development set)中,人工翻译是:Jane visits Africa in September,标记为y*。这是一个十分不错的人工翻译结果。在已完成学习的RNN翻译模型中运行束搜索算法时,它输出翻译结果为:Jane visited Africa last September,标记为y-帽。这是一个十分糟糕的翻译,它实际上改变了句子的原意,因此这不是个好翻译。
模型有两个主要部分,①一部分是神经网络模型,即序列到序列模型(sequence to sequence model),将这个称为RNN模型,它实际上是个编码器和解码器( an encoder and a decoder)。②另一部分是束搜索算法,以某个集束宽度B运行。如果我们能够找出造成这个错误,这个不太好的翻译的原因,是两个部分中的哪一个,不是很好吗? RNN (循环神经网络)是更可能是出错的原因呢,还是束搜索算法更可能是出错的原因呢?然后再采取相应的措施,像第三门课中收集更多的训练数据。所以同样的,也可以尝试增大束宽。不过如何判断我们是不是值得花时间去改进搜索算法呢? 下面我们来分解这个问题弄清楚什么情况下该用什么解决办法。
RNN (循环神经网络)实际上是个编码器和解码器(the encoder and the decoder),它会计算P(y|x)。对于Jane visits Africa in September,将Jane visits Africa填入这里(上图紫色网络),同样,这里忽略了字母的大小写。P(y|x)结果表明,此时能做的最有效的事就是用这个模型来计算P(y*|x),同时也用RNN模型来计算P(y-帽|x),然后比较一下这两个值哪个更大。这取决于实际是哪种情况,就能够更清楚地将这个特定的错误归咎于RNN或是束搜索算法,或说是哪个负有更大的责任。我们来探究一下其中的逻辑(logic)。
如上图,计算完P(y*|x) 和P(y-帽|x),然后比较大小,分析以下两种情况。
(1)第一种情况,RNN模型的输出结果P(y*|x) 大于P(y-帽|x),这意味着什么呢? 束搜索算法选择了y-帽。 你得到y-帽的方式是,用一个RNN模型来计算P(y|x),然后束搜索算法做的就是尝试寻找使P(y|x)最大的y,不过在这种情况下,相比于y-帽,y*的值更P(y|x)大,因此你能够得出束搜索算法实际上不能够给你一个能使P(y|x)最大化的y值,因为束搜索算法的任务就是寻找一个y的值来使这项更大,但是它却选择了y-帽,而y*实际上能得到更大的值。因此这种情况下你能够得出是束搜索算法出错了。
(2)第二种情况:P(y*|x)小于或等于P(y-帽|x),情况1或是情况2总有一个为真。情况2你能够总结出什么呢? 在这个例子中,y*是比y-帽更好的翻译结果,不过根据RNN模型的结果,P(y*)是小于P(y-帽)的,即相比于y-帽,y*成为输出的可能更小。因此在这种情况下,看来是RNN模型出了问题。同时可能值得在RNN模型上花更多时间。这里Andrew少讲了一些有关长度归一化(length normalizations)的细节。这里略过了有关长度归一化的细节,如果你用了某种长度归一化,那么你要做的就不是比较这两种可能性大小,而是比较长度归一化后的最优化目标函数值。不过先忽略这种复杂的情况。第二种情况表明虽然y*是一个更好的翻译结果,RNN模型却赋予它更低的可能性,是RNN模型出现了问题。
误差分析过程(error analysis process)看起来就像上图。(1)首先遍历开发集(development set),然后在其中找出算法产生的错误,假如这个例子中P(y*|x)的值为2 x 10^-10,而P(y-帽|x)的值为 1 x10^-10,根据上页幻灯片中的逻辑关系,这种情况下我们得知束搜索算法实际上选择了比y*可能性更低的y-帽,因此我们会说束搜索算法出错了。我们将它缩写为B。(2)接着你继续遍历第二个错误,再来看这些可能性。也许对于第二个例子来说,你认为是RNN模型出现了问题,用缩写R来代表RNN。(3)再接着你遍历了更多的例子,有时是束搜索算法出现了问题,有时是模型出现了问题,等等。
通过这个过程,我们能够执行误差分析,得出束搜索算法和RNN模型出错的比例是多少,能发现这两个部分中哪个是产生更多错误的原因。对开发集中每一个错误例子,即算法输出了比人工翻译更差的结果的情况,尝试确定这些错误(ascribe the error),是搜索算法出了问题,还是生成目标函数(束搜索算法使之最大化)的RNN模型出了问题。通过这个过程你能够发现有下面两种情况:①如果发现是束搜索算法造成了大部分错误,可以增大集束宽度。②相反地,如果发现是RNN模型出了更多错,那么可以进行更深层次的分析,来决定是需要增加正则化还是获取更多的训练数据,抑或是尝试一个不同的网络结构,或是其他方案。在第三门课中,了解到各种技巧都能够应用在这里。
这就是束搜索算法中的误差分析,Andrew认为这个特定的误差分析过程是十分有用的,它可以用于分析近似最佳算法(如束搜索算法),这些算法被用来优化学习算法(例如序列到序列模型/RNN)输出的目标函数。学会了这个方法,在应用里能更有效地运用好这些类型的模型。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。