Beam Search 优化

在说集束搜索的优化之前,先说说贪心搜索和集束搜索的区别吧。

集束搜索和贪心搜索比较

简单的来说,贪心算法是先挑出一个最可能的词,在此基础上再挑出第二个最有可能的词,以此类推,使每个词的概率最大化。而集束搜索是站在整个词序列整体的角度上使其概率最大化。典型的结果是,通过贪心搜索得到的翻译结果可能会包含一些日常使用中词频较高的词。贪心搜索最为简单,直接选择每个输出的最大概率,直到出现终结符或最大句子长度。
集束搜索可以认为是维特比算法的一个特例,在维特比算法中由于利用动态规划导致当字典较大时效率低,而集束搜索使用beam size参数来限制在每一步保留下来的可能性词的数量。集束搜索是在测试阶段为了获得更好准确性而采取的一种策略,在训练阶段无需使用。
假设字典为[a,b,c],beam size选择2,则如下图有:
在这里插入图片描述

1:在生成第1个词的时候,选择概率最大的2个词,那么当前序列就是a或b;
2:生成第2个词的时候,我们将当前序列a或b,分别与字典中的所有词进行组合,得到新的6个序列aa ab ac ba bb bc,然后从其中选择2个概率最高的,作为当前序列,即ab或bb;
3:不断重复这个过程,直到遇到结束符为止。最终输出2个概率最高的序列。
显然集束搜索属于贪心算法,不能保证一定能够找到全局最优解,因为考虑到搜索空间太大,而采用一个相对的较优解。而维特比算法在字典大小较小时能够快速找到全局最优解,贪心搜索可以认为beam size为1时的集束搜索特例。

Beam Search 优化

主要涉及两个方面的优化:

  • length normalization和coverage normalization
  • EOS token normalization
    下面分别介绍
length normalization 和 coverage penalty

这个方法是论文《Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation》中提出的。包含两个部分 length normalization 和 coverage penalty。

在采用对数似然作为得分函数时,Beam Search 通常会倾向于更短的序列。因为对数似然是负数,越长的序列在计算 score 时得分越低 (加的负数越多)。在得分函数中引入 length normalization 对长度进行归一化可以解决这一问题。

coverage penalty 主要用于使用 Attention 的场合,通过 coverage penalty 可以让 Decoder 均匀地关注于输入序列 x 的每一个 token,防止一些 token 获得过多的 Attention。

把对数似然、length normalization 和 coverage penalty 结合在一起,可以得到新的得分函数,如下面的公式所示,其中 lp 是 length normalization,cp 是 coverage penalty:
在这里插入图片描述

EOS(End of sentence) token normalization

有时Decoder生成序列很难停止,此时需要对最大生成长度进行控制,可以采用下面的公式进行约束: e p ( X , Y ) = γ ∣ X ∣ ∣ X ∣ ep(X,Y)=\gamma\frac{|X|}{|X|} ep(X,Y)=γXX其中 ∣ X ∣ |X| X是source的长度, ∣ Y ∣ |Y| Y是当前target的长度, γ \gamma γ是End of sentence normalization的系数。那么由上式可知,target长度越长的话,上述得分越低,这样就会防止出现生成序列不停止的情况。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值