Shinonome Tech Blog

株式会社Shinonomeの技術ブログ
3 min read

最尤推定とクロスエントロピー誤差の関係

機械学習において、多クラス分類などでは、クロスエントロピー誤差を最小化するように学習させることがよくあります。今回、クロスエントロピー誤差を最小化することの統計的な意味について学んだのでそれを記事にしました。

shinonomeが運営するコミュニティ"PlayGround"で機械学習を勉強しているIshihiraです。
毎週行っている深層学習についての輪読会でクロスエントロピー誤差
$$ -\displaystyle\sum^N_{n=1}\sum^K_{k=1}d_{nk}\log y_k(\bf x_n; \bf w) $$
を最小化することの意味について勉強したので、それを紹介します。

記号の定義

記号 意味
$\boldsymbol x_n$ 入力データ
$\boldsymbol d_{n}$ n番目のデータの正解
$\bf w$ ネットワークのパラメータ
$y_k(\bf x_n;w)$ 入力$\bf x_n$、パラメータ$\bf w$に対するネットワークの出力

$d_n$のk番目の要素 $d_{nk}$ は正解のクラスで1、それ以外で0になります。例えば10個の数字を見分ける10クラス分類で正解が3のときの $d_n$ は、3番目だけ1の[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]です。

想定するタスク

ニューラルネットワークを利用して多クラス分類問題を解くこと

ネットワークの尤度関数

多クラス分類では出力層への活性化関数としてソフトマックス関数

$$ y_k \equiv z_k^{(L)}=\frac {\exp (u_k^{(L)})}{\sum^K_{j=1}\exp (u_j^{L})} $$

を使います。和が1で範囲が[0, 1]なので確率として解釈できます(後で詳しく触れます)。
今回は入力$ \boldsymbol x $ がクラスkに属するという事象を$ C_k $として、出力をデータが$ \bf x $だったときに$C_k$である事後確率

$$ p(C_k|\boldsymbol {x}) = y_k = z_k^{(L)} $$

とみます。
よって、 $d_n$のk番目の要素を$d_{nk}$ とすると、

$$ p(\boldsymbol d_n|\boldsymbol x) = \prod^K_{k=1}p(C_k|\boldsymbol x)^{d_{nk}} $$

と書けます。ネットワークの出力は$y_k(\bf x_n;w)$なので、これと合わせると、訓練データ
$ { ( \boldsymbol x_n, \boldsymbol d_n) }_{n=1,...,N} $に対する$\bf w$の尤度(Likelihood)は

$$ L(\boldsymbol w) =\prod^N_{n=1} p(\boldsymbol d_n|\boldsymbol x_n; \boldsymbol w) = \prod^N_{n=1} \prod^K_{k=1}p(C_k|\boldsymbol x_n)^{d_{nk}}= \prod^N_{n=1}\prod^K_{k=1}(y_k(\boldsymbol x; \boldsymbol w))^{d_{nk}} $$

になります。

尤度とクロスエントロピー誤差の関係

やっと本題。
尤度関数$ L(\boldsymbol w) $の対数をとり、その符号を反転します

$$ E(\boldsymbol w) = -\log(L(\bf w)) $$

$$ E(\boldsymbol w) = -\log(\prod^N_{n=1}\prod^K_{k=1}(y_k(\boldsymbol x; \boldsymbol w))^{d_{nk}}) $$

$$ E(\boldsymbol w) = -(\sum^N_{n=1}\sum^K_{k=1}d_{nk}\log y_k(\boldsymbol x_n; \boldsymbol w)) $$

最後の式はクロスエントロピー誤差の式です。
つまり学習によってクロスエントロピー誤差を最小にしようとしているとき、ネットワークはパラメータ$\boldsymbol w$のもとで$d_{n}$である尤度を最大にしようとしているわけですね($ d_n $である尤度が最大になる関数を近似しているともいえます)。

余談

ソフトマックス関数の出力が事後確率と見れることについての補足です。
定義から事後確率 $ p\left( C_k|\boldsymbol x \right) $ は
$$ p\left( C_k|\boldsymbol x \right) = \frac{p (\boldsymbol x, C_k)}{\sum^K_{j=1}p(\boldsymbol x, C_j)} $$
と書けますが、ここで $ u_k \equiv \log p(\boldsymbol x, C_k) $ とおくと
この確率は
$$ p(C_k|\boldsymbol x) = \frac{\exp(u_k)}{\sum^K_{j=1}\exp(u_j)} $$
と書き換えられます。
このとき、$p(\boldsymbol x, C_k) \in [0,1]$ から$ u_k \in \left(-\infty,0 \right] $ なので、 $u_k$ の値はこの範囲にないといけません。
ただ前の層の出力をソフトマックス関数に入力する場合、$u_k$ の値としてこの範囲にない値もあり得ますが、実際のところソフトマックス関数の入力には、前層の出力 $\boldsymbol u$ に対してオーバーフロー対策を施した $\boldsymbol u'$ を入力します。(下式)($u_k'$, $u_k$は $\boldsymbol u'$, $\boldsymbol u$ のk番目の値)
$$u_k' = u_k - u_{max}$$

したがって $u_k \in (-\inf, 0]$ が保証され、ソフトマックス関数の出力を事後確率と見ることができることがわかりますね。
オーバーフロー対策についての詳細はこちら

おわりに

機械学習の分野は割と環境が整っていて、よく中身を知らなくても使えたりしてあとから使っていたものの意味を知るみたいなことがよくあります。最初から意味がわかればいいんですが、なじんだ後でその意味を知るというのも、それはそれでめちゃくちゃ面白いです。今後も頑張ります。
ちなみにサムネイルはデザインコースのAyato君が作ってくれました。