随着大语言模型(LLM)如 GPT、Claude、Gemini 的广泛应用,调优生成文本的质量与风格成为开发者和研究人员的重要课题。其中,超参数(Hyperparameters)如 temperature
和 top_p
扮演了核心角色,影响着生成文本的创造性、确定性与一致性。
1. Temperature — 随机性的调控器
temperature
是控制模型输出概率分布的温度系数,直接作用于 softmax 函数的 logits:
低 temperature(如 0.2) → 分布更尖锐,模型更"自信",更倾向选择最高概率的词,生成更确定、重复性强的文本。
高 temperature(如 1.2) → 分布更平坦,模型更"犹豫",更愿意尝试低概率词,生成更发散、多样性更强的内容。
例子:不同 temperature 下模型行为对比
假设模型在某位置预测三个词的原始 logits:
logits = [2.0, 1.0, 0.5] # 对应词:"the", "a", "cat"
我们分别用不同 temperature 调整这些 logits:
import numpy as np
def softmax(x):
e_x = np.exp(x - np.max(x))
return e_x / e_x.sum()
def apply_temperature(logits, temperature):
adjusted = np.array(logits) / temperature
return softmax(adjusted)
print("T=0.5", apply_temperature(logits, 0.5))
print("T=1.0", apply_temperature(logits, 1.0))
print("T=2.0", apply_temperature(logits, 2.0))
输出结果:
T=0.5 [0.82, 0.15, 0.03]
T=1.0 [0.59, 0.32, 0.09]
T=2.0 [0.44, 0.33, 0.23]
温度越低,最大概率的词越可能被选中;温度越高,其他词被选中的机会增大。
2. Top-p (Nucleus Sampling) — 概率质量控制器
top_p
又称 nucleus sampling,它不是看词的个数,而是选择累计概率大于等于 p
的最小集合,再从中随机采样。与 top_k
(固定保留前 k 个词)相比,top_p
更动态、更智能。
示例说明:
假设 softmax 后的词概率排序如下:
Token | Prob |
---|---|
the | 0.40 |
a | 0.25 |
dog | 0.15 |
cat | 0.10 |
fish | 0.05 |
moon | 0.03 |
blue | 0.02 |
若 top_p = 0.9
,模型会选择:["the", "a", "dog", "cat"]
,因为它们的累计概率已達到 0.9。
随后,模型将在这 4 个词中,按照归一化后的概率随机采样。
3. 其它重要超参数
参数名 | 功能 |
---|---|
top_k |
保留前 k 个概率最高的词 |
max_tokens |
控制输出最大 token 数量 |
repetition_penalty |
惩罚重复出现的词,避免机械重复 |
presence_penalty |
惩罚已经出现过的词,促进新意 |
frequency_penalty |
基于词频惩罚高频词,鼓励用词丰富 |
stop |
指定停止生成的标记 |
实战建议:如何调参?
创造性写作:
temperature=0.9
,top_p=0.95
或更高,鼓励模型发散
摘要 / 回答问题:
temperature=0.3-0.7
,top_p=0.8
,结果更确定
代码生成:
temperature=0.1-0.3
, 关闭 top_p 或设低值,避免胡言乱语
可视化采样过程(可选代码)
你可以运行如下代码来观察不同 temperature 下的采样频率:
import matplotlib.pyplot as plt
import seaborn as sns
def sample_with_temperature(logits, temperature, num_samples=1000):
probs = softmax(np.array(logits) / temperature)
samples = np.random.choice(["the", "a", "cat"], size=num_samples, p=probs)
return {word: (samples == word).sum() for word in set(samples)}
for T in [0.5, 1.0, 2.0]:
counts = sample_with_temperature([2.0, 1.0, 0.5], T)
sns.barplot(x=list(counts.keys()), y=list(counts.values()))
plt.title(f"Temperature = {T}")
plt.show()
总结
大语言模型中的采样超参数为我们提供了调控输出风格的强大杠杆。
temperature
控制整体的“随机性”与分布形状;top_p
控制输出候选词的“概率覆盖范围”;合理使用其他参数如
repetition_penalty
,stop
,max_tokens
等可以进一步提升生成质量。