機械学習の理論を理解しようと エクセルでニュートラルネットワークを作ってみた 〜画像認識 mnist 編〜

#シリーズ目次
- [機械学習の理論を理解せずに tensorflow で オセロ AI を作ってみた ～導入編～](http://qiita.com/sasaco/items/3b0b8565d6aa2a640caf)
- [機械学習の理論を理解せずに tensorflow で オセロ AI を作ってみた ～実装編～](http://qiita.com/sasaco/items/fdb9771c146cb877b183)
- [機械学習の理論を理解せずに tensorflow で オセロ AI を作ってみた ～いざ対戦編～](http://qiita.com/sasaco/items/f9aa608860eebb3026c1)
- [機械学習の理論を理解しようとしてから オセロ AI を作ってみた 〜再始動‼〜](https://qiita.com/sasaco/items/5e102063c256bf56e396)
- [機械学習の理論を理解しようとしてから オセロ AI を作ってみた 〜何これ Alpha Zero 編〜](https://qiita.com/sasaco/items/d249ee3493b5b85c6eb5)
- エクセルでニュートラルネットワークを作ってみた 〜画像認識 mnist 編〜


# エクセルでニュートラルネットワークを作ってみた

はじめにソースコードをダウンロードします。
ソースはここにおいておきます。
[`$ git clone https://github.com/sasaco/excel_deeplearning.git`](https://github.com/sasaco/excel_deeplearning)


## フォルダ構成

今回作成した エクセルファイル(mnist.xlsm) と 10種類のフォルダに分けた学習用のビットマップ画像(*.bmp)をたくさん用意しました

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/10642725-9123-53e4-34e7-48decfe639ce.png)


## 操作方法

モードは２つあります

1. 学習をするモード
2. 学習したニュートラルネットワークを試すモード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/bec591e9-b3e4-927a-84ef-f9bc1054d825.png)

### 1. 学習をするモード の操作方法

上図 1 ~ 10 で指定したフォルダ内の 28 × 28 ピクセルの画像に対して学習を行います

**学習** とは 下図の赤字の数値を更新することを意味しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/6b12b7c2-ad22-8490-c4b8-a3c8cbc25252.png)

- **重みリセットボタン** をクリックすると 初期化します。
- **学習開始ボタン** をクリックすると 上図 1 ~ 10 で指定したフォルダ内のすべての画像ファイルについて学習開始します


### 2. 学習したニュートラルネットワークを試すモード の操作方法

**判定ボタン** をクリックすると 判定したい画像ファイルを選択するウィンドウが表示されます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/9dab368d-4dc2-46fd-3adb-1b3e55a91651.png)

それまでに 学習したニュートラルネットワークによって 上図 1 ~ 10 から予測を示します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/6611c7e6-d59d-0efb-f612-0fa7dd12410b.png)


## ニュートラルネットワークのしくみ

### このExcel で構築しているニュートラルネットワークの構成図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/357963ec-5926-beab-207e-5c72635a9108.png)


### 入力層

入力は 28×28ピクセルのビットマップの各ピクセルの青色の強度を入力層にします
値は 255 で除した 0~1 の値を入力値にしました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/ed26e66d-3d52-6d04-e00c-7d0cfb27b3bc.png)


### 中間層

中間層は 100ノード × 1層 にします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/e1df2e46-025e-a143-c87b-b0c9b6a261b6.png)


### 出力

出力層は 1 ~ 10 で それぞれの出力が 学習した 1 ~ 10 の可能性を示している
下図の場合、5番目が 0.88244　で最大となっているので、このニュートラルネットワークスは
入力に対して、5番目が一番可能性があると判断している
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/0d0c7f71-566e-8aa6-58c1-0b42a3c89a85.png)


## ニュートラルネットワークとは
 
- ∑ **入力値** × 中間層の重み係数 = 中間層層の出力値
- ∑ 出力層の入力値 × 出力層の重み係数 = **出力値**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/583842ee-1b31-c2ba-fb72-4c4f1d4af5ad.png)
中間層の出力値 → 出力層の入力値 とするときに活性化関数を通します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/5d986fb1-54d5-0866-61a0-dd06af58d236.png)
活性化関数はいろいろあるようですが、今回採用した関数は、下式のシグモノイドです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/4824b96f-0e15-1844-2692-f3714d01be34.png)

Excel では 赤い数値が **重み係数** です
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/7e4e0ada-cd95-cc72-1a23-9792889b6fa6.png)

## 重み係数の調整
Excelの赤い数値(**重み係数**)を調整して、数字が認識できるようにします。

### 出力値と正解値との差
下図は１番目の画像を読み込んだ時、ニュートラルネットワークが5番目が 0.88244で最も可能性が高いと判断している
ニュートラルネットワークが出した数値と正解値(0.99 か 0.01)との差を error とする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/dece94fb-2b9e-fcf3-55df-7e928fa721f4.png)

### 正解値を算出する重み係数は
**ニュートラルネットワークが出した数値と正解値との差** が分かったら
正しい値を算定する重み係数は、上記を逆算すればよい

① × ② × ③ × ④ ＋ ⓹

① ニュートラルネットワークが出した数値と正解値との差
② 活性化関数の逆数(微分)
③ 入力層
④ 学習率
⓹ もともとの重み係数
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/2b81ce6e-4fb8-82af-8c97-ea27d97546e8.png)

> 学習率とは 一回の更新で 100% 反映してしまうと学習が収斂しないので、少しづつ学習するための係数

### 重み係数の更新
**出力値と正解値との差** から 新しい 重み係数が分かったら、重み係数を更新します。
Excel の場合 青い数値を赤い数値にコピーする行為です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/6b432ebf-5329-f4b3-f673-f2a7e2490717.png)

この一連の動作を繰り返して 画像認識できるニュートラルネットワークを育てます。

# 学習実行
学習を実行したら 200000回の学習で正解率 90% になりました

![test11.gif](https://qiita-image-store.s3.amazonaws.com/0/142847/bcb4c3ed-60ba-1fd6-0acc-3ca2cfe52bb8.gif)


４日間かかりました。

これが正解率が上がっていく様子です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142847/368febac-279b-82b9-7786-572213c23e45.png)