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

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

誤差逆伝播法

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

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

を求める必要があります。これまで線形識別などで誤差の勾配を求めて最適化したのと同じことですね。この偏微分係数を求めるアルゴリズムとして誤差逆伝播法という手法があります。今回はこの誤差逆伝播法の計算手法についてです。

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

f:id:opabinia2:20190117215730p:plain

m番目の層の1つの素子が、重みw_{kj}を介して第n番目の層の素子に接続されているとします。それぞれの出力ユニット活性はa_{j},a_{k}であるとします。活性化関数はhとします。(参考:ニューラルネットワークの概要

まず誤差E_na_{j}での偏微分を考えます。E_nは第n層の出力ユニット活性の関数になっていると考えることができ、第n層の素子の総数をKとすれば、E_n=f(a_1,\cdots,a_K)と書くことができます。ちょっと紛らわしい書き方ですけど、a_1,\cdots,a_Kは第n層の出力ユニット活性を表しており、第m層のa_{j}は含まれないとします。また、a_{k}a_{j}の関数になっていると考えることができ、これをa_{k}=g_k(a_{j})とします。a_{j}と接続されている全ての第n層の出力ユニット活性に対して同様のことがいえますので、

 E_n = f(g_1(a_{j}),g_2(a_{j}),\cdots,g_K(a_{j})) \tag{2}

という合成関数になっているといえます。したがって

 
\begin{eqnarray*}
\displaystyle \frac{\partial E_n}{\partial a_{j}} &=& \frac{\partial f}{\partial g_{1}}\frac{\partial g_1}{\partial a_{j}} + \cdots +\frac{\partial f}{\partial g_{K}}\frac{\partial g_K}{\partial a_{j}}  \tag{3} \\
\displaystyle &=& \sum_{k} \frac{\partial f}{\partial g_{k}}\frac{\partial g_k}{\partial a_{j}} \tag{4} \\
\displaystyle &=& \sum_{k} \frac{\partial f}{\partial a_{k}}\frac{\partial a_k}{\partial a_{j}} \tag{5} \\
\end{eqnarray*}

です。

次にE_nの重みw_{kj}での偏微分を考えます。E_na_{k}の関数であり、a_{k}w_{kj}の関数ですから、先ほどと同様にして合成関数の微分より

 
\displaystyle \frac{\partial E_n}{\partial w_{kj}} =  \frac{\partial E_n}{\partial a_{k}}\frac{\partial a_k}{\partial w_{kj}} \tag{6} \\

です。w_{kj}と接続されている素子は1つだけですから、式(5)と違って和ではありません。

さて、出力ユニット活性a_jに活性化関数hを通したh(a_j)が出力でしたので、

 \displaystyle a_k = \sum_{j} w_{kj} h(a_j) \tag{7}

です。そして、

 \displaystyle \delta_k = \frac{\partial E_n}{\partial a_{k}} \tag{8}

と定義すれば、式(5)、(7)より

 
\begin{eqnarray*}
\displaystyle \delta_j &=&  \frac{\partial E_n}{\partial a_{j}} \tag{9} \\
&=& \sum_{k} \frac{\partial f}{\partial a_{k}}\frac{\partial a_k}{\partial a_{j}} \tag{10}\\
&=& \sum_{k} \delta_k w_{kj} h^{\prime}(a_j) \tag{11} \\
&=& h^{\prime}(a_j) \sum_{k} \delta_k w_{kj}  \tag{12} \\
\end{eqnarray*}

です。この式は、ある層の\deltaが計算できれば、その1つ前の層の\deltaも求めることができることを意味しています。回帰、2クラス分類、多クラス分類のモデルにおいて、最後の層の\deltaは既に確認済みです。(参考:出力ユニット活性で微分(回帰)出力ユニット活性で微分(2クラス分類)出力ユニット活性で微分(多クラス分類)) よって、式(12)を使えば全ての\deltaが計算可能になります。なお\deltaは誤差と呼ばれるようです。

さて、今求めたかったのは\deltaではなく式(1)の \displaystyle \frac{\partial E_n}{\partial w_{ij}}でした。これは式(6)、(7)、(8)を使えば

 
\begin{eqnarray*}
\displaystyle \frac{\partial E_n}{\partial w_{kj}} &=&  \frac{\partial E_n}{\partial a_{k}}\frac{\partial a_k}{\partial w_{kj}} \tag{13}\\
&=& \delta_k h(a_j) \tag{14}
\end{eqnarray*}

です。

これでニューラルネットワークの誤差E_nの勾配が計算可能になります。以上のような計算手順を誤差逆伝播法と呼びます。最後の層の\deltay-tで、まさに誤差を表しており、これを使って前の層の\deltaを次々に計算していくから誤差逆伝播、、、なのだと思います。