2016-06-13 15 views
1

私はRインターフェイスを介してh2oを探索しています。私は奇妙な重み行列を得ています。私の仕事は、x、yを計算するとx + yを計算するのと同じくらい簡単です。
私は3列の214の行を持っています。最初の列(x)は、(-1000、1000)から一様に描画され、2番目の列((y)は(-100,100)から描画されました。私はただそれらを結合したいので、私は単一のニューロンを持つ単一の隠れた層を持っています。 これは私のコードである:h2o深い学習の重みと正規化

library(h2o) 
localH2O = h2o.init(ip = "localhost", port = 54321, startH2O = TRUE) 
train <- h2o.importFile(path = "/home/martin/projects/R NN Addition/addition.csv") 
model <- h2o.deeplearning(1:2,3,train, hidden = c(1), epochs=200, export_weights_and_biases=T, nfolds=5) 
print(h2o.weights(model,1)) 
print(h2o.weights(model,2)) 

結果がYの重み値は0.055であり、いくつかの理由

> print(h2o.weights(model,1)) 
      x   y 
1 0.5586579 0.05518193 

[1 row x 2 columns] 
> print(h2o.weights(model,2)) 
     C1 
1 1.802469 

ある - Xよりも10倍低いです。したがって、最終的にニューラルネットはx + y/10を計算します。しかし、h2o.predictは実際に正しい値を返します(テストセット上であっても)。
データをスケーリングする前処理ステップがあると思います。モデルによって生成された実際の重みを再現できる方法はありますか?私は、かなりシンプルなニューラルネットワークを視覚化できるようにしたいと考えています。

答えて

3

ニューラルネットワークは、すべての入力フィーチャが平均値0と標準偏差1の場合に最もよく機能します。特徴が非常に異なる標準偏差を有する場合、ニューラルネットワークは非常に貧弱に機能する。そのため、h20はこの正規化を行います。言い換えれば、あなたのネットをトレーニングする前に、あなたが持っているすべてのフィーチャの平均と標準偏差を計算し、元の値を(x - mean)/stddevに置き換えます。あなたのケースでは、stddevの2番目の機能は最初のものよりも10倍小さいので、正規化後の値は合計にどれくらい貢献するかという点で10倍重要になり、隠れたニューロンに向かう重みはキャンセルしてください。そのため、第2のフィーチャのウェイトは10倍小さくなります。

関連する問題