誤差逆伝搬法について勉強してみた [2018-05-30]

主に誤差逆伝播法に関するメモ。

※ 機械学習については何の経験もない素人による学習メモです。信用しないように。

ニューラルネットワーク

i 層目の j 番目のパーセプトロンを \(p^i_j\) と表すことにする。

\(p^i_j\)\(p^{i-1}_k\) を結ぶ重みを \(w^i_{jk}\) と表すことにする。 また、\(p^i_j\) のバイアスを \(b^i_j\) と表すことにする。

このとき \(p^i_j\) の出力は次式で表される。

\[\begin{split}\xi^i_j &= \sum_k w^i_{jk}x^{i-1}_k + b^i_j \\ x^i_j &= \phi(\xi^i_j)\end{split}\]

ここで \(\phi\) はシグモイド関数または ReLU 関数が用いられることが一般的。 また \(x^0_j\) は入力信号とする。

n 層目を出力層とすると、\((x^n_j)_j\) のうち最大出力となるインデックスが ニューラルネットワークの判定結果となる。

学習と損失関数

教師データとは、入力信号 \(\{x^0_j\}\) に対する正解インデックス \(m\) のペアである。

損失関数とは、現状のニューラルネットワークの出力と教師データとのズレを表す関数である。

学習とは、損失関数を最小化するような \(w^i_{jk}, b^i_j\) を探索する行為である。

学習のためには、重みやバイアスに対する損失関数の勾配(gradient)が必要となる。 誤差逆伝播法とは、この勾配を高速に求めるための手法である。

損失関数などは、誤差逆伝播法がシンプルになるように恣意的に考案されたものが用いられる。

one-hot 表現

教師データの正解インデックス \(m\) に対して、次のように \(t_k\) を定める。

\[\begin{split}t_k = \left\{\begin{array}{cc} 1 & (k = m) \\ 0 & (k \neq m)\end{array}\right.\end{split}\]

これを one-hot 表現という。

softmax 関数

出力層 \(x^n_k\) に対して次のような softmax 関数を施す。

\[y_j = \frac{e^{x^n_j}}{\sum_k e^{x^n_k}}\]

式からわかるように、

  • \(0 < y_j < 1\) であり、one-hot 表現との差を考えるのに適している
  • softmax 関数を施しても最大出力となるパーセプトロンは変わらない

この関数は、あとで説明する誤差逆伝播法において式がシンプルになるように恣意的に 考案されたものではないかと思う。

交差エントロピー誤差

\[E = -\sum_j t_j \log y_j\]

ここで \(t_k\) が one-hot 表現だとすると、

\[E = -\log y_m\]

これも誤差逆伝播法において式がシンプルになるように恣意的に考案されたものではないかと思う。

誤差逆伝播法

学習のために損失関数の勾配を求めることが目的。 つまり、

\[\frac{\partial E}{\partial w^i_{jk}},\quad \frac{\partial E}{\partial b^i_j}\]

を求めることが目的。

ここでは次のように損失関数の全微分を書き下すことを目指す。

\[dE = \sum_i \sum_j \left( \sum_k\frac{\partial E}{\partial w^i_{jk}}dw^i_{jk} + \frac{\partial E}{\partial b^i_j}db^i_j \right)\]

出力層による微分

出力層の値を用いると損失関数の全微分は次式で与えられる。

\[dE = \sum_j \frac{\partial E}{\partial x^n_j} dx^n_j\]

まずは次の微分を求めることを目的としよう。

\[\frac{\partial E}{\partial x^n_j} = \sum_k\frac{\partial y_k}{\partial x^n_j} \frac{\partial E}{\partial y_k}\]

ここで、交差エントロピー誤差の微分は次式となる。

\[\frac{\partial E}{\partial y_k} = -\frac{t_k}{y_k}\]

次に softmax 関数の微分は次式となる。

\[\begin{split}\begin{array}{ll} \frac{\partial y_k}{\partial x^n_j} &= \frac{\partial}{\partial x_j^n}\left(\frac{e^{x_k^n}}{\sum_l e^{x_l^n}}\right) \\ &= \frac{\partial (e^{x_k^n})}{\partial x^n_j}\frac{1}{\sum_l e^{x_l^n}} - e^{x_k^n}\frac{e^{x_j^n}}{(\sum_l e^{x_l^n})^2} \\ &= \delta_{jk}y_j - y_k y_j \\ &= (\delta_{jk} - y_k)y_j \end{array}\end{split}\]

\(\delta_{jk}\) はクロネッカーのデルタ。

これらを合わせると次式が得られる。

\[\begin{split}\begin{array}{ll} \frac{\partial E}{\partial x^n_j} &= \sum_k (\delta_{jk} - y_k)y_j\cdot\left(-\frac{t_k}{y_k}\right) \\ &= \sum_k \left(y_j t_k - \delta_{jk}\frac{y_j}{y_k}t_k\right) \\ &= (\sum_k t_k)y_j - t_j \\ &= y_j - t_j \end{array}\end{split}\]

ここで \(\sum_k t_k =1\) を用いた(\(t_k\) は one-hot 表現)。

以上より損失関数の全微分は次式で与えられる。

\[dE = \sum_j(y_j - t_j)dx^n_j\]

パーセプトロン出力値の微分

\(p^i_j\) の出力は次式で表されるのであった。

\[\begin{split}\xi^i_j &= \sum_k w^i_{jk}x^{i-1}_k + b^i_j \\ x^i_j &= \phi(\xi^i_j)\end{split}\]

これを全微分すると次式となる。

\[dx^i_j = \phi'(\xi^i_j)\left\{ \sum_k\left(w^i_{jk}dx^{i-1}_k + x^{i-1}_k dw^i_{jk}\right) + db^i_j \right\}\]

この式にあらわれている \(dx^{i-1}_k\) に対して再帰的に全微分を施すことにより、最終的には \(dw^i_{jk}, db^i_j\) の線形和として全微分を書き下すことができる。

ここで \(\phi\) をシグモイド関数とする。

\[x^i_j = \phi(\xi^i_j) = \frac{1}{1 + \exp(-\xi^i_j)}\]

この微分は次式で与えられる。

\[\begin{split}\frac{dx^i_j}{d\xi^i_j} &= -\frac{1}{(1 + \exp(-\xi^i_j))^2}(-\exp(-\xi^i_j)) \\ &= (x^i_j)^2\exp(-\xi^i_j) \\ &= x^i_j(1 - x^i_j)\end{split}\]

これを代入すると、パーセプトロンの全微分は次式となる。

\[dx^i_j = x^i_j(1 - x^i_j)\left\{ \sum_k\left(w^i_{jk}dx^{i-1}_k + x^{i-1}_k dw^i_{jk}\right) + db^i_j \right\}\]