
在實際深度學習系統中模型審計往往比模型訓練更難。訓練時只需要關注損失曲線和評估指標而審計時需要回答一個更尖銳的問題模型做出這個預測到底依賴了哪些信息如果模型把背景、水印、陰影或某個與任務無關的特征當成主要依據準確率再高也不具備上線條件。ICON Decomposition 這類概念級解釋方法正是為了對深層網絡的內部表示做“多變量概念級分解”把黑盒表征拆成一組可理解的語義概念再基于這些概念完成模型審計。本文會圍繞這個概念展開先講清它解決的問題再用一個最小可復現的 Python 示例展示實現思路最后說明如何在真實項目里落地。1. 理解 ICON Decomposition從模型審計視角看深度表示1.1 深度表示為什么不透明深度神經網絡內部不是一個清晰的規則庫。以圖像分類為例網絡在前幾層可能學習到邊緣、顏色、紋理等低級特征在中間層會組合出更復雜的模式比如“毛皮”“輪子”“圓形物體”最后映射到類別概率。但問題是這些模式不是以人類可讀的方式存儲的而是分散在成千上萬個中間特征圖或向量維度里。一個常見誤解是神經網絡最后的全連接層權重可以解釋模型決策。實際上最后一層只是把倒數第二層的向量映射到類別真正決定“這個概念是否出現”的信息早就在中間層被編碼了。如果只審計輸出層的權重無法發現模型是否偷偷使用了某些無關但容易區分的信號例如照片背景里常見的水印、邊框、拍攝設備噪聲。模型審計需要深入到這些表示內部。ICON Decomposition 的出發點就在這里它不直接看單個神經元而是把表示空間看成多個“概念方向”的組合嘗試用一個分解模型把這些方向分離出來。1.2 概念級解釋與顯著性圖的區別早期可解釋性大量使用顯著性圖例如 Grad-CAM、SmoothGrad它們回答的是“圖像哪個區域對預測最重要”。這對定位問題很有用但有一個明顯短板它只告訴你在哪里不告訴你那個區域觸發了什么概念。一張貓的圖片中模型可能關注了貓的臉也可能關注了背景里的地毯。同樣是高激活區域這兩者代表的決策邏輯完全不同。概念級解釋進一步回答“為什么這個區域重要”。它會把內部表示解釋為若干個概念例如“貓耳朵”“毛皮”“地毯紋理”“照片水印”然后說明某張圖片的預測主要被哪些概念驅動。這樣審計者就能判斷模型是否依賴了不該依賴的概念。ICON Decomposition 強調“多變量”概念指的是一個概念不一定對應某個單獨的神經元而可能是多個維度的線性組合或非線性組合。這在真實網絡里更常見一個語義概念通常被分布式地編碼在多個特征維度上用單神經元解釋會錯失大量信息。1.3 多變量概念分解的核心思路可以把深度表示看成一張表格。假設從中間層抽取出 (N) 個樣本的表示每個表示有 (D) 個維度組成矩陣 (R \in \mathbb{R}^{N \times D})。如果存在 (K) 個概念我們希望找到概念定義矩陣 (H \in \mathbb{R}^{K \times D})每一行是一個概念表示這個概念在原始特征維度上的權重樣本概念激活矩陣 (W \in \mathbb{R}^{N \times K})每一行表示這個樣本以多大強度包含每個概念。這樣就有近似關系[ R \approx W H ]這就是常見的矩陣分解形式。ICON Decomposition 的核心不是簡單的逼近而是要求分解出的概念具有語義可解釋性并且能支撐后續審計。為了實現這一點通常還要對 (H) 或 (W) 加入稀疏性、非負性、正交性等約束讓每個概念盡量由少量特征構成同時避免多個概念重復表達同樣的信息。1.4 模型審計的應用場景概念級分解最常用的四個審計場景如下審計目標典型問題概念級分解如何幫助偏見識別模型是否依賴性別、膚色、年齡等敏感屬性分解出與任務無關的敏感概念并統計其對預測的影響捷徑學習模型是否依賴水印、邊框、背景色等低成本特征發現訓練數據中高頻出現的干擾概念數據泄漏測試集和訓練集是否存在隱藏標識在表示中分離出與任務無關但能區分數據集來源的概念失效模式分析某些樣本類別準確率低模型在想什么對比錯誤樣本與正確樣本的概念激活差異這些場景的共同點是不能只看準確率必須進入模型內部看證據。概念級分解提供了這套證據鏈。2. 理解多變量概念分解的數學基礎2.1 概念是方向不是神經元在深度網絡中“概念”可以用表征空間中的一個方向來定義。例如假設某層特征有 512 個維度一個“條紋”概念可能不是第 37 個神經元而是第 12、45、200 個維度的一組組合權重。這個權重向量在輸入空間中沒有直觀像素意義但在表示空間中代表一個語義方向。從幾何角度看給定一個概念向量 (v \in \mathbb{R}^D)樣本表示 (r_i) 對概念 (v) 的激活分數可以定義為[ s_i \frac{r_i \cdot v}{|r_i| |v|} ]這個分數可以理解為余弦相似度。如果多個樣本在某個概念方向上有持續的高激活就能說明這些樣本共享某個語義模式。2.2 從單概念到多變量組合單概念方法一次只找一個概念向量例如 Concept Activation VectorCAV會用正負樣本在表示空間訓練一個線性分類器把分類器權重當作概念方向。這個方法有效但存在一個問題多個概念可能同時出現在同一個表示里單獨找每個方向時容易互相干擾。ICON Decomposition 采用多變量分解的思路把表示矩陣一次分解成多個概念。這樣做的好處是概念之間可以互相競爭避免重復表達一個樣本可以同時由多個概念解釋更貼近真實組合邏輯審計者能看到“概念組合”而不是“單一最強方向”。2.3 稀疏性與非負性為什么重要常見的矩陣分解包括 PCA、SVD、NMF 和稀疏編碼。它們都能把矩陣拆成若干因子但可解釋性差別很大。PCA/SVD 得到的因子可能有正有負某些維度互相抵消很難對應到“某個概念出現了”或“某個概念沒出現”。非負矩陣分解要求 (W) 和 (H) 的所有元素不小于 0因此概念激活不能是負的。這在語義解釋上更自然一個概念要么不出現要么以一定強度出現不會出現“負的條紋”這種說法。稀疏性要求概念向量 (H) 中很多維度為零或接近零這樣每個概念只依賴少量原始特征更容易歸納出語義。否則一個概念向量在所有維度上都有權重無法說清它到底代表什么。注意非負性不是所有特征都滿足的前提。深度網絡中間層特征常常包含負數因此在做 NMF 前需要先做平移、ReLU 或歸一化處理。2.4 審計指標概念貢獻、覆蓋度與穩定性分解完成后只有“概念”還不夠還需要量化指標來支撐審計結論。通常可以計算三類指標第一是概念貢獻。對某樣本 (i) 和概念 (k)可以用激活值 (W_{i,k}) 作為該概念對樣本表示的貢獻。如果要進一步評估對預測的貢獻可以移除該概念后觀察概率變化。第二是覆蓋度。對某個類別統計該類別的樣本中哪些概念持續高激活。若一個概念只在極少數樣本上激活即使激活很強也不是類別的主要解釋。第三是穩定性。同一個模型、同一批數據如果每次重新分解得到的概念完全不同審計結論就不可信。通常需要用多次初始化、交叉驗證或其他聚類一致性指標來評估。指標計算方式審計用途概念貢獻概念激活值 / 樣本表示范數解釋單樣本預測類別覆蓋度類別內高激活樣本比例判斷模型是否依賴某個共享概念穩定性多次分解后概念方向的平均相似度判斷分解結論是否可信重構誤差(|R - WH|_F)判斷概念數量是否足夠3. 環境準備用 Python 搭一個概念分解實驗3.1 安裝依賴下面示例以 Python 為核心使用 PyTorch 加載預訓練模型使用 scikit-learn 做矩陣分解。建議新開一個虛擬環境python -m venv icon-audit source icon-audit/bin/activate然后安裝依賴pip install numpy pandas scikit-learn matplotlib torch torchvision opencv-python如果只需要跑通分解部分不加載深度模型也可以只安裝pip install numpy scikit-learn matplotlib安裝完成后建議檢查版本避免出現兼容性差異python -c import sklearn; print(sklearn.__version__) python -c import torch; print(torch.__version__)3.2 準備深度表示數據集為了演示完整鏈路過深可以先使用 CIFAR-10 和 PyTorch 自帶的 ResNet-18 預訓練權重。這里要說明下面的代碼只是提取表示的通用模板實際項目需要替換成自己的模型和數據集。約定一個“表示提取模塊”從 ResNet-18 的 layer3 輸出特征圖經過全局平均池化后得到一個 256 維向量。代碼實現如下import torch import torch.nn as nn import torchvision import torchvision.transforms as transforms class FeatureExtractor(nn.Module): def __init__(self, backboneNone, layer_namelayer3): super().__init__() if backbone is None: backbone torchvision.models.resnet18(weightsIMAGENET1K_V1) # 截取到指定層為止 self.features nn.Sequential( backbone.conv1, backbone.bn1, backbone.relu, backbone.maxpool, backbone.layer1, backbone.layer2, backbone.layer3, ) self.pool nn.AdaptiveAvgPool2d((1, 1)) def forward(self, x): x self.features(x) x self.pool(x) return x.flatten(1)這里的features直接截取了 ResNet-18 的前三個殘差階段。如果把layer_name參數改為不同層可以對比不同抽象級別的審計結果。3.3 構造表示矩陣為了演示不一定要跑完整數據集。可以從 CIFAR-10 測試集中均勻抽取 2000 張圖每類 200 張前向得到表示矩陣。transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) dataset torchvision.datasets.CIFAR10( root./data, trainFalse, downloadTrue, transformtransform ) # 每類抽 200 個樣本 sampled_indices [] for cls in range(10): cls_indices [i for i, label in enumerate(dataset.targets) if label cls][:200] sampled_indices.extend(cls_indices) subset torch.utils.data.Subset(dataset, sampled_indices) loader torch.utils.data.DataLoader(subset, batch_size64, shuffleFalse) extractor FeatureExtractor().eval() features, labels [], [] with torch.no_grad(): for x, y in loader: out extractor(x) features.append(out) labels.append(y) R torch.cat(features, dim0).numpy() # shape (2000, 256) y torch.cat(labels, dim0).numpy() # shape (2000,)這一步是審計的“原材料準備”。后續所有分解都基于矩陣R因此R的質量會影響審計結論。3.4 環境檢查清單檢查項預期結果說明Python 可用版本 3.8 以上兼容 PyTorch 和 scikit-learnPyTorch 可加載預訓練模型能下載權重如果網絡受限權重加載會失敗表示矩陣維度2000 x 256說明特征提取正常樣本標簽分布每類 200 個審計結論必須覆蓋所有類別4. 核心實現實現一個 ICON 風格的概念級分解4.1 特征預處理從神經網絡中間層拿到的特征向量可能有負值直接做 NMF 會報錯或產生不合理結果。這里先做兩個處理用min-max把每個特征維度縮放到[0, 1]或者使用ReLU將負值截斷為 0。第一種方式保留更多信息第二種方式更接近“特征是否出現”的語義。這里以 min-max 為例from sklearn.preprocessing import MinMaxScaler scaler MinMaxScaler() R_scaled scaler.fit_transform(R)注意MinMaxScaler是在所有審計樣本上擬合的。如果后續要審計新數據新數據必須使用同一個 scaler 轉換不能重新擬合否則概念定義會漂移。4.2 用 NMF 做多變量概念分解scikit-learn的NMF是現成可用的基線方法。它不僅支持非負約束還允許調整稀疏性。from sklearn.decomposition import NMF n_concepts 16 model NMF( n_componentsn_concepts, initnndsvda, beta_lossfrobenius, solvercd, max_iter500, random_state42 ) W model.fit_transform(R_scaled) # (2000, 16) H model.components_ # (16, 256) reconstruction_error model.reconstruction_err_參數解釋參數含義調整建議n_components概念數量最關鍵的參數過少會欠擬合過多會重復init初始矩陣方式nndsvda適合稀疏數據random適合快速驗證beta_loss損失函數類型frobenius是平方誤差kullback-leibler對計數型特征更合適solver優化方式cd適合中大型矩陣mu更穩定但慢max_iter最大迭代次數如果重構誤差仍未收斂需要調大random_state隨機種子審計必須固定否則結果無法復現4.3 增加稀疏約束讓概念更易解釋直接用 NMF 得到的概念可能仍然稠密每個概念在 256 個特征維度上都有明顯權重難以歸納語義。可以打開 L1 稀疏約束。model_sparse NMF( n_componentsn_concepts, initnndsvda, beta_lossfrobenius, solvercd, max_iter1000, alpha_W0.1, alpha_H0.1, l1_ratio0.9, random_state42 ) W_sparse model_sparse.fit_transform(R_scaled) H_sparse model_sparse.components_這里alpha_W和alpha_H控制 W 和 H 的 L1 正則強度l1_ratio0.9表示 90% 使用 L1 懲罰。增大alpha_H會讓概念定義更稀疏但也不能過大否則重構誤差顯著上升。4.4 把概念映射回輸入空間得到概念向量 (H_k) 后還需要回答“這個概念的語義是什么”。可以把概念向量當作一組特征權重對原始特征圖做加權求和得到概念激活圖。假設feature_map的形狀是(C, H, W)概念向量concept_vec的形狀是(C,)則概念激活圖如下def concept_activation_map(feature_map, concept_vec): # feature_map: (C, H, W) # concept_vec: (C,) cam torch.tensor(concept_vec) feature_map.view(feature_map.shape[0], -1) cam cam.view(feature_map.shape[1], feature_map.shape[2]) cam cam - cam.min() cam cam / (cam.max() 1e-8) return cam這個操作類似 Grad-CAM但不需要梯度也不需要類別預測。它反映的是“某個概念在空間上出現在哪里”。實際使用前需要對feature_map做上采樣到輸入圖像尺寸可配合 OpenCV 的resize完成。4.5 面向審計的概念報表分解只是中間步驟審計最終需要給出一份報表。以下函數統計每個概念在每個類別上的平均激活import pandas as pd df pd.DataFrame(W_sparse, columns[fconcept_{i} for i in range(n_concepts)]) df[label] y report df.groupby(label).mean().T print(report.round(3))輸出是一張概念-類別交叉表審計者可以通過這張表快速發現異常關聯。比如某個概念在類別 5 上平均激活為 0.8但在其他類別上接近 0說明該概念幾乎就是這個類別的“專屬特征”。如果這個類別是人類標簽該概念可能合理如果這是一個與任務無關的屬性就需要進一步探查。5. 運行驗證從“能跑”到“審計結論可靠”5.1 用合成數據驗證分解流程真實數據無法預知“正確”概念因此先把流程跑在一份人工合成數據上驗證分解邏輯是否正確。假設有 300 個樣本每個樣本由 10 個特征構成其中只有 3 個特征是有效概念其余全是噪聲rng np.random.default_rng(0) n, d, k 300, 50, 3 true_W rng.uniform(0, 1, size(n, k)) true_H np.zeros((k, d)) # 概念1只用特征0-4 true_H[0, 0:5] 1.0 # 概念2只用特征10-14 true_H[1, 10:15] 1.0 # 概念3只用特征30-34 true_H[2, 30:35] 1.0 R_synthetic true_W true_H 0.01 * rng.normal(size(n, d))使用與上一節相同的 NMF 流程但將n_concepts設為 4觀察能否恢復出三個有效概念和第四個噪聲概念。這才是“驗證方法有效”的第一步。5.2 評估概念穩定性審計不是跑一次就能下結論的。概念分解受隨機初始化和樣本抽樣的影響很大。可以在多個隨機種子下重復分解然后計算兩次概念矩陣的相似度。一種簡化方法是固定樣本改變random_state對每個新概念在舊概念中找到最大余弦相似度取平均作為穩定性分數。from sklearn.metrics.pairwise import cosine_similarity def concept_stability(H1, H2): sim cosine_similarity(H1, H2) return np.mean(np.max(sim, axis1))如果多次運行后的平均穩定性低于 0.5說明概念不穩定要么增加樣本量要么增大稀疏約束要么固定隨機種子并明確說明審計版本。5.3 審計發現示例模型依賴背景用一個典型場景說明審計輸出如何幫助發現模型風險。在 CIFAR-10 上有兩個類別貓和狗。如果訓練數據里貓的圖片大量出現在沙發上狗的圖片大量出現在草地上模型可能學習到“沙發”概念和“草地”概念而不僅僅是貓和狗本身。在概念分解報告中如果看到某個概念在貓類別上的激活顯著高于狗并且這個概念的概念激活圖主要落在背景區域而不是動物主體區域那么基本可以懷疑模型存在背景依賴。驗證方式可以是構造一個“概念干預”實驗。把測試圖片中背景區域替換成更常見的公共背景觀察預測概率變化。變化越大說明模型對該背景概念的依賴越強。5.4 驗證審計結論的可信邊界概念級分解是一種探索性工具不是最終裁決。審計結論必須寫明三個邊界樣本邊界只審計了哪批數據是否覆蓋真實數據分布模型邊界抽取了哪一層特征不同層得到的概念可能不同分解邊界概念數量 K 的選取會影響結論不能只看一組 K。注意概念解釋不等于因果解釋。某個概念與類別預測高度相關不能直接認定模型“使用”了這個概念只能說在表示空間中這個概念對預測路徑有較強的相關性。6. 常見問題與排錯路徑6.1 概念無法歸納成語義現象分解出的 16 個概念每個都看不出明確含義所有樣本激活都接近 0.5。可能原因特征沒有歸一化尺度差異導致分解結果被少數維度主導概念數量過多或過少特征本身抽象程度過高無法用簡單直方圖歸納。處理方式先減少概念數量例如改為 8 個再檢查預處理是否生效然后對每個概念畫出高激活樣本人工查看共同點。如果依然無法歸納可以考慮換更靠近輸出的層或改用稀疏約束更強的參數。6.2 多次運行結果差別大現象概念穩定性分數低于 0.5。可能原因樣本量太小NMF 隨機初始化沒有收斂特征維度存在高度相關性導致多個局部最優解。處理方式固定random_state把審計結果視為某一版本提高max_iter檢查reconstruction_err_是否下降增加特征規范化與稀疏約束如果特征維度極高先做 PCA 降維會損失一部分語義需要權衡。6.3 分解結果與審計問題脫節現象概念都很有語義但沒有一個概念對應用戶關心的敏感屬性或干擾特征。可能原因審計樣本中沒有覆蓋那些屬性概念數量不足目標概念被壓進其他概念中間層選擇不合適目標屬性只出現在更淺或更深的層。處理方式先做一次快速單概念檢驗用 CAV 方式驗證目標屬性是否存在可分離的概念方向。如果 CAV 能分離說明表示中有相關信息再把概念數量調大或用其他分解算法繼續挖。6.4 排錯清單問題現象檢查方式處理建議NMF 報“Negative values”檢查 R 矩陣最小值對特征做 min-max或加非負平移重構誤差很大打印reconstruction_err_增大概念數量或增大迭代次數概念大量重復計算概念之間余弦相似度增大稀疏約束或降低概念數量審計報告無法解釋對齊高激活樣本的原始圖片人工抽查必要時用聚類摘要結果不可復現查看random_state是否設置固定種子并記錄所有超參7. 最佳實踐與擴展方向7.1 學習環境與生產環境的差異學習環境里跑通概念分解可以很快只要數據能加載、NMF 能收斂就行。生產環境做模型審計時還需要額外的工程化要求維度學習環境生產環境審計數據任意抽樣必須覆蓋真實分布和邊緣場景特征層隨意挑選記錄模型版本、層名、特征統計分解參數默認或少量調整多次運行并比較穩定性報告打印表格輸出可追溯 JSON 或 PDF 報告監控無記錄模型變更前后的概念漂移審批無審計結論需要復核人確認7.2 概念級審計的落地流程一個可復用的概念級審計流程可以按下面五步執行。第一步定義審計目標。先寫清楚懷疑點是否擔心背景依賴、敏感屬性、數據泄漏還是類別失效模式。第二步確定表示層。從模型的多個中間層分別抽取特征不要只選一層因為不同語義可能在不同抽象級別出現。第三步進行多變量概念分解。使用固定隨機種子記錄概念數量、稀疏參數和重構誤差。第四步人工解釋概念。抽取每個概念的高激活樣本生成概念激活圖由領域專家給概念打標簽。第五步輸出審計報告。包括概念定義、覆蓋率、穩定性、風險判斷、建議動作。7.3 從 NMF 走向更完整的 ICON 方案NMF 只是一個便于復現的基線。真實以 ICON Decomposition 為標題的方法可能還會包含更多設計例如用變分自編碼器學習非線性概念表示通過稀疏自編碼器把概念激活限制在稀疏碼本上在概念層與預測層之間加入因果干預估計概念對預測的因果效應對多個概念做交互效應分析識別“概念組合”導致的錯誤。實際項目中可以根據數據規模選擇方法適用場景代價NMF中型特征矩陣快速基線線性分解表達能力有限稀疏自編碼器大規模表示能學到非線性概念訓練復雜需要調參CAV / TCAV驗證單一概念假設需要正負樣本標注ICON 風格分解多概念同時出現需要審計報告實現成本高需領域專家參與7.4 審計報告應包含哪些內容無論使用哪種方法最終審計報告都應包含以下內容模型與數據版本包括預訓練權重、特征層名稱、數據集切分分解配置概念數量、隨機種子、歸一化方式、稀疏參數概念清單每個概念的權重 Top 特征、高激活樣本、人工命名審計發現哪些概念與目標無關但激活顯著哪些類別存在風險證據圖表概念激活圖、概念-類別熱力圖、穩定性評分建議動作是否需要重新訓練、收集數據或加入約束。實際操作中“審計”兩個字容易讓人直接聯想到上線前檢查。更合理的做法是把它放進模型迭代流程每次數據更新或模型微調后都重新跑一次概念級審計觀察概念是否漂移、是否有新的捷徑特征出現。這樣ICON Decomposition 的意義就不只是調試模型更是讓模型交付從“準確率高”升級為“理由可信”。對任何需要解釋模型行為的團隊來說這都是值得長期投入的方向。