ニューラルネットワークをざっくりと理解する パーセプトロン、活性化関数編

近年話題のDeepLearning(深層学習)はニューラルネットワークを応用してできている。ニューラルネットワークを理解するには単純パーセプトロン、多層パーセプトロンの理解が必要となります。
今回は、このパーセプトロンについての概要をメモとして残しておきます。

#単純パーセプトロン
>視覚と脳の機能をモデル化したものであり、パターン認識を行う。シンプルなネットワークでありながら学習能力を持つ。1960年代に爆発的なニューラルネットブームを巻き起こしたが、1969年に人工知能学者マービン・ミンスキーらによって線形分離可能なものしか学習できないことが指摘されたことによって下火となった。他の研究者によってさまざまな変種が考案されており、ニューロン階層を多層化し入出力が二値から実数になったボルツマンマシン（1985年）やバックプロパゲーション（1986年）などによって再び注目を集めた。2009年現在でも広く使われている機械学習アルゴリズムの基礎となっている。 （Wikipedia）

![スクリーンショット 2019-02-17 16.44.02.png](https://qiita-image-store.s3.amazonaws.com/0/346585/3f4d18ee-f26c-9f8c-f3bd-c5f03888eaa5.png)
上記の図のように、入力x1、重みw1の積と入力x2、重みw2の積を足し合わせたものがある閾値を超えていなければ0、超えていれば1を出力するモデルとなっています。
数式にすると以下の通りです。
![スクリーンショット 2019-02-17 17.06.20.png](https://qiita-image-store.s3.amazonaws.com/0/346585/2aa8b7a8-d2f2-ff3a-707f-606211e7880f.png)
この単純パーセプトロンを論理回路を用いて考えてみましょう。

- AND(論理積)

AND回路の出力は以下の表のようになります。

| x1| x2| y |
|:-:|:-:|:-:|
|0  | 0 | 0 |
|0  | 1 | 0 |
|1  | 0 | 0 |
|1  | 1 | 1 |

![スクリーンショット 2019-02-17 16.59.40.png](https://qiita-image-store.s3.amazonaws.com/0/346585/e7632b2c-b613-4457-4c1a-dbc8868777bd.png)
入力x1,x2が1の時のみ出力yが1を出力する回路です。
これを単純パーセプトロンの数式
![スクリーンショット 2019-02-17 17.06.20.png](https://qiita-image-store.s3.amazonaws.com/0/346585/cc853185-cc63-0429-6bf8-a94923fd75ce.png)
のパラメータwとθを求めると、w1=0.5、w2=0.5、θ=0.7などで式の条件を満たすことができます。よってAND回路は単純パーセプトロンで表現することが可能だということがわかります。

- OR(論理和)

OR回路の出力は以下の表のようになります。

| x1| x2| y |
|:-:|:-:|:-:|
|0  | 0 | 0 |
|0  | 1 | 1 |
|1  | 0 | 1 |
|1  | 1 | 1 |

![スクリーンショット 2019-02-17 17.08.46.png](https://qiita-image-store.s3.amazonaws.com/0/346585/9204cc7b-d11e-7837-2ac0-32d1f0ef698e.png)
入力x1,x2のどちらか一方、または両方が1の時に出力yが1を出力する回路です。
パラメータwとθを求めると、w1=0.5、w2=0.5、θ=-0.2などで式の条件を満たすことができます。よってOR回路も単純パーセプトロンで表現することが可能だということがわかります。

- NAND(論理積の否定)

NAND回路の出力は以下の表のようになります。

| x1| x2| y |
|:-:|:-:|:-:|
|0  | 0 | 1 |
|0  | 1 | 1 |
|1  | 0 | 1 |
|1  | 1 | 0 |

![スクリーンショット 2019-02-17 17.27.53.png](https://qiita-image-store.s3.amazonaws.com/0/346585/53838a4f-30d5-9792-3536-3389db1ea171.png)
AND回路の逆バージョンになります。
パラメータwとθを求めると、w1=-0.5、w2=-0.5、θ=-0.7などで式の条件を満たすことができます。よってNAND回路も単純パーセプトロンで表現することが可能だということがわかります。

上記のようにAND、OR、NAND回路は問題なく表現することがわかりました。

- XOR(排他的論理和)

XOR回路の出力は以下の表のようになります。

| x1| x2| y |
|:-:|:-:|:-:|
|0  | 0 | 0 |
|0  | 1 | 1 |
|1  | 0 | 1 |
|1  | 1 | 0 |

![スクリーンショット 2019-02-17 18.03.09.png](https://qiita-image-store.s3.amazonaws.com/0/346585/8ac26d3f-f661-9007-8deb-dad6fb412beb.png)

このXOR回路は、パラメータをどのように調整しても式の条件を満たすことはできません。
![スクリーンショット 2019-02-17 18.12.47.png](https://qiita-image-store.s3.amazonaws.com/0/346585/a614951b-459e-1278-a6ac-f7791b1b81d9.png)
上記の図のように、単純パーセプトロンは直線で表現(線形分離可能な問題)することしかできず、XORのような非線形の領域を表現することはできません。

#多層パーセプトロン

単純パーセプトロンでは表現できなかった、非線形の領域はパーセプトロンの層を重ねることで表現できます。

層を重ねるとXOR回路は以下のように表現できます。
![スクリーンショット 2019-02-17 18.26.09.png](https://qiita-image-store.s3.amazonaws.com/0/346585/91b083ae-2422-968a-bf5c-a75c1add8a2c.png)

| x1| x2| NAND | OR | AND| y |
|:-:|:-:|:-:|:-:|:-:|:-:|
|0  | 0 | 1 |0  | 0 | 0 |
|0  | 1 | 1 |1  | 1 | 1 |
|1  | 0 | 1 |1  | 1 | 1 |
|1  | 1 | 0 |1  | 0 | 0 |

3種類の論理ゲートを組み合わせることで、元の入力が排他的論理和の出力となることがわかりました。

ただし、今の形では出力yが0,1のみであるため現実の問題に適用できるとは思えません。

・回帰問題の出力は連続した実数値
・分類問題の出力は確率

上記のように出力を適切な形に変換する必要があります。

なお多層パーセプトロンは入力層と出力層しかなかった単純パーセプトロンに中間層(隠れ層)を追加したモデルで中間層と出力層の値を以下の活性化関数で変換する必要があります。
![スクリーンショット 2019-02-17 22.28.10.png](https://qiita-image-store.s3.amazonaws.com/0/346585/31117a4b-5058-98d0-b361-2d63daf3d634.png)

#活性化関数

>活性化関数（かっせいかかんすう、英: activation function）もしくは伝達関数（でんたつかんすう、英: transfer function）とは、ニューラルネットワークにおいて、線形変換をした後に適用する非線形関数もしくは恒等関数のことである。（Wikipedia）

説明の意味がいまいちわからないと思いますが、入力の重み付き和をある閾値を境に0,1に変換していました。このように重み付き和をある出力に変換する関数を活性化関数を呼びます。今回は活性化関数の種類と用途について説明します。

- ステップ関数

入力が0以上の時に1を出力し、入力が0以下の時に0を出力する関数。
![スクリーンショット 2019-02-17 22.03.25.png](https://qiita-image-store.s3.amazonaws.com/0/346585/a31ab4eb-5102-0a53-ac50-cc16d0d9ebd4.png)

- ReLU関数

入力が0以上ならその値をそのまま出力し、0以下なら0を出力する関数(入力の重要度を出力に反映する)。
ほとんどの場合、中間層の活性化関数にはこのReLU関数が用いられる。
![スクリーンショット 2019-02-17 22.33.08.png](https://qiita-image-store.s3.amazonaws.com/0/346585/038ceaad-7678-27a2-e0a0-b5e7d6479218.png)
![スクリーンショット 2019-02-17 22.13.32.png](https://qiita-image-store.s3.amazonaws.com/0/346585/d3a48f44-c869-b9a6-b619-3fb295204fdc.png)

- 恒等関数

入力をそのまま出力とする関数。回帰問題における出力層の活性化関数に用いられる。
![スクリーンショット 2019-02-17 22.36.41.png](https://qiita-image-store.s3.amazonaws.com/0/346585/d179d9aa-1996-25f6-1117-a000f8dd95f4.png)

- シグモイド関数

0から1を出力する関数。確率を出力していると解釈できるため2値分類の出力層で用いられる。
![スクリーンショット 2019-02-17 22.39.40.png](https://qiita-image-store.s3.amazonaws.com/0/346585/090289b1-5869-05d0-77d1-7f589825426e.png)
![スクリーンショット 2019-02-17 22.40.01.png](https://qiita-image-store.s3.amazonaws.com/0/346585/648ee5f2-e6ee-dc87-ed6a-fee03adbb894.png)

- ソフトマックス関数

多値分類問題に用いられる関数。多層パーセプトロンで多値分類を行う場合は、出力層のニューロンの数を分類するクラスの数と同じにする。
![スクリーンショット 2019-02-17 22.54.31.png](https://qiita-image-store.s3.amazonaws.com/0/346585/9ec215a6-27a8-c253-195f-c80819be1f72.png)
特徴はn個の出力の総和が1になる。つまりどのクラスに属しているのか予測することができる。
![スクリーンショット 2019-02-17 23.11.35.png](https://qiita-image-store.s3.amazonaws.com/0/346585/f82a7630-f8a2-cc32-aba8-45093aeffd43.png)


今回は、本当にざっくりではありますが、パーセプトロン出力の原理とその出力を適切な形に変換する活性化関数の説明をしました。
次回は、学習方法について理解していきたいと思います。