ニューラルネットワーク
2022年に書いた記事をまとめておこうと思いますー。 NeuralNetwork on Scratch Scratch で作ったニューラルネットワークです。 ミニバッチにも対応しています。 手書きの文字や図形をちゃんと学習し、認識できるようになります。 Scratch のプロジェクトは公…
マクロの登録 各ボタンにマクロを登録します。 ボタン プロシージャ名 データ読み込み Click_データ読み込み 重みクリア Click_学習状況クリア 学習開始 Click_学習開始 テスト開始 Click_テスト開始 データ読み込み C2セル、C3セルをダブルクリックして、デ…
スーパーバイザ メインの処理となるモジュールです。 '[mdlSupervisor - 標準モジュール] Option Explicit Option Base 1 Dim mcInLayer As classInputLayer Dim mcHLayer1 As classHiddenLayer Dim mcHLayer2 As classHiddenLayer Dim mcOutLayer As classO…
出力層クラス 出力層のユニットを管理するクラスです。 '[classOutputLayer - 出力層クラス] Option Explicit Option Base 1 Dim mUnitList() As classUnit 'ユニット格納用リスト Dim mUnitCount As Long '自レイヤーのユニット数 Dim mAct As Long '活性関…
隠れ層 隠れ層のユニットを管理するクラスです。 '[classHiddenLayer - 隠れ層クラス] Option Explicit Option Base 1 Dim mUnitList() As classUnit 'ユニット格納用リスト Dim mUnitCount As Long '自レイヤーのユニット数 Dim mAct As Long '活性関数の種…
入力層のユニット管理 入力層のユニットを管理するためのクラスです。 '[classInputLayer - 入力層のユニットを管理するためのクラス] Option Explicit Option Base 1 Dim mInUnitList() As classInputUnit 'ユニット格納用リスト Dim mInUnitCount As Long …
入力層のユニットクラス 入力層のみ実装が異なります。 '[classInputUnit - 入力層のユニットクラス] Option Explicit Dim mX As Double '入力データをセットする '[引数] <- inputData : Double / 入力データ Public Property Let X(ByRef aInputData As Do…
演算用モジュール 活性化関数や損失関数を実装します。 '[ML - マシンラーニング演算用モジュール] Option Explicit Option Base 1 '活性化関数 ReLU '[引数] <- aU : Double / ユニットの u '[戻り値] -> actReLU : Double / ReLU適用後の値 Public Functio…
ファイル指定処理 読み込むデータのCSVファイルを指定するコードです。 「ws_Main」シートに記述します。 '[ws_Main - シートオブジェクト] Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim filePa…
メイン画面 celaeno42.hatenablog.com メイン画面の数式 数式はこのように入っています。 C列の値はとりあえずこんな感じで。 モジュールとシート 必要な標準モジュール、クラスモジュールは以下の通りです。【標準モジュール】 オブジェクト名 用途 G 定数…
全コード掲載 なかなか更新の時間がとれず、ずいぶんと放置してきてしまい、未完に終わってしまうのも何なのでいくつかに記事を分けて全コードを載せていきます。 概要とデータ celaeno42.hatenablog.com メイン画面 celaeno42.hatenablog.com ws_Main, G, m…
勾配降下法 このブログでは VBAでニューラルネットワークをフルスクラッチする連載をしてますが、数式編でやった通りパラメータ更新の式は手順を追って導出できたのですが、その理屈的なところがどうもしっくりいってなかったので、そんな自分でもわかるレベ…
順伝播の実行 前回は順伝播の動作確認で必要な部分のコードを追加しました。 今回は、実際にデータを読み込んで順伝播の処理を行い、結果を表示させてみます。 celaeno42.hatenablog.com データの準備 使用するデータは以前の記事で準備しています。celaeno4…
動作確認 前回までで順伝播については入力から出力まで計算できるようになりました。celaeno42.hatenablog.comここまででいったん正しく動作するかを確認してみましょう。 ただ、その前にコードをいくつか追加しておきます。 それぞれ「----追加----」の部分…
出力層 前回は隠れ層のクラスを作成しました。今回は出力層用のクラスを作成します。なお、今回のコードは隠れ層とほとんど同じです。 celaeno42.hatenablog.com 出力層の初期化 隠れ層同様、初期化処理を作ります。コードは「classOutputLayer」に記述しま…
レイヤークラス 前回はユニットクラスを作成しました。今回からはユニットを管理するレイヤークラスを作成していきます。 入力層は以前こちらで作成しました。 celaeno42.hatenablog.com隠れ層と出力層がありますが、若干機能が異なるので今回は別々に実装し…
ユニット ニューラルネットワークの基本となる単位です。隠れ層、出力層のユニットは基本的には同じ機能を持つので、共通して使える「classUnit(ユニットクラス)」として定義します。まずは順伝播の機能を作ります。 各ユニットは次のような機能を持つよう…
入力層の作成? まず手始めに入力層のコードを書いていきます。 が、、実は入力層はデータを受け取って隠れ層1層めに渡しているだけなので、なくても大丈夫です。 もし、入力層の作成が面倒だったり、計算資源を無駄にしたくない>< 場合などは、入力層の…
前回まででデータの読み込み処理の作成が完了しました。 今回からは実際にニューラルネットワークを作るフェーズに移っていきます。 その前に、どのように実装するかを簡単に見ていきましょう。以前の記事もあわせて参考にしてください。 celaeno42.hatenabl…
前回はそれぞれのシートにCSVデータを読み込む処理を作成しました。 今回は読み込んだデータを標準化する処理を書いていきます。 標準化 「標準化」とは、データを「平均が0、分散が1になるように変換する」ことです。 標準化を行うことで、学習の効率がよく…
必要なシート、モジュールの追加 前回は読み込むデータのパスを取得するまでの処理を作りましたので、今回はそのデータを読み込む処理を作ります。 訓練データ、テストデータはそれぞれ別のシートに読み込ませたいので、「訓練データ」と「テストデータ」の…
メイン画面の作成 メイン画面を下記のように作成します。シート名は「ws_Main」としておきます。 また、「G」という名前で標準モジュールを作成しておきましょう。 ここにはグローバルで使用する定数や変数をまとめておきます。 定数の宣言 パスを格納するセ…
今回作るニューラルネットワーク 入力:4 出力:3 隠れ層の活性化関数:ReLU 出力層の活性化関数:Softmax 損失関数:クロスエントロピー 学習方法:教師あり学習 教師データ:one-hot 表現 扱う問題:分類問題 データセット:アイリス データセット さん…
逆伝播の更新式を一覧でまとめたものを載せておきます。 VBA編ではこれを元に実装していきます。
逆伝播についてはそれぞれの重みとバイアスの (勾配)の部分を載せます。 重みやバイアスは、 (勾配)に学習率を掛け、現在の重みやバイアスの値から引くことで更新していきます。 出力層 出力層についても共通部分を で表すことにしましょう。 ユニットo1…
いままでに求めた順伝播の式をまとめておきます。 隠れ層1層め ユニットh11 ユニットh12 ユニットh13 隠れ層2層め ユニットh21 ユニットh22 ユニットh23 ユニットh24 出力層 ユニットo11 ユニットo12 ユニットo13 損失関数(クロスエントロピーエラー)
ユニットh12 の重みとバイアスの更新式 もう一度、前回までで求めた更新式を見てみましょう。(再掲) よく見ると、 という構造になっていることがわかります。 それを踏まえると以下のようになると思います。 今回の共通部は としましょう。 ユニットh13 の…
ユニットh11 の残りの重みとバイアスの更新式 では、残りの の更新式についてみていきましょう。 ・まずは の更新式 前回求めた の更新式と見比べると、 の部分が共通していることがわかると思います。 (再掲) なので、 の部分だけ計算すればいいですね。 …
隠れ層1層めの重みの更新式 さて、いよいよ隠れ層1層めの重みとバイアスの更新式についてみていきましょう。 今回は、隠れ層1層めの1つめのユニット ユニットh11 の重み についてみていきます。 隠れ層1層めともなると、その出力が影響を及ぼした値はか…
おさらい 前回までで ユニットh21 と ユニットh22 についての必要な更新式が求まりました。 以下に再掲してみます。 ・ユニットh21 ・ユニットh22 見比べてみると以下のことがわかると思います。 かっこの部分はユニットごとに共通 最後に掛け合わされている…