はじめに
学習の忘備録として書いており,なんとなく理解したい初心者向けです.
完全な嘘があればご教授ください.
CAM(Class Activation Mapping)[1]
ざっくり説明すると,CNN がどこを見て判断したのかを可視化する手法です.後述するモデル制約があるため,Grad-CAM に一般化されています.

[1]より引用
CAMの意味するところは複雑ではないので,以下の数式と上図を照らし合わせて理解します.
S_c = \sum_{k} w_c^k (\frac{1}{Z} \sum_{i,j} A^k_{ij}) \\
= \frac{1}{Z} \sum_{k} \sum_{i,j} w_c^k A^k_{ij} \\
= \frac{1}{Z} \sum_{i,j} \sum_{k} w_c^k A^k_{ij} \\
= \frac{1}{Z} \sum_{i,j} L_{CAM}^c (i,j)
S_c はクラス c の出力で,図でいうところの Australian terrier です.A^k_{ij} は,図でいうところの色付けされた k 番目の特徴マップのピクセル位置 (i,j) を示しています.また,Z は特徴マップの全ピクセル数となっています.つまり,数式の1行目のカッコ内はk 番目の特徴マップのGAPを示しており,全結合層の入力と対応していることがわかります.よって,1行目は最終特徴マップから出力を表しています.2行目は自明なレベルでの入れ替えをしており,3行目の \sum は互いに依存していないので入れ替え可能です.4行目で L_{CAM}^c (i,j) = \sum_{k} w_c^k A^k_{ij} と定義することで完成です.
ここまで来ると式変形の意味がようやく見えてきます.つまり,S_c を (i,j) の和として表現しなおすことで,ピクセル位置 (i,j) によって S_c への寄与が変わる(=どの位置が出力にとって重要なのかがわかる) ように解釈できるようになったということです.
上式から,「conv層 \Rightarrow GAP \Rightarrow FC層 \Rightarrow 出力」の流れが CAM を適用するためのモデル制約であることもわかります.
Grad-CAM[2]
前述したモデル制約について,一体どこが制約なのかと感じる人がいるかもしれません.クラス分類タスクモデルはこのアーキテクチャ構成が多いですが,物体検出などの他のタスクではこの構成とは限りません.以下の図が非常にわかりやすいので示しておきます.(Guided Grad-CAM部分はいったん無視してください)

[2]より引用
上図の Any Task-specific Network を見ると,conv層の後の流れが多様であることがわかります.実は,Grad-CAM では w_c^k の代わりになるものを用いて,モデル制約を解消しています.以下に Grad-CAM の式を示します.CAM 部分で示した L_{CAM}^c(i,j) に置き換えて考えてください.
L_{Grad-CAM}^c(i,j) = ReLU(\sum_{k} \alpha_c^k A^k_{ij})
まず,以下のことに気づくと思います.
-
w_c^k から \alpha_c^k への代替
- ReLUの登場
順に考えていきます.
まず,1について見ていきます.\alpha_c^k は以下の式で表されます.
\alpha_c^k = \frac{1}{Z} \sum_{i,j} \frac {\partial S_c}{\partial A^k_{ij}}
混乱しますね.しかしイメージをしていくとなんとなく理にかなっていそうなことがわかります.そもそも,w_c^k は,出力 S_c に対して,k 番目特徴マップの重要性を表していました.では,\alpha_c^k も「出力に対する特徴マップの重要性」を表してほしいです.上式を要素ごとに分解してみると,\frac{\partial S_c}{\partial A^k_{ij}} は「 k 番目の特徴マップの位置 (i,j) の値を1増やすとどれだけ S_c が変化するか」を示しています.k 番目の特徴マップすべての位置に対して平均を取っているので,「 k 番目の特徴マップのある位置 (i,j) の値を1増やすと平均してどの程度出力 S_c が変化するか」を表しており,「 k 番目の特徴マップの重要性」を示すと解釈できそうです.w_c^k と異なり特徴マップ A_k^c から出力までの道筋は制限していないので,逆伝播により微分値がもとまれば適用できるという寸法です.
続いて,2についてですが,ReLU をとっているということは,負の出力には興味がないということですね.つまり L_{Grad-CAM}^c(i,j) が負になるのであれば,注目しているクラスの出力を低下させることにつながるので,他のクラスへの寄与はあっても今注目しているクラスには寄与しないため,排除していると考えられます.
さいごに
今回は直感的な CAM と Grad-CAM の説明をしてみました.Grad-CAM の元論文[2]をよむと,より丁寧な導出と説明がなされていますので興味を持たれた方は参照してみてください.実は,Grad-CAM にはいろいろと問題点があることが指摘され,今もなお賢い人たちによって多くの改良手法が提案されています.
時間があれば勉強して記事を書ければと思っております.
[1]https://arxiv.org/abs/1512.04150
[2]https://arxiv.org/abs/1610.02391
Discussion