MLPの基礎理論

# はじめに
ニューラルネットワークってなんか流行ってるらしいけど、実際よくわからないという人向けに大まかな全体像を把握するための記事です.
枝葉の細かい理論や実装の解説は別で書く予定です.
この記事では、MLPの理論的背景が理解することを目指して解説していきます.

# ニューラルネットワークの分類

まず、ニューラルネットワークの分類について触れておきます
ニューラルネットワークは概ね以下の分類ができます.

- 階層型
- 相互結合型

階層型は情報は一方通行であるのに対して、相互結合型は情報が行ったり来たり循環します.
昨今のディープラーニングで使用されているものはほとんどが階層型になります.
本記事では階層型に焦点をあてています.
以降では、階層型ニューラルネットワークをニューラルネットワークと表記します.

```
💡 コラム1: なぜ階層型ニューラルネットワークが普及したのか?
階層型ニューラルネットワークが**普及した**大きな理由の1つにGPUと相性がいいことが挙げられます
GPUでは並列で単純な処理を高速に処理できます.
階層型ニューラルネットでは、主に誤差逆伝播というアルゴリズムが使われ、行列計算で重みを学習していくことができます.
行列計算はGPUを使うことで高速にできます.
つまり、階層型ニューラルネットでは、GPUにより高速な学習が可能になります.
```

```
💡 コラム2: ニューラルネットの細かい区分
wikipediaが割とよくまとまってます
[https://ja.wikipedia.org/wiki/ニューラルネットワーク](https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF)
```

# 単層パーセプトロン
![ml.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315124/c894b435-fac9-3b5c-4a44-d02156892f6d.png)




まずは単層パーセプトロンから説明していきます.

単層パーセプトロンは、今日のニューラルネットの基盤になっているアルゴリズムで、フランク・ローゼンブラットが1958年に論文を発表しました.

仕組みはいたって単純、簡単に計算の流れを書くと
1. 入力値に重みをかけて足しあわる
2. バイアスをたす
3. ステップ関数で0~1に変換する

という感じです.

ステップ関数をシグモイド関数にすればロジスティック回帰と等価になります.
しかしながら、単層パーセプトロンでは線型分離可能な問題しか解けないことがわかっています.
さらには、多層にすることで非線形分離可能な問題を解くことができることもわかっています.
つまり、単層パーセプトロンでは複雑な問題が解けないが、多層にすると複雑な問題を解けるということです.

```
💡 線型分離可能な問題とは何かと言う説明は省きますが、

線型分離: 単純な問題
非線形分離: 複雑な問題
くらいの理解でとりあえずは差し支えないでしょう.

```

単層パーセプトロンを多層にしたものを多層パーセプトロンといい省略してMLP(Multi Layer Perceptron)と呼ばれます.
MLPは昨今の複雑化したディープラーニングではあえて使うことは少ないですが、さまざまな派生理論の大元なので、基礎として理解しておくことは重要です.

# 多層パーセプトロン(MLP)

## **アフィン変換**

MLPを端的に説明すると、**アフィン変換を多層にしたものです.**
アフィン変換は、幾何学的には線型変換と平行移動の組み合わせです.
図を見るとわかりますが、単層パーセプトロンの出力を複数にして活性化関数がないだけです.
要は、入力値に重みをかけて足し合わせることを複数回繰り返してるだけです.

![ml.drawio (2) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315124/ef16a62d-fe9d-e135-d355-f9d4477661b2.png)


ちなみに、行列式では以下のように書けます

$$
Y = WX + B
$$

Wの中身

$$
\begin{bmatrix}
   w11 & w12 & ...& w1m \\
   w21 & w21 & ...& w2m \\
   ... \\
   wn1 & wn1 & ...& wnm \\
\end{bmatrix}
$$

Bの中身

$$
\begin{bmatrix}
   b1 \\
   b2 \\
   ...\\
   bn \\
\end{bmatrix}
$$

## 活性化関数

アフィン変換だけでは非線形問題を解けないので、出力を非線形変換します.
![ml.drawio (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315124/e0944ca2-3c2f-3050-4ec5-4a2b871408c9.png)



出力を非線形変換することを活性化といい、活性化に使用する関数を活性化関数といいます.
活性化関数により、モデルの表現力があがり、より複雑な問題を解けるようになります.
活性化関数にはさまざまな種類がありますが、よく使われる**Relu関数は以下のような形になります.**

$$
f(x) =
\begin{cases}
x~~~~  (x > 0) \newline
0~~~~  (x \leq 0 )
\end{cases}
$$

他にも、ロジスティック回帰で知られる**Sigmoid関数などがあります**

$$
f(x) = \cfrac{1}{1+e^{-x}}
$$

活性化関数についてはまた別の機会に詳しく書こうかと思います.

## 多層化
アフィン変換 → 活性化をさらに繰り返して多層にすればMLPの完成です.
![ml.drawio (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315124/45fcb52b-212d-7036-4331-0187db22bf50.png)



## MLPの特性
こうした階層化されたネットワークでどのような問題が解けるのか?
結論から言うと、理論的には3層ニューラルネットワークは任意の関数を任意の精度で近似できることがわかっています.
これを万能近似定理と言い、ニューラルネットがさまざまな分野で成功を収めているのにはこうした理論的背景も起因しているでしょう.
じゃあもうあらゆる問題は解けるようになったのか?というとそれはNoです.
理論的にはというのがミソで、実際には理論通りそうそう簡単にうまくはいかないです.
ニューラルネットワークで問題を解くには、中間層の大量の重みを最適化する必要になります.
これがなかなか難しく、先人の知恵が詰まっていて面白いところでもあります.

# おわりに
最後まで読んでいただきありがとうございます.
これまでニューラルネットワークの基礎的なアーキテクチャであるMLPの理論をざっくりみてきました.
理論を解説しておいてなんですが、機械学習は実装してなんぼなので、理論的に細かいところでわからないことはあっても、とりあえず実装して動かしてみることが非常に重要です.
実装についてはこちらで解説しているので合わせて見てもらえると嬉しいです.
近日中には学習のアルゴリズムと諸々の課題についてまとめようと思います.
この記事は誰かの理解の助けになれば幸いです.

https://www.wantedly.com/companies/sweeep/projects