前言
写这篇文章的主要目的是讲清楚语言模型生成句子的随机性从哪里来,它和1.解码策略有关,2.和初始种子有关。
解码策略
1. greedy search (贪婪搜索)
贪婪搜索的方法是对每一个时间点输出的概率分布,选择概率最大的token作为正确输出,拼接到上一句输入中形成一个新的输入,由于每次选择的是概率最大的token,因此在初始种子固定的情况下,每次生成的句子都是一样的
2. beam search (束搜索)
束搜索可以参考我之前写的Beam Search与Prefix Beam Search的理解与python实现,其产生是由于贪婪搜索产生的最优解仅符合每一个时间点是最优的,但是在整体时间段内可能是次优的,因此通过beam search对每一个时间点的n个最优解去搜索,最终找到n条在受限搜索空间内的最优解,由于beam search选择的是每一个时间点的n个最优解,因此其和贪婪搜索一样,也是生成的固定输出
3. Top-K搜索
Top-K搜索是在每一个时间点,对输出的logits选择K个概率最大的位置,采用multinomial对这K个概率采样1个点,采样的位置认为是正确输出,由于概率大的值采样的可能性越大,因此在一定程度上满足了正确性,同时保留了选择概率小的值的可能性,增加了随机性,因此Top-K搜索更加富有创造性,输出的语句是不固定的
4. Top-p搜索(nucleus sampling)
Top-p搜索是设定一个概率阈值,选择K个位置其概率累加小于设定阈值,例如输出的概率分布为(0.5, 0.15, 0.3, 0.05),设定阈值为0.9,则K=2,位置0和位置2的概率累加为0.8,概率其次大的值为0.15,累加上大于0.9不进行选择。因此Top-p是Top-K的一种变体,其通过设定阈值来选择K,因此Top-p更加的灵活,同样具有创造性