1. はじめに
近年、AIモデルを業務に取り入れるケースは珍しくなくなりました。
しかし、次のような違和感を覚えたことはないでしょうか。
• なぜこの判断になったのか分からない
• 結果は合っていそうだが、説明できない
• 間違えたときに責任を持てない
人間も間違えますが、人間の判断には「なぜそう考えたのか」という説明が伴います。
AIにも同じことを求めたくなるのは自然です。
そこで登場するのが 説明可能なAI(XAI: eXplainable AI) です。
本記事では、XAI手法の一つ LIME を、次のステップで紐解いていきます。
LIME理解のステップ
2.LIMEを数式なしで理解する
3.LIMEを数式から理解する
4.実例を用いて計算してみる
2. LIMEを数式なしで理解する
LIMEは一言でいうと、
難しいモデルを、近くの点だけ見て、人が理解できる"簡単なモデル"で近似して説明する
という方法です。
例えるなら「複雑な山道を"その場だけ直線で説明する"」
複雑な(非線形)モデルは、曲がりくねった山道のようなものです。
どこが上りで、どこが下りか、全体を見渡すのはとても大変です。
一方、簡単な(線形)モデルはまっすぐな一本道のようなものです。
「右に進めば上がる」「左に進めば下がる」と、誰でも直感的に分かります。
LIMEは何をしているかというと、
山道そのものを単純化するのではなく、「今いるこの場所の近くだけ」を取り出して、そこだけを直線の道として描き直す
という事をしています。
3. LIMEを数式から理解する
LIMEの代表的な数式表現(目的関数)は次の通りです:
$$\arg\min_{g \in \mathcal{G}} \sum_{i=1}^{N} \pi(\boldsymbol{x}_i,\boldsymbol{x}_0)\left( f(\boldsymbol{x}_i) - g(\boldsymbol{x}_i-\boldsymbol{x}_0) \right)^2+ \Omega(g)$$
「これだけ?」と思われる方もいれば、 知らない記号やたくさんの添え字が並んでいて、 「ここで読むのをやめたい」と感じている人もいるかもしれません。
そこで、この数式をいくつかの段階に分けて説明していきます。
なるべくシンプルに解説します
- $f$ は、元々のAIモデル(複雑なモデル)です。
例えるなら「山道」です。 - $g$ は、人が理解しやすいシンプルなモデルです。
今回は一次関数を利用するので「直線」に相当します。
この後、この$g$を求めていきます。つまり、LIMEの数式は
「複雑なモデル$f$のふるまいを、評価点の近くで一番よく真似する直線$g$を、どう決めているのか」
を表したものです。
まずは、余計な要素を省いた次の形を見てみましょう。
$$\arg\min_{g \in \mathcal{G}} \sum_{i=1}^{N} \left( f(\boldsymbol{x}_i) - g(\boldsymbol{x}_i-\boldsymbol{x}_0) \right)^2$$
3-1. 評価点と疑似点
- $\boldsymbol{x}_0$ は、AIの出力結果を説明したい 評価点(入力値) です。
- $\boldsymbol{x}_i(i=1,2,\dots,N)$ は、評価点 $\boldsymbol{x}_0$ の周辺に用意した 疑似点 です。
また、ここで $g$ の入力を $\boldsymbol{x}_i - \boldsymbol{x}_0$ としているのは、
「評価点 $\boldsymbol{x}_0$ を基準に、そこからどれだけズレたか」を説明したいからです。
この式で表していることは、意外とシンプルです。
各疑似点において、
$f$ と $g$ の出力の差の二乗をできるだけ小さくする $g$ を探している
だけです。
つまり「評価点の近くで、$f$ とできるだけ同じ振る舞いをする直線 $g$」を探しています。
3-2. 重み関数と正則化項
ここまで省略していたのが、次の2つです。
- 重み関数 $\pi(\boldsymbol{x}_i,\boldsymbol{x}_0)$
- 正則化項 $\Omega(g)$
重み関数:$\pi(\boldsymbol{x}_i,\boldsymbol{x}_0)$
これは、「どの疑似点をどれくらい重視するか」を決めるためのものです。
- 評価点 $\boldsymbol{x}_0$ に近い疑似点 → 重みを大きく
- 遠い疑似点 → 重みを小さく
つまり、「評価点の近くでの振る舞い」を特に重視する仕組みです。
正則化項:$\Omega(g)$
こちらは、説明モデル $g$ 自体に対する罰則のようなものです。
- 係数が極端に大きくなる
- 特定の疑似点だけに過剰に合わせた、不安定な説明になる
といったことを防ぎ、「シンプルで人が理解しやすい説明モデル」に保つ役割があります。
なお、今回下記に記載する具体例では説明を簡単にするため、この正則化項は実際の計算では使いませんが、「説明モデルをシンプルに保つための仕組み」として重要な要素です。
3-3. 説明モデルの集合
最後に説明モデルの集合 $\mathcal{G}$ です。
これは「説明モデルとして使ってよい関数の集合」を表しています。
つまり、
出力差が小さくなりさえすれば、どんなに複雑な関数でもよい
というわけではありません。
本来のLIMEの目的でもある
「人が理解できるシンプルな関数で近似する」
という制約を与えています。
今回は、「一次関数」のみを $\mathcal{G}$ としています。
ここまで理解できれば、LIMEの数式の意味としては十分だと思います。
4. 実例を用いて計算してみる
今回扱うAIモデル$f$は以前、私が投稿した 「任意の色が暖色か寒色かを判定するモデル」 です。
まず、今回扱うモデルに入る前に、少しだけ直感の話をします。
みなさんは、どんなときに「暖色っぽい」「寒色っぽい」と感じるでしょうか?
多くの方は、
- 赤が強くなると暖かく感じる
- 青が強くなると冷たく感じる
- 緑はその中間、もしくはやや寒色寄り
と感じるのではないでしょうか。
実は、これからLIMEで求める係数は、この「人間の感覚」を 数式として言語化した結果 になります。
それでは、この直感が数式としてどう現れるのかを、実際のモデルを使って確認していきましょう。
4-1. モデルの概要
色はR(Red)、G(Green)、B(Blue)の各成分を0から255の範囲で組み合わせて表されます。
$$\boldsymbol{x} = (R, G, B), \quad R,G,B \in {0,\dots,255}$$
モデルの内部(一次関数)
まず次の線形結合を計算します。
$$y(\boldsymbol{x})=0.6667R-0.5958G-0.4043B-0.0066$$
出力(シグモイド関数)
最終出力はシグモイド関数です。
\begin{align}
f(\boldsymbol{x}) &= \sigma(y) \\
&= \frac{1}{1 + e^{-y}}
\end{align}
• $f(\boldsymbol{x}) \geqq 0.5$:暖色
• $f(\boldsymbol{x}) < 0.5$:寒色
今回の $f$ は「線形 → 非線形」なAIモデルです。
詳細を確認したい方は、以下の記事をご覧ください。
紙とペンで挑んだ画像認識モデル ~ディープラーニングの世界を体験~
なぜこのモデルで LIME をやるのか?
率直に言います。実務的には、このモデルで LIME を使う意味はほぼありません。
理由は:
• 中身の係数がすべて分かっている
• 構造が単純
• 本来 LIME が必要とされる「複雑さ」がない
しかし、LIMEを理解する題材としては非常に良いと考えています。
• すべての数式が追える
• 近似の意味が可視化できる
• LIMEを深く理解できる
それでは、いよいよ実例を用いて、LIMEの原理を紐解いていきます。
改めて、LIMEの目的関数を記載します:
$$\arg\min_{g \in \mathcal{G}} \sum_{i=1}^{N} \pi(\boldsymbol{x}_i,\boldsymbol{x}_0)\left( f(\boldsymbol{x}_i) - g(\boldsymbol{x}_i-\boldsymbol{x}_0) \right)^2+ \Omega(g)$$
4-2. 評価点と疑似点の設定
今回、モデル$f$の出力結果を説明したい 評価点は次の色です。
$$\boldsymbol{x}_0 = (R_0,G_0,B_0) = (244,176,66)$$
この点で得られた
$$f(\boldsymbol{x}_0) \approx 0.5288$$
が 「なぜ暖色寄りと判定されたのか」 を説明するのが目的です。
擬似点(周辺の点)の作成
評価点の周りに RGB を ±10 ずらした 6 点を用意します。($N=6$)
\begin{aligned}
R_+ = \boldsymbol{x}_1 &= (254,176,66) \\
R_- = \boldsymbol{x}_2 &= (234,176,66) \\
G_+ = \boldsymbol{x}_3 &= (244,186,66) \\
G_- = \boldsymbol{x}_4 &= (244,166,66) \\
B_+ = \boldsymbol{x}_5 &= (244,176,76) \\
B_- = \boldsymbol{x}_6 &= (244,176,56)
\end{aligned}
これらの疑似点を判定モデル$f$に代入すると以下の出力結果になります:
\begin{aligned}
f(R_+) = f(\boldsymbol{x}_1) \approx 0.5354\\
f(R_-) = f(\boldsymbol{x}_2) \approx 0.5223\\
f(G_+) = f(\boldsymbol{x}_3) \approx 0.5230\\
f(G_-) = f(\boldsymbol{x}_4) \approx 0.5347\\
f(B_+) = f(\boldsymbol{x}_5) \approx 0.5249\\
f(B_-) = f(\boldsymbol{x}_6) \approx 0.5328
\end{aligned}
4-3. 説明モデルの設定
評価点の近くで、$f$とできるだけ同じ振る舞いをする直線$g$を設定していきます。
今回の簡易モデルは一次関数とします。そのため、 $g(x_i-x_0)$ は以下のように表せます。
説明モデルの形:
$$g(\boldsymbol{x}_i-\boldsymbol{x}_0) = g(\Delta R_i,\Delta G_i,\Delta B_i) = b + w_R \Delta R_i + w_G \Delta G_i + w_B \Delta B_i$$
| 変数 | 定義・説明 |
|---|---|
| $b$ | 切片 |
| $w_R,w_G,w_B$ | 局所的な影響度 (評価点$x_0$の近傍において、各成分が出力に与える影響の強さ) |
| $\Delta R_i$ | $R_i - R_0$ (評価点$x_0$を基準にした$R$成分の変化量) |
| $\Delta G_i$ | $G_i - G_0$ (評価点$x_0$を基準にした$G$成分の変化量) |
| $\Delta B_i$ | $B_i - B_0$ (評価点$x_0$を基準にした$B$成分の変化量) |
$f$ と $g$ は完全に別のモデルです。
LIMEで実施したいことは、この$b$と$w_R,w_G,w_B$を求めることです。
4-4. 重み関数
重み関数は$ \pi(\boldsymbol{x}_i,\boldsymbol{x}_0)$は以下のように表せます。
$$ \pi(\boldsymbol{x}_i,\boldsymbol{x}_0) = \exp\left( -\frac{||\boldsymbol{x}_i-\boldsymbol{x}_0||^2}{\sigma^2} \right)$$
| 変数 | 定義・説明 |
|---|---|
| $||\boldsymbol{x}_i-\boldsymbol{x}_0||^2$ | 評価点$x_0$と疑似点$x_i$との距離の2乗 |
| $\sigma$ | 今回は10とする (「どこまでを近いとみなすか」を決めるスケール) |
| $\exp(X)$ | $e^X$ |
今回は評価点と疑似点の距離は等しく10であるため、以下の結果となります:
• $||\boldsymbol{x}_i-\boldsymbol{x}_0||^2 = 10^2 = 100$
• $\sigma = 10$
\begin{aligned}
\pi(\boldsymbol{x}_i-\boldsymbol{x}_0) &= \exp\left( -\frac{\|\boldsymbol{x}_i-\boldsymbol{x}_0\|^2}{\sigma^2} \right) \\
&= \exp(-100/100) \\
&= e^{-1} \\
&\approx 0.3679
\end{aligned}
4-5. 正則化項(今回は使わない)
代表的な正則化項$\Omega(g)$は以下のように表せます。
$$\Omega(g) = \lambda ||\boldsymbol{w}||^2$$
| 変数 | 定義・説明 |
|---|---|
| $\boldsymbol{w}$ | 係数ベクトル。 今回は$\boldsymbol{w}=(w_R,w_G,w_B)$ |
| $||\boldsymbol{w}||^2$ | 係数ベクトルの大きさ。 今回は$w_R^2+w_G^2+w_B^2$ |
| $\lambda$ | 正則化係数(罰則の強さ)。 今回は0とする |
この正則化項はノイズを含む$f$に役立ちますが、今回は、次元が小さく点が対称のため、$\lambda=0$として、省略します。
ここまでで、材料は揃いました。
改めて、現状を記載します。
疑似点は$N=6$であり、正則化項$\Omega(g)=0$のため、LIMEの目的関数は以下となります。
$$\arg\min_{g \in \mathcal{G}} \sum_{i=1}^{6} \pi(\boldsymbol{x}_i,\boldsymbol{x}_0)\left( f(\boldsymbol{x}_i) - g(\boldsymbol{x}_i-\boldsymbol{x}_0) \right)^2$$
また、それぞれの要素に対し、先ほど定めた値を代入していきます。
$$\arg\min_{g \in \mathcal{G}} \sum_{i=1}^{6} e^{-1}\left( f(\boldsymbol{x}_i) - b - w_R \Delta R_i - w_G \Delta G_i - w_B \Delta B_i \right)^2$$
つまり、
$$\sum_{i=1}^{6} e^{-1}\left( f(\boldsymbol{x}_i) - b - w_R \Delta R_i - w_G \Delta G_i - w_B \Delta B_i \right)^2$$
に対し、誤差が最小となる$g$、すなわち$b$と$w_R,w_G,w_B$を求めていきます。
これは$i=1$の時の最小、$i=2$の時の最小。と1点ずつ解くのではなく、すべての疑似点をまとめて一気に解いていきます。
そこでまとめて解くために登場するのが行列です。
4-6. 行列を用いた誤差関数
ここからは、若干テクニック要素が強い箇所が出てきます。
さらっと読み進めて結果のみ確認いただいても問題ございません。
係数ベクトル:
\begin{aligned}
\boldsymbol{\beta}
&=
\begin{pmatrix}
b\\
w_R\\
w_G\\
w_B
\end{pmatrix}
\end{aligned}
入力行列:
X =
\begin{pmatrix}
1 & \Delta R_1 & \Delta G_1 & \Delta B_1 \\
1 & \Delta R_2 & \Delta G_2 & \Delta B_2 \\
1 & \Delta R_3 & \Delta G_3 & \Delta B_3 \\
1 & \Delta R_4 & \Delta G_4 & \Delta B_4 \\
1 & \Delta R_5 & \Delta G_5 & \Delta B_5 \\
1 & \Delta R_6 & \Delta G_6 & \Delta B_6 \\
\end{pmatrix}
=
\begin{pmatrix}
1 & +10 & 0 & 0 \\
1 & -10 & 0 & 0 \\
1 & 0 & +10 & 0 \\
1 & 0 & -10 & 0 \\
1 & 0 & 0 & +10 \\
1 & 0 & 0 & -10
\end{pmatrix}
$X\boldsymbol{\beta}$は、各点における説明モデル$g$の予測値となります。
出力ベクトル:
\boldsymbol{y} =
\begin{pmatrix}
f(\boldsymbol{x}_1)\\
f(\boldsymbol{x}_2)\\
\vdots\\
f(\boldsymbol{x}_6)
\end{pmatrix}
\approx
\begin{pmatrix}
0.5354\\
0.5223\\
0.5230\\
0.5347\\
0.5249\\
0.5328
\end{pmatrix}
$\boldsymbol{y} - X\boldsymbol{\beta}$は、各点の誤差ベクトルになります。
重み行列:
\begin{aligned}
W
& =
\pi(\boldsymbol{x}_i,\boldsymbol{x}_0)
=
\begin{pmatrix}
e^{-1} & 0 & 0 & 0 & 0 & 0 \\
0 & e^{-1} & 0 & 0 & 0 & 0 \\
0 & 0 & e^{-1} & 0 & 0 & 0 \\
0 & 0 & 0 & e^{-1} & 0 & 0 \\
0 & 0 & 0 & 0 & e^{-1} & 0 \\
0 & 0 & 0 & 0 & 0 & e^{-1} \\
\end{pmatrix} \\
&= e^{-1} I_6
\end{aligned}
※$I$:単位行列(対角成分が1で、それ以外の成分がすべて0の正方行列)
$W\left(\boldsymbol{y} - X\boldsymbol{\beta}\right)$は、誤差に重みをかけた形になります。
ここで、少し飛びますが以下の式がさきほどの$\Sigma$を含む誤差関数です:
$$\left(\boldsymbol{y} - X\boldsymbol{\beta}\right)^\top W \left(\boldsymbol{y} - X\boldsymbol{\beta}\right)$$
4-7. 誤差関数を最小にする
いよいよ大詰めです。
LIMEの式をこの形にまですることができました:
$$\arg\min_{\beta} \left(\boldsymbol{y} - X\boldsymbol{\beta}\right)^\top W\left(\boldsymbol{y} - X\boldsymbol{\beta}\right)$$
最小にするとは、誤差関数の勾配(各成分での偏微分)がすべて0になるところです。
つまり、今回はこの式に対し$\beta=\left( b,w_R,w_G,w_B \right)$で偏微分して0になるところです。
※ここでの「$\beta$で偏微分」とは、各成分$\left( b,w_R,w_G,w_B \right)$について同時に微分する、という意味です。
この計算式の導入は省きますが、結果以下のようになります:
$$\beta = \left(X^\top W X \right)^{-1} X^\top W \boldsymbol{y}$$
それでは、実際に$\beta$を求めるため、値を代入していきます。
まずは、 $X^\top W X $を計算します。
疑似点の対称性により重み行列が$W=e^{-1}I_6$となり、非常に計算がしやすくなります。
\begin{aligned}
X^\top W X
&=
e^{-1} X^\top X \\
&= e^{-1}
\begin{pmatrix}
6 & 0 & 0 & 0\\
0 & 200 & 0 & 0\\
0 & 0 & 200 & 0\\
0 & 0 & 0 & 200
\end{pmatrix}
\end{aligned}
その逆行列$(X^\top W X)^{-1}$は次の結果となります。
(X^\top W X)^{-1}
=
e
\begin{pmatrix}
\frac{1}{6} & 0 & 0 & 0\\
0 & \frac{1}{200} & 0 & 0\\
0 & 0 & \frac{1}{200} & 0\\
0 & 0 & 0 & \frac{1}{200}
\end{pmatrix}
次に$X^\top W y$を求めます。
\begin{aligned}
X^\top W y
&=e^{-1}X^\top y \\
&=e^{-1}
\begin{pmatrix}
\sum_{i=1}^{6} f(\boldsymbol{x}_i)\\
10(f\left(\boldsymbol{x}_1)-f(\boldsymbol{x}_2)\right)\\
10(f\left(\boldsymbol{x}_3)-f(\boldsymbol{x}_4)\right)\\
10(f\left(\boldsymbol{x}_5)-f(\boldsymbol{x}_6)\right)
\end{pmatrix}
\end{aligned}
数値代入すると:
\approx
e^{-1}
\begin{pmatrix}
3.17131\\
0.131\\
-0.117\\
-0.079
\end{pmatrix}
解(説明モデルの係数)
\begin{aligned}
\boldsymbol{\beta}
&= \left(X^\top W X \right)^{-1} X^\top W \boldsymbol{y} \\
&\approx ee^{-1}
\begin{pmatrix}
\frac{1}{6} & 0 & 0 & 0\\
0 & \frac{1}{200} & 0 & 0\\
0 & 0 & \frac{1}{200} & 0\\
0 & 0 & 0 & \frac{1}{200}
\end{pmatrix}
\begin{pmatrix}
3.17131\\
0.131\\
-0.117\\
-0.079
\end{pmatrix} \\
&\approx
\begin{pmatrix}
0.52855\\
0.000655\\
-0.000585\\
-0.000395
\end{pmatrix}
\end{aligned}
4-8. 結果と評価
上記の計算により、「評価点の近くで、$f$ とできるだけ同じ振る舞いをする直線 $g$」は次のように表すことができました。
\begin{aligned}
g(\boldsymbol{x}_i-\boldsymbol{x}_0)
&= g(\Delta R_i,\Delta G_i,\Delta B_i) \\
&= b + w_R \Delta R_i + w_G \Delta G_i + w_B \Delta B_i\\
&= 0.52855 + 0.000655 \Delta R_i -0.000585 \Delta G_i -0.000395 \Delta B_i
\end{aligned}
つまり、今回のLIMEによって得られた説明モデル$g$の係数から以下の事がいえます。
• w_R:正の値(赤成分が増えるほど暖色方向)
• w_G:負の値(緑成分が増えるほど寒色方向)
• w_B:負の値(青成分が増えるほど寒色方向)
これは直感とよく一致しています。
「赤っぽくなると暖かく感じ、青っぽくなると寒く感じる」という、人間の感覚を、数式の形で言語化できていると言えます。
5. おわりに
本記事では、実例を用いて、LIMEを数式のレベルから丁寧に紐解いていきました。
重要なのは、LIMEが「AIの中身を覗いた」のではなく、
評価点 $x_0$ の近くで、AIの振る舞いを人が理解できる言葉(一次関数)に翻訳した
という点です。
今回の例では、元のモデルが比較的シンプルだったため、説明モデルの係数は元の係数とよく似た値になりました。
しかし、これが複雑な非線形モデルであれば、
• 場所によって係数が変わる
• 「この色では赤が効くが、別の色では効きにくい」
といった 局所的な説明 が得られます。
それこそが、LIMEの本来の価値です。
なお、LIMEは万能ではありません。
疑似点の取り方や重み関数の設定によって、説明結果は変わります。
そのため、「唯一の正解」を与えるものではなく、あくまで人が理解するための補助線であることには注意が必要です。
最後まで読んでいただき、ありがとうございました。
参考文献
大坪直樹 [ほか] 共著, 『XAI(説明可能な)ー そのとき人工知能はどう考えたのか?』, リックテレコム, 2021.
