2016-12-06 12 views
1

ここで私を助けることができるかどうかわかりませんが、私は理解できない問題があります。私は約45万エントリの大きな(私にとっては)データセットを持っています。TFLearn - 大規模なデータセットNaNの損失になる

[217088.0, 212992.0, 696.0, 191891.0, 524.0, 320.0, 0.0, 496.0, 0, 0, 364.0, 20.0, 0, 1.0, 0, 0.0, 0, 4.0, 22.0, 0, 672.0, 46.0, 16.0, 0.0, 0.0, 106496.0, 8.0, 0, 4.0, 2.0, 26.0, 640.0, 0.0, 1073741888.0, 624.0, 516.0, 4.0, 3.0, 0, 4319139.0, 0.0, 0, 0.0, 36.0, 8.0, 217088.0, 0.0, 0, 0, 0, 4.0, 5.0, 0, 20.0, 255624.0, 65535.0, 5.10153058443, 396.0, 4319140.0, 552.0, 144.0, 28.0, 5.0, 1048576.0, 217088.0, 350.0, 0.0, 0, 7.0, 1048576.0, 260.0, 0, 116.0, 0, 322.0, 0.0, 0, 4319141.0, 0.0, 10.0, 0.0, 9.0, 4.0, 0, 0, 0, 6.36484131641, 0.0, 0, 11.0, 72.0, 372.0, 45995.0, 217088.0, 0, 4096.0, 12.0, 80.0, 592.0, 264.0, 0, 0, 4096.0, 0.0, 256.0, 0.0, 49152.0, 700.0, 0, 4096.0, 0, 0, 0.0, 336.0, 8.0, 0, 0.0, 0, 4319142.0, 0.0, 60.0, 308.0, 4319143.0, 0, 0, 0, 0, 0, 0.742746270768, 316.0, 420.0, 276.0, 1073741888.0, 0.0, 332.0, 284.0, 0, 1107296320.0, 0.0, 4.0, 13.0, 18.0, 0.0, 632.0, 424.0, 261200.0, 0.0, 299008.0, 0.0, 4096.0, 0, 0.0, 299008.0, 0, 658.0, 0, 4319144.0, 4319145.0, 12.0, 50.0, 292.0, 688.0, 484.0, 70.0, 20.0, 4319146.0, 16.0, 17.0, 0, 0, 0, 0.0, 18.0, 4.0, 330.0, 0.0, 0, 0.0, 42.0, 303104.0, 19.0, 8.0, 20.0, 0.0, 0.0, 544.0, 340.0, 0, 14.0, 0, 209078.0, 0.0, 0.0, 22.0, 0, 209078.0, 0.0, 0.0, 18932.0, 4319147.0, 4.58031739078, 0.0, 376.0, 0.0, 0, 632.0, 4.0, 0, 0, 0, 428.0, 0, 0, 323584.0, 0.0, 24.0, 4.0, 368.0, 12.0, 40.0, 0, 720.0, 4.0, 348.0, 267.0, 20468.0, 32.0, 45995.0, 303104.0, 0.0, 0.0, 0, 0, 224.0, 16.0, 4.0, 44.0, 0.0, 0.0, 444.0, 720.0, 0, 1180.0, 0.0, 16.0, 412.0, 0.0, 4.0, 8462.0, 600.0, 568.0, 16.0, 0, 2.0, 36.0, 0.0, 6.0, 0, 21.0, 0.0, 24.0, 0, 4.0, 652.0, 4319148.0, 92.0, 8.0, 2.0, 0, 0.0, 0, 16.0, 0, 0, 324.0, 4.0, 300.0, 0, 278.0, 400.0, 0, 0.0, 0, 352.0, 0, 0.0, 209078.0, 8.0, 4096.0, 8.0, 36.0, 0.0, 256.0, 268435456.0, 0.0, 48.0, 4319149.0, 6.0, 4319150.0, 0, 416.0, 0, 0, 283.0, 4.0, 0, 0, 0, 8.0, 592.0, 0, 0, 25.0, 0.0, 0, 0, 0.0, 332.0, 212992.0, 540.0, 512.0, 0, 532.0, 20.0, 26.0, 0.0, 0, 52.0, 440.0, 7.0, 488.0, 8.0, 12.0, 0.0, 60.0, 14.0, 3221225536.0, 7.0, 56.0, 432.0, 4.0, 0, 12.0, 0.0, 40.0, 680.0, 16.0, 504.0, 344.0, 576.0, 0.0, 452.0, 266240.0, 290816.0, 578.0, 0, 552.0, 34.0, 0.0, 636.0, 88.0, 698.0, 282.0, 328.0, 38.0, 8.0, 480.0, 64.0, 4319151.0, 0.0, 0.0, 34.0, 460.0, 64.0, 0, 612.0, 0.0, 4319152.0, 0, 604.0, 0, 436.0, 0, 0, 20.0, 0, 4.0, 0, 0, 0, 0, 40.0, 356.0, 584.0, 0, 84.0, 0.0, 0, 0, 0, 294912.0, 7.0, 29.0, 20.0, 0, 60.0, 0.0, 268.0, 536.0, 4319153.0, 0.0, 106.0, 456.0, 24.0, 404.0, 0, 31.0, 0, 380.0, 24.0, 648.0, 0.0, 0, 0, 0.0, 0, 0, 0, 0.0, 0, 0, 0.0, 0.0, 1883.0, 5.85655736551, 34.0, 17744.0, 28680.0, 38.0, 36.0, 0.0, 24576.0, 596.0, 107.0, 33.0, 4.0, 5.0, 0, 0, 45995.0, 384.0, 8.0, 0, 0, 500.0, 20468.0, 34.0, 312.0, 8.0, 660.0, 0.0, 35.0, 608.0, 0, 684.0, 8.0, 68.0, 0.0, 32.0, 34.0, 23117.0, 3.0, 520.0, 0, 4319154.0, 0, 0, 512.0, 8.0, 28.0, 4096.0, 0, 538.0, 0.0, 572.0, 0.0, 2.0, 36.0, 0.0, 0.0, 32.0, 32.0, 4.0, 28.0, 0, 4.0, 38.0, 68.0, 9.0, 0.0, 0, 0.0, 36.0, 39.0, 618.0, 0, 8.0, 266240.0, 4.0, 5.0, 34.0, 304.0, 0, 0.0, 20.0, 40.0, 0.0, 0.0, 0, 580.0, 556.0, 4.0, 8.0, 262.0, 0, 12.0, 32.0, 0, 76.0, 12.0, 184.0, 720.0, 4.0, 16.0, 644.0, 16.0, 28680.0, 4319155.0, 720.0, 0.0, 564.0, 392.0, 672.0, 0.0, 24.0, 492.0, 0, 0.0, 676.0, 0, 0, 0, 12.0, 592.0, 360.0, 8.0, 692.0, 552.0, 4.0, 36.0, 512.0, 7198.0, 42.0, 44.0, 45.0, 4319156.0, 20.0, 388.0, 476.0, 5.0, 36.0, 20480.0, 47.0, 16.0, 326.0, 0.0, 12.0, 0.0, 0.0, 7.0, 272.0, 280.0, 0.0, 0, 288.0, 48.0, 4319157.0, 10.0, 448.0, 4.0, 4.0, 0, 20468.0, 408.0, 2.0, 50.0, 560.0, 0, 1610612768.0, 8.0, 0, 620.0, 656.0, 4.0, 4096.0, 51.0, 0, 0, 0.0, 28.0, 0, 616.0, 0, 296.0, 2.0, 632.0, 468.0, 28.0, 32.0, 52.0, 0, 528.0, 0, 28.0, 0.0, 0, 24.0, 18.0, 4096.0, 0, 8.0, 180.0, 664.0, 4319158.0, 26.0, 0.0, 6.0, 0, 4096.0, 472.0, 0, 28.0, 72.0, 464.0, 672.0, 0, 24.0, 4.0, 0, 28680.0, 0, 0, 18.0, 0, 0, 4319159.0, 24.0, 28.0, 16.0] 

私は、例えばを試してみて、このデータのオフカテゴリモデルを作成するためにTflearnを使用しています。各エントリは次のようにフォーマットについて〜700の整数のリストであり、各エントリには、0または1のラベルを持っていると私は未知のエントリがここで0または1であるか否かを予測するモデルを訓練しようとしている私のコードのまとめです:

def main(): 
    ## Options ## 
    num_tf_layers = 10   # Number of fully connected layers, ex. softmax layer 
    num_tf_layer_nodes = 32  # Number of nodes in the fully connected layers 
    print_test_scores = 1  # Bool to print test set and predictions 
    use_validation_set = 0  # Bool to use testing set when fitting 
    num_tf_epochs = 10 
    tf_batch_size = 1 
    tf_learn_rate = 0.001 

    ## Opening files 

    print("Preparing labels...") 
    trainY = tflearn.data_utils.to_categorical(temp_train_Y, nb_classes=2) 
    if use_validation_set: 
     testY = tflearn.data_utils.to_categorical(temp_test_Y, nb_classes=2) 
    print('Forming input data...') 
    net = tflearn.input_data(shape=[None, len(trainX[0])]) 
    print('Creating fully connected layers...') 
    for i in range(num_tf_layers): 
     net = tflearn.fully_connected(net, num_tf_layer_nodes) 
    print('Creating softmax layer...') 
    net = tflearn.fully_connected(net, 2, activation='softmax') 
    print('Preparing regression...') 
    net = tflearn.regression(net, learning_rate=tf_learn_rate) 
    print('Preparing DNN...') 
    model = tflearn.DNN(net) 
    print('Fitting...') 
    if use_validation_set: 
     model.fit(trainX, trainY, n_epoch=num_tf_epochs, batch_size=tf_batch_size, validation_set=(testX, testY), show_metric=True) 
    else: 
     model.fit(trainX, trainY, n_epoch=num_tf_epochs, batch_size=tf_batch_size, show_metric=True) 
    print('Complete...') 

私は、次のオフにこれをベースTFlearn example。このプログラムは、250 0と250 1の小さなデータセットで美しく機能しました。私は80%の精度を達成しました。データを1トン増やすと精度が向上します。しかし、大量のデータを追加した後は、NaNへの損失は非常に速くなります。すぐに1回の反復で45万をすばやく実行できます。いくつかの研究の後、私はデフォルトにしておいたので、学習率が高すぎる可能性があることを知りました。私は0.1と0.000001の間に設定し、何もNaNに行くことからの損失を止めませんでした。バッチサイズを1から1024の間で変更し、レイヤーの数を3から20の間で変更しようとしました。何も助けにはなりませんでした。それを修正するために、誰が何を変えるべきか、これをどうやって別の方法にアプローチするかについてのアイデアは誰にもありますか?

ありがとうございます!

答えて

1

あなたのネットワークはvanishing gradient problemに罹患していると推測しています。これはニューラルネットワークの基本的な問題ではありません。特定のアクティベーション機能によって引き起こされるグラディエントベースの学習方法には問題があります。直感的に問題とそれの背後にある原因を理解しようとしましょう。

問題

グラデーションベースの方法は、パラメータの値の小さな変化は、ネットワークの出力にどのように影響するかを理解することによって、パラメータの値を学びます。パラメータの値を変更すると、ネットワークの出力に非常に小さな変化が生じます。ネットワークはパラメータを効果的に学習できません。これは問題です。

これは、消失勾配の問題で起こっていることです。初期層のパラメータに対するネットワーク出力の勾配は非常に小さくなります。これは、初期のレイヤのパラメータの値を大きく変更しても、出力に大きな影響を与えないということを示す素晴らしい方法です。いつ、そして、なぜこの問題が起こるのかを理解しようとしましょう。

原因

バニシング勾配の問題は、活性化関数の選択に依存します。多くの一般的な活性化機能(例えば、シグモイドまたはタン)は、それらの入力を非常に小さな出力範囲に非常に非線形に「詰め込む」。たとえば、sigmoidは実数の行を[0, 1]の「小さい」範囲にマップします。その結果、非常に小さい範囲にマッピングされる入力空間の大きな領域が存在する。入力空間のこれらの領域では、入力が大きく変化しても出力がわずかに変化するため、勾配は小さくなります。

このような非線形性の複数のレイヤーを重ねると、これは非常に悪化します。例えば、第1の層は大きな入力領域をより小さい出力領域にマップし、第2の層によってさらに小さな領域にマッピングされ、第3の層などによりさらに小さな領域にマッピングされる。その結果、第1層のパラメータの大きな変化があっても、出力が大きく変化することはない。

この問題を回避するには、入力領域を小さな領域に「押しつぶす」というこのプロパティを持たないアクティベーション関数を使用します。よく使われるのはxmax(0,x)に写像する整流線形ユニットです。

回答はQuoraのpostから取られました。

更新:

勾配問題を爆発時には、勾配が以前の層にはるかに大きくなり、それが爆発勾配の問題として知られています。たとえば、重み行列に大きな値を選択し、グラディエントが大きくなるようにバイアス値を設定した場合、ニューラルネットワークはグラデーションの爆発的な問題に悩まされます。別の理由は、データポイント自体が大きくて学習率が低い場合でもグラジェント降下中に非常に大きなステップを引き起こす可能性があります。したがって、勾配の爆発の問題を避けるために、訓練の前に列ごとにデータポイントを正規化することができます。

さらに、学習率が高いことは、グレイドネット問題の爆発の別の潜在的な理由になります。私は、あなたがこの問題を解決するために、articleを参照してください。

@timleathartに感謝の言葉をいただき、ありがとうございます。

+0

消失勾配の問題は損失を爆発させませんが、貧弱な値で停滞させます。さらに、彼はすでに線形アクティベーションを使用しているため、実際には勾配が消えてしまうことはありません。 – timleathart

+0

@timleathart微分値が1(sigmoidとtanh)未満の活性化関数のために、ぼかし勾配の問題が発生することがあります。したがって、OPがそれを使用した可能性があります。私はあなたの最初の点に同意し、私はそれを反映するために私の答えを更新しています。あなたがそれのために下落した場合、私はあなたに再考することを強く勧めます。ありがとう。 –

+2

OPは隠れ層に使用する活性化関数を指定していないので、TFLearnではデフォルトで、シグモイドやtanhではなく線形活性化 'f(x)= x'になります。おそらく、データポイントの値が非常に高く、学習率が低い場合でも勾配降下中に非常に大きなステップを引き起こすという問題があります。これらはトレーニングの前に列で正規化する必要があります。これは、datascience.stackexchange.comでこの質問の元の投稿で回答したアドバイスです。 – timleathart

関連する問題