Apakah overfitting dapat terjadi meskipun kehilangan validasi masih menurun?

12

Saya memiliki model + LSTM konvolusional di Keras, mirip dengan ini (ref 1), yang saya gunakan untuk kontes Kaggle. Arsitektur ditunjukkan di bawah ini. Saya telah melatihnya pada set berlabel 11000 sampel saya (dua kelas, prevalensi awal adalah ~ 9: 1, jadi saya menaikkan nilai 1 hingga rasio 1/1) untuk 50 zaman dengan pembagian validasi 20%. Saya mendapatkan overfitting terang-terangan. untuk sementara waktu tapi saya pikir itu bisa dikendalikan dengan lapisan noise dan dropout.

Model tampak seperti pelatihan luar biasa, pada akhirnya mencetak 91% pada keseluruhan set pelatihan, tetapi setelah pengujian pada set data uji, benar-benar sampah.

Kehilangan karena zaman

Akurasi validasi berdasarkan zaman

Perhatikan: akurasi validasi lebih tinggi daripada akurasi pelatihan. Ini kebalikan dari overfitting "tipikal".

Intuisi saya adalah, mengingat pemisahan validasi ish kecil, model masih berhasil menyesuaikan terlalu kuat ke set input dan kehilangan generalisasi. Petunjuk lainnya adalah bahwa val_acc lebih besar dari acc, yang tampaknya mencurigakan. Apakah itu skenario yang paling mungkin di sini?

Jika ini berlebihan, akankah meningkatkan pemisahan validasi mengurangi ini sama sekali, atau apakah saya akan mengalami masalah yang sama, karena rata-rata, masing-masing sampel akan melihat setengah dari total zaman masih?

Model:

Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
convolution1d_19 (Convolution1D) (None, None, 64)      8256        convolution1d_input_16[0][0]     
____________________________________________________________________________________________________
maxpooling1d_18 (MaxPooling1D)   (None, None, 64)      0           convolution1d_19[0][0]           
____________________________________________________________________________________________________
batchnormalization_8 (BatchNormal(None, None, 64)      128         maxpooling1d_18[0][0]            
____________________________________________________________________________________________________
gaussiannoise_5 (GaussianNoise)  (None, None, 64)      0           batchnormalization_8[0][0]       
____________________________________________________________________________________________________
lstm_16 (LSTM)                   (None, 64)            33024       gaussiannoise_5[0][0]            
____________________________________________________________________________________________________
dropout_9 (Dropout)              (None, 64)            0           lstm_16[0][0]                    
____________________________________________________________________________________________________
batchnormalization_9 (BatchNormal(None, 64)            128         dropout_9[0][0]                  
____________________________________________________________________________________________________
dense_23 (Dense)                 (None, 64)            4160        batchnormalization_9[0][0]       
____________________________________________________________________________________________________
dropout_10 (Dropout)             (None, 64)            0           dense_23[0][0]                   
____________________________________________________________________________________________________
dense_24 (Dense)                 (None, 2)             130         dropout_10[0][0]                 
====================================================================================================
Total params: 45826

Inilah panggilan untuk menyesuaikan model (berat kelas biasanya sekitar 1: 1 karena saya meningkatkan input):

class_weight= {0:1./(1-ones_rate), 1:1./ones_rate} # automatically balance based on class occurence
m2.fit(X_train, y_train, nb_epoch=50, batch_size=64, shuffle=True, class_weight=class_weight, validation_split=0.2 )

SE memiliki beberapa aturan konyol bahwa saya dapat memposting tidak lebih dari 2 tautan sampai skor saya lebih tinggi, jadi inilah contohnya jika Anda tertarik: Ref 1: machinelearningmastery DOT com SLASH urutan-klasifikasi-lstm-recurrent-neural-networks- python-keras

DeusXMachina
sumber

Jawaban:

8

Saya tidak yakin apakah set validasi seimbang atau tidak. Anda memiliki masalah ketidakseimbangan data yang parah. Jika Anda mengambil sampel yang sama dan acak dari setiap kelas untuk melatih jaringan Anda, dan kemudian persentase dari apa yang Anda sampel digunakan untuk memvalidasi jaringan Anda, ini berarti Anda melatih dan memvalidasi menggunakan set data yang seimbang. Dalam pengujian Anda menggunakan database yang tidak seimbang. Ini berarti bahwa set validasi dan pengujian Anda tidak setara. Dalam kasus seperti itu, Anda mungkin memiliki akurasi validasi tinggi dan akurasi pengujian rendah. Silakan temukan referensi ini yang berbicara terutama tentang masalah ketidakseimbangan data untuk DNN, Anda dapat memeriksa bagaimana sampel mereka melakukan pelatihan, validasi, dan pengujian https://pdfs.semanticscholar.org/69a6/8f9cf874c69e2232f47808016c2736b90c35.pdf

Bashar Haddad
sumber
1
Set validasi ditarik dari set yang sama dengan set pelatihan. Saya tidak 100% yakin tetapi saya percaya Keras mengambil potongan validasi sebelum pengocokan dan pelatihan (yaitu jika Anda memberinya data yang tidak diacak, pemisahan validasi memotong bagian dari distribusi Anda). Jadi saya menyeimbangkan dan mengacak secara manual sebelum beralih ke Keras. Satu-satunya masalah adalah bahwa saya menduplikasi angka 1 dan menambahkan noise gaussian, yang mungkin meningkatkan overfit.
DeusXMachina
2
Saya pikir Anda tidak perlu bergantung pada Keras untuk melakukan validasi, Anda dapat membagi data Anda menjadi tiga bagian. Pelatihan, validasi, dan pengujian. Sampel dari data pelatihan dan latih jaringan Anda. Jangan bermain dengan distribusi di set validasi dan pengujian. Optimalkan jaringan Anda pada set validasi dan kemudian periksa set pengujian. Saya mengedit jawaban saya untuk menambahkan referensi yang bermanfaat
Bashar Haddad
5

Jika kehilangan latihan Anda berada di bawah kerugian validasi Anda, Anda kelebihan beban , bahkan jika validasi masih menurun.

Ini adalah tanda bahwa jaringan Anda sedang mempelajari pola dalam rangkaian kereta yang tidak berlaku dalam validasi

mencolok
sumber
Saya mengerti kehilangan pelatihan kurang dari kehilangan validasi - ini hanya overfitting ke set pelatihan. Tetapi akurasi validasi lebih tinggi daripada akurasi pelatihan . Itu bagian yang aneh!
DeusXMachina
Tidak jika set Anda tidak seimbang. Misalnya, dalam klasifikasi biner, jika Anda memiliki proporsi kurang dari 1 dalam set validasi, dan model Anda hanya menghasilkan 0s, Anda akan memiliki akurasi validasi yang lebih tinggi
tebal