Pynote

Python、機械学習、画像処理について

Deep Learning - 逆伝播法

概要

ニューラルネットワークの学習は損失関数を最小化することで行われる。
最小化は勾配降下法により行われるが、このアルゴリズムを実行するには損失関数 E(\boldsymbol{w}) に対する重み \boldsymbol{w} の勾配を求める必要がある。
逆伝播法またはバックプロパゲーション (back propagation) はこの勾配を効率的に計算するためのアルゴリズムである。

キーワード

重みの再定義

式を簡略化するために、各層に常に 1 を出力する 0 番目のニューロンを配置し、各ニューロンのバイアス b_j^{(l)} を前の層の 0 番目のニューロンとの結合の重み w_{j0}^{(l)} とする。

これにより、各ニューロンの入力は以下のようになる。

\displaystyle
u_j^{(l)} = \sum_{i = 1}^{N^{(l - 1)}} w_{ji}^{(l)} y_i^{(l - 1)} + b_j^{(l)}
=
\sum_{i = 0}^{N^{(l - 1)}} w_{ji}^{(l)} y_i^{(l - 1)}

以下、ニューラルネットワークの重みと言った場合は、ニューロン間の結合の重みの他、各ニューロンのバイアスも含むものとする。

目標

順伝播時には重み \boldsymbol{w} を係数、入力 \boldsymbol{x} を変数とみて損失関数を計算する。
逆伝播時には順伝播時の入力や各ニューロンの出力値を係数、重み \boldsymbol{w} を変数とみて損失関数の勾配を計算する。

損失関数 E(\boldsymbol{w}) に対する重み \boldsymbol{w} の勾配は、E(\boldsymbol{w}) に対する重み \boldsymbol{w} の各成分の偏微分係数を並べたものになる。

\displaystyle
\nabla E = (\cdots, \frac{\partial E}{\partial w_{ji}^{(l)}}, \cdots)^T

したがって、目標はすべての偏微分係数 \frac{\partial E}{\partial w_{ji}^{(l)}} を求めることである。

連鎖律

逆伝播法の導出には以下の連鎖律を使用する。

定理 多変数関数の連鎖律
関数 E の値は y_1, y_2, \cdots ,y_m によって決まり、関数 y_1, y_2, \cdots ,y_m の値は x_1,x_2, \cdots, x_n によって決まるとき、次が成り立つ。
\displaystyle
\frac{\partial E}{\partial x_j} =
\sum_{k = 1}^m
\frac{\partial E}{\partial y_k}
\frac{\partial y_k}{\partial x_j}

多変数関数の連鎖律において m = n = 1 とした場合は1変数の合成関数の連鎖律になる。

定理 1変数関数の連鎖律
関数 f の値は y によって決まり、関数 y の値は x によって決まるとき、次が成り立つ。
\displaystyle
\frac{\partial f}{\partial x}
=
\frac{\partial f}{\partial y}
\frac{\partial y}{\partial x}

逆伝播法の導出

E(\boldsymbol{w}) に対する重み w_{ji}^{(l)}偏微分係数 \frac{\partial E}{\partial w_{ji}^{(l)}} を求める。
{w_{ji}^{(l)}} は第 l-1 層の i 番目のニューロンと第 l 層の j 番目のニューロンとの結合の重みである。

ステップ1

E は第 l 層への入力 u_0^{(l)}, u_1^{(l)}, \cdots, u_{N^{(l)}}^{(l)} によって決まる。
u_0^{(l)}, u_1^{(l)}, \cdots, u_{N^{(l)}}^{(l)} は第 l 層と第 l - 1 層との結合の重み w_{ji}^{(l)}, (i = 0, 1, \cdots, N^{(l - 1)}, j = 1,2, \cdots, N^{(l)}) によって決まる。
したがって、多変数関数の連鎖律を適用する。

\displaystyle
\frac{\partial E}{\partial w_{ji}^{(l)}}
=
\sum_{k = 0}^{N^{(l)}} \frac{\partial E}{\partial u_k^{(l)}} \frac{\partial u_k^{(l)}}{\partial w_{ji}^{(l)}}

しかし、u_k^{(l)} = \sum_{i = 0}^{N^{(l - 1)}} w_{ki}^{(l)} y_i^{(l - 1)} であるから、変数 w_{ji}^{(l)}u_0^{(l)}, u_1^{(l)}, \cdots, u_{N^{(l)}}^{(l)} のうち、u_j^{(l)} 以外には含まれない。
そのため、

\displaystyle
\frac{\partial u_k^{(l)}}{\partial w_{ji}^{(l)}}
=
\left\{
\begin{array}{*{20}{l}}
  0 & (k \ne j) \\ 
  \frac{\partial u_j^{(l)}}{\partial w_{ji}^{(l)}} & (k = j)
\end{array}
\right.

となる。したがって、実際は次のようになる。

\displaystyle
\frac{\partial E}{\partial w_{ji}^{(l)}}
=
\frac{\partial E}{\partial u_j^{(l)}}
\frac{\partial u_j^{(l)}}{\partial w_{ji}^{(l)}}

ステップ2

E は第 l + 1 層への入力 u_0^{(l + 1)}, u_1^{(l + 1)}, \cdots, u_{N^{(l + 1)}}^{(l + 1)} によって決まる。
u_0^{(l + 1)}, u_1^{(l + 1)}, \cdots, u_{N^{(l + 1)}}^{(l + 1)} は第 l 層への入力 u_0^{(l)}, u_1^{(l)}, \cdots, u_{N^{(l)}}^{(l)} によって決まる。
したがって、多変数関数の連鎖律を適用する。

\displaystyle
\frac{\partial E}{\partial u_j^{(l)}}
=
\sum_{k = 0}^{{N^{(l + 1)}}}
\frac{\partial E}{\partial u_k^{(l + 1)}}
\frac{\partial u_k^{(l + 1)}}{\partial u_j^{(l)}}

ステップ3

u_k^{(l + 1)}
=
\sum_{i = 0}^{N^{(l)}} w_{ki}^{(l + 1)} y_i^{(l)}
=
\sum_{i = 0}^{N^{(l)}} w_{ki}^{(l + 1)} f_i^{(l)}(u_i^{(l)}) であるから、1変数の連鎖律より、

\displaystyle
\frac{\partial u_k^{(l + 1)}}{\partial u_j^{(l)}}
=
w_{kj}^{(l + 1)} \frac{\partial f_j^{(l)}}{\partial u_j^{(l)}}

\frac{\partial f_j^{(l)}}{\partial u_j^{(l)}} は活性化関数の導関数である。

ステップ4

u_j^{(l)} = \sum_{i = 0}^{N^{(l - 1)}} w_{ji}^{(l)} y_i^{(l - 1)} であるから、1変数の連鎖律より、

\displaystyle
\frac{\partial u_j^{(l)}}{\partial w_{ji}^{(l)}} = y_i^{(l - 1)}

ステップ5

ステップ2、3より、

\displaystyle
\frac{\partial E}{\partial u_j^{(l)}}
=
\sum_{k = 0}^{N^{(l + 1)}}
\frac{\partial E}{\partial u_k^{(l + 1)}}
\frac{\partial u_k^{(l + 1)}}{\partial u_j^{(l)}}
=
\sum_{k = 0}^{N^{(l + 1)}}
\frac{\partial E}{\partial u_k^{(l + 1)}} w_{kj}^{(l + 1)}
\frac{\partial f_j^{(l)}}{\partial u_j^{(l)}}

ここで、\delta_j^{(l)}: = \frac{\partial E}{\partial u_j^{(l)}} とおく。すると、

\displaystyle
\delta_j^{(l)}
=
\sum_{k = 0}^{N^{(l + 1)}}
\delta _k^{(l + 1)} w_{kj}^{(l + 1)}
\frac{\partial f_j^{(l)}}{\partial u_j^{(l)}}

この式から第 l 層の各 \delta_j^{(l)} は、第 l + 1 層の各 \delta_k^{(l + 1)} から計算できることがわかる。
よって、以下のように出力層から入力層に向けて順番に計算していくことですべてのデルタが求められる。

順伝播では出力を求めるのに入力層から出力層に向かって順番に計算したが、デルタを求めるときは逆に出力層から入力層に向かって順番に計算していくことになるので、逆伝播法またはバックプロパゲーション(backpropagation)といわれる。

ステップ6

ステップ5により、すべてのデルタが求まったとする。
このデルタを使い、\frac{\partial E}{\partial w_{ji}^{(l)}} の求めるには次のようにする。

ステップ1、4より、
\displaystyle
\frac{\partial E}{\partial w_{ji}^{(l)}}
=
\frac{\partial E}{\partial u_j^{(l)}} y_i^{(l - 1)}
=
\delta_j^{(l)} y_i^{(l - 1)}

このようにして、目標であったすべての偏微分係数を求めることができた。

逆伝播の行列による表現

これを行列で表現する方法は以下の記事を参照されたい。

pynote.hatenablog.com

参考