深層学習day1 Section5:誤差逆伝播法

要点まとめ

誤差逆伝播とは、算出された誤差を出力層側から順に微分し、前の層へと伝播する。最小限の計算で各パラメータでの微分値を解析的に計算する手法。

入力\boldsymbol{z}に重み\boldsymbol{w}とバイアス\boldsymbol{b}を用いて、更に出力関数は恒等写像を用いると、出力yまでは下記の式になる。

 \displaystyle{
  u^{(2)} = w^{(2)} \boldsymbol{z} + b^{(2)} \\
  y = u^{(2)}
}

誤差関数

 \displaystyle{
  E(y) = \frac{1}{2}\sum_{j=1}^{J} (y_j - d_j)^2 = \frac{1}{2} || \boldsymbol{y} - \boldsymbol{d} ||^2
}

誤差逆伝播法では、\boldsymbol{w}を更新するために、E(y)\boldsymbol{w}^{(2)}偏微分したものを求めたい。ここで、微分の連鎖律を用いると下記のように表される。

 \displaystyle{
\newcommand{\partialdiff}[2] {\frac{\partial {#1}}{\partial{#2}}}
  \partialdiff{E}{w^{(2)}} = \partialdiff{E}{y} \partialdiff{y}{u} \partialdiff{u}{w^{(2)}} 
}

各項について計算すると、

 \displaystyle{
  \partialdiff{E(\boldsymbol{y})}{\boldsymbol{y}} = \partialdiff{}{y} \frac{1}{2} || \boldsymbol{y} - \boldsymbol{d} ||^2 = \boldsymbol{y} - \boldsymbol{d} \\
  \partialdiff{\boldsymbol{y}(\boldsymbol{u})}{\boldsymbol{u}} = \partialdiff{\boldsymbol{u}}{\boldsymbol{u}} = 1 \\
  \partialdiff{\boldsymbol{u}}{w_{ji}} = \partialdiff{}{w_{ji}} (\boldsymbol{w}^{(l)} \boldsymbol{z}^{(l-1)} + \boldsymbol{b}) = 
  \partialdiff{}{w_{ji}} \Biggl(
     \begin{pmatrix}
       w_{11} z_1 & + & \cdots & + & w_{1i} z_i & + & \cdots & + & w_{1I} z_I \\
                  &   &        &   & \vdots     &   &        &   &            \\
       w_{j1} z_1 & + & \cdots & + & w_{ji} z_i & + & \cdots & + & w_{jI} z_I \\
                  &   &        &   & \vdots     &   &        &   &            \\
       w_{J1} z_1 & + & \cdots & + & w_{Ji} z_i & + & \cdots & + & w_{JI} z_I 
     \end{pmatrix}
     +
     \begin{pmatrix}
      b_1 \\
      \vdots \\
      b_j \\
      \vdots \\
      b_J
     \end{pmatrix}
     \Biggr)
  = \begin{pmatrix}
    0 \\
    \vdots \\
    z_i \\
    \vdots \\
    0
  \end{pmatrix}
}

結局、

 \displaystyle{
  \partialdiff{E}{w^{(2)}} = \partialdiff{E}{y} \partialdiff{y}{u} \partialdiff{u}{w^{(2)}} = (\boldsymbol{y} - \boldsymbol{d}) \cdot
  \begin{pmatrix}
    0 \\
    \vdots \\
    z_i \\
    \vdots \\
    0
  \end{pmatrix}
  = (y_i - d_i)z_i 
}

となり偏微分結果が求められる。

実装演習

f:id:yui-gen-ron:20211129084425p:plainf:id:yui-gen-ron:20211129084434p:plain

確認テスト等考察

数式で誤差逆伝播法を表せることができれば、そのままpythonで記述するとが可能。行列の計算式を計算できることと、pythonでの行列演算表記を覚えることが重要。