前回のあらすじ
パーセプトロンプログラムを最後まで読んだ。
やったこと
今回からは多層パーセプトロンプログラムを読んでいく。
courseraの機械学習動画や各種技術書で基礎をじっくりと…
と思っていたが結局プログラムを実際に動かした方が理解が早い。
Java DeepLearning4j 多層パーセプトロンの構築|軽Lab
早速プログラムを見ていく。
INDArray tIn = Nd4j.create( new float[]{ 1 , 1 , // 入力1 1 , 0 , // 入力2 0 , 1 , // 入力3 0 , 0 }, // 入力4 new int[]{ 4 , 2 } ); // サイズ INDArray tOut = Nd4j.create( new float[]{ 0 , 1 , 1 , 0} , // 出力1~4 new int[]{ 4 , 1 } ); // サイズ DataSet train = new DataSet( tIn , tOut ); // 入出力を対応付けたデータセット System.out.println( train );
このあたりは、パーセプトロンプログラムと同じ。
入力と出力のデータセットを生成している。
// ニューラルネットワークを定義 MultiLayerConfiguration.Builder builder = new NeuralNetConfiguration.Builder() .seed(seed) .iterations(iterations) .learningRate(0.01) .weightInit(WeightInit.SIZE) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .updater( Updater.NONE ) .list() .layer(0, new DenseLayer.Builder() .nIn(inputNum) .nOut(middleNum) .activation("sigmoid").build()) .layer(1, new OutputLayer.Builder( LossFunctions.LossFunction.MSE ) .nIn(middleNum) .nOut(outputNum) .activation("sigmoid") .build()) .backprop(true).pretrain(false);
次はニューラルネットワークの定義部分。
seed … 乱数生成
iteraions … 繰り返し回数
learningRate … 学習率 までは同じ。
waightInitだが、今回はWeightInit.SIZEが指定されている。
WeightInit.SIZEとは「最小および最大のシェイプを使用して、一定の一様分布からの得るサンプルウェイト」とあるが、シェイプとは?
グラフの形のことを言ってんのかな…?
この辺りはページに書いていることを、そういうもんだということで、とりあえず納得しておこう。
optimizationAlgo … 誤差関数には確率的勾配降下法を使う
updater … なし
list … 層の数だが…これ、今回入力層含め3層だから引数に3を入れるべきでは?
と思ったが、手元の技術書のサンプルプログラムから仕様が変わったようだ。
何層でも引数なしが正しい。
layer … 各レイヤの定義。DenseLayerとは前のレイヤーと全接続するレイヤーのこと。
backprop … 誤差逆伝搬の有無を指定する。
pretrain … 事前学習の有無を指定する。
以降、まったく同じなので省略。
いくつかパラメータが変わっているが基本的にパーセプトロンと同じ。
ありがたいことに多層パーセプトロンプログラムの構造まで解説されているので、プログラムも難なく読むことができた。
次回の予定
・courseraの動画を見る
・Deep Learning Javaプログラミングを読む
・不明点の確認(乱数を指定する意味、確率的勾配降下法とは)
・プログラミングのための線形代数を読む
・Mavenのpomの読み方