“ 一个采样方法,口碑挺好的,各个加速框架也都在接入
https://github.com/ggerganov/llama.cpp/pull/3841
top p / top k
从下图可以看到top p 如果设置的比较大,那其实很多低概率的token会进候选池子,有概率被随机到。只要有一个token出问题,后面就有概率偏离原始的意思。top k指定前k个也是同理。
min p
Min P所做的事情很简单:设置了一个最低值,只有达到这个值的token才会被考虑。这个值会根据最高概率令牌的置信度而变化。
如果设为0.1,那意味着它只会允许概率至少是最大概率token的1/10。如果设置为0.05,则会允许至少是最大概率token的1/20的token
依旧是凑字数的小节
你可能会认为,“这样做不会限制创造力吗?因为这里设置了一个最小概率值,阻止了更加不确定的选择?” 实际上,它有助于以Top P通常无法实现的方式实现更多样化的选择。 假设指定top = 0.8,你的前两个token是: 1.81% 2.19%
Top P将完全忽略第二个token,尽管它相当合理。这会导致不必要的响应确定性更高。 这意味着在上下文中,Top P可能会考虑太多或太少的标记; Min P通过根据顶部选择的置信度设置最小值来强调平衡。 因此,在顶部标记为6%的情况下,Min P为0.1将仅考虑至少0.6%可能性的标记。但是,如果顶部标记为95%,则只会考虑至少9.5%可能性的标记。 0.05-0.1似乎是一个合理的范围进行调整,但您也可以更高,而不会过于确定性,并且不包括尾部“无意义”的概率。