Udemyの関連講座リンクリンクExcelによるニューラルネットワークを行列演算で効率化する行列演算は大量のデータの線形和を一遍に計算するのに便利です。過去の記事で9画素の〇✕画像を見分けるニューラルネットワークをExcelに実装しました。ニューラルネットワークをExcelに実装して画像処理させてみた。この時は行列演算を使わなかったので、使ったらどれだけ簡単になるか試してみました。重みの初期値がどれだけ学習速度に影響するかもシミュレーションしてみました。【勾配消失しない重みの初期値】Excelでモンテカルロシミュレーションしてみた行列を定義する行列サイズを決定する前回作ったニューラルネットワークは、入力層9ニューロン、隠れ層3ニューロン、出力層2ニューロンでした。クリックすると拡大します入力が3×3画素の画像データだったため、分かりやすくするために上図のようにExcelに入力していました。これを今回は9個の画素データを並べて1次元のデータにします。クリックすると拡大しますその上で入力データ、隠れ層の重み、出力層の重み、出力データを下記の行列サイズにします。クリックすると拡大します2つの行列の掛け算をする時には、前の行列と列数と後の行列の行数が一致していないといけないことに注意です。それに注意すると、自ずと行列のサイズはこのように決定されます。行列成分を決定するすると、行列の成分も自ずと下記のように決定します。クリックすると拡大します重み行列WHやWOがどのニューロンにかかる重みに対応しているかは、図示した通りです。前回は44組の教師データを1つずつ読み込んで逐次学習させましたが、今回は44組のデータをまとめてバッチ処理します。これにより行列演算の威力が更に発揮され、処理の高速化が期待できます。クリックすると拡大しますExcelに実装する順伝播の計算式それではExcelに入力していきます。最初の順伝播の計算は簡単なので、サラッと行きます。クリックすると拡大しますクリックすると拡大しますクリックすると拡大します逆伝播の計算式ここから逆伝播の計算が入ってきます。簡単な出力層の重みの勾配は次のように計算します。クリックすると拡大します例えばwO11の勾配を求めるには、uO1の計算式にwO11が入っていて、zO1の計算式にuO1が入っているので、連鎖律により上式のように3つの微分に分解できます。それぞれの微分は簡単に計算できます。次に、少し難しい隠れ層の重みの勾配は次のように計算できます。クリックすると拡大します図が込み入っていますが、考え方自体は出力層の重みの微分と同じです。wH11の勾配を求めるにはuH1の計算式にwH11が入っています。uH1が関係してくるのはuO1、zO1、uO2、zO2の計算式です。それに沿って連鎖律を適用していくと上図のように計算できます。クリックすると拡大します収束するまでバッチ計算を繰り返すさて、これで44組の入力データによる1バッチ分の計算が終わりました。最後に計算された隠れ層の重みの勾配と出力層の重みの勾配に学習率を掛けて、初期値の重みから引いて更新します。この更新された重みを使って同じ44組のデータを入力として2バッチ目の計算を行います。上図では1バッチ目が終了した損失関数の値は10.95でしたが、この値が十分に小さくなるまでバッチ計算を繰り返します。学習率を0.5にした場合の結果は次のようになりました。上記のシミュレーションでは、隠れ層と出力層の各重みの初期値を平均ゼロ、標準偏差0.1の正規分布に従う乱数で設定していました。Xavierの初期値では、前の層のニューロン数をnとすると、平均ゼロ、標準偏差1/√nの正規分布乱数で設定すると良いとされています。これに従うと、隠れ層の初期値は標準偏差1/3、出力層の初期値は標準偏差1/√3になります。これに従って初期値を設定した場合の結果は次のようになりました。初期値は乱数で設定していますので毎回結果は異なるのですが、ほぼ毎回きれいな放物線で収束しXavierの初期値の有効性が確認できました。次に、標準偏差を0.01に変えてシミュレーションしてみました。振幅は少ないのですが、最初の10バッチくらいはほとんど学習が進みませんでした。Excelシートで計算結果を見ると原因がよく分かります。勾配の計算式を見てみましょう。出力層、隠れ層共に出力の誤差が計算式に掛け算で含まれています。出力の誤差は出力値-教師データの値です。クリックすると拡大します重みの初期値を平均ゼロ、標準偏差0.01にしていますので、初期値はほぼゼロです。いうことは、入力値に重みを掛けて合計した線形和もほぼゼロです。これがシグモイド関数を通って出力値になりますが、シグモイド関数は入力がゼロの時には0.5を出力します。教師データは0か1ですので、z-t、つまり出力誤差は0.5か-0.5になります。1バッチには44組の入力データと教師データの組を読み込ませていますが、教師データが0のデータと1のデータは半々です。いうことは、44個の出力誤差を足すとほぼゼロになってしまいます。勾配の計算式には出力誤差が掛け算で入っているため、これがほぼゼロになると勾配もほぼゼロになって学習が進まないのです。最初の約10バッチ分で損失関数の値が減少していないのはこのためです。クリックすると拡大しますこのような場合には、学習率を上げれば少しはマシになるでしょう。学習率を0.5から0.9に上げたら、次のようになりました。学習が進まない期間が半分に減って、収束までの時間も短くなりました。このように、重みパラメータの初期値と学習率は関連があることが分かります。AI数学-文系でも理解できる!高校から始めるデータ分析、AIのための数学-データ分析、機械学習に関わる数学に絞り、効率的に学習できるようカリキュラムを構成しました。文系でも理解できるよう丁寧な説明をしています。Pythonエンジニア育成推進協会認定スクールによる高品質な数学コースです。–1000人以上が受講している(株)キカガクの『脱ブラックボックスセミナー』が遂に登場!機械学習の参考書を「閉じてしまった人」への再入門に最適な講座です。微分・線形代数といった数学の基礎からPythonでの実装まで短時間で習得しましょう。1時間で理解できる!小学校から大学まで一気に駆け上るスピード感のあるコースです。...【ルーレットの赤黒ベット】100ドルの軍資金を200ドルに増やせる確率は?ルーレットの赤黒ベットは当たる確率がほぼ50%です。【区間推定の使い方】タイヤの摩耗を具体例にわかりやすく解説します。TOP28【作業分析6】MMCモデル|最適なトラックドック数をSimpyでシミュレーション【作業分析5】トラックの待機台数の多さを人の表情でアニメーション(2)カンボジアの物流でお困りのことがあればお気軽にご相談下さい。学生時代にアジアの雑踏にハマる。誰もが羨むメーカーを退職し「旅するように働く」ことを目指し物流業界に転職。理工学と経営学のダブル修士。2023年1月からカンボジアのオートレスビーチ在住。