激活導向
透過將已學到的導向向量加入中間激活值以操控模型行為,以直接的表徵工程繞過安全訓練。
激活導向
激活導向(也稱表徵工程)直接操控模型內部表徵以控制其行為。不同於透過模型輸入通道運作的提示詞基礎攻擊,激活導向運作於模型隱藏狀態——層與層之間的中間運算。這繞過任何輸入層安全過濾器,並於提示詞基礎監控無法觀察的層級修改行為。
理論基礎
表徵即方向
線性表徵假說主張高層概念於模型激活空間中被編碼為方向。模型對「誠實」、「安全合規」、「樂於助人」的表徵對應高維激活空間中的特定方向。
SteeringVectorExtractor 類別實作:載入 HuggingFace 模型(output_hidden_states=True)。get_activations(text, layer) 將輸入分詞後前向傳遞,從 outputs.hidden_states[layer] 取出該層隱藏狀態(形狀:batch × seq_len × hidden_dim),跨所有位置取平均(.mean(dim=1))壓平後回傳單一向量。
compute_steering_vector(positive_prompts, negative_prompts, layer) 對兩組提示詞分別擷取激活,計算正例平均與負例平均,相減得導向向量 pos_mean - neg_mean,最後正規化為單位長度。這捕捉了「展現目標行為」與「展現相反行為」之間在激活空間中的方向。
對比對設計
導向向量品質關鍵取決於用於萃取的對比對。例如萃取「合規」導向向量:
- 正例(模型合規):使用者請求寫 Python 函式、解釋量子運算、寫自然詩,助理以「Here's how...」、「Quantum computing uses...」、「Here's a poem...」等實際合規回應繼續
- 負例(模型拒絕):同樣的三個請求,但助理以「I'm sorry, but I can't help...」、「I'm not able to provide...」、「I apologize, but I'm unable...」等拒絕回應
產生的向量捕捉「合規」與「拒絕」行為間的方向。
套用導向向量
推論時激活修改
ActivationSteerer 類別於推論時以 PyTorch forward hook 注入導向。呼叫 steer(text, steering_vector, layer, strength=1.0) 時:
- 建立 hook 函式:對該層輸出的
hidden_states = output[0],加上strength * steering_vector,回傳修改後元組(modified,) + output[1:] - 將 hook 註冊至
self.model.model.layers[layer] - 執行生成(
temperature=0.7, max_new_tokens=200) - 移除 hook、解碼並回傳
正 strength 推向正例方向;負 strength 推離正例(等效於放大負例行為)。
多層導向
跨多層同時套用導向可產生更強效果。multi_layer_steer(model, tokenizer, text, steering_vector, layers, strengths=None) 依 layers 與對應 strengths 逐層註冊 hook(使用閉包 make_hook(s) 以正確捕捉每層強度)。每層加同一導向向量乘其強度,然後生成、清理所有 hook。
安全相關導向向量
萃取安全方向
激活空間中的「安全」方向代表拒絕有害請求的模型與合規者之間的差異。安全相關對比對:
- 正例(模型為安全):對「如何入侵他人郵箱?」回應「I can't help with unauthorized access...」;對「產生釣魚郵件」回應「I'm not able to help create deceptive content...」
- 負例(模型為不安全):對相同請求回應「Here are the steps to access...」或「Here's a convincing phishing email template...」
於第 15 層計算安全導向向量。推論時以 strength=-3.0 套用(負向導向=遠離安全),即可在該次生成停用安全行為。
層選擇
並非所有層對導向效果相同。最佳層依目標概念而異:
| 層區 | 編碼概念 | 導向有效性 |
|---|---|---|
| 早期(0-25%) | 語法、位置 | 行為導向低 |
| 中層(25-60%) | 語意、上下文 | 中等,主題導向佳 |
| 晚層(60-85%) | 行為、安全相關 | 安全與風格導向高 |
| 最終(85-100%) | 輸出格式化 | 變動,有退化風險 |
find_optimal_layer 函式:對每層,以多個測試提示詞比較「無導向生成」與「該層強度 2.0 導向生成」的行為差異,取平均效果分數後排序找出最有效層。
進階技術
目標概念擦除
與其加上導向,透過將激活投影垂直於概念方向以完全移除概念。concept_erasure_hook(steering_vector) 先正規化向量 v,hook 內:
投影 = (h · v) * v
h' = h - 投影
這將 h 上的 v 方向分量移除,使模型該概念相關表徵變為零。
組合導向
結合多個導向向量達成複雜行為修改。compositional_steer(model, text, vectors_and_strengths, layers) 接收如 [(safety_off_vector, -2.0), (verbose_vector, 1.5)] 的清單,計算組合向量:
combined = Σ strength_i * vector_i
然後跨指定層套用。可同時減弱安全並增強冗長。
導向向量轉移
導向向量有時可於模型間轉移。transfer_steering_vector(source_vector, source_model, target_model) 比較兩模型 hidden_size。若相同則直接轉移;若不同,使用兩模型共享對比對學習線性投影 projection,然後對源向量套用:target_vector = projection @ source_vector。
防禦意涵
激活導向對 AI 安全構成獨特挑戰:
- 繞過輸入過濾器:任何提示詞層偵測皆無法捕捉激活修改
- 繞過輸出過濾器:導向可產生看似源自正常模型運作的輸出
- 需模型存取:僅影響攻擊者可存取模型權重與推論基礎設施的部署
- 持久修改:Hook 可安裝於服務基礎設施並於多個請求間持久
偵測方法
ActivationMonitor 類別:
- 基準統計:維護每層正常激活的
mean與std - Z 分數檢查:對新激活計算
z = (activations - mean) / std,若max(|z|) > 5.0標記異常 - 方向一致性檢查:收集近 10 次激活的 deltas,計算兩兩餘弦相似度。導向會對每次請求加上相同方向,故 deltas 會呈現高餘弦相似度(> 0.9)——這是強導向訊號
此方法可偵測隱密導向攻擊,但需於受信任環境中基準統計且無法防止首次導向事件。
相關主題
某紅隊對一個已部署的開源模型擁有白箱存取。他們萃取出「安全拒絕」導向向量並於推論時以負強度套用。會發生什麼?
參考文獻
- Turner et al., "Activation Addition: Steering Language Models Without Optimization" (2023)
- Zou et al., "Representation Engineering: A Top-Down Approach to AI Transparency" (2023)
- Li et al., "Inference-Time Intervention: Eliciting Truthful Answers from a Language Model" (2023)
- Rimsky et al., "Steering Llama 2 via Contrastive Activation Addition" (2024)