推論:取樣、Temperature 與生成
中級4 分鐘閱讀更新於 2026-03-13
LLM 如何在推論期生成文字——greedy decoding、top-k、top-p、temperature——以及這些參數如何影響攻擊成功率。
從 Logits 到文字
Transformer 處理完輸入序列後,最後一層會產生一個logits 向量——詞彙表中每個 token 各一個分數。解碼策略決定這些 logits 如何變成實際文字。
# 簡化的推論管線
logits = model(input_tokens) # 形狀:(vocab_size,)
probabilities = softmax(logits) # 轉為機率分布
next_token = sample(probabilities) # 在此套用解碼策略解碼策略的選擇會從根本改變模型的產出——因而改變哪些攻擊會成功。
解碼策略比較
Greedy 解碼
總是選擇機率最高的 token。確定性但常產生重複、低品質的文字。
def greedy_decode(logits):
return torch.argmax(logits, dim=-1)Temperature 縮放
於 softmax 前將 logits 除以一個 temperature 值,控制分布的「銳度」:
def temperature_scale(logits, temperature=1.0):
return softmax(logits / temperature)| Temperature | 分布樣貌 | 行為 |
|---|---|---|
| 0.0(greedy) | 機率全集中於最高 token | 確定性、重複 |
| 0.1–0.3 | 非常尖 | 保守、聚焦 |
| 0.7–0.9 | 中度分散 | 平衡創意 |
| 1.0 | 原始分布 | 完整模型隨機性 |
| 1.5–2.0 | 非常平 | 混亂、常不連貫 |
Top-k 取樣
將取樣限制於前 k 個機率最高的 token,其餘全部歸零:
def top_k_sample(logits, k=50):
top_k_values, top_k_indices = torch.topk(logits, k)
# 將前 k 以外全部歸零
filtered = torch.full_like(logits, float('-inf'))
filtered.scatter_(0, top_k_indices, top_k_values)
return softmax(filtered)Top-p(Nucleus)取樣
動態選取累積機率超過 p 的最小 token 集合:
def top_p_sample(logits, p=0.9):
sorted_logits, sorted_indices = torch.sort(logits, descending=True)
cumulative_probs = torch.cumsum(softmax(sorted_logits), dim=-1)
# 去除累積機率超過門檻的 token
remove_mask = cumulative_probs > p
remove_mask[1:] = remove_mask[:-1].clone() # 超過 p 的第一個 token 保留
remove_mask[0] = False
sorted_logits[remove_mask] = float('-inf')
return softmax(sorted_logits), sorted_indices解碼參數如何影響攻擊
這裡正是推論機制與紅隊直接相關之處:
| 參數設定 | 攻擊影響 |
|---|---|
| 低 temperature(0.0–0.3) | 攻擊必須精準;模型走最高機率路徑,通常就是「安全」回應 |
| 中 temperature(0.5–0.8) | 許多攻擊的甜蜜點;足夠隨機以探索不安全補全 |
| 高 temperature(>1.0) | 高變異;攻擊可能偶然成功,但輸出常不連貫 |
| 大 top-k(100+) | 輸出更多樣;提高取到非拒答 token 的機率 |
| 小 top-p(0.1–0.5) | 輸出保守;較難破解對齊 |
| 大 top-p(0.9–1.0) | 完整輸出多樣性;較易繞過對齊 |
機率性的攻擊成功
由於取樣具隨機性,攻擊成功通常以比率衡量:
def measure_attack_success_rate(
prompt: str,
model,
n_trials: int = 100,
temperature: float = 0.7,
) -> float:
"""量測對抗性提示繞過安全的頻率。"""
successes = 0
for _ in range(n_trials):
response = model.generate(
prompt,
temperature=temperature,
max_tokens=200,
)
if is_policy_violation(response):
successes += 1
return successes / n_trialsLogit 操弄攻擊
當攻擊者能取得模型 logits(白箱或灰箱情境),即可直接操弄輸出分布:
Logit Bias
許多 API 暴露 logit_bias 參數,在取樣前將固定值加到特定 token 的 logit:
# OpenAI API logit_bias 範例
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "Is this safe?"}],
logit_bias={
# 拉高「unsafe」token 並壓低「safe」
15513: 5, # 拉高特定 token
20147: -100, # 等同禁止該 token
}
)Logit Lens 與探測
在白箱情境下,「logit lens」技術會將模型最後的反嵌入層套用於中間層表示,揭露模型在每一層「在想什麼」:
# Logit lens:偷看中間層的預測
for layer_idx in range(model.config.num_hidden_layers):
hidden = get_hidden_state(model, input_tokens, layer_idx)
intermediate_logits = model.lm_head(hidden)
top_token = tokenizer.decode(intermediate_logits.argmax(-1)[-1])
print(f"Layer {layer_idx}: predicting '{top_token}'")這可揭露模型在何時「決定」拒答或遵從,有助攻擊者找出該以激活操弄鎖定的層級。
輸出分布攻擊
除了操弄單一參數,攻擊者亦可利用輸出分布本身的特性:
| 攻擊 | 描述 | 所需存取 |
|---|---|---|
| 機率探測 | 查詢模型以判斷被拒答的輸出是否具高機率 | 可取得 logprobs 的 API |
| 受限解碼 | 強迫模型於排除拒答模式的特定語法內生成 | 具 logit_bias 或自訂解碼的 API |
| Best-of-N 取樣 | 生成 N 個回應,挑選繞過安全的那個 | 標準 API 存取 |
| 逐 token 擷取 | 以 logprob 端點逐 token 取出,繞過回應層過濾 | 可取得 logprobs 的 API |
Best-of-N 越獄
最簡單的推論期攻擊之一:生成多個回應,再過濾出違反政策者。
def best_of_n_attack(prompt, model, n=20, temperature=1.0):
"""生成 N 個回應,回傳所有違反政策者。"""
violations = []
for _ in range(n):
response = model.generate(prompt, temperature=temperature)
if is_policy_violation(response):
violations.append(response)
return violations在 temperature 1.0 下,即便對齊良好的模型也可能以 1–5% 機率產生違反政策的回應。若 N=100,至少找到一次違反的機率幾乎等於 1。
相關主題
- LLM 運作原理:紅隊指南 — 更廣泛的 LLM 脈絡
- 從攻擊者角度看 Transformer 架構 — 產生 logits 的那一層
- 梯度式攻擊解析 — 以梯度存取最佳化輸入
- LLM API 呼叫解剖 — 這些參數如何透過 API 暴露
參考資料
- "The Curious Case of Neural Text Degeneration" - Holtzman et al.(2020)- 引入 nucleus(top-p)取樣的論文,論證為何 greedy 與純取樣會產生差劣文字
- "On the Dangers of Stochastic Parrots" - Bender et al.(2021)- 影響力深遠的作品,討論大型語言模型風險,含生成與取樣層面
- "Jailbroken: How Does LLM Safety Training Fail?" - Wei et al.(2023)- 分析解碼參數與取樣策略如何影響越獄成功率
- "Scalable Extraction of Training Data from (Production) Language Models" - Nasr et al., Google DeepMind(2023)- 透過針對性生成策略擷取記憶訓練資料的研究
Knowledge Check
為什麼「best-of-N」攻擊會隨 N 增大而愈發有效?