Может ли перенастройка произойти, даже если потеря проверки все еще падает?


12

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

Модель выглядела так, как будто она тренируется замечательно, в конце набрала 91% на всей тренировке, но после тестирования на тестовых данных абсолютный мусор.

Убыток по эпохе

Точность валидации по эпохе

Примечание: точность проверки выше, чем точность обучения. Это противоположно «типичному» оснащению.

Моя интуиция заключается в том, что с учетом небольшого разбора валидации модель все еще может слишком сильно соответствовать входному набору и теряет обобщение. Другая подсказка в том, что val_acc больше чем acc, что выглядит подозрительно. Это наиболее вероятный сценарий здесь?

Если это переобучение, уменьшит ли это разделение проверки достоверности, или я столкнусь с той же проблемой, так как в среднем каждый образец будет видеть половину всех эпох еще?

Модель:

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 sequence-классификация-lstm-recurrent-нейронные сети- питон-keras

Ответы:


8

Я не уверен, сбалансирован ли набор проверки или нет. У вас серьезная проблема с дисбалансом данных. Если вы проводите выборку одинаково и случайным образом из каждого класса для обучения своей сети, а затем процент от того, что вы выбрали, используется для проверки вашей сети, это означает, что вы обучаетесь и проверяете, используя сбалансированный набор данных. В тестировании вы использовали несбалансированную базу данных. Это означает, что ваши наборы для валидации и тестирования не эквивалентны. В таком случае у вас может быть высокая точность проверки и низкая точность тестирования. Пожалуйста, найдите эту ссылку, которая говорит в основном о проблеме дисбаланса данных для DNN, вы можете проверить, как они выбирают для проведения обучения, проверки и тестирования https://pdfs.semanticscholar.org/69a6/8f9cf874c69e2232f47808016c2736b90c35.pdf


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

2
Я думаю, что вам не нужно зависеть от Keras для выполнения проверки, вы можете разделить ваши данные на три части. Обучение, проверка и тестирование. Получите данные тренировок и обучите свою сеть. Не играйте с дистрибутивом в комплектах валидации и тестирования. Оптимизируйте свою сеть на проверочном наборе, а затем проверьте на испытательном наборе. Я отредактировал свой ответ, чтобы добавить полезную ссылку
Башар Хаддад

5

Если ваша потеря в результате обучения подпадает под вашу потерю в результате валидации, вы переизбираетесь , даже если валидация все еще падает.

Это признак того, что ваша сеть изучает шаблоны в наборе поездов, которые не применимы в проверочном.


Я понимаю, что потери при тренировках идут меньше, чем потери при проверке - это просто переоснащение на тренировочный набор. Но точность проверки выше, чем точность обучения . Это странная часть!
DeusXMachina

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