Sigmoidレイヤの実装|Excel VBAでIris分類問題

本ページはゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装を参考にニューラルネットワークを作成していきます。参考書籍では「Affineレイヤ」「ReLUレイヤ」「Softmax-with-Lossレイヤ」という3つのレイヤを作成し、それらを組み合わせることでニューラルネットワークを構築していきます。本サイトでも同じように3つのレイヤをVBAで作成し実装していきます。(ReLUレイヤの代わりとなるSigmoidレイヤというものも実装します)

本ページではその中の「Sigmoidレイヤ」をVBAで実装していきます。
基本的にはReLU関数を使えば問題なく学習できると思いますが、知識としてSigmoid関数についても理解しておいて損はないと思います。本サイトのコードではメインモジュールでReLU関数とSigmoid関数を切り替えることができるように実装していきます。

※エクストラステージ(おまけ)のような内容なので、本ページはやらなくても問題はありません。

 

Sigmoidレイヤの機能

Sigmoidレイヤは入力された値にSigmoid関数を適用し活性化させる機能を持ちます。
本レイヤは「順伝播」と「逆伝播」の両機能をもっているため、このレイヤを呼び出すだけで簡単にニューラルネットワークを構築することができるようになっています。
基本的に扱いは前回の「ReLUレイヤ」と同じです。

 
機械学習の流れ 

今回作成していくニューラルネットワークをレイヤで表すと下図の通りです。

このレイヤの流れは以下のようになっています。(以下では上図の各レイヤを左から「Affine1」「Sigmoid」「Affine2」「Softmax-with-Loss」として説明していきます)

1. 入力値(4つの数字)を「Affine1」に入れ、入力値と重みの総和を計算する。
2.「Affine1」の出力を「Sigmoid」に入れて活性化させる。(ReLUにも変更可能)
3.「ReLU」の出力を「Affine2」に入れ、入力値と重みの総和を計算する。
4.「Affine2」の出力を「Softmax-with-Loss」に入れ、活性化の結果/損失関数を求める。
5.「Softmax-with-Loss」から「Affine2」に逆伝播(Affine2のパラメータを更新)
6.「Affine2」から「Sigmoid」に逆伝播
7.「ReLU」から「Affine1」に逆伝播(Affine1のパラメータを更新)

上記の1~7を数百回ループすることで「Affine1」と「Affine2」が持つパラメータ(重み/バイアス)が正解に近づくように徐々に更新されていきます。あとは損失関数をもとにループを止めれば学習終了といった流れになってます。

 

Sigmoidレイヤの実装

まずはクラスモジュールで「Sigmoid_Layer」というモジュールを作成します。
Sigmoidレイヤでは逆伝播時に「順伝播時の入力値」が必要になるため、値を保存することのできるクラスモジュールで作成します。

また「Option Base 1」を使い配列を「1」スタートにします。
これは要素数とインデックスを合わせ配列同士の計算をわかりやすくするためです。

以下はSigmoidレイヤの全コードです。

以下では各関数で何を行っているかを解説していきます。

 

Function forward

関数「forward」は名前のとおり順伝播を行う関数です。
順伝播といっても、入力された値に対してSigmoid関数で活性化させるだけです。
(図でいうと「a1」を「z1」に変換する部分)

 
Sigmoid関数は入力値に応じて0〜1の数値を返す関数です。
式とグラフは下図の通りです。(横軸が入力値、縦軸が出力値)


 
Excel VBAには「Exp関数」があるので、上記の式をそのまま書けばSigmoid関数を適用させることができます。関数「forward」のコードは下記のとおりです。

この関数の引数としては「x()」があります。
これはAffineレイヤからの出力値が入った1次元配列です。
(先ほどの図でいう「a1」)

ループを使ってこの引数の配列の要素1つずつにSigmoid関数を適応させていきます。

Sigmoid関数を適応させた値は「out()」という配列に格納します。
この配列はそのまま逆伝播時に再利用します。

 

Function backward

関数「backward」は名前のとおり逆伝播を行う関数です。

この関数の引数としては「dout()」があります。
これは逆伝播でいう前の層の関数「backward」で求めた「微分の値」が入った配列です。

この「微分の値」をすべての層に逆伝播していくことでAffineレイヤにある重み/バイアスパラメータを徐々に正解に近づけていくことができます。(Affineレイヤではこの逆伝播された「微分の値」を使うことでパラメータを更新していきます)

Sigmoid関数の逆伝播は前の層から逆伝播してきた「微分の値(dout)」と「順伝播時の値(out)」を使い下記の計算を行います。

 icon-code Sigmoidレイヤの逆伝播の値 

dx = dout × (1 – out ) × out

実際は配列が入力されるので、各要素ごとに上記計算を行なっていきます。

 

まとめ

ここではゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装を参考にVBAでSigmoidレイヤの実装を行いました。

今回実装したSigmoidレイヤの機能をまとめると以下の通りです。

Function forward:順伝播(Sigmoid関数を適用する)
Function backward:逆伝播(逆伝播でのSigmoid関数を適用する)

Sigmoid関数の式は内容は一見難しそうですが、VBAコードで書くとかなり単純です。

また、活性化関数なのでReLU関数同様、入力された値を変化させるだけなので配列の”かたち”は変化しません。つまり要素数が10の1次元配列「x()」が入力された場合は、活性化された要素数10の1次元配列が出力されるということです。

レイヤとしては単純な構造をしているので、ReLUレイヤと合わせて理解して見てください。

次回はニューラルネットワークの最終層となるSoftmax-with-Lossレイヤの実装です。
 

【次回】Softmax-with-Lossレイヤの実装
【前回】ReLUレイヤの実装
メインページ
 

 icon-book 参考書籍

AI, Deep Learning, Excel, VBA

Posted by Lic