Az miktarda veri üzerinde büyük bir LSTM ağı ile aşırı uydurmaktan kaçınma
Bu soruyu AI.SE'den yeniden yayınlıyorum , çünkü AI için konu dışı olabilir.
1. Bağlam
Sağlık İzleme teknikleri okuyorum ve C-MAPSS veri kümesi üzerinde çalışıyorum . Amaç, bir motora verilen sensör ölçüm serisinin Kalan Kullanışlı Ömrünü (RUL) tahmin etmektir. Hem klasik (DL olmayan) makine öğrenimi teknikleri hem de DL tabanlı yaklaşımlar dahil olmak üzere C-MAPSS veri kümesi hakkında geniş bir literatür var. Birkaç yıl önce, LSTM tabanlı ağlar ümit verici sonuçlar gösterdi (bkz. Kullanışlı Ömründe Kalan Uzun Kısa Süreli Bellek Ağı tahmini, Zheng ve diğerleri , 2017 ) ve bu sonuçları yeniden üretmeye çalışıyorum.
C-MAPSS veri kümesi düşük miktarda veri içerir. FD001 alt kümesinde örneğin yalnızca 100 çalışma-arıza serisi vardır. Sabit uzunlukta zaman serileri elde etmek için önceden işlediğimde, ~ 20.000 çerçeveli seriye kadar çıkabilirim. LSTM kullanarak yukarıda bahsedilen makalede, her biri 64 birim içeren iki gizli LSTM katmanı ve her biri 8 nöronlu iki tam bağlantılı katman (~ 55000 parametre) kullanıyorlar.
2. Sorun
LSTM'ler çok sayıda parametreyi indükler, bu nedenle böyle bir ağı eğitirken aşırı uyumla karşılaşılabilir. L1 veya L2 regülasyonunu, kesintileri kullanabilirim, ağ hala veri setine göre büyük ölçüde büyük olacaktır. Aynı mimariyi koruyarak, doğrulama setindeki kağıttaki puanlara ve RMSE'ye ulaşamıyorum ve aşırı uyum her zaman burada.
Bununla birlikte, işe yarayan bir şey, LSTM katmanlarının birim sayısını azaltmaktır. Beklendiği gibi, katman başına 64 yerine sadece 24 birimle, ağın çok daha az parametresi (~ 9000) vardır ve fazla uyum göstermez. Puanlar ve RMSE, gazetedekinden biraz daha kötü, ancak şimdiye kadar alabildiğim en iyisi bu. Bu sonuçlar benim için iyi olsa da, makalenin yazarlarının LSTM (64,64) ağlarına aşırı uymaktan kaçınmalarının nasıl mümkün olduğunu merak ediyorum.
3. Soru
LSTM harikadır, ancak küçük veri kümelerinde doğru öğrenmeyi engelleyen birçok parametreyi tetikler: Bu özel sorunu çözmek için herhangi bir yöntem olup olmadığını merak ediyorum. Küçük bir veri setinde LSTM tabanlı bir ağ ile aşırı uyumu nasıl önleyeceğiniz konusunda herhangi bir tavsiyeniz var mı?
4. Bilgiler
Aşağıda ağım ve sonuçlarım hakkında daha fazla bilgi veriyorum:
Ağ mimarisi
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')
])
Puanlar (Doğrulama seti)
- Kağıt: Puan = 16.14; RMSE = 338
- LSTM'm (64, 64): Puan = 26.47; RMSE = 3585 (overfits)
- LSTM'm (24, 24): Puan = 16.82; RMSE = 515
Düzenleme: @ hH1sG0n3 tarafından önerilen çözümün sonuçları
- LSTM (64, 64) ile
recurrent_dropout=0.3
: Skor = 16,36; RMSE = 545
Yanıtlar
Yukarıdaki kodunuzda test etmediğiniz görünen birkaç hiperparametreyi kontrol etmek isteyebilirsiniz:
- Gradyan kırpma: Eğitim sırasında ağırlıklarda yapılan büyük güncellemeler, genellikle "patlayan gradyanlar" olarak adlandırılan sayısal bir taşmaya veya yetersizliğe neden olabilir.
# configure your optimizer with gradient norm clipping
opt = SGD(lr=0.01, momentum=0.9, clipnorm=1.0)
- Tekrarlayan bırakma: LSTM katmanının birimlerinin tekrarlayan giriş sinyaline uygulanan bırakma.
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., recurrent_dropout=0.3)
- Durum bilgisi olan: Modelin her eğitim yinelemesinde durumunu koruduğu kağıttan anlaşılıyor mu? Bunu da deneyebilirsiniz.
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., stateful=True)
Dolayısıyla soru, özellikle küçük bir veri kümesiyle aşırı uydurmanın nasıl önleneceğini soruyor.
Açıkçası, ilk sezgim katman sayısını azaltmayı söylüyor (örneğin, ikinci LSTM katmanını kaldırın), ancak bu açık bir şekilde modelin genel mimarisini değiştirecektir, öyle ki kağıda anlatılan modelden daha az katmana sahiptir.
Diğer özellikle bariz öneri, şu anda sahip olduğunuz veri kümesini kullanarak örnek sayısını yapay olarak artırmak için bir tür veri artırma yapmaktır.
Ayrıca verilere herhangi bir ön işlem uyguladınız mı (yani ölçeklendirilmiş sayısal değerler vb.)? Aksi takdirde, bu da yardımcı olabilir.