HOME > natural science Laboratory > コンピュータ・シミュレーション講座 > ゼロから作るDeep Learning

ゼロから作るDeep Learning
1層ニューラルネットワークへのバイアスと活性化関数の追加

文責:遠藤 理平 (2017年4月10日) カテゴリ:ゼロから作るDeep Learning(14)

昨今注目を集めているAI(人工知能)を学びたいと思い立ち、ディープラーニング(Deep Learning、深層学習)と呼ばれるAIの数理モデルである多層構造のニューラルネットワークを書籍「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」を参考にを独習していきたいと思います。本書籍ではプログラミング言語としてPythonが利用されていますが、本項ではJavaScriptで実装していきます。

目次


バイアスと活性化関数を加えたモデル

前項のモデルにバイアスと活性化関数を加えたモデルを示します。 活性化関数は旧層のニューロン値から新しい層のニューロン値を決定する関数、バイアスは活性化関数に与える引数に加える値を意味します。

計算アルゴリズム

上記のモデルにおける入力層(0層目)に対する出力層(1層目)のニューロン値は次の計算式で与えられます。

X^{(1)}_0 = F( W^{(0)}_{00}X^{(0)}_0 +W^{(0)}_{01}X^{(0)}_1+W^{(0)}_{02}X^{(0)}_2 + b^{(0)}_0)
X^{(1)}_1 = F( W^{(0)}_{10}X^{(0)}_0 +W^{(0)}_{11}X^{(0)}_1+W^{(0)}_{12}X^{(0)}_2 + b^{(0)}_1)

この関係式を行列で表すと次の通りです。

\mathbf{X}^{(n+1)} = F(\, \mathbf{W}^{(n)}\mathbf{X}^{(n)} + \mathbf{b}^{(n)} )

ただし、Fはベクトルの各成分ごとに作用させることを意味するとします。

JavaScriptによる実装

上記のモデルに対応したニューラルネットワークをコンストラクタの第二引数にバイアス、第三引数に活性化関数を与えることでNNクラスを定義します。 第二引数に与えるバイアスBは第一要素に層番号、第二要素にニューロン番号で表現される多重配列です。 また、第三引数に与える活性化関数には関数そのものを与えます。

//ニューラルネットワーク
var NN = function( W, B, AF ){
	//重み
	this.W = W;
	//W.length : 層数
	//W[].length : 列(後ニューロン数)
	//W[][].length : 行(前ニューロン数)

	//バイアス
	this.B = B;
	//活性化関数
	this.AF = AF;

	//ニューロンの初期化
	this.X = [];
	for( var i = 0; i < W.length; i++ ){

		this.X[ i ] = [];

		for( var j = 0; j < W[ i ][ 0 ].length; j++ ){

			this.X[ i ][ j ] = 0;

		}

	}
	//出力層
	this.X[ W.length ] = [];
	for( var j = 0; j < W[ W.length-1 ].length; j++ ){
		this.X[ W.length ][ j ] = 0;
	}

}
//入力層(0層目ニューロン値)へのインプット
NN.prototype.setInput = function( Input ){

	for( var i = 0; i < Input.length; i++ ){

		this.X[ 0 ][ i ] = Input[ i ];
	}

}
//出力層へのアウトプット
NN.prototype.getOutput = function(){

	//各層ニューロン値の計算
	for( var i = 0; i < W.length; i++ ){

		this.multiplayMatrixVector ( this.W[ i ], this.X[ i ], this.X[ i+1 ] );
		this.addVectors ( this.X[ i+1 ], this.B[ i ], this.X[ i+1 ] );
		this.adoptAF( this.X[ i+1 ], this.X[ i+1 ] )

	}

	return this.X[ this.X.length -1 ];
}
//行列×ベクトルの計算
NN.prototype.multiplayMatrixVector = function( M, V, C ){
	C = C || [];

	var Mgyou = M.length;
	var Mretu = M[ 0 ].length;

	for( var i = 0; i < Mgyou; i++ ){

		C[ i ] =0;

		for( var j = 0; j < Mretu; j++ ){

			C[ i ] += M[ i ][ j ] * V[ j ];

		}

	}

	return C;
}
//ベクトルの和
NN.prototype.addVectors = function( V1, V2, V3 ){
	V3 = V3 || [];

	for( var i = 0; i < V1.length; i++ ){

		V3[ i ] = V1[ i ] + V2[ i ];

	}

	return V3;
}
//活性化関数の実行
NN.prototype.adoptAF = function( V_in, V_out ){
	V_out = V_out || [];

	for( var i = 0; i < V_in.length; i++ ){

		V_out[ i ] = this.AF( V_in[ i ] );

	}

	return V_out;
}

計算チェック

上記のNNクラスに次の重み、バイアス、活性化関数を与えて計算して、コンソール(「F12」で表示)に出力します。

//入力層
var X0 = [ 1, 2, 3];

//重み
var W = [];
W[ 0 ] = [
	[ 0.1, 0.1, 0.1 ], //W^{(0)}_{00}, W^{(0)}_{01}, W^{(0)}_{02}
	[ 0.2, 0.2, 0.2 ]  //W^{(0)}_{10}, W^{(0)}_{10}, W^{(0)}_{12}
];

//バイアス
var B = [
	[ 10, 20, 30 ], //B^{(0)}_0, B^{(0)}_{1}, B^{(0)}_{2}
];

//活性化関数
var AF = function( x ){
	return Math.sqrt(x);
}

//ニューラルネットワークの生成
var nn = new NN( W, B, AF );
//入力層へのインプット
nn.setInput( X0 );
//出力層へのアウトプット
nn.getOutput();
//結果の表示
console.log( nn.X[1] ); //出力[3.255764119219941, 4.604345773288535]


▲このページのトップNPO法人 natural science トップ

関連記事

ゼロから作るDeep Learning







▲このページのトップNPO法人 natural science トップ