2016-05-18 1 views
0

オンラインコースの束を取り、多くの論文を読んだ後、私はneural-netで遊び始めましたが、驚いたことに単純なビット単位AND演算を一般化できません。ニューラルネットは単純なビット単位で一般化することに失敗します

入力:

Inp#1 - randomly generated number between 0-15, scaled down to (0,1) 
Inp#2 - 16 bit randomly generated unsigned int scaled down to (0,1) 

# Code snippet 
int in1 = (int)rand()%16; 
int in2 = (int)rand()%(0x0010000); 
in[0] = (fann_type)(in1/100.0); // not to worry about float roundup 
in[1] = (fann_type)(in2/100000.0); // not to worry about float roundup 

出力:

Out#1 = -1 if the corresponding bit specified by index inp#1 in inp#2 value is 0, otherwise 1 

# Code snippet 
int out1 = (in2 & (1<<in1)) ? 1 : -1; 
out[0] = (fann_type)out1; 

ネットワーク:テストのためのトレーニング、5000 5000のサンプル:データセット

A. 1 hidden layer with 30 neurons, 
    Activation Function (hidden): sigmoid, 
    Activation Function (output): sigmoid_symmetric (tanh), 
    Training method: RPROP 
    Learning rate: 0.7 (default) 
    Momentum: 0.0 (default) 
    RPROP Increase factor: 1.2 (default) 
    RPROP Decrease factor: 0.5 (default) 
    RPROP Minimum Step-size: 0 (default) 
    RPROP Maximum Step-size: 50 (default) 


B. 3 hidden layers each having 30 neurons, with the same params as in A 

C. tried the same networks also with scaling inputs to (-1,1) and using tanh for also hidden layer. 

例である以下、多くの異なるバリエーションを試し検証のための5000さらに大きなデータセットを試していない、何の成功

# examples from training set 
0.040000 0.321600 
-1 
0.140000 0.625890 
1 
0.140000 0.039210 
-1 
0.010000 0.432830 
1 
0.100000 0.102220 
1 

プロセス:トレーニングセットで訓練されたネットワークとの可能なオーバーフィッティングを避けるために、並列にテストデータのMSEを監視しました。

ライブラリ:複数使用されましたが、主にfannで試してみましたが、guiにfanntoolを使用しました。

アイデア?特に関心がある場合は、データセットをアップロードできます。

+0

あなたの学習率は?トレーニングプロセス中のコスト関数の値は何ですか? – gcucurull

+0

不足している情報をカバーするように説明を更新し、実際のコードスニペットも提供しました。ありがとう – user1039384

+0

あなたは何をやっているのは、分類作業です。なぜ、-1,1つの出力とMSEを0,1、およびログ損失の代わりに使用していますか?そのような設定がより良い仕事をしていることが証明されています。 Btw。この作業は容易ではありません。このような操作を学ぶためには神経網のためにかなり厳しいです。 –

答えて

1

私はあなたのセットアップを理解していれば、あなたが何かやろう:( - 隠されたユニットX) -

  • は、アーキテクチャ2-XXX-1のネットワークを持っているので、2つの入力、1つの出力
  • を入力

オーバーモデルビット単位機能これが本当であるならば、これは非常に特有の問題、およびアーキテクチャの非常に悪い選択です。ニューラルネットワークは魔法の帽子ではなく、モデルの非常に大きなファミリーです。あなたがしようとしているのはで、の特性はありません。これはNNによってモデル化された関数から期待されています。それは入力では完全に滑らかではなく、不連続点がたくさんありますが、実際はif-else節の束です。

どうすればよいですか?入力をビットと表現する必要があります。したがって、32個の入力と16個のバイナリ入力が必要です。問題なく機能を学習します。入力を非常に特殊な方法(10進表現)でエンコードし、ネットワークで分解をバイナリにモデル化し、その上で操作することを期待します。 NNはそれを学びますが、そのような操作を達成するためにはかなり複雑なネットワークが必要になるかもしれません - 元々最適な表現でネットワークを提供し、元来はスムーズな機能に近づけるように設計された、

+0

フィードバックありがとうございます。私は同意するが、この方法を試してみる理由は、ニューラルネットが私の特定の問題に手動で適応するのではなく、第1 /第2の隠れたレイヤーを単独で使用することによって、より最適な表現を導き出すことができるかどうかを確認することでした。私は手ピッキング機能が徹底的に深いネットが交換しようとしていることを望んだ – user1039384

+0

あなたのネットワークは深くありません。私が言ったように、あなたは現在の設定でそれを解決するだろうが、計算しようとしている関数が計算モデルではcpmaptibleではないので、より多くの容量が必要です。シグモイドの線形結合は、if節表現​​には良くない。さらに、バイアス入力としてのデータの表現は、豊富な入力スペースで、RAW入力を与えたと仮定した場合に、エンジニアリング – lejlot

+0

Dlではありません。あなたは非常に圧縮された方法でデータを提供します。関数が本当に滑らかでない場合、ndの入力は難しい – lejlot

関連する問題