マイノート

いろいろ勉強したことをまとめていきます

MENU

バックプロパゲーションの更新式の導出

※これから、もう少し綺麗にしていきます

フィードフォワード型のニューラルネットを実装しようとしたときに、

バックプロパゲーションの式展開が思い出すのに時間かかったのでメモ。

活性化関数はsigmoid関数としている。

バックプロパゲーションの更新式の導出

f:id:ttt242242:20170102111239j:plain:w300

図の記号の説明

{w_{i,j}} はノードiとjを接続するリンクの重み。

{u_{j}}は、ノード{j} に伝搬された値を示している。 言い換えれば、ノード{j} に接続しているリンクとノードの積の総和を表している。 つまり、数式的には以下のようになる

\begin{equation} u_j = \sum_{i}^{Ln} w_{i,j} o_i + b_j \end{equation}

{o_{j}}は、ノード{j} の入力{u_{j}}を活性化関数の引数としたときの値である。

{w_{i,j}}の更新式

\begin{equation} w_{i,j} = w_{i,j} + \Delta w_{i,j} \end{equation}

{
\Delta w_{i,j}
} は接続先が出力層の場合と、 接続先が中間層の場合で異なる。

リンクの接続先が出力層の場合

\begin{equation} w_{i,j} = w_{i,j} - \upsilon (- (y_j - o_j) o_j (1 - o_j) ) o_i \end{equation}

リンクの接続先が中間層の場合

\begin{equation} w_{i,j} = w_{i,j} - \upsilon ({ \sum_{k}^{Ln} \delta_j w_{k,i}} o_j (1 - o_j) ) o_i \end{equation}

これから上記の式の導出を行う

導出

リンクの接続先が出力層の場合

{\Delta w_{i,j}}{E} をリンクの勾配で求めることができる

\begin{equation} \Delta w_{i,j} = - \upsilon \frac{\partial E}{\partial w_{i,j}} \end{equation}

合成関数の微分

\begin{equation} = - \upsilon \frac{\partial E}{\partial u_j} \frac{\partial u_j}{\partial w_{i,j}} \end{equation}

{\frac{\partial u_j}{\partial w_{i,j}}} の式展開は下にある式展開補足を参照。

\begin{equation} = - \upsilon \frac{\partial E}{\partial u_j} o_i \end{equation}

ここで、

\begin{equation} \delta_j = \frac{\partial E}{\partial u_j} \ \end{equation}

とおくと、

\begin{equation} \Delta w_{i,j} = - \upsilon \delta_j o_i \end{equation}

また、{\delta_j}を展開すると

\begin{equation} \delta_j = \frac{\partial E}{\partial u_j} \ = \frac{\partial E}{\partial o_j} \frac{\partial o_j}{\partial u_j} \end{equation}

{\frac{\partial E}{\partial o_j}}{\frac{\partial o_j}{\partial u_j}} は下の補足の式展開参照。

\begin{equation} = - (y_j - o_j) o_j (1 - o_j) \end{equation}

リンクの接続先が中間層の場合

f:id:ttt242242:20170102111247j:plain:w300

接続しているノードから伝搬してきた誤差の総和を用いるため、以下のようになる。

\begin{equation} \delta_i = { \sum_{k}^{Ln} \delta_j w_{k,i}} o_j (1 - o_j) \end{equation}

式展開補足

{u_j} は以下のようになる。

\begin{equation} u_j = \sum_{i}^{Ln} w_{i,j} o_i + b_j \end{equation}

{w_{i,j}}微分してやると、

\begin{equation} \frac{\partial u_j}{\partial w_{i,j}} = \frac{\partial (\sum_{i}^{Ln} w_{i,j} o_i + b_j) }{\partial w_{i,j}} \ = o_i \end{equation}

教師データと出力値の二乗誤差{E}

\begin{equation} E = \frac{1}{2} \sum_{i}^{Ln} (y_i - o_i)^2 \end{equation}

微分してやると、

\begin{equation} \frac{\partial E}{\partial o_j} = - (y_j - o_j) \end{equation}

以下、はシグモイド関数微分

\begin{equation} \frac{\partial o_j}{\partial u_j} = o_j (1 - o_j) \end{equation}

参考文献

http://ipr20.cs.ehime-u.ac.jp/column/neural/chapter6.html

http://www-ailab.elcom.nitech.ac.jp/lecture/neuro/bp3.html

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)