Appearance
大模型在生成每一个 Token 的时候,都不是"直接写"出来的,而是通过一个"概率轮盘"来决定下一个 Token 是什么。
注:在本文中,我们使用"Token"而不是"词"来指代模型处理的最小单位。一个Token可能是一个完整的词,也可能是一个词的一部分,甚至是一个标点符号。例如,"不错"这个词可能被切分为两个Token:"不"和"错"。
想象一下,在生成"今天天气真"之后,模型内部会计算一个列表,列出所有可能的下一个Token以及它们的概率:
- "好":85%
- "不错":10%
- "棒":3%
- "糟":0.5%
- "热":0.4%
- ...
- "龙":0.00001%
模型的任务就是从这个概率轮盘上,选出一个Token作为下一步的输出。我们接下来要讲的这4个参数,就是用来调校和控制这个概率轮盘以及选择方式的工具。
1. temperature
- 一句话概括: 控制模型输出的"随机性"和"创造性"的阀门。
- 作用机制:
- 这个参数直接作用于上面提到的那个概率列表。它通过一个叫做 Softmax 的数学公式来调整概率分布。
temperature
较低 (比如 0.1, 0.2): 它会"锐化"概率分布。高概率的Token(如"好")会变得更高,低概率的Token会趋近于0。这使得模型几乎总是选择最常见、最符合逻辑的那个Token。轮盘上的"好"那一格会变得巨大,其他格变得微不足道。temperature
较高 (比如 0.8, 1.0, 1.5): 它会"平滑"概率分布。高概率和低概率Token之间的差距会变小,给了那些不那么常见、但也有可能性的Token(如"棒"、"热")更多的机会被选中。这增加了输出的随机性、多样性和创造性。轮盘上各个格的大小差距会缩小。
- 直白的比喻:
temperature
就像一个创意兴奋剂的剂量。- 低剂量 (低 temperature): 大脑非常冷静、理性,只会说最稳妥、最合乎逻辑的话。
- 高剂量 (高 temperature): 大脑变得兴奋、天马行空,可能会说出一些出人意料、富有创意甚至有点奇怪的话。
- 效果与应用场景:
- 调低: 适用于需要精确、事实性的回答,如:客服问答、代码生成、数学计算、文章摘要。
- 调高: 适用于需要创造力、多样性的场景,如:写诗、写故事、市场营销文案、头脑风暴。
2. top_k
- 一句话概括: 限制模型在选择下一个Token时,只从概率最高的
k
个Token中进行选择。 - 作用机制:
- 这是一个简单粗暴的截断方法。在模型计算出所有候选Token的概率后,
top_k
会先对它们进行排序,然后只保留排名前k
的Token,形成一个"候选Token池"。最后,模型再从这个小得多的池子里根据它们的相对概率进行抽样(这个抽样过程依然受temperature
影响)。 - 例如,如果
k=3
,模型在"今天天气真"之后,只会考虑"好"、"不"+"错"、"棒"这3个Token,其他所有Token的概率直接被视为0(哪怕是"糟"),绝无可能被选中。
- 这是一个简单粗暴的截断方法。在模型计算出所有候选Token的概率后,
- 直白的比喻:
top_k
就像一个考前划重点的老师。- 老师说:"这次考试只考前
k
个重点知识。" 于是你只复习这k
个重点,其他的看都不看。k
越小,重点范围越窄,考试(输出)结果越容易预测。
- 老师说:"这次考试只考前
- 效果与应用场景:
- 调低 (如 k=5, 10): 可以有效排除那些非常不合逻辑、奇怪的Token,让输出更安全、更可控。
- 调高 (如 k=50): 允许更多可能性,但如果
temperature
也很高,可能会引入一些不相关的Token。通常不建议设置得过高。 - 缺点:
k
是固定的,不够智能。有时最合理的Token只有一个(比如1+1=
后面只能是2
),有时合理的Token有很多(比如写诗),top_k
无法动态适应。
3. top_p
(也叫 Nucleus Sampling)
- 一句话概括: 动态地选择一个核心候选Token池,池中Token的概率总和不低于
p
。 - 作用机制:
- 这是一种比
top_k
更智能的截断方法。它也是先将所有Token按概率排序,然后从高到低逐个累加它们的概率,直到总和刚刚超过p
这个阈值。所有被累加进来的Token构成了"候选Token池"。 - 例如,
p=0.9
。模型会选择:- "好"(85%) -> 当前总和 0.85
- "不"+"错"(10%) -> 累加后总和 0.95,已经超过了0.9。
- 于是,候选Token池就是 {"好", "不"+"错"}。模型将从这两个Token中选择一个。
- 关键点: 候选Token池的大小是动态变化的。如果某个上下文下,一个Token的概率极高(如"伊丽莎白二世是英国女" -> "王"的概率可能是99.9%),那么候选池可能就只有1个Token。如果上下文很开放,候选池可能会包含很多Token。
- 这是一种比
- 直白的比喻:
top_p
就像一个购物预算。- 你有
p
(比如95%)的预算,用来"购买"最有可能的Token。你从最贵的(概率最高)开始买,一个一个放进购物车,直到花掉95%的预算为止。购物车里的东西就是你的候选Token。
- 你有
- 效果与应用场景:
- 它在 保留多样性(防止错过好Token)和抑制胡言乱语(排除垃圾Token) 之间取得了绝佳的平衡。
- 在大多数场景下,
top_p
是比top_k
更受推荐的选择。通常设置在0.85
到0.95
之间效果很好。 - 注意: 通常我们只在
top_k
和top_p
中选择一个使用,不要同时设置。
4. frequency_penalty
(频率惩罚)
- 一句话概括: 降低那些在已生成文本中重复出现的Token的被选中概率。
- 作用机制:
- 它直接修改模型计算出的原始概率(在应用
temperature
之前)。模型会检查到目前为止已经生成了哪些Token以及它们出现的次数。 - 对于每个已经在前面出现过的Token,模型会根据其出现频率,对其下一次被选中的概率进行"罚款"(降低其概率值)。一个Token出现的次数越多,罚款越重。
- 惩罚值为正数(如 0.1 到 1.0)时生效。值越大,惩罚力度越强。
- 它直接修改模型计算出的原始概率(在应用
- 直白的比喻:
frequency_penalty
就像一个重复发言税。- 你在会议上每重复说一次同一个Token,就要交一次税。重复的次数越多,税率越高,导致你下次再说这个Token的"成本"就越高,你就会倾向于换个Token说。
- 效果与应用场景:
- 主要目的: 减少无意义的重复,提升文本的可读性和信息量。当你发现模型总是在说车轱辘话时(例如,"这是一个很好的例子,这个例子非常好,这个例子..."),就可以调高这个参数。
- 调高: 强力避免重复,鼓励模型使用新Token,让文本更多样化。
- 调低 (或为0): 对重复不作惩罚,模型可能会更频繁地重复一些高频核心Token。
总结与协同工作
这四个参数协同工作,共同塑造了模型的最终输出:
第一步:原始计算
模型根据上下文,计算出所有候选Token的原始概率分数(Logits)。
第二步:施加惩罚
frequency_penalty
登场,检查已生成内容,对重复Token的原始分数进行"罚款"。第三步:温度调控
temperature
对被罚款后的分数进行加工,形成最终的、或尖锐或平滑的概率分布。第四步:筛选候选池
top_k
或top_p
登场,从这个最终的概率分布中划定一个候选范围。第五步:最终抽样
模型从这个小小的、精心筛选过的候选池里,随机选择一个Token作为输出。
通用建议:
- 优先调整
temperature
和top_p
。 这是最核心的两个参数。通常将top_p
固定在 0.9 左右,然后微调temperature
来寻找创造性和准确性之间的平衡点。 - 当发现有明显重复时,再引入
frequency_penalty
。 top_k
可以在特定、需要强力控制输出范围的场景下替代top_p
使用。