はじめに
スタンフォード大学 Andrew Ng氏による機械学習の講義動画を各週社内メンバーで持ち回りで受講し、学んだことを発表、Qiitaで共有しています。
第5週は以下の内容でした。
- Neural Networks: Back Propagation
主に、誤差逆伝播法を説明していきます。
目次
-
アインシュタインの縮約記法
-
記号等の説明
-
数学的準備
- 対数関数の微分
- シグモイド関数の微分
- 連鎖律
- 行列の諸定義
-
順伝播の復習
-
損失関数
-
誤差逆伝播法
アインシュタインの縮約
本項では、アインシュタインの縮約で記述します。
例えば
$$
\sum_{\mu=0}^{N} a_\mu = a_1 + a_2 + ... + a_N
$$
$$
\sum_{\nu=0}^{N} a_\nu b_\nu = a_1b_1 + a_2b_2 + ... + a_Nb_N
$$
$$
\sum_{\xi=0}^{N} a_\xi b^\xi = a_1b^1 + a_2b^2 + ... + a_Nb^N
$$
などを単に
$$
a_\mu
$$
$$
a_\nu b_\nu
$$
$$
a_\xi b^\xi
$$
とシグマを省略して記述します。
縮約の添え字は $ \mu , \nu, \xi $ を使用します。
これら三つの文字が出てきたら縮約されていると思ってください。
数学的準備
-
対数関数の微分
$$
\frac{d}{dx}\log{x}=\frac{1}{x}
$$
これと、合成関数の微分法
$$
\frac{dy}{dt}=\frac{dy}{du}\frac{du}{dt}
$$
から
$$
\frac{d}{dx}\log{f(x)}=\frac{d}{df}\log{f}\frac{df}{dx}=\frac{f^{\prime}(x)}{f(x)}
$$ -
シグモイド関数の微分
$$
\sigma(x)=\frac{1}{1+e^{-x}}
$$
$\frac{d}{dx}e^{-x}=-e^{-x}$ , $ \frac{d}{dx}\frac{1}{x}=-\frac{1}{x^2} $ であり合成関数の微分法から $ f(x)=1+e^{-x} $ とすると
$$
\frac{d}{dx}\frac{1}{f(x)}=\frac{d}{df}\frac{1}{f(x)}\frac{df}{dx}=
-\frac{1}{f(x)^2} \times f^\prime(x)=
-\frac{1}{(1+e^{-x})^2} \times (-e^{-x})=
\frac{1}{1+e^{-x}} \times (1-\frac{1}{1+e^{-x}})
$$すなわち
$$
\sigma^\prime(x)=\sigma(x)(1-\sigma(x))
$$
となります。 -
連鎖律
$f(x_1,x_2, ...)$ を $t$ で微分したいとき、が $x_1,x_2,...$ の全てが $t$ に依存しているならば
$$
\frac{\partial f}{\partial t} =
\frac{\partial f}{\partial x_\mu}\frac{\partial x_\mu}{\partial t}
$$
$t$ が微小に動くとき $x_1,x_2,...$ の全てが微小に変化し、それら全てが$f$を微小に変化させる要因となるため、足し合わせる。といったイメージです。 -
行列の諸定義
-
行列の積
$$
A = (a_{ij})_{ij} ,,, B = (b_{ij})_{ij}
$$とすると
$$
AB = (a_{i \mu}b_{\mu j})_{ij}
$$ -
アダマール積
$$
A \circ B = (a_{ij}b_{ij})_{ij}
$$ -
転置
$$
A^T = (a_{ji})_{ij}
$$
上記はそれぞれベクトルへの自然な応用が出来ます。(ベクトルを行数または列数が1の行列と考える)
-
本項の設定
本項では以下の設定のニューラルネットワークで説明していきます。
-
入力データ
$$
(x_1, x_2, \cdots)
$$ -
ラベルデータ
$$
(t_1, t_2, \cdots),,,,, (t = 0 , or , 1)
$$ -
層の数は L 層 ( よって出力層は第 L 層 )
-
出力層の活性化関数はシグモイド関数
- $$
\sigma^L(x)=\frac{1}{1+e^{-x}}
$$
- $$
順伝播の復習
復習なので、ざっと進めます。
以下の図は
- 第 l 層の上から i 番目のノードから
- 第 l+1 層の上から j 番目のノードへの
順伝播です。
第 $l$ 層の $i$ 番目以外のノードの伝播も考慮して
$$
y_j^l = w_{\mu j}^l , z_\mu^{l-1}
$$
$$
z_j^l = \sigma^l(y_j^l)
$$
になります。
損失関数
損失関数は対数尤度関数を用います。
$$
E=E(z_1^L, z_2^L,\cdots) = -(,t_\nu\log{z_\nu^L} + (1 - t_\nu)\log(1-z_\nu^L),)
$$
[ 式の意味 ]
出力層のj番目の出力
$$
z_j^L
$$
はシグモイド関数により活性化されるので
$$
z_j^L \in (0,1)
$$
であり、これは確率として解釈できます。
つまり出力が $t_j$ である確率は
$$
{z_j^{L}}^{t_j},(1-z_j^{L})^{1-{t_j}}
$$
となります。全出力層のノードを掛け合わせると
$$
\prod_j {z_j^{L}}^{t_j},(1-z_j^{L})^{1-{t_j}}
$$
これの対数を取り、整理します。(足し算の方が扱いやすく、かつ対数だと微分ができるので)
$$
t_\nu\log{z_\nu^L} + (1 - t_\nu)\log(1-z_\nu^L)
$$
この式は分類がうまくいっている指標になります。
今回は、損失関数(分類がうまくいっていない指標)として扱うので$ -1 $ をかけて上記結果となります。
##誤差逆伝播法
損失関数が小さくなる方向に、重み $w$ を修正します。つまり
$$
\Delta w_{ij}^l = -\frac{\partial E}{\partial w_{ij}^l} \times学習率
$$
で $w_{ij}^l$ の修正分 $\Delta w_{ij}^k$ を求めます。学習率は、どの程度の大きさで修正するかを決めるハイパーパラメータです。
学習率を一定とすると、$\frac{\partial E}{\partial w_{ij}^l}$ は修正分を表しています。また
$$
\frac{\partial E}{\partial w_{ij}^l}=\frac{\partial E}{\partial y_{j}^l} \frac{\partial y_j^l}{\partial w_{ij}^l}
$$
であり、
$$
\frac{\partial y_j^l}{\partial w_{ij}^l} = z_i^{l-1}
$$
なので $\frac{\partial E}{\partial y_{j}^l}=\delta_j^l$とすると
$$
\frac{\partial E}{\partial w_{ij}^l}=\delta_j^l , z_i^{l-1}
$$
と表現できます。
次に$\delta_j^l$ について考えます。以下のように、漸化式が求まります。
$$
\delta_j^l =
\frac{\partial E}{\partial y_{j}^l}=
\frac{\partial E}{\partial z_{j}^l}\frac{{\partial z_{j}^l}}{{\partial y_{j}^l}}=
\frac{\partial E}{\partial y_{\xi}^{l+1}}\frac{\partial y_{\xi}^{l+1}}{\partial z_{j}^{l}}\frac{{\partial z_{j}^l}}{{\partial y_{j}^l}}=
\delta_j^{l+1},w_{j\xi}^{l+1},\sigma^{l,\prime}(y_j^l)
$$
ここでは偏微分の連鎖律を用いました。また、
$$
\delta_j^L =
\frac{\partial E}{\partial y_{j}^L}=
\frac{\partial E}{\partial z_{j}^L}\frac{{\partial z_{j}^L}}{{\partial y_{j}^L}}=
-(\frac{t_j}{z_j^L} - \frac{1 - t_j}{1 - z_j^L}) \times z_j^L(1 - z_j^L)=z_j^L - t_j
$$
よって上記二式より任意の $\delta_j^l$ を求めることが出来る。
まとめると、
$$
\Delta w_{ij}^l = \delta_j^{l+1},w_{j\xi}^{l+1},\sigma^{l,\prime}(y_j^l) \times学習率
\
\delta_j^L = z_j^L - t_j
\
\delta_j^l = \delta_j^{l+1},w_{j\xi}^{l+1},\sigma^{l,\prime}(y_j^l)
$$
また、行列やベクトルで表記すると
$$
\Delta W^l = z^{l-1} , (\delta^l)^T \times学習率
\
\delta^L = z^L - t
\
\delta^l = (W^{l+1}\delta^{l+1}) \circ \sigma^{l,\prime}(y^l)
$$
ただし
$$
\Delta W^l = (\Delta w_{ij}^l)_{ij}
$$
$$
y^{l}=(y_j)_j ,,, z^{l}=(z_j)_j
$$
$$
\delta^{l}=(\delta_j^l)_j
$$
とします。
以上になります。