【DeepLearning】Excel VBAでニューラルネットワークを再現|MNIST学習で文字認識

ディープラーニング(深層学習)の根源にはニューラルネットワークという人工のネットワークが存在しています。このニューラルネットワークは豊富なライブラリが用意されていることから『Python』によって実装されることが多いため、ディープラーニングはPythonでしかできないと思っている人も多くいます。

しかし、ニューラルネットワークの中を覗いてみると、いくつかの計算が網羅的に行われているだけということがわかります。言い方を変えれば、この”網羅的な計算”の内容さえ理解できればどのプログラミング言語でもニューラルネットワークを作ることができるということです。

本ページではこの『ニューラルネットワーク』をExcel VBAのみで再現し、手書き数字を認識するマクロを作成していきます。Excel VBAは情報量も多く、Pythonのように動作環境を作る必要が無いため、手軽にディープラーニングについて学習することができます。

またPythonのようにディープラーニングに有効なライブラリが用意されているわけではないので、ゼロからニューラルネットワークの構造を理解して作っていく必要があり、Pythonでの実装以上に理解を深めることができることでしょう。

ディープラーニング/ニューラルネットワークは簡単に理解できるものではないので時間をかけてゆっくりと理解していきましょう。本ページがディープラーニングの世界に興味を持つ”きっかけ”となれば幸いです。

本ページは「Excel VBAでニューラルネットワークを作成して実際にディープラーニングを行うことで、ディープラーニングについての理解を深める」ということを目的としています。そのため精度にはあまり重きを置かず非常にシンプルなニューラルネットワークを作成していくので最終的な結果がうまくいかない可能性も大いにあるということは予め理解しておいてください。
  

―  参考書籍 ―

本ページはディープラーニング学習の名著
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
を参考にしてExcel VBAでニューラルネットワークを構築していきます。

 
本書は『Python』での実装を想定していますが、処理の流れが細かく解説されているため、内容さえ理解できればその他のプログラミング言語でも再現が可能です。
 

これからVBAを使ってディープラーニングを学習していく上で様々な計算式が出てきますが、それらは全てこの書籍に載っている内容です。Pythonを使う使わないに限らず、ディープラーニングを学習していこうと考えているのであれば本書だけは持っておきましょう。

本ページは上記の書籍を持っている前提の内容になっています。
というのも、ニューラルネットワークの仕組みなどを1から解説していると非常に長くなりますし、書籍を超える説明をここではできないためです。書籍でいう「5章 誤差逆伝播法」まで理解できていれば本ページの内容はすべて理解できるので、興味のある方はぜひ参考書籍を手に取ってみて下さい。

※「ニューラルネットワークの仕組みはいいから、VBAで実際に機械学習をやってみたい」という方は「ディープラーニング実行編」の「全コードまとめ」のページだけ確認すれば大丈夫です。

 

完成イメージ

本ページの内容をすべて行うことで以下gif画像のように、
選択した画像に書かれている手書き数字を認識することが可能になります。

これはファイル名を読み取っているのではなく、実際に画像ファイルに書かれている数字を読み取っています。ニューラルネットワークを理解することでどのようにしてプログラムが数字を認識しているかを理解することができます。

 

ニューラルネットワークの構造

まずは今回作成していくニューラルネットワークの構造を記しておきます。
(構造を見ればわかりますが、実際はディープラーニングというほど深くはない誤差逆伝播を使った多層パーセプトロンでの機械学習となっています)

入力層: 1層 (ニューロン 784個)
隠れ層: 1層 (ニューロン 64個)
出力層: 1層 (ニューロン 10個)

隠れ層の活性化関数: ReLU
出力層の活性化関数: Softmax
損失関数: 交差エントロピー
学習データ: MNISTデータセット

正解ラベルは「one-hot表現」とし、VBAの配列使って表していきます。
正解が「1」の場合は「t(1,0,0,0,0,0,0,0,0,0,0)」
正解が「2」の場合は「t(0,1,0,0,0,0,0,0,0,0,0)」
正解が「3」の場合は「t(0,0,1,0,0,0,0,0,0,0,0)」
          :
正解が「9」の場合は「t(0,0,0,0,0,0,0,0,0,1,0)」
正解が「0」の場合は「t(0,0,0,0,0,0,0,0,0,0,1)」となっています。
 

今回作成するニューラルネットワークはCNN(畳み込みニューラルネットワーク)でもなければ、ミニバッチ処理も行なっていない単純な順伝播と誤差逆伝播の繰り返しだけの学習となっているため、機械学習にはある程度の時間がかかります。

学習時間を省きたい方は事前に学習済みのパラメータも載せているので、それをそのままご利用下さい。あまり精度は高めではありませんが、途中から学習を再開することもできますし、学習率や隠れ層のユニット数などの一部のハイパーパラメータは変更可能なので、いろいろ試してより精度の高いニューラルネットワークを作成してみて下さい。

 

ニューラルネットワーク作成編

ここからExcel VBAで実際にニューラルネットワークを作成していきます。Pythonの「Numpy」や「Class」の代わりにVBAでは「(1次元)配列」「2次元配列」「クラスモジュール」を多用します。ニューラルネットワークの内容だけでも複雑なので、それぞれの使い方をある程度理解してから進めることをオススメます。

1. MNISTデータセットのダウンロード
2. Functionsモジュールの実装
3. Affineレイヤの実装
4. ReLUレイヤの実装
5. Softmax-with-Lossレイヤの実装
6. TwoLayerNetクラスの実装
7. メインモジュールの実装  (ニューラルネットワークの学習機能の実装)
8. MNISTデータセットを学習させてみよう  

 

ディープラーニング実行編

上記の項までではニューラルネットワークとMNIST学習を行いました。
ここでは学習済みのニューラルネットワークを使い、実際に”自分自身が描いた数字(0〜9)画像”を入力して描かれている数字を推論させてみましょう。(※学習の内容によって精度は変化するため100%当たるということはありません)

9. csv_Functionsモジュールの実装 
(参考:VBAでBMP画像を読み込みExcel上でドット絵を作成する方法)

10. 手書き文字の認識をさせてみよう (ニューラルネットワークの推論機能の実装)

全コードまとめ

 

2021年6月1日AI, Deep Learning, Excel, VBA

Posted by Lic