试了试,确实差点意思。我们从技术的角度看看,为啥会变成这样。
众所周知,现如今的 LLM 绝大多数都是基于 Transformer 架构的。
工作流程
我们先来粗略了解一下它的工作流程。 大约就是每次生成从候选词列表中选择一个 token 作为输出,这个这次输出作为下次输入。关键点在于采样输出是怎么选择的。
早期的 llm 通过 Top-k 加温度作为采样策略,后来引入了 Top-p 等其他负责的控制策略。
Top-k 采样
Top-k 比较简单,就是把候选词按照概率从高到低排,取前 k 个。
温度
假设只有 Top-k 采样,会发生什么?会变成每次都从 k 个元素中选择,而 top1 会被更高概率选择,导致输出重复度比较高。
为了让输出更加丰富,不这么单调,需要引入新的采样策略,让低概率的词也可能被选择到。
假设有一个参数,
值小的时候稳重一些,选择概率高的,应对一些严谨性高的场景(如编程)
值大的时候多样一些,选择概率低的,应对一些丰富性高的场景(如写作)
为了方便描述,我们姑且先称这个参数为 T。
也就是说
T 小的时候,我们需要让低概率词的被选择的机会变小,也就是放大低概率词和高概率词的差距,一枝独秀。
T 大的时候,我们需要让低概率词的被选择的机会变大,也就是缩小低概率词和高概率词的差距,众生平等。
除法
什么运算可以实现这种缩放效果呢?最朴素的,就是除法。我们用 $x_i$ 表示词汇表中第 i 个词的概率(术语叫 logits), $y_i$ 表示第 i 个词温度调节后的概率,有下面这样的公式。
yi=xiT��=���
指数函数
我们知道,概率之和应该为 1。为了让概率之和变为 1,我们需要用 当前概率 除以所有概率的和得到新的概率(归一化)。
聪明的你可能已经想到了,等比例缩放一旦归一化,我们所有缩放都没有意义了。比如:[5,3,2] 无论我们怎么使用除法,归一化都会变成 [0.5,0.3,0.2]。
显然,我们需要再引入一个非线性变化,让我们缩放不失效,我们选择使用指数函数。
zi=eyi��=���
举例说明一下 我们的缩放不再被归一化抵消,平均概率差距也被拉大了。