Mencegah Overfitting dengan jaringan LSTM besar pada sejumlah kecil data

Aug 19 2020

Saya memposting ulang pertanyaan ini dari AI.SE di sini karena saya pikir itu mungkin di luar topik untuk AI.SE ...

1. Konteks

Saya mempelajari teknik Pemantauan Kesehatan, dan saya berlatih dengan set data C-MAPSS . Tujuannya adalah untuk memprediksi Remaining Useful Life (RUL) dari mesin yang diberi seri pengukuran sensor. Ada banyak literatur tentang set data C-MAPSS, termasuk teknik ML klasik (non-DL) dan pendekatan berbasis DL. Beberapa tahun yang lalu, jaringan berbasis LSTM menunjukkan hasil yang menjanjikan (lihat perkiraan Jaringan Memori Jangka Pendek Panjang untuk Sisa Umur Berguna, Zheng dkk , 2017 ), dan saya mencoba mereproduksi hasil ini.

Dataset C-MAPSS berisi sedikit data. Misalnya, subset FD001 hanya memiliki 100 seri run-to-failure. Ketika saya memprosesnya terlebih dahulu untuk mendapatkan deret waktu panjang tetap, saya bisa mendapatkan hingga ~ 20.000 rangkaian berbingkai. Dalam artikel yang disebutkan di atas menggunakan LSTM, mereka menggunakan dua lapisan LSTM tersembunyi dengan masing-masing 64 unit, dan dua lapisan yang terhubung sepenuhnya dengan masing-masing 8 neuron (~ 55.000 parameter).

2. Masalah

LSTM menyebabkan sejumlah besar parameter, sehingga overfitting dapat terjadi saat melatih jaringan seperti itu. Saya dapat menggunakan regularisasi L1 atau L2, putus sekolah, sebagian besar jaringan masih akan terlalu besar terkait dengan kumpulan data. Dengan mempertahankan arsitektur yang sama, saya tidak dapat mencapai skor dan RMSE di makalah dalam set validasi, dan overfitting selalu ada di sini.

Namun, satu hal yang berhasil adalah mengurangi jumlah unit lapisan LSTM. Diharapkan, dengan hanya 24 unit, bukan 64 per lapisan, jaringan memiliki lebih sedikit parameter (~ 9000), dan tidak ada overfitting. Skor dan RMSE sedikit lebih buruk daripada yang ada di koran, tapi itu yang terbaik yang bisa saya dapatkan sejauh ini. Meskipun hasil ini baik-baik saja bagi saya, saya ingin tahu tentang bagaimana penulis makalah dapat menghindari overfitting pada jaring LSTM (64,64) mereka.

3. Pertanyaan

LSTM memang bagus, tetapi mereka menyebabkan banyak parameter yang menghalangi pembelajaran yang benar pada kumpulan data kecil: Saya ingin tahu apakah ada metode untuk mengatasi masalah khusus ini. Apakah Anda punya saran tentang cara menghindari overfitting dengan jaringan berbasis LSTM pada set data kecil?

4. Info

Di bawah ini saya berikan info lebih lanjut tentang jaring saya dan hasil:

Arsitektur jaringan

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')
])

Skor (Set validasi)

  • Makalah: Nilai = 16,14; RMSE = 338
  • LSTM saya (64, 64): Skor = 26.47; RMSE = 3585 (pakaian berlebih)
  • LSTM saya (24, 24): Skor = 16.82; RMSE = 515

Sunting: Hasil untuk solusi yang diusulkan oleh @ hH1sG0n3

  • LSTM (64, 64) dengan recurrent_dropout=0.3: Skor = 16.36; RMSE = 545

Jawaban

2 hH1sG0n3 Aug 19 2020 at 19:39

Anda mungkin ingin memeriksa beberapa hyperparameter yang tampaknya tidak Anda uji dalam kode Anda di atas:

  • Pemotongan gradien: pembaruan besar pada bobot selama pelatihan dapat menyebabkan luapan atau kekurangan numerik yang sering disebut sebagai "gradien yang meledak".
# configure your optimizer with gradient norm clipping
opt = SGD(lr=0.01, momentum=0.9, clipnorm=1.0)
  • Putus-putus berulang: Putus-putus yang diterapkan ke sinyal masukan berulang dari unit-unit lapisan LSTM.
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., recurrent_dropout=0.3)
  • Stateful: Apakah jelas dari makalah jika model mempertahankan statusnya dengan setiap iterasi pelatihan. Anda juga bisa bereksperimen dengan ini.
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., stateful=True)
shepan6 Aug 19 2020 at 17:51

Jadi, pertanyaannya menanyakan tentang bagaimana mencegah overfitting, terutama dengan kumpulan data yang kecil.

Jelas, intuisi pertama saya mengatakan untuk mengurangi jumlah lapisan (misalnya menghapus lapisan LSTM kedua, misalnya), tetapi ini jelas akan mengubah keseluruhan arsitektur model, sehingga memiliki lebih sedikit lapisan daripada model yang dijelaskan di makalah.

Saran lain yang sangat jelas adalah melakukan beberapa bentuk augmentasi data, untuk meningkatkan jumlah sampel secara artifisial menggunakan kumpulan data yang Anda miliki saat ini.

Apakah Anda juga telah menerapkan pra-pemrosesan ke data (mis. Nilai numerik berskala, dll.)? Jika tidak, ini juga bisa membantu.