Чи може виникнути перевиконання навіть тоді, коли втрати перевірки все ще знижуються?


12

У мене в Керасі згорнута модель LSTM, подібна до цієї (посилання 1), яку я використовую для змагань Kaggle. Архітектура показана нижче. Я підготував це на своєму міченому наборі з 11000 зразків (два класи, початкова поширеність становить ~ 9: 1, тому я збільшив вибірку від 1 до приблизно 1/1) протягом 50 епох з 20% розбиттям валідації. на деякий час, але я подумав, що це перебуває під контролем із шарами шуму та випадання.

Модель виглядала так, що вона прекрасно тренується, врешті-решт набрала 91% усього навчального набору, але після тестування на тестовому наборі даних, абсолютно сміття.

Втрата за епохою

Точність перевірки за епохами

Зауважте: точність перевірки вище, ніж точність тренування. Це протилежність "типовому" набору.

Моя інтуїція полягає в тому, що, враховуючи розбіжність валідації з невеликим результатом, модель все ще вдається надто сильно вписуватися в набір входів і втрачає узагальнення. Інша підказка полягає в тому, що val_acc більше, ніж ac, що здається рибним. Це найімовірніший сценарій тут?

Якщо це є надмірним, чи збільшить розрив валідації це взагалі пом'якшить, чи я зіткнуся з тим самим питанням, оскільки в середньому кожен зразок побачить ще половину загальної епохи?

Модель:

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

Ось заклик підходити до моделі (вага класу зазвичай становить близько 1: 1, оскільки я збільшив вибірку введення):

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 є якесь нерозумне правило, що я можу розміщувати не більше 2 посилань, поки моя оцінка не буде вищою, тому ось приклад у випадку, коли вас цікавить: Посилання 1: machinelearningmastery DOT com SLASH послідовна класифікація-lstm-recurrent-neural-network- пітон-кери

Відповіді:


8

Я не впевнений, збалансований набір перевірки чи ні. У вас серйозна проблема з дисбалансом даних. Якщо ви відбираєте рівномірно та випадковим чином з кожного класу для навчання вашої мережі, а потім відсоток від того, що ви взяли на вибірку, використовується для перевірки вашої мережі, це означає, що ви тренуєтесь та перевіряєте, використовуючи збалансований набір даних. У процесі тестування ви використовували незбалансовану базу даних. Це означає, що ваші набори перевірки та тестування не є еквівалентними. У такому випадку у вас може бути висока точність перевірки та низька точність тестування. Будь ласка, знайдіть це посилання, в якому йдеться переважно про проблему дисбалансу даних для DNN, ви можете перевірити, як вони проводять вибірку для навчання, перевірки та тестування https://pdfs.semanticscholar.org/69a6/8f9cf874c69e2232f47808016c2736b90c35.pdf


1
Набір перевірки витягується з того ж набору, що і навчальний набір. Я не впевнений на 100%, але я вважаю, що Керас знімає валідацію перед перетасуванням та тренуванням (тобто, якщо ви подаєте неперемішані дані, валідація розділяє частину вашого розповсюдження). Тож я вручну балансую і перемішуюсь перед тим, як перейти до Керасу. Єдине питання може полягати в тому, що я дублюю оцінку 1 і додаю гауссовий шум, що може посилити надмірність.
DeusXMachina

2
Я думаю, вам не потрібно залежати від Кераса, щоб зробити перевірку, ви можете розділити свої дані на три частини. Навчання, перевірка та тестування. Вибірка з навчальних даних та тренування вашої мережі. Не грайте з розподілом у наборах для перевірки та тестування. Оптимізуйте вашу мережу на наборі перевірки, а потім перевірте набір тестування. Я відредагував свою відповідь, щоб додати корисну довідку
Башар Хаддад

5

Якщо ваші втрати на тренінгу підпадають під ваші втрати на підтвердження, ви перестараєтеся , навіть якщо перевірка все ще падає.

Це знак того, що ваша мережа вивчає схеми в наборі поїздів, які не застосовуються у валідації


Я розумію, що втрати тренінгу йдуть менше, ніж втрати валідації - це просто надмірна кількість навчального набору. Але точність перевірки вище, ніж точність тренувань . Це дивна частина!
DeusXMachina

Ні, якщо ваші набори незбалансовані. Наприклад, у двійковому класифікаторі, якщо у валідації валідації є менше 1 пропорції, а ваша модель виводить лише 0s, ви мали б більш високу точність перевірки
жирний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.