隨著大語言模型(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 npdef 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) / temperaturereturn 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 snsdef 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
等可以進一步提升生成質量。