当我们与 ChatGPT、Claude 等大语言模型对话时,可能会注意到它们的回答既流畅又富有变化。这背后的关键机制就是采样策略。本文将深入浅出地介绍大模型如何生成文本,以及 Temperature、Top-p、Top-k 这三个关键参数如何影响输出结果。
大语言模型的文本生成是一个逐个 token 生成的过程(token 可以简单理解为词或字)。就像我们写作时一个字一个字地思考和书写,模型也是根据前面已经生成的内容,预测下一个最合适的 token。
这个过程可以概括为:
展开代码输入文本 → 模型编码 → 预测下一个token → 将新token加入输入 → 继续预测...
让我们具体看看模型内部是如何工作的。假设模型的词汇表有 50,000 个 token(实际中可能更多),生成每个 token 的过程如下:
Softmax 之前 - Logits(原始分数)
模型最后一层会输出一个长度为 50,000 的向量,每个位置对应词汇表中一个 token 的原始分数(logits)。这些分数没有经过归一化,可能是任意实数。
例如:
展开代码"苹果" → 8.2 "香蕉" → 3.1 "电脑" → 6.5 "的" → 7.8 "是" → 2.3 ... (共50,000个token)
这些原始分数反映了模型认为每个 token 作为下一个词的"合理程度",但它们还不是概率。
Softmax 之后 - 概率分布
Softmax 函数将这些原始分数转换为概率分布,使得:
公式为:
转换后:
展开代码"苹果" → 0.352 (35.2%) "香蕉" → 0.023 (2.3%) "电脑" → 0.078 (7.8%) "的" → 0.265 (26.5%) "是" → 0.011 (1.1%) ... (概率总和 = 1.0)
现在每个 token 都有了明确的被选中概率。但模型并不总是选择概率最高的那个,这就引出了我们的采样策略。
Temperature(温度)参数控制概率分布的"平滑程度",从而影响输出的随机性和创造性。
Temperature 在 Softmax 之前就开始发挥作用,它会对 logits 进行缩放:
其中 T 就是 temperature 参数。
让我们看看同一组 logits 在不同温度下的变化:
原始 logits:
展开代码"苹果": 8.2, "电脑": 6.5, "的": 7.8, "香蕉": 3.1
Temperature = 1.0(标准情况):
展开代码"苹果": 35.2% "的": 26.5% "电脑": 7.8% "香蕉": 2.3%
Temperature = 0.5(更保守):
展开代码"苹果": 58.7% ← 概率进一步集中 "的": 34.1% "电脑": 3.2% ← 小概率项被压制 "香蕉": 0.1%
Temperature = 2.0(更随机):
展开代码"苹果": 28.3% ← 概率更平均 "的": 22.1% "电脑": 12.8% ← 小概率项机会增加 "香蕉": 5.6%
Temperature → 0(接近贪婪):
展开代码"苹果": 99.9% ← 几乎确定选最高的 "的": 0.1% "电脑": 0.0% "香蕉": 0.0%
Top-p 采样(也称核采样)是一种更智能的筛选机制,它不是固定选择多少个候选,而是动态选择累计概率达到 p 的最小候选集。
假设经过 Temperature 调整后,我们得到以下概率分布(按概率降序排列):
展开代码"苹果": 35.2% "的": 26.5% "手机": 12.3% "电脑": 7.8% "很": 5.1% "好": 3.2% "香蕉": 2.3% ...其他数万个token
如果 Top-p = 0.9:
从概率最高的开始累加:
候选集包含:["苹果", "的", "手机", "电脑", "很", "好"]
将这些候选的概率重新归一化,然后从中随机采样
如果 Top-p = 0.6:
只会保留 ["苹果", "的", "手机"],候选范围更小,输出更保守。
如果 Top-p = 0.95:
可能包含十几个候选 token,输出更多样。
Top-p 的巧妙之处在于它是自适应的:
这比固定数量的 Top-k 更加灵活智能。
理解了 Top-p,Top-k 就非常简单了。
Top-k 就是只保留概率最高的 k 个候选,忽略其他所有选项。
如果 Top-k = 5:
展开代码保留: "苹果": 35.2% "的": 26.5% "手机": 12.3% "电脑": 7.8% "很": 5.1% 舍弃: "好": 3.2% "香蕉": 2.3% ...其他所有token
然后将这 5 个候选的概率重新归一化后采样。
Top-k 的问题是不够智能:
这就是为什么 Top-p 通常更受欢迎。
在实际应用中,这三个参数通常组合使用:
展开代码原始logits ↓ 应用 Temperature 调整 ↓ 通过 Softmax 得到概率分布 ↓ 应用 Top-p 或 Top-k 筛选候选集 ↓ 从候选集中采样一个 token
1. 精确任务(翻译、代码、数学)
2. 日常对话
3. 创意写作
让我们用一个例子直观感受这些参数的影响。
提示词: "今天天气真好,"
配置1: Temperature=0.1, Top-p=0.5 可能输出: "今天天气真好,适合出门散步。"(保守、常见)
配置2: Temperature=1.0, Top-p=0.9 可能输出: "今天天气真好,我们去公园野餐吧!"(自然、有变化)
配置3: Temperature=1.5, Top-p=0.95 可能输出: "今天天气真好,云朵像棉花糖一样飘在天空中。"(更有创意)
理解这些参数,你就能更好地调教大模型,让它在不同任务中发挥最佳表现。记住:没有绝对"最好"的参数设置,关键是根据具体任务和需求进行调整!


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!