2017-08-10 7 views
1

まったく同じパラメータを持つdeeplearning4jとRは同じ、同等のMSEを実行する必要があると私は信じています。しかし、私はそれを達成する方法がわかりません。Deeplearning4jとRの結果が異なる

私は、46個の変数と2個の出力を含む次の形式のCSVファイルを持っています。完全に1,0000サンプルがあります。すべてのデータが正規化され、モデルは回帰分析用です。

S1 | S2 | ... | S46 | X | Y 

はRで、私はneuralnetパッケージを使用すると、コードは次のようになります。非常に簡単です

rn <- colnames(traindata) 
f <- as.formula(paste("X + Y ~", paste(rn[1:(length(rn)-2)], collapse="+"))) 
nn <- neuralnet(f, 
       rep=1, 
       data=traindata, 
       hidden=c(10), 
       linear.output=T, 
       threshold = 0.5) 

私はアルゴリズムをJavaプロジェクトに統合したいので、モデルをトレーニングするためにdl4jを検討します。 trainsetはRコードのものとまったく同じです。テストセットはランダムに選択されます。 dl4jコードがある:

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() 
      .seed(rngSeed) //include a random seed for reproducibility 
      // use stochastic gradient descent as an optimization algorithm 
      .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) 
      .iterations(100) 
      .learningRate(0.0001) //specify the learning rate 
      .updater(Updater.NESTEROVS).momentum(0.9) //specify the rate of change of the learning rate. 
      .regularization(true).l2(0.0001) 
      .list() 
      .layer(0, new DenseLayer.Builder() //create the first, input layer with xavier initialization 
        .nIn(46) 
        .nOut(10) 
        .activation(Activation.TANH) 
        .weightInit(WeightInit.XAVIER) 
        .build()) 
      .layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.MSE) //create hidden layer 
        .nIn(10) 
        .nOut(outputNum) 
        .activation(Activation.IDENTITY) 
        .build()) 
      .pretrain(false).backprop(true) //use backpropagation to adjust weights 
      .build(); 

エポックの数は10であり、バッチサイズがテストセットを使用して128

であり、Rの性能は enter image description here

とdl4jの性能でありますその後、私はそれが完全な可能性を発揮しないと思う。

dl4jのmornitorはdl4jなどupdaterregulizationweightInitではるかに多くのパラメータがあるよう

あります。だから私はいくつかのパラメータが適切に設定されていないと思います。ところで、なぜ午前のグラフには周期的な棘があるのですか?

いずれかを助けてもらえますか?

答えて

1

ほとんどのニューラルネットトレーニングはミニバッチで行われます。 Deeplearning4jはデフォルトでおもちゃの問題を起こしていないと仮定しています(メモリ内のすべてのデータ<例など)

neural net configには、探す必要のあるminibatchという関数があります。

設定でminibatchをfalseに設定すると、同じ結果が得られます。

なぜこのようなことが起こるのだろうかと疑問に思っているのは、ミニバッチの学習がメモリ内のすべてのことと異なるからです。ミニバッチ学習は自動的にグラデーションをミニバッチサイズで除算します。あなたがすべてのことを思い出すと、あなたはそれを望んでいません。

他の実験を行っているときは、この点に注意してください。 詳しくは https://deeplearning4j.org/toyproblems

関連する問題