生成模型的常用解码策略 | greedy search & beam search & sample-topk & sample-topp

1、greedy search(贪婪搜索)

对于每一步直接取概率最大的。容易陷入局部最优。

2、beam search(束搜索)

每一步只取概率最高的beam size个(beam size=1,其实就是贪婪搜索了)。这样能让生成时有更多探索空间,更不易陷入局部最优。

具体做法:

  • 选取当前分数最大的 beam size 个候选放入 beam
  • 然后开始看每个候选下一步预测,从所有预测中取总分最大 beam size 个候选放入 beam
  • 当候选中有生成结束符,将候选拿出,beam size 减 1
  • 继续下一步预测 … 直到 beam size 为 0,结束搜索,取分最高为结果。
    注:因为路径的概率 = 所有步的log(prob)求和,log(prob)是负的,所以会使得模型倾向于生成短句,于是针对束搜索生成较长句就有好几种策略,如对长度惩罚

缺点:因为束搜索也是取最大概率的方式来生成对话时,相比起人的对话,就会出现生成对话太普通了,没有多样性。例如束搜索的生成式对话系统总会说,“我也是”,“好的”这样没营养的话。

3、sample(采样)

为增加生成随机性和多样性,那可通过采样的方式生成答案,以解决束搜索的问题。

  • 但可能会出现语法错误。可通过强化顶部词的概率来缓解,然后只对最有可能的一些词进行采样,这样就能够在增加随机性的同时,又保证不出现一般性的错误。

  • 强化顶部词概率,可以通过对模型输出的 logits 除以一个小于 1 的温度(Temperature,T),再通过softmax,这样就能在过 softmax 后使得分布更加尖锐,大概率的词概率更大。

  • 根据获得概率对顶部词先进行挑选,然后再采样,这样直接杜绝了低概率词出现的可能性。

采样主流有topk和topp采样。

3.1、topk

  • 挑选概率最高 k 个 token,然后重新过 softmax 算概率,之后根据获得概率进行采样,接着进行下一步生成,不断重复。
  • topk 有可能会出现一个问题,那便是,假如说遇上一种情况,模型对当前生成非常肯定,比如说概率最高的 token 的概率就有 0.9,而剩下的 token 概率都很低了。而如果这个时候,还单纯的用 topk 采样的话,就会导致之前想避免的采样到低概率情况仍然发生。

3.2、topp

  • 针对topk的缺点做改进。topp 是先设置一个概率界限,比如说 p=0.9,然后从最大概率的 token 往下开始取,同时将概率累加起来,当取到大于等于 p 也就是 0.9 时停止。
  • 例如如果最大 token 概率就已经有 0.9 了,那么就只取最大的一个 token。

4、总结

一般来说,在对话系统中,采样效果好一些。一般设置参数为 temperature 设 0.9,topk 和 topp 一起使用,k 取 40,p 取 0.9。

猜你喜欢

转载自blog.csdn.net/weixin_43646592/article/details/131796247