Shap 第二篇

Evans Tsai
Jun 4 · 7 min read

前言 Intro

上一篇的Explain Your Machine Learning Model by Shap. (Part 1)提到了如何利用 Shap 解釋相對難理解的 Tree based model,這次的第二篇,會提到如何使用 Shap 解釋你的 Deep Learning models.

  • 快速回顧 Shap
  • Dataset
  • 利用 Keras 快速建立模型
  • Shap explainer on deep learning
  • Takeaway

快速回顧 Shap value

SHAP 是一個 Python 的視覺化分析套件,讓我們能簡單的了解我們的模型作出決策的根據。SHAP 利用 shap value 去解釋模型,若要再仔細一點理解的話可以到第一篇去查看,會有更清楚的理解。

Dataset

這次利用的 image Dataset 是從 Kaggle 上拿取的 10 Monkey Species,內容為 10 種猴子的影像,這次的任務就是訓練一個影像分類模型,並且利用 Shap value 觀察影像模型在做分類時,是根據圖像的哪些位置,做出分類的判斷,那這些位置是否是人類在做觀察時,也會同時判斷的地方,可以理解建出來的模型是否有正確觀察到該關注的地方,而不是運用了奇怪的特徵,得到了奇怪的結果。

猴子們

Dataset outlook

我這次只有使用 Training.zip 的資料集而已,若有想要手動練習玩玩看的朋友們,建議可以先下載Training.zip。載下來解壓縮後,會有如右邊的資料夾,意思即是為從 n0~n9 共 10 類猴子。

利用 Keras 快速建立模型

我們可以非常迅速地利用 Keras 建立 Deep learning model,首先我們站在巨人的肩膀上,引用 VGG16 作為 Transfer 的 backbone,由於原始模型是在 imagenet 上訓練的,我們必須把模型最後要做分類的地方改成我們自建的分類器,重構 Dense layer,將後面接為 10 種分類。

# include_top 改成 False,即代表我們不要使用原始的 Dense layer。based_model = VGG16(weights=’imagenet’, include_top=False, input_shape=(224, 224, 3))x = based_model.output
x = Flatten()(x)
prediction = Dense(10, activation = "softmax")(x)

再來,因為 imagenet 的權重已經很好的能夠抓出圖像的特徵了,故在這邊我們就不重新訓練,所以將引用自 VGG16 的 weight 鎖起來,再進行 backprop,不需要更新到 VGG16 的權重,只要更新我們新建立的 Dense layer 權重即可

# 鎖住 vgg16 的權重,設定 layer.trainable = False
for layer in based_model.layers:
layer.trainable = False
Build model

將模型建立完成之後,需要再將 model compile 後才可以使用,所以接下來的動作就是給予模型一些參數,接著利用 ImageDataGenerator 的方式,將圖片餵進模型中訓練。我自己在做 image 類別的訓練時,習慣都用 image generator,同時能做 data augmentation,也可以在餵入 model 時避免OOM問題。

可以看到 loss 很快地就下降了,accuracy 也很快的來到了9成,雖然這次的重點不是放在模型訓練上,但因為要讓模型有解釋有個公允的結果,我們必須要 call earlystop ,避免 over fitting,不然會影響模型對於圖像解釋。

Shap explainer on deep learning

對於預測的解釋,從原始圖像去解釋是非常困難的一件事,因此我們基本上會從 Convolution layer 下手,基本的原理會像是 每個 conv net 上的參數就像是個feature,經過 Shap 計算後,他會給予每個 pixel 一個 Shap value,而這也就代表,對於 prediction 的影響大小。而 Shap 用 image_plot 將它畫出來。

首先,我們需要先創造一個 GradientExplainer。

class _TFGradientExplainer(Explainer):
def __init__(self, model, data, session=None, batch_size=50, local_smoothing=0):

根據 Shap 的 source code,model 的地方要先丟入我們要查看的特定 layer,有就是 VGG 內的某一層 conv net,接著把這個 input 跟整個 model 的 output 接在一起 (model.layers[layer_check].input, model.layers[-1].output) 。再來是一個比較奇怪的地方,source code 的參數 data,丟入幾筆資料都無所謂,我認為他不會對整體解釋造成影響。 尤其是在這邊,如果有實際操作的話,他很容易造成OOM的現象,因此如果大家試跑不過的話,建議可以將這個地方調小。

在創造出了 explainer 物件之後,我們便可以用物件的 method,shap_value 求得我們想要解釋的 to_explain (哪些圖)的 shap value。並同時 return 預測分類,我們可以在 ranked_output,給予我們要看過經過 softmax 後,機率值前幾高的預測分類。

接著便可以用shap.image_plot 繪出在第 layer_check 中,這個 conv net 主要關注在整個圖形的哪邊。

Conclusion

用 Shap 套件能夠很好的實現 explainable AI ,對於我們在檢視模型 performance 上能有很好的幫助。而其實此方法也就是權重前向傳遞的實現,使用前向傳遞的方法,理解是圖片哪些地方,可以很好的作用整個 activation function,那麼顯然的,這些就是該 Convolution network 對於此張圖片最關注的地方。

Take away

https://github.com/EvanstsaiTW/SHAP_tutorial

Reference

[1.]https://www.kaggle.com/slothkong/10-monkey-species
[2.]https://github.com/slundberg/shap

Taiwan AI Academy

news, tech reviews and supplemental materials

Evans Tsai

Written by

Taiwan AI Academy

news, tech reviews and supplemental materials

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade