可解釋 AI (XAI) 系列 — 02 基於梯度的方法 (Gradient-Based): Sensitivity analysis, SmoothGrad, Integrated Gradients
在可解釋 AI 系列中,上一篇我們介紹了基於遮擋的方法 (Perturbation-Based) ,接著我們來介紹基於梯度的方法 (Gradient-Based),如果還沒看過上一篇的,強烈建議先看一下。
進入正題,我們先來看簡單的線性模型,可以很直觀的透過權重與輸入的特徵來決定 attribution。
其中 y 為預測值、w_i 為權重、x_i 為輸入的特徵、ε 為殘差值。
這邊有一個例子,此線性模型為基於兩個投資 x_1 和 x_2 來估計未來資本資產 y_c。
- 當我們關注全局可解釋性 (針對整個模型去做解釋) 時,其 attribution (R_i) 就等於是模型的權重,投資於 x_1 的每一美元將產生 1.05 $ 的資本,而投資於 x_2 的每一美元將產生1.50 $ 的資本。
- 當我們關注局部可解釋性時 (針對一個具體的輸入去做解釋),其 attribution (R_i) 就等於是模型的輸入乘以權重,讓我們考慮一個具體的投資場景,其中對 x_1 項目投資了100000 美元,x_2 項目投資了 10000 美元,很容易看出,120000 美元可以解釋為兩個資金的總和:105000 美元來自於第一隻投資的資金和 15000 美元來自於第二隻投資的資金:
因此線性模型的全局可解釋性 (Global) 與局部可解釋性 (Local) 的 attribution 值可以用以下式子求得:
經過簡單的線性模型例子,應該比較理解 attribution 的概念了,接著我們進入深度學習的領域,深度學習所用到的模型都是非線性的。
Sensitivity analysis
Sensitivity analysis 是第一個使用 gradient-based 的方法,我們先令一個簡單的線型模型 Sc(I) 如下:
其中 c 代表 class、w 代表權重、b 代表 bias、Sc(I) 就是我們算出來的分數 (score),經過上面的詳細說明,attribution 很直觀的就是他的權重。
而神經網路是一個很複雜的非線性模型 Sc(I),然而我們可以對 I_0 的周圍對模型 Sc(I) 進行一階泰勒展開式把它近似成線性模型,變成:
其中 w 就是 Sc(I) 對 I 的偏導數,也就是輸出對輸入的梯度 (Gradient) 值。
把這些 input 的 weight 畫出來就是 Saliency Map 了,可以告訴我們影像中的像素點對影像分類結果的影響,如 圖1 所示:
對於上面計算梯度 w 可以用來表示每個特徵的重要度,我們可以這麼來進行理解:梯度的大小表示某個像素點改變一點,對最後結果的影響。
SmoothGrad
由於使用 Saliency Map 會有一個問題,如 圖2 所示,若在原圖 (x) 加上人眼看不出來的微量差異變成右圖 (x+ε),其中 ε ~ N(0, 0.01^2 ),以這兩張圖為基準做線性差值進而生成多張影像 (0 ≦ t ≦ 1),並針對這些相似的生成影像中的單個像素 (例如紅色圈圈) 去做 RGB 的偏導數,發現其值是相當不穩定的。
若 Saliency Map (Mc(x)) 為輸出對輸入的梯度值
則 SmoothGrad 將輸入影像進行擾動,即加入 N(0, σ^2) 的微小差異,共生成 n 張,並計算他們的梯度並將它平均,即可得到穩定的 Saliency Map
效果如 圖3 所示,將 sample size 逐漸變大,Saliency Map 也越穩定,更能看出模型關注的位置
Integrated Gradients
李宏毅老師舉過一個例子,如 圖4 所示:大象的鼻子對神經網絡將一個物體識別為大象的決策很重要,但當大象的鼻子長度增加到一定程度後(例如 1 公尺長),繼續增加不會帶來決策分數的增加,導致輸出對輸入特徵的梯度為 0,達到梯度飽和了。
很顯然鼻子的長度對大象很重要,但上述的 Saliency Map 方法在飽和區將其重要性設為 0,明顯違反常識。因此為了正確捕捉鼻子長度的重要性,積分梯度法使用了沿著整條梯度線的積分值作為鼻子長度對決策分類的重要程度。
唯一困難的地方在於對於一張給定的影像,其大象鼻子長度已定(例如 2 公尺長),那我們該如何得到鼻子長度小於 2 公尺時輸出對輸入的梯度呢?
假設當前影像為 x,若知道鼻子長度為 0 公尺時的 baseline 影像 x' (通常為像素值全為 0 的全黑影像),那我們就可以做線性插值並生成其中間的影像了,也就是
當常數 α 為 0 時,輸入影像即為 baseline 影像 x',而當 α 為 1 時,即是當前影像 x,在中間即為其他線性插值出來的影像,實際例子如 圖5 所示
完整計算公式如下:
注意前面乘了一個 xi-xi',來自於 dx~ = (x - x¯) dα
實驗結果如 圖6 所示
在我的 github 有實際的案例 code,有興趣的可以參考以下連結: