问题是否出在Beam搜索上

朋友们,如需转载请标明出处:http://blog.csdn.net/jiangjunshow

 

前面几篇文章我们介绍了使用下面的编解码CNN网络后再应用Beam搜索可以实现机器翻译。

 

当翻译结果不对时,我们首先需要找到问题出在哪里。是出在编解码CNN网络上,还是出现在Beam搜索上。就像给软件修复bug一样,首先要找到问题的源头在哪。但是有些程序员不管问题根源在哪,一阵乱打补丁,结果是治标不治本,打了一个补丁后又需要打另外两个补丁来修复之前的补丁…结果把整个软件的代码都搞得一团糟。其实某些问题你只要找到根源后,有可能一两行代码就可以完全修复它了。所以我在管理团队时,都要求代码review,就是下属提交代码后,要经过上级领导的审核才能合并到git的主分支中,以此来保证代码质量。其实也像医生治疗疾病一样,先要找到病灶在哪里,然后才开始治疗。一些庸医则不管病灶在哪里,一顿瞎治疗,结果小病被治成大病,大病被治疗成了绝症。所以大家生病了要不就自己挺一挺,要不就去三甲大医院,千万不要去诊所和小医院。我高中时有一次喝醉酒,被送到一个小诊所去打点滴,越打越难受,气都喘不过来,幸亏我妈在旁边陪着,叫傻逼护士停止输液,停了后就好了。过了一阵子那个诊所就关门了,听说把一个人给治疗死了。

 

上面说了那么多“废话”,下面给大家说说干货——如果分析问题出在Beam搜索还是在CNN网络。

 

首先我们从验证集或测试集的运行结果中找出一些翻译不对的结果。例如验证集中一个法语句子是(就是输入x)

 

这个句子对应的英语是(也就是y标签)

 

但是模型给出的翻译结果却是(也就是预测结果y')

 

这个翻译结果的意思已经不对了。为了找出是CNN的问题还是Beam搜索的问题,我们需要将输入x再次输入到CNN编解码网络中,从解码网络中找出y标签的句子的概率以及预测结果y'的句子的概率。这里可能有点难懂,我慢慢给大家解释一下。大家还记得解码网络中的每一个时间步都会输出词表中的每一个单词的概率吗?(如果不记得就复习一下前面几篇文章),那么从这些概率中就可以得到标签y的句子的概率,我们用p(y)来表示,同理,也会得到预测值y'的句子的概率,我们用p(y')来表示。

 

如果p(y)>p(y'),那么就是Beam搜索的问题,因为在CNN给出的概率中句子y的概率是更高的,但是Beam搜索却选择使用概率更低的句子y'作为最终结果,所以说问题出在Beam中。

 

如果p(y)<p(y'),那么问题出在CNN中,因为句子y是更加正确的翻译结果,但是在CNN网络给出的结果中句子y'的概率却更高,所以说CNN网络有问题。

 

当然,可能对于某些句子而言问题出在CNN中有,而对于某些其他句子问题却出在Beam搜索中。所以要在验证集中多找一些翻译失败的句子来进行分析。如果很多句子的问题都出在Beam搜索中,那么我们就要集中精力和时间来提升Beam搜索能力,比如可以加大超参数B的数值,让搜索方法可以统计更多的选项,这样就有助于选择出最佳的翻译,当然如果统计更多的选项,那么要求的计算力和存储空间又要更大。

评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符 “速评一下”
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页