機械学習に詳しくなりたいブログ

機械学習や数学について勉強した内容を中心に書きます。100%趣味です。記事は数学的に厳密でなかったり誤りを含んでいるかもしれません。ご指摘頂ければ幸いです。

誤差逆伝播法

ニューラルネットワークの概要

概要はこちらです。

www.iwanttobeacat.com

ニューラルネットワークの最適化課題

ニューラルネットワークモデルの重みパラメータを最適化するためには、誤差E_nの各パラメータに対する偏微分

 \displaystyle \frac{\partial E_n}{\partial w_{ij}} \tag{1}

を求める必要があります。これまで線形識別などで誤差の勾配を求めて最適化したのと同じことです。しかしネットワークモデルが複雑になれば、この偏微分の計算は非常に煩雑になっていきます。この課題を解決するアルゴリズムが誤差逆伝播法です。今回はこの誤差逆伝播法の計算手法についてです。

誤差逆伝播法

以下のようなニューラルネットワークの部分図を考えます。

図.1

m番目の層の1つの素子が、重みw_{kj}を介して第n番目の層の素子に接続されているとします。それぞれの出力ユニット活性(つまり素子への入力)はa_{j}^{(m)},a_{k}^{(n)}であるとします。活性化関数はhとします。

上記のモデルにおいて、E_nの重みw_{kj}での偏微分を考えます。同じ文字を使ってわかりにくくしてしまいましたが、E_nの添字nは、層の番号ではなくn番目のサンプルデータであることを表しています。

具体的なモデルで示せば、いま下図の黄色の線に関する重みでの偏微分を考えているとします。この重みは、青色の素子を介して出力に影響します。出力は青色素子の関数、そしてさらに青色素子は重み係数の関数という合成関数の関係であるといえます。

図.2

図.1の一般的な例でいえば、w_{kj}が黄色の重みに相当し、これはa_{k}^{(n)}(青色素子)を介してのみE_nに影響を与えるいという合成関数の関係になっています。よって合成関数の微分を適用すれば、

 
\displaystyle \frac{\partial E_n}{\partial w_{kj}} =  \frac{\partial E_n}{\partial a_{k}^{(n)}}\frac{\partial a_k^{(n)}}{\partial w_{kj}} \tag{2} \\

のように計算できます。ここで、

 
\displaystyle \delta_k = \frac{\partial E_n}{\partial a_{k}^{(n)}} \tag{3}

と定義します。この\delta_kは素子kの誤差と呼びます。\delta_kを用いれば、式(2)は

 
\displaystyle \frac{\partial E_n}{\partial w_{kj}} = \delta_k \frac{\partial a_k^{(n)}}{\partial w_{kj}} \tag{4} \\

と書けます。

さて、a_k^{(n)}は、前段の層の全ての出力に対してそれぞれ対応する重みwをかけたものであり、出力は活性化関数hを通したものですから、

 \displaystyle a_k^{(n)} = \sum_{j} w_{kj} h(a_j^{(m)}) \tag{5}

です。これをw_{kj}で微分すると、w_{kj}と接続しているa_j^{(m)}以外の項は全て0になりますから、

 
\displaystyle \frac{\partial a_k^{(n)}}{\partial w_{kj}} =  h(a_j^{(m)}) \tag{6} \\

となります。よって、式(4)は

 
\displaystyle \frac{\partial E_n}{\partial w_{kj}} = \delta_k h(a_j^{(m)}) \tag{7} \\

となります。

これで、目的であった各重みパラメータでの偏微分が求めることができました。ここでh(a_j^{(m)})というのはニューラルネットワークのある素子の出力ですから簡単に計算可能です。あとは\delta_kが計算できれば良いことになります。

そこで次に\delta_j、つまり誤差E_na_{j}^{(m)}での偏微分を考えます。再び下図のように具体的なモデルで示します。

図.3

先程は計算の過程で青色の層の誤差\delta_kが出てきましたが、今度はその前段の黄色の層の誤差を考えます。そして黄色の素子の入力は、結合する次の層の素子を介してE_nに影響を与えます。さきほどと同様、出力は青色素子の関数、そしてさらに青色素子は黄色素子の関数という合成関数の関係であるといえます。図.1のモデルでいえば、黄色の素子への入力がa_{j}^{(m)}、それと結合する青色素子がn層の素子となり、a_{j}^{(m)}はこれらの素子を介して出力に影響します。よって、それら素子に対して合成関数の微分則を適用すれば、

 
\begin{eqnarray*}
\displaystyle \delta_j &=&  \frac{\partial E_n}{\partial a_{j}^{(n)}}  \tag{8} \\
\displaystyle &=& \sum_{k} \frac{\partial E_n}{\partial a_{k}^{(n)}}\frac{\partial a_k^{(n)}}{\partial a_{j}^{(m)}}  \tag{9} \\
\displaystyle &=& \sum_{k} \delta_k \frac{\partial a_k^{(n)}}{\partial a_{j}^{(m)}} \tag{10} \\
\end{eqnarray*}

と計算でき、ある層の誤差は、その次の層の誤差から求められる関係にあることがわかります。

さて、式(5)をa_{j}^{(m)}で微分すれば、

 
\displaystyle \frac{\partial a_k^{(n)} } { \partial a_{j}^{(m)}} = w_{kj} h^{\prime}(a_j^{(m)}) \tag{11}

ですので、これを式(10)に代入すれば、

 
\begin{eqnarray*}
\displaystyle \delta_j = h^{\prime}(a_j^{(m)}) \sum_{k} \delta_k w_{kj}  \tag{12} \\
\end{eqnarray*}

となります。

この式は、ある層の\deltaが計算できれば、その1つ前の層の\deltaも求めることができることを意味しています。\deltaが求められれば、式(7)によって各重みwに関する偏微分も計算可能です。 以上のような計算手順を誤差逆伝播法と呼びます。最後の層、つまり出力の誤差\deltaが後に示すようにy-tで、まさに誤差を表しており、これを使って前の層の\deltaを次々に計算していくから誤差逆伝播、、、なのだと思います。

各モデルにおける出力誤差

回帰、2クラス分類、多クラス分類のモデルにおいて、出力の\deltaは次の記事で計算しています。この結果を用いれば、最後の層の誤差から辿り、全ての誤差が計算可能になります。

www.iwanttobeacat.com

www.iwanttobeacat.com

www.iwanttobeacat.com