はじめてのパターン認識７章後半 式変形メモ〜誤差逆伝播法〜


# ブログの動機

先日、はじパタ輪読会なるもので担当として 7 章後半が当たってきました。この輪読会は担当者が皆の前で講義を行うスタイルだったので、準備のため概要をノートにまとめました。
　はじパタは全体的に、式変形とか飛ばしながら進んでいくのでどうしても読むのに時間がかかってしまい、、、まとめたノートをブログに書いておくことで、あとで自分で振り返ることが出来るようにしておきたいなと思い、今回のブログを書くことにしました。

# いきなりお詫び

- 誤字脱字等あるかも知れません。
- 表記ははじパタに寄せていますが、所々微妙な違いがあるかも知れません。

# 本編

### 単純パーセプトロンの限界

４章の後半、一番最初の話題は単純パーセプトロンでは単純な識別関数しか表現できないって話です。
![IMG_5255.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323251/cb9e3ec5-d491-a983-f711-c0b6ca1823e0.jpeg)
ここで XOR ゲートの話が出てくるのですが、分かり易いように$x_1$と$x_2$の二変数の場合で図示してみました。

### 損失関数（二乗誤差）

この式は損失関数と言われ、多層パーセプトロンの学習ではこの関数を出来るだけ小さくするような$\boldsymbol{w}$を求めていくのがゴールになります。実際の正解と出力の差を取って二乗するという操作を全ての$k$(出力値の数)で足し合わせる操作を意味しているのですが、正解と出力（予測値）が近いほど精度が高いモデルと言えるので、この式を小さくするというモチベーションは割と分かり易いかと思います。
![IMG_5256.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323251/b952af6c-fcfd-4ee6-90d2-5d551e7dd34d.jpeg)
　一応、赤字で書いているのですが ①（つまり全てのデータの損失を合計した値）を使ってパラメータを更新していくのがバッチ学習、②（つまりデータ一つ一つの損失）を使って都度パラメータを更新していくのがオンライン学習になります。

### ここから少しややこしくなります

![IMG_5257.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323251/56fa55b2-843c-c937-f91a-f0486712aa28.jpeg)

左のページが入力層から隠れ層、およびその後の隠れ層から出力層への流れを書いています。各ノードへの総入力がデータ$x$の各特徴量（$x_1, x_2, … x_i$）、及び前層からの出力（$V_1, V_2, …V_j$）と各層のパラメータ$\boldsymbol{w}$の線型結合で表現でき、最終的にベクトルの内積で書くことが出来るのが分かるかと思います。
　右のページは先ほどの損失関数の最小値を求めるための準備として、勾配$w_{kj}$で損失関数を微分しています。この辺はそこまで難しい計算をしている訳ではないのですが、添え字がたくさん出てきて戸惑うポイントでした。
　ここで出てきた勾配に$-\eta$をかけた分だけパラメータを更新して（つまり、勾配降下法）、求めたい$\boldsymbol{w}$に辿り着けるよう$\boldsymbol{w}$を更新していきます。

### 隠れ層の勾配と連鎖律

先ほどは損失関数を$w_{kj}$（出力層のパラメータ）で微分していきましたが、次は$w_{ji}$で微分していきます。その前に以下の連鎖律をひとまず約束事としておきます。

1 変数の関数$h=f(x)$と 1 変数の関数$x=g(t)$
$$\frac{dh}{dt} = \frac{dh}{dx}\frac{dx}{dt}$$

2 変数の関数$h=f(u, v)$と 1 変数の関数$u=s(x), v=t(y)$
$$\frac{dh}{dt} = \frac{\partial h}{\partial u}\frac{du}{dx} + \frac{\partial h}{\partial v}\frac{dv}{dy}$$

2 変数の関数$h=f(u, v)$と 2 変数の関数$u=s(x, y),v=t(x, y)$の場合
$$\frac{\partial h}{\partial x} = \frac{\partial h}{\partial u}\frac{\partial u}{\partial x} + \frac{\partial h}{\partial v}\frac{\partial v}{\partial x}$$
$$\frac{\partial h}{\partial y} = \frac{\partial h}{\partial u}\frac{\partial u}{\partial y} + \frac{\partial h}{\partial v}\frac{\partial v}{\partial y}$$

![Slide1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323251/9250793f-b289-c487-4cba-8d3f13cc2f55.jpeg)

連鎖律自体が分かっていてもパッと見て、はじパタの式の意味が分かりづらいと思ってノートの最初に色々書きましたが、なんだか余計分かりづらいかもです。ここの部分がこの章で一番ややこしいかも知れません。

### 正則化

![Slide1 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323251/491cd5a2-5a56-04fc-e74d-01b53fcaba74.jpeg)
正則化については、機械学習のその他アルゴリズムでも良くあるかと思うので、先ほどの微分に比べると式変形は理解し易いかと思います。パラメータ$\boldsymbol{w}$のノルムを評価関数に加える手法はその他のアルゴリズムでも定番です。

### クロスエントロピーとシグモイド関数の組み合わせ

先ほどまでは損失関数（評価関数）として二乗誤差の最小化を目指していましたが、次は尤度関数というものを考えてその最大化（実際には − １を掛けているので、最小化）を目指していきます。ちなみに対数をとって変形された後の式をクロスエントロピーとも言います。
　長い式変形をしていますが、最終的にシグモイドとクロスエントロピーの組み合わせが勾配が非常にシンプルな形で出てきます。
![Slide1 3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323251/c131b622-5406-56ea-f425-d03503e41131.jpeg)
　良く見るとはじパタでは勾配に$\beta$という定数が出てきていますが、これはシグモイド関数の変数部分に$\beta$という値がついている為、微分後に出てくるのが理由です。$\beta$という定数でシグモイド関数の挙動をコントロールしている形になります。

# 終わりに

- はじパタは何となくの理解で終わっている章も多いので、深いところまで理解できるようにしたい（特に SVM は難しかった）

# 参考文献

[はじめてのパターン認識](https://www.morikita.co.jp/books/book/2235)　著 平井有三　森北出版株式会社