當視覺系統傷害到人
先從三個有紀錄的真實故事說起。在 2018 年一份被廣泛引用的稽核中,商用人臉分類系統對淺膚色男性近乎完美,卻會把深膚色女性的性別誤判到大約每三次就有一次——最容易與最困難族群之間的錯誤率差距超過三十個百分點。大約同一時期,一台自動洗手乳機因為紅外線感測器只對淺膚色的手有反應、卻忽略深膚色的手而在網路上瘋傳。而在 2015 年,一款相片 App 自動把一對黑人情侶標記為「大猩猩」——廠商唯一能做的「修補」竟是把這個類別整個刪掉好幾年。
這些不只是讓人尷尬的小錯。多個國家的警方曾用人臉比對來產生嫌疑人線索,而已經有少數幾個人——其中黑人男性的比例異常地高——在人臉辨識系統回傳了一個「很有信心卻錯誤」的比對結果後遭到錯誤逮捕。模型給出的數字很高;對人造成的後果卻是牢房。本篇要強調的是:即使在廠商自己的基準上系統是「準確的」,傷害依然真實發生了。
因此這篇收尾在準確與穩健之上,再疊加三根支柱。第一是公平性——系統是否對某些族群比其他族群更常出錯?我們又該如何衡量?許多麻煩可追溯到偏斜的訓練資料,而非某個惡意的演算法;而要把這些問題講精確,有一門專門研究視覺中的公平性的學問。第二是可解釋性——我們能否看見某個決策「為什麼」這樣做,足以拿來除錯與稽核?第三是完整性(誠信)——也就是深偽問題:我們學會用來評估的生成模型,反過來成了詐騙與假訊息的工具。全篇的語氣保持冷靜、工程取向:不是「AI 很邪惡」,而是「它在哪裡會壞、怎麼量、然後該怎麼處理」。
偏誤從何而來:資料
我們很容易想像某處藏著一行帶有偏見的程式碼,但視覺偏誤幾乎從不住在那裡。資料集偏誤指的是訓練資料系統性地誤現了模型實際要運作的真實世界。一個從某國名人照片爬取而來的人臉資料集,會比部署後系統真正遇到的人群更淺膚色、更年輕、打光也更「標準」。網路會忠實地學會它被餵入的統計分布——包含其中的缺口。不公平是真實的,但它是從資料以及問題被框定的方式繼承而來,並不是最佳化器自己發明的。
這直接呼應第 4 篇。代表性不足其實就是一種分布變化——只是這個變化發生在「誰在訓練集裡」與「系統實際服務誰」之間。如果深膚色女性只佔訓練影像的 5%,卻佔真實使用者的 25%,那麼在部署時,模型會不斷面對來自一塊它幾乎沒練習過的輸入空間區域。你在分布變化那篇學到的一切——它如何傷害準確率——在這裡全部適用,差別只在於:痛苦集中落在特定一群人身上,而非平均分攤。
- 取樣:如何蒐集樣本。網路爬取、實驗室蒐集或就近取得的便利樣本,會過度代表那些容易被捕捉到的人,並低估其他所有人。
- 標註:由人(或舊模型)指派真值標籤,把他們自己的假設、疲勞與文化盲點,帶進了模型用來學習的那個「真相」裡。
- 代理變數:模型抓住一個相關的捷徑(膚色反光、背景、服裝),即使受保護屬性從未被當成明確輸入,這些捷徑仍替它「代言」了那個屬性。
- 回饋迴圈:帶偏誤的預測會塑造世界,而明天的訓練資料正是從那個被扭曲的世界蒐集而來——於是偏誤會在一次次重新訓練中自我放大。
一張示意圖,將整體準確率與各族群高度不一的準確率長條對比,並用箭頭標出偏誤在取樣與標註階段進入的路徑。
衡量視覺中的公平性
公平性唯有變成一個數字,才真正成為工程。訣竅很簡單,而且重用了第 1 篇的混淆矩陣:不要對所有人算一個矩陣,而是對每個族群各算一個混淆矩陣,再比較其指標。這個領域有三個主要的形式準則,每一個都是一句白話的承諾。人口統計均等(demographic parity):模型對每個族群說「是」的比率相同。機會均等(equal opportunity):在那些真正為正例的人之中,模型抓到他們的比率相同——也就是各族群的真陽性率(召回率)相等,這正是把召回率的概念逐族群套用。均等勝算(equalized odds):更強——真陽性率與假陽性率「兩者」都要在各族群間相等。要求其中哪一個,正是視覺公平性研究的核心。
並排的兩個 2x2 混淆矩陣,分別標示族群 A 與族群 B,並標亮公平準則所用的真陽性率與假陽性率格位。
把兩個公平準則寫成條件機率。
仔細讀這些符號。這裡 ŷ 是模型的預測(1 = 正例/「是」),Y 是真實標籤,A 是受保護屬性——也就是族群,例如 A=深膚色 與 A=淺膚色。人口統計均等 P(ŷ=1 | A=a) 是篩選率:在你屬於族群 a 的條件下、模型說「是」的機率;均等意指這個機率不取決於 a——不論哪個族群,篩選率都一樣。均等勝算則額外以真值 Y=y 為條件:P(ŷ=1 | Y=1, A=a) 是真陽性率、P(ŷ=1 | Y=0, A=a) 是假陽性率;要求這兩者在各族群間都相等,意味著模型對每個人「找出真正的正例」一樣強、且「誤報」的傾向也一樣。為何它們會打架的直覺:如果各族群的基底比率不同——比方真正的正例在族群 A 佔 20%、在族群 B 只佔 10%——那麼要讓整體「說是」的比率相等(均等),你就被迫在正例較少的那群多標一些人,而那些人多半是負例,這會抬高該族群的假陽性率,於是破壞了均等勝算。當底層真相在族群之間不同時,你一般無法同時把篩選率固定、又把錯誤率固定。
# Per-group fairness audit reusing the Guide-1 confusion matrix.
# Two groups, 1000 people each. Note the DIFFERENT base rates.
# Group A: 200 truly positive (20% base rate)
# Group B: 100 truly positive (10% base rate)
groups = {
# tp, fn, fp, tn
"A": dict(tp=180, fn=20, fp=40, tn=760),
"B": dict(tp=70, fn=30, fp=45, tn=855),
}
for g, c in groups.items():
n = c["tp"] + c["fn"] + c["fp"] + c["tn"]
acc = (c["tp"] + c["tn"]) / n # overall accuracy
tpr = c["tp"] / (c["tp"] + c["fn"]) # recall / equal-opportunity metric
fpr = c["fp"] / (c["fp"] + c["tn"]) # false-positive rate
sel = (c["tp"] + c["fp"]) / n # selection rate / demographic parity
print(f"{g}: acc={acc:.3f} TPR={tpr:.2f} FPR={fpr:.3f} sel_rate={sel:.3f}")
# A: acc=0.940 TPR=0.90 FPR=0.050 sel_rate=0.220
# B: acc=0.925 TPR=0.70 FPR=0.050 sel_rate=0.115
# Combined accuracy ~ 0.93 -> looks great on the headline metric,
# yet recall is 0.90 vs 0.70 (a 20-point equal-opportunity gap),
# and selection rate 0.22 vs 0.115 (demographic parity also fails).長條圖中兩族群的整體準確率長條幾乎等高,但真陽性率長條明顯不等。
打開黑盒子:可解釋性
假設上面的稽核顯示出召回率落差。你接下來會問「為什麼?」——而光靠準確率的數字你回答不了。模型可解釋性這門學問,就是要把模型的推理變得讓人看得懂:輸入中是什麼驅動了這個輸出?它分為兩大家族。本身就可解釋的模型(小型決策樹、線性模型)在構造上就可讀——你真的能看見那條規則。事後(post-hoc)解釋則是在訓練之後,套用到一個已經不透明的深度網路上,反向工程出一套對其行為的說明。深度視覺模型穩穩屬於第二類:五千萬個權重不是人能讀的規則,所以我們得打造工具來盤問它。
視覺領域最主力的事後工具是顯著圖(saliency map),其中最受歡迎的形式是 Grad-CAM。其直覺是一個敏感度問題:輸入的哪些區域,只要被輕推一下,最會改變所預測類別的分數?把那些區域標亮,你就得到一張覆蓋在影像上的熱力圖——網路「看」的地方亮、忽略的地方暗。Grad-CAM 利用流入某個卷積層特徵圖的梯度,高效地算出這張圖。
Grad-CAM:以梯度加權的特徵圖總和,再經過 ReLU。
逐塊拆解。挑一個卷積層;它輸出一疊特徵圖,A^k 是第 k 張圖——一個小小的二維激活網格(比方 14×14),其中 A^k_{ij} 是空間位置 (i, j) 的激活值。項 ∂y_c/∂A^k_{ij} 是所預測類別 c 的分數 y_c 對「那一個激活值」的梯度:如果那個位置再亮一點,類別分數會上升多少。我們把這些梯度在全部 Z 個空間位置上取平均(Z=該圖的高×寬,例如 196),得到 α_k,也就是第 k 張特徵圖的單一重要性權重——「這整張圖對類別 c 有多重要?」。接著做加權總和 Σ_k α_k A^k,依重要性把各圖結合起來,再套用 ReLU 只保留正向證據(支持類別 c 的區域,而非反對它的)。結果 L 是一張粗略的熱力圖,再上採樣到影像大小,標亮網路真正倚賴的區域。具體地說:若不論你怎麼擾動背景上的圖位、「貓」的分數幾乎不動,但一擾動動物臉部上的圖位分數就跳起來,那麼梯度——以及熱力圖——就會集中在臉上。這正是我們想要的解釋。
一張照片上覆有半透明的紅黃熱力圖,集中在模型所分類的物體上,向其他區域漸變為藍色。
一個由影像區塊組成的網格,覆蓋著注意力權重,顯示某個查詢 token 強烈關注的少數幾個區塊。
合成媒體:深偽與其偵測
在第 2 篇我們學會用 FID 評估生成器——一個衡量模型樣本有多逼真的指標。把它反過來看,危險就一目了然:一個 FID 分數很棒的生成器,按定義就是能產出讓人分不出真假影像的生成器。同樣的 GAN 與擴散模型,可以捏造出不存在之人令人信服的臉、把真人的臉換進影片、用幾秒鐘的音訊複製出聲音,或上演從未發生的事件。傷害是具體的:用一通你「執行長」的假視訊電話進行金融詐騙、未經同意的私密影像、以及為選舉精心安排時點的政治假訊息。深偽偵測正是試圖反制的領域。
本質上,深偽偵測就只是一個二元分類器——真 vs 合成——以兩類的範例訓練而成。讓它不只是一個普通影像分類器的,是它學會利用的那些細微、常常肉眼不可見的線索。生成器會留下指紋:頻域偽影(上採樣層會在影像頻譜中印上一道隱約而規律的網格,眼睛看不到,但傅立葉轉換能揭露);不一致的打光與反射(眼睛沒有反映出同一個光源、影子彼此矛盾);以及失常的生理訊號(不自然或缺失的眨眼、或缺少真實心跳所造成的那種極微的膚色脈動)。
一張示意圖:生成器產出假影像、判別器判斷真假,並有一條回饋箭頭使生成器變得更強。
這裡有個令人不安的結構性真相,呼應第 3、4 篇:偵測是一個對抗性的、會移動的標靶。偵測器所倚賴的每一個線索,都是下一代生成器會被訓練去抹除的瑕疵——頻域偽影可以被濾掉、眨眼可以被合成出來。所以今天準確率 99% 的偵測器,遇到明年的模型可能就崩潰。更糟的是,在某個生成器的假影像上訓練出的偵測器,一旦看到另一種它從未見過的架構所產的假影像,就會遭遇嚴重的分布變化;一個沒見過的生成器實質上是個分布外輸入,而過度自信的偵測器恰恰會在那裡無聲地失敗。偵測是必要的,卻永遠沒有完工的一天。
負責任地部署:把整個學習路徑串起來
這不只是本路徑的收尾,更是貫穿全部二十條路徑那條「評估與倫理」主線的終章。你學到的一切,匯聚成一門功夫:在一個視覺系統碰到真實的人之前,你要在我們點過名的每一個面向上衡量它在哪裡失敗——平均表現、穩健性、公平性、可解釋性與完整性。可信賴不是你最後才加上的一項功能;它是誠實量測的總和,以及對量測結果採取行動的意願。
- 回報數個切合任務的指標並附上信賴區間,而非單一的頭條準確率(第 1–2 篇):精確率/召回率、mAP、IoU、FID——任務適用什麼就用什麼——每個都帶上不確定性的誤差範圍。
- 在對抗性攻擊與自然分布變化下做壓力測試(第 3–4 篇):除了平均情況,也回報最壞情況的行為,並在執行時標記分布外輸入。
- 逐族群稽核公平性,並選定且論證一個準則(本篇):公開各族群的混淆矩陣,而不只是合併後的那一個。
- 解釋具代表性的決策(本篇):用顯著性/注意力確認模型倚賴的是物體、而非某個假性代理——並用以調查你發現的任何公平性落差。
- 把一切記錄下來並持續盯著:附上模型卡與資料表(datasheet)、界定人工監督與救濟管道,並在上線後持續監測。
有兩種產物已成為該文件化的標準。模型卡(model card)是一張訓練好模型的簡短而誠實的規格表:它的預期用途、上述指標按族群拆分後的結果、已知限制,以及不該被使用的情境。資料表(datasheet for a dataset)對資料做同樣的事:它如何被蒐集、裡面有誰、遺漏了什麼、以及取得了什麼樣的同意——正是我們在第 2 節看到、決定資料集偏誤是否「看得見」的那些上游事實。兩者合起來,把「我們測過了」變成一份別人能查核的紀錄。
一張環狀的機器學習生命週期圖:資料蒐集、訓練、評估、部署、監測,再循環回到資料。
再輕輕談一下治理。法規正在到來(歐盟《AI 法案》將遠端生物辨識在某些用途上列為高風險或加以禁止),而許多視覺能力是雙重用途的——同一個人臉模型可以解鎖你的手機,也可以監視一場抗議。同意很重要:那些臉孔、聲音或醫療影像被用來訓練你系統的人,對它如何被使用是有切身利害的。你不需要當律師,但你確實需要在動工之前問:誰可能受到傷害?這項任務是否該存在?公平性稽核、可解釋性與誠實的文件化三者合一,正是讓你能用證據、而非意見來回答這些問題的東西。