API 型模型萃取
深入探討透過系統化 API 查詢、主動學習策略、logprob 利用、軟標籤蒸餾,以及規避查詢異常偵測系統來萃取專有模型能力。
API 型模型萃取
API 型萃取是最容易取得、也最常見的模型盜竊向量。攻擊者只需標準 API 憑證,卻能以執行良好的活動,以原始訓練成本的極小比例複製 85-95% 保真度的特定任務能力。本頁涵蓋完整方法論:從設計高效查詢策略、訓練代理模型,到在過程中規避偵測。
查詢策略設計
萃取品質取決於「查什麼」而非「查多少」。天真的隨機取樣會把預算浪費在輸入空間中資訊量低的區域。有效的查詢策略以階段化方式組織。
第一階段:廣覆蓋種子
初始查詢集在目標模型的能力表面建立基準覆蓋。種子查詢來源包含:
| 來源 | 優點 | 缺點 |
|---|---|---|
| 公開基準資料集 | 已知多樣性、標準化 | 模型可能已用於訓練 |
| 合成生成(LLM 撰寫) | 便宜、可擴展、可控 | 可能漏掉真實分布尾端 |
| 領域特定語料 | 符合目標部署領域 | 需要領域知識 |
| 網路爬取的使用者提示詞 | 分布貼近真實 | 雜訊多、可能需過濾 |
| 對抗範本擴展 | 涵蓋決策邊界 | 對典型行為覆蓋低 |
第二階段:針對性探測
完成第 0 輪訓練後,分析代理模型的誤差分布。代理模型與目標快取回應差異最大的區域,代表進一步查詢將帶來最高邊際保真度提升的地方。
# Identify high-error regions for targeted follow-up
def select_targeted_queries(surrogate, target_cache, candidates, top_k=1000):
errors = []
for prompt, target_response in target_cache.items():
surrogate_output = surrogate.generate(prompt, max_tokens=len(target_response))
divergence = compute_token_divergence(surrogate_output, target_response)
errors.append((prompt, divergence))
errors.sort(key=lambda x: x[1], reverse=True)
# Generate variants of high-error prompts
return expand_prompt_variants(errors[:top_k], candidates)第三階段:決策邊界精煉
最後階段聚焦於 決策邊界——模型行為發生轉變的輸入點。沿語意軸進行二元搜尋可高效映射這些邊界。
萃取中的主動學習
主動學習把代理模型本身當成挑選下一批查詢的甲骨文。核心洞察是:代理模型最不確定的查詢,恰是能產生最大訓練訊號的查詢。
產生候選池
產生較每輪預算多 3-5 倍的候選查詢。使用範本擴展、改寫,以及在既有高價值查詢之間的內插。
以代理不確定性為候選評分
將每個候選送入代理模型並計算輸出熵。對生成式模型,使用短生成視窗(32-64 符元)的每符元平均熵。
依不確定性選 top-k,並以多樣性過濾
依熵排序,但套用多樣性過濾(例如嵌入空間分群)以避免因同一原因不確定的冗餘查詢。
查詢目標 API
送出所選批次。收集完整回應,包括(若可取得)logprob、top-k 符元替代項,以及任何後設資料(finish reason、符元數)。
訓練並迭代
在新資料上微調代理模型,然後回到第 1 步。在留存驗證集上追蹤保真度以判斷收斂。
# Active learning query selection with MMR diversity
def select_queries_mmr(candidates, surrogate, budget, lambda_div=0.3):
entropies = [surrogate.compute_output_entropy(c) for c in candidates]
embeddings = surrogate.encode(candidates)
selected = []
remaining = list(range(len(candidates)))
for _ in range(budget):
scores = []
for idx in remaining:
relevance = entropies[idx]
if selected:
max_sim = max(cosine_sim(embeddings[idx], embeddings[s]) for s in selected)
else:
max_sim = 0
score = (1 - lambda_div) * relevance - lambda_div * max_sim
scores.append((idx, score))
best = max(scores, key=lambda x: x[1])[0]
selected.append(best)
remaining.remove(best)
return [candidates[i] for i in selected]Logprob 利用技術
當目標 API 暴露符元層級對數機率時,萃取效率會大幅提升。每個回應攜帶的是對詞彙表的機率分布而非單一符元,每次查詢提供數量級更多的資訊。
完整分布還原
多數 API 暴露 top-k logprob(通常 k=5 到 k=20)。雖為完整詞彙分布的子集,它仍捕捉了主宰 KL 散度損失的高機率質量。
直接把 top-k logprob 當稀疏教師目標。將所有其他詞彙位置置零並重新正規化。當 k >= 10 時簡單有效。
def sparse_distillation_loss(student_logits, teacher_top_k, temperature=2.0):
student_log_probs = log_softmax(student_logits / temperature, dim=-1)
# Build sparse teacher distribution from top-k
teacher_dist = torch.zeros_like(student_log_probs)
for idx, logprob in teacher_top_k:
teacher_dist[idx] = exp(logprob)
teacher_dist = teacher_dist / teacher_dist.sum() # renormalize
mask = teacher_dist > 0
loss = -(teacher_dist[mask] * student_log_probs[mask]).sum()
return loss * (temperature ** 2)透過對觀測到的 top-k 機率擬合參數化模型、並利用機率總和為 1 的已知約束,重建完整分布。剩餘機率質量以學生自身分布作為先驗分配給非 top-k 符元,並以殘差質量加權。
def reconstruct_teacher_dist(teacher_top_k, student_logits, vocab_size):
full_dist = torch.zeros(vocab_size)
top_k_mass = 0
for idx, logprob in teacher_top_k:
prob = exp(logprob)
full_dist[idx] = prob
top_k_mass += prob
# Distribute residual mass using student prior
residual = 1.0 - top_k_mass
student_probs = softmax(student_logits, dim=-1)
for idx, logprob in teacher_top_k:
student_probs[idx] = 0
student_probs = student_probs / student_probs.sum()
full_dist += residual * student_probs
return full_distLogprob 探測以推論架構
除了蒸餾,logprob 也能揭露目標模型的結構性屬性。跨符元位置的熵剖面揭露注意力模式,詞彙分布形狀則顯示模型家族。
預算最佳的萃取
真實萃取活動受限:API 預算、速率限制、時間窗口、被偵測風險。預算最佳萃取追求每美元保真度最大化。
成本模型
總萃取成本結合 API 費用、代理模型訓練算力與運營成本:
Total Cost = (N_queries * avg_tokens * price_per_token)
+ (N_rounds * surrogate_training_cost)
+ (infrastructure + personnel time)
最佳化策略
| 策略 | 保真度影響 | 成本降幅 |
|---|---|---|
| 主動學習查詢選擇 | 同預算下 +15-25% 保真度 | 所需查詢減少 3-10 倍 |
| Logprob 利用 | 同預算下 +20-30% 保真度 | 所需查詢減少 3-10 倍 |
| 漸進式學生擴張 | 損失極小 | 訓練算力省 40-60% |
| 提示詞壓縮 | 損失極小 | 符元成本省 20-40% |
| 離峰查詢 | 無 | 降低速率限制爭用 |
規避查詢異常偵測
生產 API 日益部署異常偵測以辨識萃取活動。理解這些系統對攻擊者(規避)與防禦者(調校)都至關重要。
常見偵測訊號
異常偵測器監控能區分萃取與合法使用的樣式:
- 查詢多樣性:萃取查詢所覆蓋的輸入空間遠大於典型使用者會話
- 時間規律性:自動化萃取產生不自然的規律查詢時間
- 會話連貫性:合法使用者維持主題連貫性;萃取查詢則在不相關主題間跳躍
- 回應使用方式:萃取活動收集但很少以對話方式與回應互動
- 量體特徵:萃取產生持續的高量查詢模式
規避技術
模仿合法使用模式,引入由真實使用者行為模型抽取的變動查詢間隔。在異常閾值較鬆的高流量期爆發查詢。將相關查詢歸類成似真的對話,以維持會話層級連貫。
將萃取查詢包裹於對話脈絡,使其貌似合法使用。在查詢前加上似真的系統提示詞,並維持多輪結構。在萃取查詢之間穿插符合典型使用者樣式的良性填充查詢。
將萃取分散於多個 API 金鑰、IP 位址與時區。每把金鑰量量遠低於量體閾值。協調查詢分配,讓每把金鑰覆蓋輸入空間不同區域,最後於伺服器端合併訓練資料。
在主動學習萃取迴圈中,為何以代理不確定性挑選查詢時,多樣性過濾很重要?
相關主題
- 模型萃取與智慧財產竊盜 —— 涵蓋完整萃取威脅樣貌的父層概述
- 旁路模型攻擊 —— 透過時序與快取訊號的互補式萃取
- 浮水印與指紋規避 —— 萃取後的來源資訊移除
- 訓練與微調攻擊 —— 由被萃取模型啟用的下游攻擊
- LLM 內部機制 —— 指引學生模型挑選的架構知識
參考資料
- Stealing Machine Learning Models via Prediction APIs (Tramer et al., 2016) —— 預測 API 萃取的奠基工作
- Thieves on Sesame Street: Model Extraction on BERT-based APIs (Krishna et al., 2020) —— NLP 模型萃取的主動學習
- Stealing Part of a Production Language Model (Carlini et al., 2024) —— 從生產 LLM 萃取隱藏維度
- High Accuracy and High Fidelity Extraction of Neural Networks (Jagielski et al., 2020) —— 保真度最佳化的萃取策略
- Distilling the Knowledge in a Neural Network (Hinton et al., 2015) —— 知識蒸餾基礎