XAIについての検証 - 手法比較
はじめに
前回までいくつかのXAI手法の検証を行ってきた。
今回はそれらの手法を比較するコードを実装し、githubに公開した。
https://github.com/NeverendingNotification/pytorch-xai-analyze
このコードを用いていくつかの状況で各XAIアルゴリズムの挙動を検証した。
比較したアルゴリズムは
初期値依存性
Deep Learningの学習結果はネットワーク重み初期値にある程度依存する。
XAIアルゴリズムの初期値依存性を見るために、 乱数SEED以外のパラメータを
固定して数回学習し、 XAIの可視化結果を比較した。
学習曲線 (評価データ)
精度 (評価データ)
class-F | run1 | run2 | run3 |
---|---|---|---|
T-shirt/top | 0.872945 | 0.867698 | 0.870871 |
Trouser | 0.987443 | 0.985915 | 0.98542 |
Pullover | 0.897 | 0.891337 | 0.897654 |
Dress | 0.921944 | 0.92323 | 0.924303 |
Coat | 0.869186 | 0.880193 | 0.88101 |
Sandal | 0.978894 | 0.979879 | 0.980529 |
Shirt | 0.766631 | 0.765803 | 0.771222 |
Sneaker | 0.962451 | 0.961727 | 0.959334 |
Bag | 0.986028 | 0.988 | 0.985522 |
Ankle boot | 0.972348 | 0.970707 | 0.965377 |
mean-F | 0.921487 | 0.921449 | 0.922124 |
acc | 0.9221 | 0.9218 | 0.9225 |
評価データに対する性能的には初期SEEDごとのブレはほぼ存在しない。
XAI結果比較 (Ankle bootクラス)
4行ずつ一組で(元画像、Anchors, SHAP, Grad-CAM)。
上から順にrun1, run2, run3。
- Anchorの挙動はrunごとにややぶれているが、靴底の窪んでいる部分と正面部分に反応しているものが多い。
- SHAPは共通してつま先付近(+かかとも?)に強く反応している。
- Grad-CAMは共通して靴の正面部分に反応している。
モデル初期値によってXAIアルゴリズムの挙動が大きく変わることはないようだ。
ネットワークのパラメータ数依存
ネットワークの複雑さによってXAIの挙動が変化するか検証した。
変更したパラメータは
- チャンネル数 (model.feature.c0)
- (16, 32, 64, 128)
- 層数 (model.feature.num_layres)
- (2, 3 ,4)
赤はデフォルト値。
チャンネル数比較
学習曲線 (評価データ)
精度 (評価データ)
class-F | channel_16 | channel_32 | channel_64 | channel_128 |
---|---|---|---|---|
T-shirt/top | 0.856566 | 0.872945 | 0.878073 | 0.885328 |
Trouser | 0.981891 | 0.987443 | 0.988978 | 0.989442 |
Pullover | 0.873657 | 0.897 | 0.898709 | 0.905698 |
Dress | 0.910366 | 0.921944 | 0.924988 | 0.937406 |
Coat | 0.861098 | 0.869186 | 0.886608 | 0.906126 |
Sandal | 0.974975 | 0.978894 | 0.981379 | 0.987976 |
Shirt | 0.746842 | 0.766631 | 0.793354 | 0.799401 |
Sneaker | 0.957594 | 0.962451 | 0.969966 | 0.96895 |
Bag | 0.982491 | 0.986028 | 0.98854 | 0.989033 |
Ankle boot | 0.965169 | 0.972348 | 0.974333 | 0.972152 |
mean-F | 0.911065 | 0.921487 | 0.928493 | 0.934151 |
acc | 0.9111 | 0.9221 | 0.9289 | 0.9341 |
チャンネル数は増加するほど性能が向上している。
XAI結果比較 (Ankle bootクラス)
上から順にチャンネル数(16, 32, 64, 128)。
全体の傾向としてはどのアルゴリズムも多くは変わっていない。
層数比較
学習曲線 (評価データ)
精度 (評価データ)
class-F | layers_2 | layers_3 | layers_4 |
---|---|---|---|
T-shirt/top | 0.821782 | 0.872945 | 0.889555 |
Trouser | 0.972039 | 0.987443 | 0.990964 |
Pullover | 0.82341 | 0.897 | 0.907023 |
Dress | 0.856865 | 0.921944 | 0.945744 |
Coat | 0.778786 | 0.869186 | 0.909 |
Sandal | 0.940759 | 0.978894 | 0.986987 |
Shirt | 0.66242 | 0.766631 | 0.807771 |
Sneaker | 0.92137 | 0.962451 | 0.971852 |
Bag | 0.960716 | 0.986028 | 0.987026 |
Ankle boot | 0.942799 | 0.972348 | 0.973764 |
mean-F | 0.868095 | 0.921487 | 0.936969 |
acc | 0.8687 | 0.9221 | 0.9372 |
層数が増加するほど性能が向上している。
XAI結果比較 (Ankle bootクラス)
上から順に層数 2, 3, 4。
Anchorsの挙動
層数を増やすほど反応箇所が減少している。
Anchorsの反応箇所はその部分を残すと予測結果があまり変わらない
superpixels領域を示しているため、層数が増加し、視野の広い特徴を
獲得するほどに、ローカルなsuperpixelsに対しての依存度が下がっている
ためと思われる。 解釈性という観点ではあまりよくないため、
superpixelsのとり方を考えるなど対策が必要。
SHAPの挙動
層数2の場合、つま先やかかと付近に強く反応している。
層数が増えると特定箇所への反応は弱くなり、正面付近の輪郭
全体に分布するようになる。 Anchorsと同様画像の特定部位への
依存性が落ちているためと思われる。
Grad-CAMの挙動
Grad-CAMは全てのパラメータで2層目の特徴マップを可視化している。
2層モデルの場合可視化している層は最終層であり、 靴の履き口、
正面、つま先など凹んでいる局所構造に反応している。
3層モデルの場合は靴正面のライン上に反応している。
4層モデルの場合はGrad-CAMが消滅しているものがある。
これはGrad-CAMが特徴量マップの重み付け和をとったあとに
ReLUを通すため、得られたマップ全体が負値ならば0となってしまうためである。
(最終層(4層目)を可視化する場合はこのような挙動はしないはず)
潰れていないマップを見るためには最終層を可視化するほうが良いが、
解像度がさらに落ちるため、局所性は失われる。
まとめ
各XAIアルゴリズムの挙動を比較した。
チャンネル数を増やした場合はあまり挙動が変わらないのに、
層数を変えると挙動が大きく変わるのはおもしろいと思った。
ネットワークのアーキテクチャや問題を変えた場合の挙動も理解したい。