ゼロから作るDeep Learning
準備:行列の和と積を計算する関数の実装
昨今注目を集めているAI(人工知能)を学びたいと思い立ち、ディープラーニング(Deep Learning、深層学習)と呼ばれるAIの数理モデルである多層構造のニューラルネットワークを書籍「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」を参考にを独習していきたいと思います。本書籍ではプログラミング言語としてPythonが利用されていますが、本項ではJavaScriptで実装していきます。
目次
- 準備1:行列の和と積を計算する関数の実装
- 準備2:ベクトルと行列の積を計算する関数の実装
- 準備3:多変数関数の数値微分と極小値の探索
- 1.1層ニューラルネットワークの実装(バイアスなし、活性化関数なし、学習なし)
- 2.1層ニューラルネットワークへのバイアスと活性化関数の追加
- 3.1n1型2層ニューラルネットワークの実装(学習なし)
- 4.1変数関数を学習させてみる1:勾配法による学習計算アルゴリズム
- 5.1変数関数を学習させてみる2:勾配法による学習計算アルゴリズムの実装
- 6.1変数関数を学習させてみる3:ニューロン数による学習効果の違い
- 7.誤差逆伝搬法(バックプロパゲーション)の導出
- 8.順伝播型ニューラルネットワーク「FFNNクラス」の実装(JavaScript)
- 9.三角関数のサンプリング学習(WebWorkersによる並列計算)
- 10.学習後の各層ニューロンの重みの可視化
- 11.層数とニューロン数による学習効果の違い
準備:行列の和と積
行列の定義
ニューラルネットワークに登場するパラメータはすべて行列で表現されます。本項では手始めに行列の和と積をJavaScriptで実装します。 プログラミング言語で行列を表現する方法は多重配列を用います。JavaScriptでは配列要素に配列を代入することで多重配列を表現することができます。 次の3つの行列
, ,
は、JavaScriptでは次のように表現します。
var X = [ [ 1, 2 ], [ 3, 4 ] ]; var Y = [ [ 4, 2 ], [ 3, -1 ] ]; var W = [ [ 1, 2, 3 ], [ 4, 5, 6 ] ];
XとYは2行2列、Wは2行3列の行列と呼ばれます。
和の定義
同じ行数と列数の行列は和を定義することができ、各行列成分の単純な和で与えられます。 2行2列の行列AとBの和の結果をCとすると、次のように表されます。
この演算をJavaScriptの関数で実装すると次のようになります。AとBの行数と列数は任意です。
//A+B=C (A,Bとも2重配列を想定) function addMatrices( A, B, C ){ C = C || []; var Agyou = A.length; var Aretu = A[ 0 ].length; for( var i = 0; i < Agyou; i++ ){ C[ i ] = C[ i ] || []; for( var j = 0; j < Aretu; j++ ){ C[ i ][ j ] = A[ i ][ j ] + B[ i ][ j ]; } } return C; }
積の定義
2つの行列A,Bが存在しAの列数とB行数が一致する場合、2つの行列は積を定義することもできます。 2行2列のAと2行3列のBの積の結果をCとすると、次のように表されます。
このようになる理由はここ(外部サイト)などを参考にしてください。この演算をJavaScriptの関数で実装すると次のようになります。 Aの列数とB行数が一致する条件のもと、AとBの行数と列数は任意です。
//C = AB (A,Bとも2重配列を想定) function multiplayMatrices( A, B, C ){ C = C || []; var Agyou = A.length; var Aretu = A[ 0 ].length; var Bgyou = B.length; var Bretu = B[ 0 ].length; for( var i = 0; i < Agyou; i++ ){ C[ i ] = C[ i ] || []; for( var j = 0; j < Bretu; j++ ){ C[ i ][ j ] = 0; for( var k = 0; k < Bgyou; k++ ){ C[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ]; } } } return C; }
計算チェック
先の行列X,Y,Wの和と積の計算を上記の関数を用いて実行します。 結果はコンソール(「F12」で表示)に出力しています。