第7章　[ニューラルネットワーク・ディープラーニング] P252 ~275（前半） 【Pythonで動かして学ぶ！ あたらしい機械学習の教科書】

[参考文献]【Pythonで動かして学ぶ！ あたらしい機械学習の教科書】：
https://www.amazon.co.jp/Python%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6%EF%BC%81-%E3%81%82%E3%81%9F%E3%82%89%E3%81%97%E3%81%84%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%BC%8A%E8%97%A4-%E7%9C%9F/dp/4798144983

##第７章で説明していること
・ニューラルネットワークを使って第６章で説明していた最尤推定から交差エントロピー誤差を利用して分類の予測モデルを作るモデルの入力値xが3つ以上のものを作る（第６章では入力値2次元入力の3クラス分類までしかやらなかった。）

######まず、前回同様、入力総和aをみる。
第６章の時と同様に入力次元数を2の時で考える（D=2）
$$
a=w_0x_0+w_1x_1+w_2
$$

切片を表す常に1をとるバイアスパラメータ$x_2$を追加すると
$$
a=w_0x_0+w_1x_1+w_2x_2
$$

総和の式で表せるので、
$$
a=\sum_{i=0}^{2}w_ix_i
$$
これも前回同様だが、シグモイド関数を通して、確率として使えるようにする
$$
y=\frac{1}{1+exp(-a)}
$$
**シグモイド関数を通すことで、入力ちから得られるaの値が0~1の範囲で推移する。（確率も0~1の範囲で推移するため、これを確率分布として使うことができる。）**

第６章では、この0~1の推移の分布を確率として表していたが、今章のニューラルネットワークでは0~1の範囲の値から**発火頻度**を表していると考える。
>（P253）
ここでは、出力値は単位時間あたりのパルスの数、つまり**発火頻度**を表していると考える。aが大きければ大きいほど、発火頻度は発火頻度の限界に近づき、逆に、aが負の大きな値を取ればとるほど、発火頻度は0に近づき、ほとんど発火しない状態となる。と考える。

# 7.2ニューラルネットワークモデル

## ２層フィードフォワードニューラルネット

２層のニューラルネットワークのモデル
![iOS の画像 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/11793d42-f0f5-37f0-7c75-21a4ed1c687f.jpeg)
<font color="SkyBlue">
2次元の入力を3つのカテゴリーに分類することができる。それぞれの出力値がそれぞれのカテゴリーに属する確率を表す。
</font>
**例えば、体重($x_0$)と、身長($x_1$)の2つの入力値があったときに、ある人Aとある人Bそれぞれの身長、体重を入力するとその人がどこの３クラスに属しているかをそれぞれのtが表す。**

```
ex)
クラス
$t_0$=黒人
$t_1$=白人
$t_2$=アジア人

Aさん：
体重：90kg
身長：189cm
をこのモデルに打ち込んだら。
$t_0$=0.95
$t_1$=0.04
$t_2$=0.01
tの合計は1になる
と出てきたら、黒人である可能性が高い

Bさん：
体重：65kg
身長：168cm
をこのモデルに打ち込んだら。
$t_0$=0.06
$t_1$=0.04
$t_2$=0.90
と出たら、アジア人である可能性が高いと言った具合。
```
### それぞれの確率が出る仕組み：
第６章P239の図を見るとわかりやすい

![iOS の画像 (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/f6b439eb-1a14-1e78-8e18-7b48589adc29.jpeg)

・それぞれの訓練データの入力に対して最尤推定で$w_0,w_1,w_2$の値を求める。
・そして、総和である$a_0,a_1,a_2$が求まるので
・それぞれの出力値yはシグモイド関数で確率として表せられている。
$y_0$の場合はt=0である確率
$y_1$の場合はt=1である確率
$y_２$の場合はt=2である確率

それぞれが、入力値の値によって0~1のどこかで決まるのでクラス分類ができる。
**（なぜ、tの総和が1になるかはわからない。）**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/bc640f35-8b28-2333-1f98-d4533480e4e0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/83919ce0-2aff-a6a1-6feb-e53f93ef26a4.png)

　- 中間層ではそれぞれの入力値xにwの重みをかけて中間層bに渡している。
　- 中間層bではそれぞれの入力値とダミー変数の総和を表しており、その総和をシグモイド関数に通して確率(z)として使えるようにしている。
　- その後、再度同じように中間層のそれぞれの確率zに重みvをかけて、出力層で再度総和をとる。
　- 今度はシグモイド関数ではなくて、ソフトマックス関数を通して出力値を確率として使用できるようにしている
>
*なぜ、シグモイド関数とソフトマックス関数を使っているのか明確な理由はわからないが、おそらく一度中間層に出力した時点では2クラス分類になってしまうので、さらに重みvをかけて総和をとる必要があるが、重みvを欠けた時点で0~1の範囲を超えてしまうので、そこを確率として直さなければいけない。そこで3次元の出力に対応したソフトマックス関数をかけていると思う。。。*

P258

中間層の入力総和：
$$
b_j=\sum_{i=0}^Dw_{ji}x_i
$$

中間層の出力：
$$
z_j=h(b_j)\hspace{25pt}h()はシグモイド関数
$$

出力層の入力総和：
$$
a_k=z\sum_{j=0}^{M}v_{kj}z_j
$$
※入力総和と呼んでいるってことは、中間層の値を入力値として見ている？？

出力層の出力：
$$
y_k=\frac{exp(a_k)}{\sum_{l=0}^{K-1}exp(a_l)}=\frac{exp(a_k)}{u}
$$

## 数値微分法
>交差エントロピー誤差は、ある入力があって(x=5.8g とか)そこから、ある確率（T=[1,0,0]とか）、そのT=[1,0,0]が生み出される確率を最尤推定で求めた時の誤差。入力値から、確率を出力するモデルを作成することができる。
そのモデルに入力値を新たに入力することでその入力値がどこに分類されるのかを出力する。

2層のフィードフォワードネットワークの交差エントロピー誤差は：
$$
E(w,v)=-\frac{1}{N}\sum_{n=0}^{N-1}\sum_{k=0}^{K-1}t_{nk}log(y_{nk})
$$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/13d9a9c3-8c82-010b-22c9-4c3252a05d96.png)

P267の図だが、このページで言っていることは、このページそのままです。

まず、何をしたいかというと、このE(w)は最尤推定から、対数尤度をとった交差エントロピー誤差で、谷の一番したが誤差が一番少ない値w（重み）をとる。

この最もある入力から、確率を求めた時の出力tを求めるためのwが欲しいので、傾きが0である。この谷底の値wが欲しい（この谷底の時のy軸が確率となっていて、最尤推定に-1をかけて逆にしたものだから、最尤推定の最も尤もらしい確率=この谷底となる）。

**よって、図の$w^*$は、分類モデルを作る時の最適な重みwとなる。**

<font color="Red">
ここで言っていることは。
・偏微分計算するの大変だよね
・わざわざ偏微分計算しなくても$w^*$のほんのちょっと先の値と、ほんのちょっと前の値を求めてしまえば、2点を通る直線を求められるから、傾きに似た傾きっぽい値を取れるよね
・それが(7-19)の式だよ
</font>

で、7-19はパラメータwが一つの時の話をしているが、それを複数個に拡張した時の式が(7-20)ですよ。
**なので、複数個のパラメータがある時も簡単に適切なwたちが求められます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/6f8dd5f9-e4ef-3364-980e-5dfb4c174027.png)

最後に、P269のこのグラフの見方：
（おそらく）w,vのそれぞれの重みパラメータに対する偏微分の値が出ているので、この値が0に近いほど傾きが小さい点となる。なので、wは4が良い感じ、vは８が良い感じのパラメータとして設定できる。

という意味だと思う。

####前半最後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/0f8e63a0-f199-298d-f632-bb46906bedd2.png)

（P373, 273は読んでそのままなので省く）

上の図では、前のページで求まったw,vの重みを元にモデルを作成して、実際にテストデータを入れた時の描画。

それぞれのクラス1,2,3の誤差が少ない時のw,vが求められているので、実際の入力値を入れた時の確率が高い部分が0.5~0.9の範囲と定義づけられている。したの画像の、$t_0~t_2$の部分。
それぞれの確率が高いところだけの等高線を表示させて区画分けすると、分類ができているように見える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/97601df8-8213-2827-7005-19adc09567ce.png)