ディープラーニングがどういう仕組みなのかについて

ディープラーニングについて学んだのでブログに書いておきます．
機械学習やディープラーニングについて学びたい初心者の方は読んでみてください．


# そもそもディープラーニングって？
「コンピュータが大量の画像から猫を認識した」ということをGoogleが2012年に発表して以来，**ディープラーニング**という言葉が流行りました

そのため，ディープラーニングという言葉は知っていても**人工知能とか機械学習と何が違うの？**という人もいると思うので整理をします

まずメディア等でもてはやされている「AI」や「人工知能」というものが大きな括りで，その中にそれを達成するための手段として機械学習があります．そしてその機械学習の一種としてディープラーニングがあります
言葉ではわかりづらいので，図で示すとこういうことです
<img width="482" alt="写真 2019-12-06 15 03 59 (1).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/bd60dbc9-fa9d-bfdc-e622-98c3d67776b0.jpeg">



# ディープラーニングの仕組み
ここからディープラーニングのモデルや，実際の例を交えて中ではどういった計算を行っているのか詳しく書いていきます
##モデルについて
ディープラーニングとは**ニューラルネットを多層（ディープ）にしたもの**です．そのためディープニューラルネットともいいます．ニューラルネットという言葉が出てきてわかりづらくなりましたね

これは脳のニューロンを模したモデルのことです．詳しくは脳科学の話になるのでアレですが，ざっくり言うと脳細胞は電気信号がある閾値に達すると「発火」するという仕組みを模しています．（ニューロンについて知りたい方は調べてみてみてください）

またかつてのニューラルネットは入力層と出力層のみというシンプルな構成でした．その間に**中間層（隠れ層）**を入れることによって，色々なことが出来るようになりました．以下は簡単なニューラルネットの図です．
<img width="470" alt="写真 2019-12-06 15 13 42.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/3b7dad64-80fa-2316-f22e-f94a148d3c6e.jpeg">

上の図にはまだ書いていませんが，実際には入力層から中間層，中間層から出力層に移動する際，**「重み」**というものがかかってきます
そして入力層から中間層では**線形変換**という作業，中間層から出力層へは**非線形変換**という作業を経て出力を得るという流れになります

といっても，なんのこっちゃという感じだと思うので以下で説明します

## 線形変換
まずは入力層から中間層へ線形変換という作業を行います．この線形というのは**直線にするということ**を意味します．

余談ですが，初期のニューラルネットでは線形にしか出来ず，$y = ax +b $のような単純な直線しか求められませんでした　しかし，3層以上になって直線以外も扱えるようになったので，幅が広がったわけです

余談が長くなりましたが，線形変換の説明に進みます
まずは以下の図を見ていただきたいです

![写真 2019-12-06 14 59 03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/4b5a2fee-f494-1d76-52f0-1dc6e5ca3786.png)

ここでは，$x→u$を求めるという作業をしていきます　この$u$は入力の$x$に重みである$w$をかけあわせたものになります

つまり図にも書きましたがこうなります

```math
\begin{bmatrix}
u_{11} \\
u_{12}
\end{bmatrix}=
\begin{bmatrix}
w_{11} & w_{12} &w_{13} \\
w_{21} & w_{22} &w_{23}
\end{bmatrix}
\begin{bmatrix}
x_{1} \\
x_{2}\\
x_{3}
\end{bmatrix}+
\begin{bmatrix}
b_{1} \\
b_{2}
\end{bmatrix}
```

具体的な例を見ていきましょう
例えば $x_1=1,x_2=2,x_3=3$ であり
$w_{11}= 1,w_{12}=3,w_{13}=-1,w_{21}=-1,w_{22} =3,w_{23}=-2$ だったとします

そうするとあとは単純にかけるだけなので，
$u_{11} = w_{11} x_1+w_{12}x_2 +w_{13}x_3$より
$\begin{align}u_{11} =1\times1 + 2\times3+3\times(-1)=4
\end{align}$

$u_{12} = w_{21} x_1+w_{22}x_2 +w_{23}x_3$ より
$\begin{align}u_{12} =1\times(-1) + 2\times3+3\times(-2)=-1
\end{align}$

これで$u_{11}$と$u_{12}$を求めることが出来ました　線形変換では結局重みをかけるだけですね
## 非線形変換
線形変換で$u$を求めたらその次は$z$を求めます　ここでは非線形変換のための関数の例としてReLu関数という活性化関数を使います（実際には活性化関数はシグモイド関数やステップ関数といった多くの関数があります）

ちなみにReLu関数はこんな感じのグラフになります
![Relu関数 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/10d672dc-0be9-88ac-0dc5-4db90d73af65.png)


このグラフでは0を堺にして一気に上がっています　つまり入れた値が0より小さければ0，0より大きければその値を出力する$max(0,u)$といった関数です

では具体的な例を見ていきましょう
先程の線形変換によって$u$を$max(0,u)$に代入してあげると

$z_1 = max(0,4)= 4$
$z_2 = max(0,-1)= 0$
になります

そんなに難しくないですよね？

# 出力yを求める

ここまでくればあとは$y$を求めるだけです
以下の図を見てくれればわかりますが，$z$を求めたので，あとは重み$w$をかけてあげればいいだけです
<img width="476" alt="写真 2019-12-06 15 59 38.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255434/0604c3de-6597-f9fa-543a-29b461161db7.jpeg">

仮に重みが$w_{31}=1,w_{32} = -1$だったとすると
$y= w_{31}z_{11}+w_{32}z_{12} $より非線形変換で求めた$z$を用いて
$y = 1\times4 + 0\times (-1)= 4$ となります

以上がディープラーニングの基本的な流れになります

実際には大量のデータを扱うわけですがとても手計算は出来ませんが，中ではこういった計算を行っているということをしているんですね．参考になれば幸いです．