Paddle现有代码中BeamSearch中的一些细节/智慧
Created by: lcy-seso
今天和之前合作的同学讨论一个问题:如何通过策略在不修改代码情况下,非常简单地便可以控制生成长度。
第一次清晰地意识到 Paddle 目前BeamSearch代码实现的两个细节有着一定的好处(我之前从来没有特别地意识到这种好处),所以简单记录一下这两个细节,供参考。
这些细节在程序层面都只是简单的if else
判断,但在过去我做过诸多和beam search相关的任务中,对实际的生成质量都有着非常有效的改善,前人的经验和智慧供参考,经验也是可以被code~
BeamSearch 会遇到的一个难题:
- beam size 越大,越容易搜索到<e>,短序列的 logProb 更高
- 通过 logProb 对生成结果排序,选择 top 1,对长度有 bias
paddle beam search 的2个细节:beam search 会产生多于 beam size 个结果
在beamSearch 的过程中,一旦生成出终止符<e>,会得到一个完整的路径,否则是一个partial path
-
删除短路径
- 在beam search没有结束之前,当前一轮的展开可能会由于搜索到 <e>,生成出若干个完整的路径
- 这时候,还会维护至多 beam_size * beam_size 个 partial paths
- 取 partial paths 的 log probabilty 的最小值记作: $p1$ (最差的路径)
- 如果一条完整路径的 log prob 比 $p1$ 小,这条完整的路径,不会保留,会删被掉
-
直到再也无法生成更好的结果,才终止 beam seach
- 没有超过配置里面设置的 max 迭代次数时,已经得到了 beam size 个最终路径,beam search 仍然不会结束
- 始终维护一个所有完整路径 log prob 的最小值,记作 :min_prob 。
- 每一轮展开,只要有完整路径生成都会走上面第1条的逻辑,接下来:
- 取 partial paths 的 logProb 的最大值,记作 max_prob 。
- 满足:min_prob (已经生成的完整路径中的最差路径) >= max_prob(未生成完的partial paths 中的最好路径) 时,才结束beam search
上面2点逻辑上的作用是这样:
-
关于1:
- 如果已经生产了一个完整的路径,但如果这个路径,比还没有彻底生成完的 partial path 还差,这个生成结果被删掉
- 实际上,这些可能更好的、没有彻底生成完的路径,经过后续更多步的迭代,最终生成的完整路径会更长,更长路径的logProb 很可能会比之前删掉的那条完整路径还低(路径更差)
- 但是,如果不进行(1)会由于生成短路径,提前结束beam search。
-
关于2点:
- 在所有完整路径里面的最差的路径,比还没有完全生成的路径里面最好的结果,还要好,才结束beam search
- 这时候,再也不会生成出更好的完整路径了