JDLA_E資格の深層学習「NN」

#1.ニューラルネットワークとは

ニューラルネットワークとは、多数の数値入力$x$ に対して、重み$w$をかけて、バイアス$b$を加えて、それを計算することによって、どういう特徴をもったものであるかを推論して数値を出力するモデルのことである。
また、重み$w$と、バイアス$b$の最適値を求めることを学習という。
ここで、中間層が４つ以上のNNを深層ニューラルネットワークという。複雑な問題に対処できる。

![NN.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/bc1055a6-6b84-092a-527b-10d459e9d19f.png)

ニューラルネットワークが使える問題

1. 分類問題
1. 回帰問題

上記のどちらにも使えるので万能。

#2. NNの入力層＋中間層

NNの入力層へ入れた数値入力xは、重みwを掛けられ、さらにバイアスで調整されて、uとして中間層へ入力される。そして、中間層の活性化関数fによってzへ変換されて、次の中間層の入力xとなる。

~~~math
W=
\begin{pmatrix}
w_1 \\
w_2 \\
\cdots \\
w_i
\end{pmatrix}
,
X=
\begin{pmatrix}
x_1 \\
x_2 \\
\cdots \\
x_i
\end{pmatrix}
\\
u= WX+b \\
z=f(u)
~~~
![NN2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/ca79d79f-2ae1-6d43-5cbf-9212ce3f21e7.png)

#3. 活性化関数

前節で説明した入力xと重みW、バイアスbによる演算は線形なものである。こに対して中間層、出力層の活性化関数fで非線形な処理を加えることで、いろんなモデルを表現することが出来る。

中間層と出力層では、活性化関数の目的が異なる。

**中間層で使う活性化関数**
+ ステップ関数
+ シグモイド関数（ロジスティック関数）
+ Relu関数

**出力層で使う活性化関数**
+ ソフトマックス
+ 恒等写像
+ シグモイド関数（ロジスティック関数）

##3.1 中間層で使う活性化関数
中間層で使う活性化関数は、入力信号の強弱を調整することが役割である。

###3.1.1 ステップ関数

今ではほぼ使われることがなくなった古典的な０、１に分類するだけの活性化関数である。線形分離が出来るものにしか使えない。

~~~math
f(x) = \left\{
\begin{array}{ll}
1 & (x \geqq 0 ) \\
0 & (x <0 ) 
\end{array}
\right.
~~~

![ステップ関数.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/d4c67baf-624c-d644-c93c-8ce7cbb4ec9c.png)

###3.1.2 シグモイド関数
ステップ関数では０か１しか表現できなかったが、シグモイド関数では、強弱が付けられる。NN普及の1要因になったと言われる。
しかし、勾配消失問題が発生する。微分値の最大値が0.25となり層を増やしてシグモイド関数が増えれば増えるほど勾配がなくなっていく。

~~~math
f(u) = \frac{1}{1+ e^{-u}} \\
~~~

![シグモイド関数.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/69ad8620-e97f-5ebe-75c6-68d4b795d79b.png)

###3.1.3 Relu関数
シグモイド関数の勾配消失問題を解決するために登場して、今最も使われている活性化関数。微分値の最大値は1.0。また、最小値が０となるので、ニューロンがスカスカになるスパース化と呼ばれる現象が発生し、発火しないニューロンが出来る。これによって精度が向上しやすいと言われる。要らない情報は次の層に伝える必要はないので。
下記の式で表現され、上限はない。ランプ関数とも言われる。

~~~math
f(x) = \left\{
\begin{array}{ll}
x & (x > 0 ) \\
0 & (x \leqq 0 ) 
\end{array}
\right.
~~~

![Relu.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/364e9402-e145-9d34-59e9-d5df7c09df45.png)

##3.2 出力層で使う活性化関数
出力層の活性化関数は、抽出された情報を出力として使いやすいように加工する事が目的である。

###3.2.2 恒等写像
回帰問題に使う。入力に対して何もせずにそのまま出力する。

~~~math
f(u) = u
~~~

###3.2.3 シグモイド関数（ロジスティック関数）
二値分類に使う。

~~~math
f(u) = \frac{1}{1+ e^{-u}} \\
~~~


###3.2.1 ソフトマックス
多クラス分類に使う。

~~~math
f(i,u) = \frac
{e^{u_i}}
{\sum_{k=1}^{K} e^{u_k}}
~~~

#4. 出力層

出力層では、分類の問題であれば、どの分類の可能性が高いかという確率出力yを行う。

そして、教師データdとの誤差を計算し、その誤差を小さくするようなパラメータW、bの値を学習により最適値へと更新していく。

![NN3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/12ca069a-7bdc-2039-6b2b-57db27d0285f.png)

### 4.1 誤差関数

誤差関数として、単純なものは二乗誤差がある。

~~~math
E(w) = \frac{1}{2} \sum ( d_i - y_i )^2
~~~

ここで二乗をするのは、二乗しないと±で誤差が０になってしまうからである。また、　$ \frac{1}{2} $には、この式の中での意味はない。誤差逆伝搬の計算を行うときに二乗の部分を微分すると、$ \frac{1}{2} $の部分が１になり、計算が簡単になるため、便宜的に置かれているだけである。

実務でよく使う誤差関数は以下

+ 平均二乗誤差（MSE)：回帰問題の場合
+ 交差エントロピー　：分類問題の場合

###4.2 問題に対する関数利用分類
問題の種類によって利用する関数のテンプレート的には以下の組み合わせで実装すると、標準的なモデルが出来る。

|-|回帰問題|二値分類問題|多クラス分類問題|
|:--------|:----|:----|:----|
|利用する活性化関数|恒等写像|シグモイド関数|ソフトマックス|
|利用する誤差関数|二乗誤差、MSE|交差エントロピー|交差エントロピー|

~~~math
誤差:E(w)= \sum_{n=1}^N E_n
~~~

~~~math
二乗誤差：E_n(w) = \frac{1}{2} \sum_{n=1}^n (y_n - d_n)^2 \\
交差エントロピー：E_n(w) = - \sum_{n=1}^n d_i log (y_i)
~~~