ディープラーニングを使用して、出会い系サイトから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])
そして、これは精度と損失の例です: そして 。
正規化とドロップアウトを削除しようとしましたが、予想通り、オーバーフィッティングになりました(トレーニングacc:〜85%)。同様の結果で、学習率を大幅に低下させようとしました。
誰もが同様の結果を見ましたか?
これは、トレーニングとテストの動作が異なるため、Dropout
を使用する場合に発生します。
トレーニング時には、機能の割合がゼロに設定されます(Dropout(0.5)
を使用しているため、この場合は50%)。テスト時には、すべての機能が使用されます(適切にスケーリングされます)。そのため、テスト時のモデルはより堅牢になり、テストの精度が向上します。
Keras FAQ および特にセクション "なぜトレーニングの損失がテストの損失よりもはるかに高いのですか?"を確認できます。
また、少し時間を取り、これを読むことをお勧めします非常に良い記事 常に行うべき「健全性チェック」についてNNを構築するときに考慮します。
さらに、可能な限り、結果が意味をなすかどうかを確認します。たとえば、カテゴリクロスエントロピーを使用したnクラス分類の場合、最初のエポックでの損失は-ln(1/n)
になります。
あなたの特定の場合は別として、Dropout
を除いて、データセットの分割がこの状況を引き起こすことがあると思います。特に、データセットの分割がランダムでない場合(時間的または空間的パターンが存在する場合)、検証セットは根本的に異なる場合があります。トレーニングよりも。
さらに、検証セットがトレーニングと比較して非常に小さい場合、モデルはトレーニングよりも検証セットによりランダムに適合します。]
これは実際にはかなり頻繁に起こります。データセットにそれほど変動がない場合は、このような動作が発生する可能性があります。 ここ これが起こる理由を説明できます。
これは、データセットに高いバイアスが存在することを示しています。それは不十分です。発行するソリューションは次のとおりです。
おそらく、ネットワークはトレーニングデータの適合に苦労しています。したがって、少し大きいネットワークを試してください。
別のディープニューラルネットワークを試してください。アーキテクチャを少し変更するということです。
より長い時間トレーニングします。
高度な最適化アルゴリズムを使用してみてください。