ベイジアン研究所

プログラミング言語(アルゴリズム的な話が中心)やガジェットの紹介をしています。時々心理学の話も。

【深層学習入門】誤差逆伝播法編

1. 記事の目的
以下の記事でニューラルネットワークの学習方法に関して概略的な解説を行なった。本記事ではニューラルネットワークの学習方法に関し、より具体的に誤差逆伝播法と呼ばれる方法に関して解説を行う。

camelsan.hatenablog.com

2. 概要
ニューラルネットワークの学習方法は、上記の記事で述べた通りだが、微分(勾配値)をプログラムの上でどのように計算するか、を説明できるのが誤差逆伝播法である。つまりニューラルネットワークの学習方法に関して、どのように実装されているかということである。各層の重みに関する勾配値を出力値から、順番に後ろの層から伝播されているように見えることから、このような名称がついている。

3. ニューラルネットワークの設定
図1のような3層からなるニューラルネットワークを考える(3層以上でも考え方は同じ)。

f:id:camelsan:20210117113202p:plain
図1 ニューラルネットワーク
損失関数を2乗和誤差とする。すなわち

E=\frac{1}{2}\displaystyle\sum_{k=1}^c (z_k-t_k)^2

とする。また、各層の活性化関数をシグモイド関数とする。すなわち

s(u)=\frac{1}{1+\mathrm{e}^{-u}}

とする(グラフを図2に示す)。

f:id:camelsan:20210117114216p:plain
図2 シグモイド関数(参考文献[1]より引用)
ここで、シグモイド関数微分は次のようになる(微分の形が分かりやすいという点で選択している)。

s^{'}(u)=s(u)(1-s(u))

以上の設定のもとで隠れ層と出力層を繋ぐ重み、入力層と隠れ層を繋ぐ重みに関する損失関数の勾配値を求める。

4. 誤差逆伝播法による勾配の計算
中間層の出力y_jは次のように計算される。

y_j = s(net_j), net_j=\displaystyle\sum_{i=1}^d w_{ij}x_i

また、出力層の出力z_kは次のように計算される。

z_k = s(net_k), net_k=\displaystyle\sum_{j=1}^d w_{jk}y_j

損失関数Ew_{jk}に関する偏微分を求める。偏微分のチェインルールより、

\frac{\partial E}{\partial w_{jk}}=\frac{\partial E}{\partial net_k}\frac{\partial net_k}{\partial w_{jk}}=\epsilon_k y_j

となる。ただし、

\epsilon_k=\frac{\partial E}{\partial net_k}=\frac{\partial E}{\partial z_k}\frac{\partial z_k}{\partial net_k}=\frac{\partial E}{\partial z_k}s^{'}(net_k)

である。損失関数とシグモイド関数微分を計算すると、

\frac{\partial E}{\partial z_k}=z_k-t_k, s^{'}(net_k)=s(net_k)(1-s(net_k))=z_k(1-z_k)

より、\epsilon_kは以下のようになる。

\epsilon_k=\frac{\partial E}{\partial z_k}s^{'}(net_k)=(z_k-t_k)z_k(1-z_k)

したがって、\frac{\partial E}{\partial w_{jk}}は次のようになる。

\frac{\partial E}{\partial w_{jk}}=(z_k-t_k)z_k(1-z_k)y_j

上式の左辺を見ると、隠れ層と出力層の間の重みに関する損失関数の勾配を、出力値から求めることができる(さらに微分値を四則演算のみで求められているので、プログラムで実装も可能である)。

続いて、損失関数Ew_{jk}に関する偏微分を求める。偏微分のチェインルールより、

\frac{\partial E}{\partial w_{ij}}=\frac{\partial E}{\partial net_j}\frac{\partial net_j}{\partial w_{ij}}=\epsilon_j x_i

となる。ここで、

\epsilon=\frac{\partial E}{\partial net_j}=\displaystyle\sum_{k=1}^c  \{\frac{\partial E}{\partial z_k}\frac{\partial z_k}{\partial net_k}\frac{\partial net_k}{\partial y_j}\}\frac{\partial y_j}{\partial net_j}=\displaystyle\sum_{k=1}^c\{\epsilon w_{jk}\}s^{'}(net_j)

である。s^{'}(net_j)=y_j(1-y_j)より、\epsilon_kは次のようになる。

\epsilon_k=(\displaystyle\sum_{k=1}^c (z_k-t_k)z_k(1-z_k)w_{jk})y_j(1-y_j)

従って、\frac{\partial E}{\partial w_{ij}}は、

\frac{\partial E}{\partial w_{ij}}=(\displaystyle\sum_{k=1}^c (z_k-t_k)z_k(1-z_k)w_{jk})y_j(1-y_j)x_i

となる。上式を見ると前の層の重みや出力値から勾配値を求めることができることがわかる。

5. 参考文献
[1] Wikipedia シグモイド関数
https://ja.wikipedia.org/wiki/シグモイド関数
[2] ディジタル画像処理