【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で実際に機械学習をやってみたい」という方は「ディープラーニング実行編」の「全コードまとめ」のページだけ確認すれば大丈夫です。

 

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

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

入力層: 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次元配列」「クラスモジュール」を多用します。ニューラルネットワークの内容だけでも複雑なので、それぞれの使い方をある程度理解してから進めることをオススメます。

MNISTデータセットのダウンロード

Functionsモジュールの実装
Affineレイヤの実装
ReLUレイヤの実装
Softmax-with-Lossレイヤの実装
TwoLayerNetクラスの実装
メインモジュールの実装 

MNISTデータセットを学習させてみよう

 

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

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

・読み込んだbmp画像を数値に変換
 参考:VBAでbmp画像を数値化して読み込む

・手書き文字の画像ファイルの判定を行う

・全コードまとめ 

 

2020年9月9日AI, Deep Learning, VBA

Posted by Lic