ニューラルネットワークをざっくりと理解する　損失関数、誤差逆伝播法編

前回、[ニューラルネットワークをざっくりと理解する パーセプトロン、活性化関数編](https://qiita.com/oymura/items/640c16e33941af5144d6)でパーセプトロン、活性化関数についてざっくりと解説しました。今回では損失関数、誤差逆伝播法(バックプロパゲーション)について紹介していきます。

#学習とは
そもそも学習するとは、予測と正解ラベルが最大限に一致するように重みパラメータを**最適**に調整することです。では**最適**とはどのように判断するのでしょうか。

- モデルの当てはまりの良さを考える

![スクリーンショット 2019-03-03 21.21.03.png](https://qiita-image-store.s3.amazonaws.com/0/346585/ff822a70-b4dd-60b6-b3ff-83c117331e67.png)

上のグラフの二本の線はどちらの当てはまりが良いでしょうか？
下の線の当てはまりが良さそうですが、この当てはまりを定量的に計る必要があります。

#損失関数

予測値と正解値にどれくらいの誤差(損失)があるのかを示す関数で、誤差(損失)とはモデルの当てはまり(精度)の**悪さ**を示している。
つまり、誤差(損失)が小さいほど、そのモデルは優秀であるといえます。この**誤差(損失)が最小になっている状態を最適**と言い学習の目標は、この損失関数を最小化(最適化)することです。

##損失関数の種類

扱うデータ、モデル、分析の目的に応じて正しく損失関数を定義する。

- 回帰問題：二乗誤差

二乗誤差を最小化するように重みパラメータを決定する手法を最小二乗法と呼びます。数式は以下の通りです。

![スクリーンショット 2019-03-03 22.07.30.png](https://qiita-image-store.s3.amazonaws.com/0/346585/2d000a11-4f5f-8c70-b6e7-a350643896c8.png)



- 分類問題：交差エントロピー

尤度関数というモデルの当てはまりの良さを示す関数の負の対数を撮ったもの。予測値と正解値が一致していると０になります。数式は以下の通りです。

・二値分類
![スクリーンショット 2019-03-03 22.09.20.png](https://qiita-image-store.s3.amazonaws.com/0/346585/afeaa97e-0ba8-7aaf-4d18-a4efbb938368.png)



・多値分類
![スクリーンショット 2019-03-03 22.05.20.png](https://qiita-image-store.s3.amazonaws.com/0/346585/140e0985-ff4f-fc16-0d2d-5385ba8090a9.png)

多値分類の具体例：
2つのモデルを使ってある人の服のサイズ(S,M,L)を予測したい。
出力はそれぞれ以下のようになった。なお正解ラベルはMです。

y = (S, M, L)

1, y=(0.01, 0.98, 0.01)
2, y=(0.25, 0.60, 0.15)

それぞれの交差エントロピーを計算すると

1, y = -(0 * log0.01 + 1 * log0.98 + 0 * log0.01)=-{0 + (-0.02) + 0} = 0.02

2, y = -(0 * log0.25 + 1 * log0.60 + 0 * log0.15)=-{0 + (-0.51) + 0} = 0.51

となり、1番の出力の誤差の方が小さいため最適であると言えます。


##損失関数の最小化方法と種類

一般に、ある関数の最小値を求めたいというときは、それぞれの変数について偏微分したものを0と置いて連立方程式を解く。偏微分によって得られた関数は接戦の傾きを表しており、最小値では接戦の傾きが0になるため＝0とおけます。

- 勾配降下法

・重みパラメータを少しずつ更新していって最適値を探す方法。
・損失関数を重みパラメータで偏微分すると、接戦の傾きを求めることができる。またどちらの方向に重みを変化させると損失が減少するかがわかります。

![スクリーンショット 2019-03-03 22.43.58.png](https://qiita-image-store.s3.amazonaws.com/0/346585/a6a9109a-1e4d-0b66-54fd-fdf1efccc28b.png)
※矢印は更新方向
接戦の傾きがマイナスなら重みを増加し、接戦の傾きがプラスなら減少させると最小値に近づく。

更新式は以下の通りになります。

![スクリーンショット 2019-03-03 22.58.20.png](https://qiita-image-store.s3.amazonaws.com/0/346585/55c3cb54-8eea-fb1b-ae68-f5ac3d1eff21.png)

- ミニバッチ勾配降下法

膨大なデータを取り扱うことが多い近年、そうなるとすべてのデータについての誤差を計算することが計算コストの観点から難しく、また非効率です。ミニバッチ勾配降下法はランダムにいくつかのデータ集合(ミニバッチ)を使って、実際には勾配降下法を適応します。
ミニバッチの大きさはデータによって変わるが、32,64,128,256など2の累乗が使われることが多い。



では実際に勾配降下法をニューラルネットワーク(多層パーセプトロン)に適用させてみる。

![スクリーンショット 2019-03-04 21.16.39.png](https://qiita-image-store.s3.amazonaws.com/0/346585/f5085e22-16f1-a620-893c-464532743dee.png)

なお重みパラメータは次のように見ます。

![スクリーンショット 2019-03-04 21.18.53.png](https://qiita-image-store.s3.amazonaws.com/0/346585/007a7227-84b0-0246-cbb0-5a4b6580dbed.png)

最終的な予測値![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/328d9239-cd7f-683d-0caa-6310c8b149f0.png)と![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/748949e8-6f2a-57b4-0130-baa974d78df9.png)(正解ラベル)の二乗誤差を考えると以下のようになります。

![スクリーンショット 2019-03-04 21.23.45.png](https://qiita-image-store.s3.amazonaws.com/0/346585/df974ab1-3aff-fb54-cae3-0db1acb807be.png)

この損失関数をそれぞれの重みパラメータで偏微分した形![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/32bbdc83-6f30-1823-6122-1432a2df3149.png)を求める。今回は例として![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/553ad001-9951-712a-e54d-530b35fd66ea.png)で偏微分してみます。

![スクリーンショット 2019-03-04 21.36.06.png](https://qiita-image-store.s3.amazonaws.com/0/346585/7deb220c-72e4-c7eb-89cb-46a56cea078a.png)

この数式は![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/169f60b9-44d7-19f4-3e7d-f240955b7219.png)という予測値に対して一番はじめの重みパラーメータ![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/0c37b642-2db0-62ae-b3ca-93cc43292d2c.png)をどれだけ変化させるのかという式です。一つの重みパラメータを求めるだけで一苦労ですが、すべての重みパラメータについて、さらにデータN個分計算することになります。つまり偏微分の具体的な結果を求めることが困難であるため、偏微分の結果をもっと簡単に得る工夫が必要となります。

#誤差逆伝播法(バックプロバゲーション)

誤差逆伝播法(バックプロバゲーション)の前に微分の連鎖律について解説しておきます。

##微分の連鎖律

今回の目標は、![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/5db1ff4b-feab-2997-d6c2-2f79ef7fad00.png)を簡単に求めることですが、そこで微分の連鎖律を使います。

微分の連鎖律とは、関数![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/b11b2e06-eac8-2ac9-6147-8bbc273132f6.png)と![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/c2ab96f4-7a3f-91be-df9f-a206351ea1db.png)がある時、![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/71d65e73-933d-a420-c6b3-b190d741e25e.png)の![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/c4ff4a22-628b-ee5a-d8f7-25bc6f813de0.png)での微分は以下の通りになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/e2664afd-5945-eaf5-25f7-5e6c85427e0e.png)

多変数関数の場合を考えてみる。![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/49367dcf-cdd1-a305-d372-34912ada4cca.png)が![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/451baf27-484b-4ab9-a245-e8da28019333.png),![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/31319864-d0f3-552a-c4d6-4f7ad9cfb85a.png)の関数で![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/451baf27-484b-4ab9-a245-e8da28019333.png),![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/31319864-d0f3-552a-c4d6-4f7ad9cfb85a.png)が![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/8208c75d-aa5c-931e-a71e-e7375e2903e6.png),![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/5552be1a-c858-13fa-f446-09d9e52aaaf2.png)の関数であるとき
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/dbc4447c-5357-6156-4ac5-142024162d09.png)
となります。
より一般的ににすると![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/cf46693f-a5ee-5b36-bb7b-b366ed35e953.png)が![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/e10fe161-b832-a934-9ca4-d3b199c04a09.png)の関数で![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/e10fe161-b832-a934-9ca4-d3b199c04a09.png)が![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/3da8bac8-7bef-588e-6421-47f08c042aee.png)の関数のとき

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/0e97a530-c7dd-953c-534f-98611e2991db.png)
となります。
以上が微分の連鎖律の説明でした。

##誤差逆伝播法

以下のようなニューラルネットワークで考えてみる。

![スクリーンショット 2019-03-05 22.13.48.png](https://qiita-image-store.s3.amazonaws.com/0/346585/c5a8e20a-80da-d30d-aa78-589c135ec45f.png)


なお![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/d0aed9ee-140c-b6f7-8799-edfd2fdb843d.png)は重み付き和で![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/22e854fc-35ae-a849-3cf2-f54440751bfc.png)は活性化関数による変換後の値で![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/1d4a3676-fbe3-8f90-6a3b-aa78965f52ab.png)は活性化関数を示しています。

![スクリーンショット 2019-03-04 22.15.35.png](https://qiita-image-store.s3.amazonaws.com/0/346585/00ee4c53-3cbf-ef55-c3b1-05cdca0e7fa0.png)

つまり、重み付き和![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/d0aed9ee-140c-b6f7-8799-edfd2fdb843d.png)は
![スクリーンショット 2019-03-04 22.21.18.png](https://qiita-image-store.s3.amazonaws.com/0/346585/e2dd8df5-14cb-3c65-236f-6056ab3a404f.png)

活性化関数による変換後の![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/22e854fc-35ae-a849-3cf2-f54440751bfc.png)は

![スクリーンショット 2019-03-04 22.28.23.png](https://qiita-image-store.s3.amazonaws.com/0/346585/659996bf-cafd-a4fa-b796-fdd6e63614a2.png)

と表すことができます。

例,![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/11da359f-9576-1519-63be-b587fc3e4038.png)を求めてみる。

![スクリーンショット 2019-03-04 22.25.30.png](https://qiita-image-store.s3.amazonaws.com/0/346585/2f244180-159f-90ec-7b3e-eb370b393ba8.png)

では本題に入りまして、誤差逆伝播法を適用していきましょう。
ここでは考えやすいように損失関数に2乗誤差を、出力層の活性化関数に恒等関数を用いた回帰問題について考えていきます。

今知りたいのは、損失関数![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/c1b3bb92-db8b-8adb-cf35-024f0f7551d8.png)を重みパラメータ![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/bc547308-3d49-c52c-bf9b-5630c4b067c7.png)で偏微分した![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/6a37fe14-7b18-8bcc-fb64-6db48a971336.png)を求めることです。

まず出力層の重みパラメータを考え、微分の連鎖律を使うと以下のようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/dcc87545-2191-8717-8afd-88f93d979d51.png)

求める値が右辺に2項に分解したので1項ずつ求めます。

まずは2項目![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/93437d48-83ce-685d-e863-5ee193eaf136.png)について分子を考えると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/c15c6845-872e-b3e4-282b-5de84bc17c84.png)

よって

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/7f298086-16ea-f6a2-c944-a161cc988d5c.png)

となる。
続いて1項目![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/6b86e696-c0c4-71ed-6b05-79f8725ad684.png)と置く。
微分の連鎖律を使って![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/6b86e696-c0c4-71ed-6b05-79f8725ad684.png)を変形していくと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/792acfa2-4f84-4e3e-1775-1430f5f9f5e8.png)

さらに![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/53ab20fe-1541-7ef3-8f74-91020129f55b.png)であるから

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/40958703-cd95-35ec-a92c-ab55018cd1ef.png)

となり、出力層の活性化関数に恒等関数を用いているため、2項目は1となります。よって求めるべきは1項目であるから

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/f4ceaa30-c78b-3759-f5f2-677b1ebeb9ec.png)

となり、損失関数は2乗誤差を用いているため
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/eaf068c9-aea2-05ff-75aa-e23e837636ed.png)
であるから

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/41847af5-2315-a44b-a545-199355990292.png)

よって

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/8747cee7-f7cd-57df-7ebe-d0f25ebbf7de.png)

となります。

同様に中間層についても考えてみる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/647e58a5-9d07-2513-faa2-961ebf66e1c7.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/8a1f54c0-3781-3494-b8b9-d76ac5d1d744.png)かつ![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/f74e6eae-df03-0cad-179d-c7e059f7e155.png)であるから![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/6006ebec-8078-d4e1-7c8c-954808fbab84.png)と置き換えることができ、以下のような式になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/7aca71f9-639a-da19-ce50-469020d94d7c.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/43299546-599d-fd4e-75ab-3ea292adadd5.png)について補足しておくと以下の図のような関係になっています。

![スクリーンショット 2019-03-05 23.16.03.png](https://qiita-image-store.s3.amazonaws.com/0/346585/b2fa8f94-db33-ad06-743f-5cee4991a78b.png)

では1項目について考えてみると、![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/75549536-2565-faa1-3f27-65bc308f7d09.png)
は![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/6a8b0b37-1b79-2627-eafd-0b028b0dcee9.png)
と置いているから

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/3467ea46-ba24-3a1b-36f8-c0511efc17a3.png)


となり、3項目![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/17c6ca59-6a04-4c1a-93ac-5840b7a2918c.png)は![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/78a2c24b-f157-0d04-b3b4-68ae5f7e630e.png)であるから

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/c0411f09-03c1-405c-9f82-2fd3331667af.png)

となり、最後に2項目![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/87f2aace-89d8-9c3a-07a3-ab19eec1f808.png)について考えると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/e1680237-b5df-96c2-2e1c-a9e487bc5cc8.png)

よって
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/80c24e5d-67b6-c508-cab6-72e4daf4113e.png)

すべての項を合わせると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/d6708335-847e-1888-9779-51a607ea43e9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/165efa10-4144-f950-ca3f-2a29e2476ba8.png)番目の![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/a7ed1dbf-bb83-70dc-b23a-c23a7ee73c96.png)は常に![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/00c91a11-8ae0-98ff-d6b0-ea07a7a2a284.png)番目の![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/a7ed1dbf-bb83-70dc-b23a-c23a7ee73c96.png)から求めることができる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/00c91a11-8ae0-98ff-d6b0-ea07a7a2a284.png)番目、つまり1つ先の![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/a7ed1dbf-bb83-70dc-b23a-c23a7ee73c96.png)をずっと辿っていくと出力層の![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/a7ed1dbf-bb83-70dc-b23a-c23a7ee73c96.png)にたどり着く。
なお出力層の![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/a7ed1dbf-bb83-70dc-b23a-c23a7ee73c96.png)は以下の式のように簡単に求められました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/9fa97c29-349d-bb58-2fa1-29b71c41013f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/b84a802e-f94d-9ac1-28b8-09ad822bc4da.png)における勾配を求めるためには出力層から![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/a7ed1dbf-bb83-70dc-b23a-c23a7ee73c96.png)(誤差)を伝達してくれば良い。
この![image.png](https://qiita-image-store.s3.amazonaws.com/0/346585/a7ed1dbf-bb83-70dc-b23a-c23a7ee73c96.png)が出力層から伝わってくる様子から逆伝播と呼ばれています。

難しい数式だらけでしたが以上が誤差逆伝播法の解説でした。