takeda_san’s blog

KotlinとVRを頑張っていく方向。

多層パーセプトロンプログラムの理解

前回のあらすじ

パーセプトロンプログラムを最後まで読んだ。

takeda-san.hatenablog.com

やったこと

今回からは多層パーセプトロンプログラムを読んでいく。
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の読み方