2016-05-14 28 views
18

私は、260,000行35列の「ワンホットエンコーディング」(すべて1とゼロ)のデータマトリックスを持っています。私は、連続変数を予測するために単純なニューラルネットワークを訓練するためにKerasを使用しています。ネットワークには、次のされていることを確認するためのコード:回帰ネットワークを訓練するときのNaNの損失

model = Sequential() 
model.add(Dense(1024, input_shape=(n_train,))) 
model.add(Activation('relu')) 
model.add(Dropout(0.1)) 

model.add(Dense(512)) 
model.add(Activation('relu')) 
model.add(Dropout(0.1)) 

model.add(Dense(256)) 
model.add(Activation('relu')) 
model.add(Dropout(0.1)) 
model.add(Dense(1)) 

sgd = SGD(lr=0.01, nesterov=True); 
#rms = RMSprop() 
#model.compile(loss='categorical_crossentropy', optimizer=rms, metrics=['accuracy']) 
model.compile(loss='mean_absolute_error', optimizer=sgd) 
model.fit(X_train, Y_train, batch_size=32, nb_epoch=3, verbose=1, validation_data=(X_test,Y_test), callbacks=[EarlyStopping(monitor='val_loss', patience=4)]) 

しかし、訓練プロセスの間に、私はうまく損失の減少を参照してくださいが、2番目のエポックの途中で、それはナンに行く:

Train on 260000 samples, validate on 64905 samples 
Epoch 1/3 
260000/260000 [==============================] - 254s - loss: 16.2775 - val_loss: 
13.4925 
Epoch 2/3 
88448/260000 [=========>....................] - ETA: 161s - loss: nan 

SGDの代わりにRMSPropを試してみましたが、reluの代わりにtanhを試しましたが、ドロップアウトなしで試してみました。私は、より小さなモデル、すなわち1つの隠れたレイヤーと同じ問題(それは異なるポイントでナノになる)で試しました。ただし、機能が少ない(つまり列が5つしかなく、かなり良い予測を行う)場合にも機能します。何らかのオーバーフローがあるように見えますが、私は理由を想像することはできません。損失は不当に大きくないわけではありません。

Pythonバージョン2.7.11は、Linuxマシンで実行され、CPUのみです。私はTheanoの最新バージョンでそれをテストしました。そしてNansも取得しましたので、Theano 0.8.2に行って同じ問題を抱えてみました。 Kerasの最新バージョンには同じ問題があり、0.3.2バージョンもあります。

+0

try loss = 'mean_squared_error'、オプティマイザ= 'adam'は1つの隠れたレイヤーで、まだナンセンスですか? –

+0

@ 1 '' Adamオプティマイザで上記のモデルを使用すると、私はナンを得る。 1つのレイヤーだけで、3つのエポックのトレーニングの間にナンセンスを与えません。 –

答えて

21

出力が無制限であるため、ニューラルネットワークによる回帰は難しいので、特にexploding gradients problem(おそらくnansの原因)になりがちです。

歴史的に、勾配を爆発させる重要な解決策の1つは学習率を下げることでしたが、Adamのようなパラメータごとの適応学習レートアルゴリズムの出現により、優れたパフォーマンスを得るために学習率を設定する必要はなくなりました。あなたがニューラルネットワークの悪人でなくても、学習スケジュールを調整する方法を知っていない限り、SGDを勢いよく使用する理由はほとんどありません。

  1. quantile normalizingまたはz scoringして出力を正規化:ここで

    は、あなたが潜在的に試みることができるいくつかのものです。厳密にするには、データセット全体ではなく、トレーニングデータに対してこの変換を計算します。たとえば、量子化正規化では、例がトレーニング・セットの60パーセンタイルにある場合、値は0.6になります。 (また、0分位が-0.5、100分位が+0.5になるように、分位の正規化された値を0.5だけシフトすることもできます)。

  2. ドロップアウト率を上げるか、重みにL1とL2のペナルティを加えて、正則化を追加します。 L1の正則化は、フィーチャの選択に似ています。フィーチャの数を5に減らすとパフォーマンスが良いと言われているので、L1も可能です。

  3. これでも解決しない場合は、ネットワークのサイズを縮小してください。これはパフォーマンスに悪影響を及ぼす可能性があるため、必ずしも最良のアイディアではありませんが、入力フィーチャー(35)に比べて1層目のニューロン(1024)が多数あるため役立ちます。

  4. バッチサイズを32から128に増やします。128はかなり標準的であり、最適化の安定性を潜在的に高める可能性があります。

    1" によって
7

答えはかなり良いです。しかし、修正の全てではなく、直接よりも、間接的に問題を解決するようです。私は単に特定の上にある任意の勾配をクリップれる、勾配クリッピングを使用することをお勧めします値。Kerasで

あなたは単に私が前に同じ問題に直面した1.

+0

フェアポイント!これは、たとえばリカレントニューラルネットワークでよく使用される、まったく正当な戦略です。しかし、これに頼る前に、シンプルなものが最適化に間違っていないことを確認することは常に良いことです。 –

10

上記の規範をすべての勾配をクリップする(https://keras.io/optimizers/を参照)clipnorm=1を使用することができます。私はこの質問と回答を検索して見つけます。上記のすべてのトリックは、深いニューラルネットワークをトレーニングするために重要です。私はそれらすべてを試しましたが、まだNANを得ました。

こちらもこの質問があります。 https://github.com/fchollet/keras/issues/2134。 私は、著者の要約を次のように引用しました: "これを指摘して、今後この問題が発生する可能性のある他の人のためにアーカイブしました。私は、訓練プロセスに入ってから突然ナノを返す私の損失機能にぶち当たっていました。私はrelus、オプティマイザ、損失関数、relus、私のネットワークのサイズとネットワークの形状に応じて私のドロップアウトを確認しました。私はまだ恋に落ちていて、やがてナンに変わってしまいました。

それは私の上に浮かんだ。私はいくつかの悪い入力があるかもしれません。それは、私がCNNに渡していた(そして平均的な平均化を行っている)画像の1つは0に過ぎなかったことが分かります。私は平均を差し引いて標準偏差で正規化したので、私はナノのものにすぎない模範の行列になった。一旦正規化機能を修正すると、私のネットワークは完全に鍛えられます。 "

私は上記の意見に同意します。 私の場合、密度推定のログ値を入力として使用します。絶対値は非常に大きく、数ステップのグラジエント後にNaNが発生する可能性があります。入力チェックが必要だと思います。まず、入力が含まれていないことを確認してください。-infまたはを入力してください。絶対値が非常に大きいものもあります。

+0

私はあなたと同じ問題を抱えていました。私のデータをチェックしている間、私はinfデータポイントを持つ複数の場所を見つけました。それらを取り出して問題を解決しました。 – troymyname00

-1

私はこのページや他の多くの人に役に立たないようにあらゆる提案を試みました。私たちはパンダでCSVファイルをインポートしていましたが、keras Tokenizerをテキスト入力に使ってボキャブラリとワードベクトルマトリックスを作成していました。他の人が働いている間にいくつかのCSVファイルに気づいた後、突然ファイルのエンコーディングを見て、asciiファイルがkerasで動作していないことに気づき、0.0000e+00というnanの損失と精度につながりました。ただし、utf-8とutf-16ファイルとなりました!ブレークスルー。

あなたがテキストの分析を実行し、これらの提案を試した後nan損失を取得している場合は、ファイルの種類を発見するfile -i {input}(Linux)またはfile -I {input}(OSX)を使用します。 ISO-8859-1またはus-asciiの場合は、utf-8またはutf-16leに変換してください。後者を試していないが、私はそれが同様に動作すると思います。うまくいけば、これは誰かが非常に非常に不満を助ける!

関連する問題