web-dev-qa-db-ja.com

TensorflowとKerasを使用して精度をトレーニングするよりも高い検証精度

ディープラーニングを使用して、出会い系サイトから15の自己報告属性から収入を予測しようとしています。

トレーニングデータよりも検証データの方が精度が高く、損失が少ないという、かなり奇妙な結果が得られています。そして、これはさまざまなサイズの隠れ層で一貫しています。これが私たちのモデルです:

for hl1 in [250, 200, 150, 100, 75, 50, 25, 15, 10, 7]:
    def baseline_model():
        model = Sequential()
        model.add(Dense(hl1, input_dim=299, kernel_initializer='normal', activation='relu', kernel_regularizer=regularizers.l1_l2(0.001)))
        model.add(Dropout(0.5, seed=seed))
        model.add(Dense(3, kernel_initializer='normal', activation='sigmoid'))

        model.compile(loss='categorical_crossentropy', optimizer='adamax', metrics=['accuracy'])
        return model

    history_logs = LossHistory()
    model = baseline_model()
    history = model.fit(X, Y, validation_split=0.3, shuffle=False, epochs=50, batch_size=10, verbose=2, callbacks=[history_logs])

そして、これは精度と損失の例です: Accuracy with hidden layer of 250 neurons そして the loss

正規化とドロップアウトを削除しようとしましたが、予想通り、オーバーフィッティングになりました(トレーニングacc:〜85%)。同様の結果で、学習率を大幅に低下させようとしました。

誰もが同様の結果を見ましたか?

21
Jasper

これは、トレーニングとテストの動作が異なるため、Dropoutを使用する場合に発生します。

トレーニング時には、機能の割合がゼロに設定されます(Dropout(0.5)を使用しているため、この場合は50%)。テスト時には、すべての機能が使用されます(適切にスケーリングされます)。そのため、テスト時のモデルはより堅牢になり、テストの精度が向上します。

41
yhenon

Keras FAQ および特にセクション "なぜトレーニングの損失がテストの損失よりもはるかに高いのですか?"を確認できます。

また、少し時間を取り、これを読むことをお勧めします非常に良い記事 常に行うべき「健全性チェック」についてNNを構築するときに考慮します。

さらに、可能な限り、結果が意味をなすかどうかを確認します。たとえば、カテゴリクロスエントロピーを使用したnクラス分類の場合、最初のエポックでの損失は-ln(1/n)になります。

あなたの特定の場合は別として、Dropoutを除いて、データセットの分割がこの状況を引き起こすことがあると思います。特に、データセットの分割がランダムでない場合(時間的または空間的パターンが存在する場合)、検証セットは根本的に異なる場合があります。トレーニングよりも。

さらに、検証セットがトレーニングと比較して非常に小さい場合、モデルはトレーニングよりも検証セットによりランダムに適合します。]

10
Jasmine

これは実際にはかなり頻繁に起こります。データセットにそれほど変動がない場合は、このような動作が発生する可能性があります。 ここ これが起こる理由を説明できます。

9
Marcin Możejko

これは、データセットに高いバイアスが存在することを示しています。それは不十分です。発行するソリューションは次のとおりです。

  1. おそらく、ネットワークはトレーニングデータの適合に苦労しています。したがって、少し大きいネットワークを試してください。

  2. 別のディープニューラルネットワークを試してください。アーキテクチャを少し変更するということです。

  3. より長い時間トレーニングします。

  4. 高度な最適化アルゴリズムを使用してみてください。

5
WaterRocket8236