らんだむな記憶

blogというものを体験してみようか!的なー

誤差逆伝播法について再び考えてみる(4)

簡単のため、以下のような分類問題のニューラルネットワーク誤差逆伝播法を考察する。
f:id:derwind:20190923222948p:plain:w345
入力層は $x_1$, $x_2$ の2つの入力を受け取り、隠れ層で活性化関数としてsigmoid関数 $\varsigma$ を適用し、出力層でsoftmax関数で確率をとる。ラベルはone-hotエンコーディングされているものとし、誤差関数 $E$ には交差エントロピー関数 $E(w) = -t_1 \log(y_1) - t_2 \log(y_2)$ を用いる。

ある学習データ $x$ とラベル $t$ を入力した場合の勾配の計算を見る。ここでは $\frac{\del E}{\del w_{11}^{(1)}}$ を求めてみる。
$t = (t_1, t_2) = (1, 0)$ の場合を見る。*1

素朴な数値微分を試みようとすると
\begin{equation}
E(w) = - \log \left( \frac{\exp \left( \frac{w_{11}^{(2)}}{1 + \cdots} + \frac{w_{21}^{(2)}}{1 + \cdots} + \frac{w_{31}^{(2)} }{1 + \cdots} + b^{(2)} \right)}{\exp \left( \frac{w_{11}^{(2)}}{1 + \exp \left( -(w_{11}^{(1)} x_1 + w_{21}^{(1)} x_2 + b^{(1)}) \right)} + \frac{w_{21}^{(2)}}{1 + \cdots} + \frac{w_{31}^{(2)}}{1 + \cdots} + b^{(2)} \right) + \exp \left( \frac{w_{12}^{(2)}}{1 + \cdots} + \cdots \right)} \right)
\end{equation}

を $w_{11}^{(1)}$ について中心差分で評価することになるがいかにも計算は複雑そうである。一方で連鎖律を活用することで計算を簡単に行うことができるようになる。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装に倣って計算グラフの考えを用いる。

  • $\alpha_1 = w_{11}^{(1)} x_1 + w_{21}^{(1)} x_2 + b^{(1)}$ (隠れ層入力)
  • $\beta_1 = \varsigma(\alpha_1)$ (隠れ層出力)
  • $\gamma_1 = w_{11}^{(2)} \beta_1 + w_{21}^{(2)} \beta_2 + w_{31}^{(2)} \beta_3 + b^{(2)}$ (出力層入力)
  • $\gamma_2 = w_{12}^{(2)} \beta_1 + w_{22}^{(2)} \beta_2 + w_{32}^{(2)} \beta_3 + b^{(2)}$ (出力層入力)
  • $y_1 = \frac{\exp(\gamma_1)}{\exp(\gamma_1) + \exp(\gamma_2)}$, $y_2 = \frac{\exp(\gamma_2)}{\exp(\gamma_1) + \exp(\gamma_2)} = 1 - y_1$ (出力層出力)

連鎖律より
\begin{equation}
\frac{\del E}{w_{11}^{(1)}} = \frac{\del E}{\del y_1} \left( \frac{\del y_1}{\del \gamma_1} \frac{\del \gamma_1}{\del \beta_1} \frac{\del \beta_1}{\del \alpha_1} \frac{\del \alpha_1}{\del w_{11}^{(1)}} + \frac{\del y_1}{\del \gamma_2} \frac{\del \gamma_2}{\del \beta_1} \frac{\del \beta_1}{\del \alpha_1} \frac{\del \alpha_1}{\del w_{11}^{(1)}} \right) \quad\quad\quad\quad (1)
\end{equation}

となる。

  • $\frac{\del E}{\del y_1} = - \frac{\del \log(y_1)}{\del y_1} = - \frac{1}{y_1}$
  • $\frac{\del y_1}{\del \gamma_1} = \frac{\exp(\gamma_1) \exp(\gamma_2)}{\left( \exp(\gamma_1) + \exp(\gamma_2) \right)^2} = y_1 \frac{\exp(\gamma_2)}{\exp(\gamma_1) + \exp(\gamma_2)} = y_1 (1-y_1) = y_1 (t_1 - y_1)$
  • $\frac{\del y_1}{\del \gamma_2} = - \frac{\exp(\gamma_1) \exp(\gamma_2)}{\left( \exp(\gamma_1) + \exp(\gamma_2) \right)^2} = -y_1 (t_1 - y_1)$
  • $\frac{\del \gamma_1}{\del \beta_1} = w_{11}^{(2)}$
  • $\frac{\del \gamma_2}{\del \beta_1} = w_{12}^{(2)}$
  • $\frac{\del \beta_1}{\del \alpha_1} = \varsigma(\alpha_1) \left( 1-\varsigma(\alpha_1) \right)$
  • $\frac{\del \alpha_1}{\del w_{11}^{(1)}} = x_1$

連鎖律を使いつつ、出力層から入力層に向けて“局所的な”偏導関数をかけていくと(1)の右辺第一項については
\begin{array}
-\frac{1}{y_1} \to y_1 - t_1 &\to& (y_1 - t_1) w_{11}^{(2)} \to \\
&\to& (y_1 - t_1) w_{11}^{(2)} \varsigma(\alpha_1) \left( 1-\varsigma(\alpha_1) \right) \to (y_1 - t_1) w_{11}^{(2)} \varsigma(\alpha_1) \left( 1-\varsigma(\alpha_1) \right) x_1
\end{array}

となり、右辺第二項も同様に計算することで求める偏導関数
\begin{equation}
\frac{\del E}{\del w_{11}^{(1)}} = (y_1 - t_1) (w_{11}^{(2)} - w_{12}^{(2)}) \varsigma(\alpha_1) \left( 1-\varsigma(\alpha_1) \right) x_1
\end{equation}

であることがわかる。

ここで、逆伝播の過程で出力層における“誤差” $y_1 - t_1$ が連鎖律によって運ばれている様子が見てとれる。これが誤差逆伝播法の名称の指し示すところのようである。「ゼロから作るDeep Learning」p.154によると交差エントロピー関数という誤差関数がこのような現象を起こすように設計されたものだからだそうである。

要は、「連鎖律」という技術を使って、“局所的な”偏導関数を出力層から入力層という「逆方向」にかけあわせていくと、「出力層の誤差」が自然に伝播されるような形で誤差関数の勾配が求まるよ、というのが誤差逆伝播法の本質だといまのところ理解している。

PyTorchのpytorch/function.py at 593bb145ceea548478f83fd820de44b95d375108 · pytorch/pytorch · GitHubインターフェイスを思い出すと、出力層側から得た“局所的な”偏導関数の積 grad_outputs を受け取って、自身が担当する“局所的な”偏導関数をかけて入力層側に返すようなものであることが見てとれる。

*1:$t = (t_1, t_2) = (0, 1)$ のケースは誤差逆伝播法について再び考えてみる(5) - らんだむな記憶で見る。結果としては以下と同じ結論が得られる。