少量のデータで大規模なLSTMネットを使用した過剰適合の回避
AI.SEからこの質問を再投稿します。これは、AI.SEにとっておそらくトピックから外れたと思うからです...
1.コンテキスト
私はヘルスモニタリング技術を研究しており、C-MAPSSデータセットで練習しています。目標は、一連のセンサー測定値が与えられた場合のエンジンの残存耐用年数(RUL)を予測することです。C-MAPSSデータセットには、古典的な(非DL)ML手法とDLベースのアプローチの両方を含む幅広い文献があります。数年前、LSTMベースのネットワークは有望な結果を示しました(残りの耐用年数の推定のための長短期記憶ネットワーク、Zheng et al、2017を参照)。私はこれらの結果を再現しようとしています。
C-MAPSSデータセットには、少量のデータが含まれています。FD001サブセットには、たとえば、100個の失敗までの一連のシリーズしかありません。固定長の時系列を取得するために前処理すると、最大20000のフレーム化されたシリーズを取得できます。LSTMを使用する上記の記事では、それぞれ64ユニットの2つの隠れたLSTMレイヤーと、それぞれ8つのニューロンを持つ2つの完全に接続されたレイヤー(〜55 000パラメーター)を使用しています。
2.問題
LSTMは多数のパラメーターを誘発するため、そのようなネットワークをトレーニングするときに過剰適合が発生する可能性があります。L1またはL2の正則化、ドロップアウトを使用できますが、データセットに関してネットは依然として大幅にサイズが大きくなります。同じアーキテクチャを維持していると、検証セットの論文のスコアとRMSEに到達できず、過剰適合は常にここにあります。
ただし、機能することの1つは、LSTM層のユニット数を減らすことです。予想通り、レイヤーあたり64ユニットではなく24ユニットしかないため、ネットのパラメーターははるかに少なく(〜9000)、過剰適合はありません。スコアとRMSEは論文のものより少し悪いですが、これまでのところ最高です。これらの結果は私にとっては問題ありませんが、論文の著者がLSTM(64,64)ネットでの過剰適合を回避することがどのように可能であったかについて興味があります。
3.質問
LSTMは優れていますが、小さなデータセットでの正しい学習を妨げる多くのパラメーターを誘発します。この特定の問題に取り組む方法があるかどうか疑問に思います。小さなデータセットでLSTMベースのネットを過剰適合させないようにする方法についてアドバイスはありますか?
4.情報
私はここに私のネットと結果についてのより多くの情報を提供します:
ネットワークアーキテクチャ
model = keras.models.Sequential([
keras.layers.LSTM(24, return_sequences=True, kernel_regularizer=keras.regularizers.l1(0.01),
input_shape=input_shape),
keras.layers.Dropout(0.2),
keras.layers.LSTM(24, return_sequences=False, kernel_regularizer=keras.regularizers.l1(0.01)),
keras.layers.Dropout(0.2),
keras.layers.Dense(8, activation='relu', kernel_regularizer=keras.regularizers.l2()),
keras.layers.Dropout(0.2),
keras.layers.Dense(8, activation='relu', kernel_regularizer=keras.regularizers.l2(), bias_regularizer=keras.regularizers.l2()),
keras.layers.Dense(1, activation='relu')
])
スコア(検証セット)
- 論文:スコア= 16.14; RMSE = 338
- 私のLSTM(64、64):スコア= 26.47; RMSE = 3585(オーバーフィット)
- 私のLSTM(24、24):スコア= 16.82; RMSE = 515
編集:@ hH1sG0n3によって提案されたソリューションの結果
- LSTM(64、64)with
recurrent_dropout=0.3
:スコア= 16.36; RMSE = 545
回答
上記のコードでテストしていないように見えるいくつかのハイパーパラメータを確認することをお勧めします。
- 勾配クリッピング:トレーニング中に重みを大幅に更新すると、「勾配の爆発」と呼ばれることが多い数値のオーバーフローまたはアンダーフローが発生する可能性があります。
# configure your optimizer with gradient norm clipping
opt = SGD(lr=0.01, momentum=0.9, clipnorm=1.0)
- 繰り返しドロップアウト:LSTM層のユニットの繰り返し入力信号に適用されるドロップアウト。
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., recurrent_dropout=0.3)
- ステートフル:モデルがトレーニングの反復ごとにその状態を保持するかどうかは、ペーパーから明らかですか。これを試すこともできます。
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., stateful=True)
したがって、質問は、特に小さなデータセットで、過剰適合を防ぐ方法について尋ねます。
明らかに、私の最初の直感では、レイヤーの数を減らす(たとえば、2番目のLSTMレイヤーを削除する)と言っていますが、これにより、モデルの全体的なアーキテクチャが明らかに変更され、ペーパーで説明されているモデルよりもレイヤーが少なくなります。
他の特に明白な提案は、現在持っているデータセットを使用してサンプルの数を人為的に増やすために、何らかの形のデータ拡張を行うことです。
また、データに前処理(つまり、スケーリングされた数値など)を適用しましたか?そうでない場合は、これも役立つ可能性があります。