クロスエントロピー

2015-12-19

Neural networks and deep learningの3章、Improving the way neural networks learn で、ニューラルネットワークの学習を改善する手法がいろいろ述べられていて、 クロスエントロピーコスト関数 で二乗誤差とは別のコスト関数について書かれている。

クロスエントロピーコスト関数

簡単な例で、二乗誤差のコスト関数で学習する時に ニューロンが出力する値が期待される値と大きく違う場合に 学習が遅いことを示す。

これはコスト関数の微分に\(\sigma(z)^\prime\)が含まれているからで、 シグモイド関数が飽和している領域だと学習が遅くなってしまう。

コスト関数としてクロスエントロピーを導入する:

$$ C(\mathbf{x}) = y \ln a + (1 - y) \ln (1 - a) $$

  • 非負
  • すべての学習パターンに対するニューロンの出力結果と期待される出力が近い場合に0となる

関係するのは出力層のデルタを求めるところのみで、 誤差逆伝播法で中間層に誤差を伝播していく計算は変わらない。

出力層のニューロンの活性関数がシグモイドじゃなくてリニア関数だった場合には、 デルタにシグモイドの微分が入ってこないので、問題は起こらない。

クロスエントロピーの微分

クロスエントロピー\(C\)を\(z^{l}_j\)で微分した値\(\delta^L_j\)を計算するには、 チェインルールで\(a^L_j\)を使って:

$$ \delta^L_j = \frac{\partial C}{\partial z^L_j} = \frac{\partial C}{\partial a^L_j} \cdot \frac{\partial a^L_j}{\partial z^L_j} \ $$

\(\frac{\partial C}{\partial a^L_j}\) を計算:

$$ \begin{align*} \frac{\partial C}{\partial a^L_j} &= \frac{\partial}{\partial a^L_j} \left\lbrace y \ln a^L_j + (1 - y) \ln (1 - a^L_j) \right\rbrace \\ &= y \frac{1}{a^L_j} - (1 - y) \frac{1}{1 - a^L_j} \\ &= \frac{y(1 - a^L_j) - (1 - y) a^L_j}{a^L_j (1 - a^L_j)} \\ &= \frac{y - y a^L_j - a^L_j + y a^L_j}{a^L_j (1 - a^L_j)} \\ &= \frac{y - a^L_j}{a^L_j (1 - a^L_j)} \\ \end{align*} $$

\(\frac{\partial a^L_j}{\partial z^L_j}\) は、\(a^L_j = \sigma (z^L_j)\)で、 シグモイド関数の微分は:

$$ \begin{align*} \sigma(z)^\prime &= \left( \frac{1}{1 + e^{-z}} \right)^\prime \\ &= \left( (1 + e^{-z}) ^ {-1} \right)^\prime \\ &= -1 (1 + e^{-z}) ^ {-2} \cdot (-1) e^{-z} \\ &= \frac{e^{-z}}{(1 + e^{-z})^2} \\ &= \frac{1}{1 + e^{-z}} \cdot \frac{e^{-z}}{1 + e^{-z}} \\ &= \frac{1}{1 + e^{-z}} \cdot \frac{1 + e^{-z} - 1}{1 + e^{-z}} \\ &= \frac{1}{1 + e^{-z}} \cdot \left( 1 - \frac{1}{1 + e^{-z}} \right) \\ &= \sigma(z) \cdot \left( 1 - \sigma(z) \right) \\ \end{align*} $$

より、

$$ \begin{align*} \frac{\partial a^L_j}{\partial z^L_j} &= \sigma(z^L_j) \cdot \left( 1 - \sigma(z^L_j) \right) \\ &= a^L_j \cdot \left( 1 - a^L_j \right) \end{align*} $$

これを式に代入すると:

$$ \begin{align*} \delta^L_j &= \frac{\partial C}{\partial a^L_j} \cdot \frac{\partial a^L_j}{\partial z^L_j} \\ &= \left\lbrace \frac{y - a^L_j}{a^L_j (1 - a^L_j)} \right\rbrace \cdot \left\lbrace a^L_j (1 - a^L_j) \right\rbrace \\ &= y - a^L_j \end{align*} $$

と、\(\sigma(z)^\prime\)が出てこないきれいな式になる。

この結果を誤差逆伝播法の出力層に当てはめればよい。