量化與壓縮攻擊
專家3 分鐘閱讀更新於 2026-03-13
量化(GPTQ、AWQ、GGUF)如何影響模型安全、精度損失造成的安全退化、量化感知對抗範例,以及壓縮攻擊面。
量化在生產 LLM 部署中近乎普遍——它降低記憶體 2–8 倍,吞吐提升相應。然而量化對安全相關模型行為的削弱不成比例,形成一個影響每一個量化部署的系統性漏洞。
為什麼量化削弱安全
脆弱性假說
安全行為(拒答、內容過濾、倫理推理)於對齊訓練(RLHF、DPO、CAI)——模型開發的最終階段——學得。這些行為:
- 存於小量權重擾動 —— 對齊相對預訓練僅修改權重空間的極小比例
- 依賴精確激活門檻 —— 拒答決策通常位於激活值接近決策邊界處
- 跨多層分散 —— 安全非局部化,需跨層協同激活
量化對所有權重引入均勻雜訊。核心語言能力深埋且具冗餘,可耐受此雜訊。安全行為則晚近學得、脆弱、依門檻,因此無法耐受。
實證安全退化
| 量化層級 | 困惑度變化 | 一般基準下降 | 安全拒答率下降 |
|---|---|---|---|
| FP16(基線) | -- | -- | -- |
| INT8(8-bit) | +0.1–0.3 | -0.5–1% | -3–8% |
| INT4(4-bit GPTQ) | +0.3–0.8 | -1–3% | -10–25% |
| INT4(4-bit AWQ) | +0.2–0.5 | -0.5–2% | -8–20% |
| INT3(3-bit) | +1.0–3.0 | -5–15% | -30–60% |
量化方法與安全特性
GPTQ 以校準資料最小化量化誤差。安全性高度取決於校準集組成:
- 安全感知校準 —— 將安全相關提示納入校準集,可更好保留安全權重
- 偏誤校準 —— 只用一般文字校準,會讓安全權重被更激進地量化
- 攻擊向量 —— 掌控校準資料集的攻擊者可選擇性削弱安全
# GPTQ 校準影響哪些權重被保留
from auto_gptq import AutoGPTQForCausalLM
# 未察覺安全之校準(常見預設)
model = AutoGPTQForCausalLM.from_pretrained(model_path)
model.quantize(
calibration_data=general_text_samples, # 無安全提示
bits=4,
group_size=128,
)
# 安全權重可能保留不佳AWQ 保護產生大激活之權重。由於安全關鍵權重於拒答時常產生尖銳激活模式,AWQ 可略好地保留安全:
- 優點 —— 以激活感知選擇自然保護部分安全關鍵權重
- 侷限 —— 僅保護具大激活之權重;細微安全模式仍可能消失
- 整體 —— 於相同位寬下,安全保留較 GPTQ 好 15–30%
GGUF 支援混合精度量化,不同層可用不同位寬。這為「安全感知量化」提供機會:
- 層特定精度 —— 將安全關鍵層維持較高精度
- Q4_K_M、Q5_K_M —— 對注意力層使用較高精度的常見預設
- 攻擊向量 —— 自訂 GGUF 量化可選擇性降低安全關鍵層之精度
提供動態量化(NF4、FP4)並可選 double quantization。執行期量化使攻擊面不同:
- 無校準資料 —— 量化與資料無關,故校準投毒不適用
- 動態範圍 —— NF4 對常態分布權重最佳化,未必適合所有安全模式
- 與 QLoRA 互動 —— 搭 QLoRA 微調使用時,基礎模型的安全於量化精度下被凍結
量化感知對抗範例
對抗輸入可被專門打造以利用量化模型的精度邊界——於量化版本上成功、卻於全精度模型失敗。
精度邊界攻擊
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
def find_quantization_boundary_attack(
fp16_model, int4_model, tokenizer, base_prompt, num_candidates=1000
):
"""尋找於 INT4 成功但於 FP16 失敗的輸入。
這利用了依精度而異的決策邊界。"""
boundary_attacks = []
for _ in range(num_candidates):
# 產生候選對抗後綴
suffix = generate_random_suffix(tokenizer, length=20)
prompt = base_prompt + suffix
# 於兩個模型上測試
fp16_response = generate(fp16_model, tokenizer, prompt)
int4_response = generate(int4_model, tokenizer, prompt)
fp16_refused = is_refusal(fp16_response)
int4_refused = is_refusal(int4_response)
if fp16_refused and not int4_refused:
# 找到量化邊界利用
boundary_attacks.append({
"suffix": suffix,
"fp16_response": fp16_response,
"int4_response": int4_response,
})
return boundary_attacks對量化模型的梯度式最佳化
# 專門鎖定量化模型最佳化對抗後綴
# 使用 straight-through estimator 將梯度穿過量化
def quantization_aware_gcg(model_quantized, prompt, target, steps=500):
"""為量化模型調整的 GCG 攻擊,
使用 straight-through estimator 計算梯度。"""
suffix_ids = torch.randint(0, vocab_size, (suffix_len,))
for step in range(steps):
# 前向通過量化模型
with fake_quantize_enabled(model_quantized):
loss = compute_target_loss(model_quantized, prompt, suffix_ids, target)
# Straight-through estimator:梯度以 identity 方式
# 穿過量化
loss.backward()
# 標準 GCG 候選挑選
top_k_substitutions = get_top_k_from_gradients(suffix_ids.grad)
suffix_ids = select_best_candidate(top_k_substitutions)
return suffix_ids防禦性量化策略
| 策略 | 做法 | 開銷 |
|---|---|---|
| 安全感知校準 | 於 GPTQ/AWQ 校準集中納入安全提示 | 最小 |
| 混合精度安全層 | 將安全關鍵層維持 FP16,其餘量化 | 多佔 10–20% 記憶體 |
| 量化後安全測試 | 量化後對安全指標做基準,退化超門檻則拒絕 | 僅測試時間 |
| 量化感知對齊 | 於訓練期注入量化雜訊並進行 RLHF/DPO | 大幅訓練成本 |
| 集成驗證 | 對安全敏感查詢以 FP16 交叉比對量化輸出 | 對被標記查詢 2 倍算力 |
相關主題
Knowledge Check
為什麼量化對安全行為的削弱大於一般語言能力?