深入理解大语言模型中的超参数:Temperature、Top-p 与更多

发布于:2025-07-05 ⋅ 阅读:(17) ⋅ 点赞:(0)

随着大语言模型(LLM)如 GPT、Claude、Gemini 的广泛应用,调优生成文本的质量与风格成为开发者和研究人员的重要课题。其中,超参数(Hyperparameters)如 temperaturetop_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 等可以进一步提升生成质量。


网站公告

今日签到

点亮在社区的每一天
去签到