多層パーセプトロン (Multilayer perceptron, MLP)をExcelで理解する

多層パーセプトロン（Multilayer perceptron、MLP）は、順伝播型ニューラルネットワークの一種であり、少なくとも3つのノードの層からなります。入力ノード以外の個々のノードは非線形活性化関数を使用するニューロンであり、誤差逆伝播法（バックプロパゲーション）と呼ばれる教師あり学習手法を利用することで、線形分離可能ではないデータを識別できます。非線形活性化関数として使われる関数のひとつに、シグモイド関数があります。

今回は、入力層Xに4つのノード、隠れ層Hには3つのノード、出力層Oに3つのノードを配置したMLPをExcelで実装しようと思います。

![network01.png](https://qiita-image-store.s3.amazonaws.com/0/211162/11d175ed-db04-161e-31f3-cbd70213f157.png)

# あやめのデータ（3品種）を例に説明します。

<a href="https://github.com/maskot1977/ipython_notebook/blob/master/toydata/iris.xlsx">あやめのデータ</a>をダウンロードしてください。

あやめのデータは機械学習の勉強でよく使われるデータで、3品種150サンプルの花片や萼の長さ・太さから品種を当てる（予測する）という問題がよく解かれます。

![01データ.png](https://qiita-image-store.s3.amazonaws.com/0/211162/d2ebd5fe-3709-dc56-d0df-15ab9812b788.png)

B-E列が説明変数X、F列が目的変数Yと思ってください。このYを予測するMLPモデルを構築したいと思います。


# 隠れ層と出力層を乱数で初期化

２行目〜３行目のH0〜H2が隠れ層のニューロンを表します。各ニューロンは入力層X1〜X4からの入力を受け付けて、行列「B2:E4」で表される重み行列Wとの線形結合とベクトル「F2:F4」で表されるバイアス項θとの和を計算し、それをシグモイド関数で変換した値を出力します。

７〜９行目のO0〜O2が出力層のニューロンを表します。各ニューロンはH0〜H2からの入力を受け付けて、行列「B7:D9」で表される重み行列Wとの線型結合とベクトル「E7:E9」で表されるバイアス項θとの和を計算し、それをシグモイド関数で変換した値を出力します。このO0, O1, O2からの出力がそれぞれ、品種0、品種1、品種2である確率を出力します。

説明変数Xから目的変数Yを精度よく出力するための重み行列Wとバイアス項θを求める、というのが今回の計算の目的になります。まずは、これらの重み行列Wとバイアス項θを乱数で初期化します。

![02隠れ層と出力層.png](https://qiita-image-store.s3.amazonaws.com/0/211162/0fe8753f-dc6e-05dd-7334-5a815bfe3c8b.png)

# 入力データを標準化

それぞれの説明変数Xについて、最大値が1、最小値が0になるような標準化を行います。

![03入力データの標準化.png](https://qiita-image-store.s3.amazonaws.com/0/211162/645c6be9-11ff-bb13-66c1-b879489e298f.png)

# 隠れ層の出力

隠れ層の各ニューロンは、入力層X1〜X4からの入力を受け付けて、行列「B2:E4」で表される重み行列Wとの線形結合とベクトル「F2:F4」で表されるバイアス項θとの和を計算し、それをシグモイド関数で変換した値を出力します。

今はWとθがデタラメな乱数なので、出力もデタラメです。

![04隠れ層の出力.png](https://qiita-image-store.s3.amazonaws.com/0/211162/8e3e34bd-7ea5-9958-4199-70c140912492.png)

# 出力層の出力

出力層の各ニューロンはH0〜H2からの入力を受け付けて、行列「B7:D9」で表される重み行列Wとの線型結合とベクトル「E7:E9」で表されるバイアス項θとの和を計算し、それをシグモイド関数で変換した値を出力します。このO0, O1, O2からの出力がそれぞれ、品種0、品種1、品種2である確率を出力します。

今はWとθがデタラメな乱数なので、出力もデタラメです。

![05出力層の出力.png](https://qiita-image-store.s3.amazonaws.com/0/211162/2cb48213-e15d-db49-f113-3a657a718932.png)

# 予測結果の表示

出力層O0〜O2からの出力を比較して、最も大きな出力をしたニューロンが最終的な予測結果（分類された品種）を表すことにします。

![06予測結果の表示.png](https://qiita-image-store.s3.amazonaws.com/0/211162/f19dcecf-2e29-3070-4bb0-1d37aa5f19c2.png)

# 教師データの表示と答え合わせ

教師データと照合して答え合せをします。

![07教師データの表示.png](https://qiita-image-store.s3.amazonaws.com/0/211162/253de5e7-7f33-8b48-a0ef-93a401873d5d.png)

正解していれば１点、不正解なら０点というスコアが算出されるようにします。

![08答え合わせ.png](https://qiita-image-store.s3.amazonaws.com/0/211162/dfd5ca36-2f03-1835-b6b2-06289d2517a2.png)

# 誤差の算出

スコアとは別に、誤差を算出します。誤差は、出力層O0〜O1からの出力と正解（教師データ）との差分の２乗和とします。

![09誤差の算出.png](https://qiita-image-store.s3.amazonaws.com/0/211162/cfed0c7c-a94a-69d3-180b-153eb401ffbd.png)

この誤差の総和Qtを最小化するWとθを求めるわけです。

![10誤差の総和.png](https://qiita-image-store.s3.amazonaws.com/0/211162/4fcde592-4c37-e243-576d-345e26a14606.png)

# 精度の算出

誤差の総和を最小化するWとθを求める前に、精度指標も計算できるようにしておきましょう。ここでの精度とは、教師セットと同じ予測を出力した割合です。

![11精度.png](https://qiita-image-store.s3.amazonaws.com/0/211162/9a5e2c22-b509-6f46-4bee-21f9ac005925.png)

# ソルバー

ソルバーが解決します。目的セル、目標値、変数セルを間違いなく入力して「解決」してください。

![12ソルバー.png](https://qiita-image-store.s3.amazonaws.com/0/211162/406d7914-b60d-adee-e2b4-4aa5ec353cfd.png)

# 収束例

収束結果はひとつとは限りません。私が計算した例をいくつか挙げます。エクセル表の次に描いたネットワーク図では、数値が大きいほど辺が太くなるように描いてあります。

## 収束例1

![13収束例0927.png](https://qiita-image-store.s3.amazonaws.com/0/211162/30a0cb5a-791e-ebba-0102-524bb5480c52.png)
![Network0927.png](https://qiita-image-store.s3.amazonaws.com/0/211162/40649b0d-4cee-0af0-0a09-6546d4c33390.png)

## 収束例2

![13収録例0953.png](https://qiita-image-store.s3.amazonaws.com/0/211162/b03ee233-913c-c6e9-9edb-dd50cc735e64.png)
![Network0953.png](https://qiita-image-store.s3.amazonaws.com/0/211162/2ab4983c-c0f7-f24c-ec4a-9dc5fe36f473.png)

## 収束例3
![13収束例0960b.png](https://qiita-image-store.s3.amazonaws.com/0/211162/dc749975-4260-e81f-e937-f217a22c742a.png)
![Network0960b.png](https://qiita-image-store.s3.amazonaws.com/0/211162/a8a8ee55-983b-09d0-c21d-f9a362ba1bd0.png)

## 収束例4
![13収束例0960c.png](https://qiita-image-store.s3.amazonaws.com/0/211162/8740a33f-1cce-03c0-b8fa-fe625262e08d.png)
![Network0960c.png](https://qiita-image-store.s3.amazonaws.com/0/211162/7cfca2b7-8b17-23cd-34cf-4fbfd32be44f.png)

## 収束例5
![13収束例0960.png](https://qiita-image-store.s3.amazonaws.com/0/211162/0af16069-972a-8753-8da5-6f03f7afcdc0.png)
![Network0960.png](https://qiita-image-store.s3.amazonaws.com/0/211162/2f12c98c-c85c-0cc8-2978-3f823513b06d.png)

# 課題

* MLPとロジスティック回帰との関係について説明してください。
* 収束例1〜5について、結果を解釈してください。また、ベストなモデルはどれか挙げてください。
* 自分で計算して、その結果を解釈してください。
* 「制約のない整数を非負数にする」のチェックを外してソルバーを実行するとどのような結果になるか試してください。またその結果について説明してください。
* 隠れ層のニューロンの数を減らすとどうなるか実験してください。
* 隠れ層のニューロンの数を増やすとどうなるか実験してください。
* 最後に、<a href="https://qiita.com/maskot1977/items/453eddf5aa154c04668c">演習用データ</a>から「ピマ・インディアンの糖尿病診断」を取得し、糖尿病の人と糖尿病ではない人を区別するためのMLPモデルを作成してください。