🧠

ニューラルネットワーク基礎(Part 2:Back Propagation)

に公開

Back Propagation とは

前述より,重みと閾値はランダムに初期化され,学習データに基づいて調整される.ニューラルネットワークが望ましい出力をするために,重みを調整する必要がある.Back Propagation法は,それを行う手法である.

Back Propagation の導出

入力層I,中間層J,出力層Kそれぞれ1つの3層ニューラルネットワークを考える.前向き計算で示した式より,ニューロンの出力をo,閾値を\theta,積和をX,シグモイド関数をf(x),とすると,層Kにおけるニューロンkの出力、いわゆるニューラルネットワークの出力を以下の式で示す.

\begin{align} X_k =& \sum_{j=1}^{J}{o_j w_{kj}} + \theta_k \\ o_k =& f(X_k) \end{align}

二乗和誤差

しかし,重みと閾値はランダムに初期化されるため,出力は望ましい出力と完全に違うだろう.そこで,望ましい出力である学習データ,いわゆる教師信号t_kを用いて,入力信号pに対するニューラルネットワークの出力が望ましい出力からどれだけ離れているかを計算する.これを誤差Eといい,今回は二乗和誤差を用いる.

E_p = \frac{1}{2} \sum_{k=1}^{K} (o_k - t_k)^2

これは,入力信号pに対する出力の二乗和誤差である.すべてのP個の入力信号のパターンに対する二乗和誤差E_{all}は以下のようになる.

E_{all} = \sum_{p=1}^{P} E_p

最急降下法

望ましい出力が得られるように重みを調整するというのは,ニューラルネットワーク全体の出力の誤差であるE_{all}が最小になるように重みを調整する.Back Propagation 法では,E_{all}を最小化するためにはそれぞれのE_pを最小化する.ここで,最急降下法が登場する.学習係数を\etaとし,最急降下法を用いて,E_pを最小化するような重みwを見つければよい.

w = w - \eta \frac{\partial E_p}{\partial w}

上式より,\frac{\partial E_p}{\partial w}がわかれば,重みが調整できるようになる.それで,\frac{\partial E_p}{\partial w}を求めるために,出力ニューロンの場合と中間ニューロンの場合に分けて考える.


出力ニューロンの重み

出力ニューロンの重みを対象にすると,\frac{\partial E_p}{\partial w_{kj}}を求めるには,E_pの式をw_{kj}で表す必要がある。そこで,チェーンルールを用いる.

\begin{align} E_p =& \frac{1}{2} \sum_{k=1}^{K} (o_k - t_k)^2 \\ o_k =& f(X_k) \\ X_k =& \sum_{j=1}^{J}{o_j w_{kj}} + \theta_k \end{align}

より,

\begin{align} \frac{\partial E_p}{\partial w_{kj}} =& \frac{\partial E_p}{\partial o_k} \frac{\partial o_k}{\partial X_k} \frac{\partial X_k}{\partial w_{kj}} \end{align}

ここで,\frac{\partial E_p}{\partial o_k}\frac{\partial o_k}{\partial X_k}\frac{\partial X_k}{\partial w_{kj}}をそれぞれ偏微分し求める.

\begin{align} \frac{\partial E_p}{\partial o_k} =& (o_k - t_k) \\ \frac{\partial o_k}{\partial X_k} =& f'(X_k) \\ \frac{\partial X_k}{\partial w_{kj}} =& o_j \\ \\ \end{align}

よって,

\begin{align} \frac{\partial E_p}{\partial w_{kj}} =& (o_k - t_k) f'(X_k) o_j \\ w_{kj} =& w_{kj} - \eta (o_k - t_k) f'(X_k) o_j \end{align}

さらに,\frac{\partial E_p}{\partial o_k} \frac{\partial o_k}{\partial X_k} = (o_k - t_k) f'(X_k) = \delta_kとすると,

\begin{align} \frac{\partial E_p}{\partial w_{kj}} =& \delta_k o_j \\ w_{kj} =& w_{kj} - \eta \delta_k o_j \end{align}
\left( \delta_k = \frac{\partial E_p}{\partial o_k} \frac{\partial o_k}{\partial X_k} = (o_k - t_k) f'(X_k) \right)

以上より,出力ニューロンに対する重みを最急降下法で修正できる.また,閾値\theta_kに対して同様な導出を行うと,以下のようになる.

\begin{align} \frac{\partial E_p}{\partial \theta_k} =& \delta_k \\ \theta_k =& \theta_k - \eta \delta_k \end{align}

中間ニューロンの重み

同様に,中間ニューロンの重みを対象にすると,\frac{\partial E_p}{\partial w_{ji}}を求めるには,E_pの式をw_{ji}で表す必要がある。そこで,チェーンルールを用いる.

\begin{align} E_p =& \frac{1}{2} \sum_{k=1}^{K} (o_k - t_k)^2 \\ o_k =& f(X_k) \\ X_k =& \sum_{j=1}^{J}{o_j w_{kj}} + \theta_k \\ o_j =& f(X_j) \\ X_j =& \sum_{i=1}^{I}{o_i w_{ji}} + \theta_j \end{align}

より,

\begin{align} \frac{\partial E_p}{\partial w_{ji}} =& \frac{\partial E_p}{\partial o_k} \frac{\partial o_k}{\partial X_k} \frac{\partial X_k}{\partial o_j} \frac{\partial o_j}{\partial X_j} \frac{\partial X_j}{\partial w_{ji}} \end{align}

ところが,実はこれが間違っている.中間層にある中間ニューロンは出力層のK個の出力ニューロンに接続しているため,中間ニューロンの重みw_{ji}E_pに影響を及ぼすのがK通りある.そのため,各出力ニューロンに対して足し合わせる必要がある.つまり,正しい式は以下に示す.

\begin{align} \frac{\partial E_p}{\partial w_{ji}} =& \sum_{k=1}^{K} \frac{\partial E_p}{\partial o_k} \frac{\partial o_k}{\partial X_k} \frac{\partial X_k}{\partial o_j} \frac{\partial o_j}{\partial X_j} \frac{\partial X_j}{\partial w_{ji}} \end{align}

それぞれを解くと,

\begin{align} \frac{\partial E_p}{\partial o_k} \frac{\partial o_k}{\partial X_k} =& \delta_k \\ \frac{\partial X_k}{\partial o_j} =& w_{kj} \\ \frac{\partial o_j}{\partial X_j} =& f'(X_j) \\ \frac{\partial X_j}{\partial w_{ji}} =& o_i \end{align}

よって,

\begin{align} \frac{\partial E_p}{\partial w_{ji}} =& \sum_{k=1}^{K} \delta_k w_{kj} f'(X_j) o_i \\ w_{ji} =& w_{ji} - \eta \sum_{k=1}^{K} \delta_k w_{kj} f'(X_j) o_i \end{align}

さらに,\sum_{k=1}^{K}\frac{\partial E_p}{\partial o_k} \frac{\partial o_k}{\partial X_k} \frac{\partial X_k}{\partial o_j} \frac{\partial o_j}{\partial X_j} = \sum_{k=1}^{K}\delta_k w_{kj}f'(X_j) = \delta_jとすると,

\begin{align} \frac{\partial E_p}{\partial w_{ji}} =& \delta_j o_i \\ w_{ji} =& w_{ji} - \eta \delta_j o_i \end{align}
\left( \delta_j = \sum_{k=1}^{K}\frac{\partial E_p}{\partial o_k} \frac{\partial o_k}{\partial X_k} \frac{\partial X_k}{\partial o_j} \frac{\partial o_j}{\partial X_j} = \sum_{k=1}^{K}\delta_k w_{kj}f'(X_j) \right)

以上より,中間ニューロンに対する重みを最急降下法で修正できる.また,閾値\theta_jに対して同様な導出を行うと,以下のようになる.

\begin{align} \frac{\partial E_p}{\partial \theta_j} =& \delta_j \\ \theta_j =& \theta_j - \eta \delta_j \end{align}

Part 3: https://zenn.dev/aizakovzky/articles/1a74e6f5133e89

Discussion