最近看Franz JosefOch的Paper--《Minimum Error Rate Training in Statistical MachineTranslation》。初读文章感觉云里雾里。找牛人们问问了,才算有些眉目。顺便瞧瞧网上的博客,顿时觉得眼前豁然开朗。
关于这篇论文的讲解,网上有位大虾写的文章 (click here)写的很详细。我就不在累赘的复述了。而是谈谈我自己的理解。
第一个问题,就是为什么要来个最小错误率训练?我们根据上面大虾的文章知道,模型中间的参数的学习对译文的生成质量没有多少影响。我们需要使用最小错误率训练在优化集(Tuning Date)上面调节权重参数(注意 这里面调节的模型中间的一些权重参数)。说到底,就是我们在生成译文时候的打分机制和我们评价译文的打分机制(eg. BLUE, NIST……)不同,导致我们在解码时候得分比较好的译文,送去评价发现他们并不是最优的,也就是两种不同的机制导致的不匹配。使得我们需要在译文生成的时候添加打分机制监督我们的训练,使我们生成的译文一方面在译文生成打分机制上表现不错,另一方面在最终的评价上面得分表现也不错。这就是为什么我们需要引入最小错误率训练。
第二个问题,如何引入这个评价译文的打分机制监督我们的训练,帮助我们优化呢?
维基百科这么说的:
最小化错误率训练
最小化错误率训练通过在所准备的第二部分数据——优化集(Tuning Set)上优化特征权重,使得给定的优化准则最优化。一般常见的优化准则包括信息熵,BLEU,TER等。这一阶段需要使用解码器对优化集进行多次解码,每次解码产生N个得分最高的结果,并调整特征权重。当权重被调整时,N个结果的排序也会发生变化,而得分最高者,即解码结果,将被用于计算BLEU得分或TER。当得到一组新的权重,使得整个优化集的得分得到改进后,将重新进行下一轮解码。如此往复直至不能观察到新的改进。
在讲怎么做之前我们需要知道是,需要调参的公式从大虾的文章我们也知道。但在这个调节的时候,我们需要调的是一组参数,不是一个,我们假设为n个。怎么做?Paper中 是这么解决的。首先,给我们要调节的参数选个一组初始值。将其他的n-1个参数固定住,就是不要管它,帮他们当做常量。集中精力对付其中的一个参数r。那么我们生成译文时候的打分机制对一个句子的打分可以成为r的一元一次函数(因为其他的东西全部成为常量)。对于一个待翻译的句子,随着r的变化,候选译文(candidate translation)的排序(就是NBest)会发生改变,被选取的译文也会改变。如图:
**图中注意:我们要选取的是得分最高的candidate,在0-r1区间我们选取的是译文e3,在r1-r2区间,我们选取的译文是e1,在r2后面的区间我们选择的译文是e2。从这个图中我们知道,不同的区间我们选取的译文不同,对不同的句子我们可能有着不同的折点。
现在我们将所有的译文全部拿到一个坐标图上去看,那么我们就有这么花哨的一个拼图。
**图中注意:图中的s1只一个翻译的句子。他可能就是上图中最高分取得的。
现在拿到这个图形,就是在不同的r时候,我们每个句子对应由着不同的各自最优译文。
到这一步,还是没有引入任何的评价译文的打分机制。现在我们就开始引入这个玩意。
在每个r值(r1 r2)我们分别计算每个句子的错误统计(例如 BLUE值或者 NIST值)。然后将句子的错误统计值进行累加,得到我们整个优化集合在r处的错误统计个数。得到下面的图
![](https://img-my.csdn.net/uploads/201209/29/1348905244_2293.png)
**图中注意:不同的r值,我们的优化集合有着不同错误统计值。我们选取错误统计值最小的(最小错误率)r近似的认为这个值最优。
那么在这一步骤中,对r的估计已经完成。后面的就是用这个方法去估计余下的n-1个参数。
然后继续这样的步骤,迭代下去。直到我们的错误统计值没有大的变化。就得到一组比较理想的参数值了。
至此,over。使用这组参数,我们得到的结果在译文评价的时候也能取得不错的结果。