Какие параметры следует использовать для ранней остановки?

100

Я тренирую нейронную сеть для своего проекта с помощью Keras. Керас предусмотрел функцию ранней остановки. Могу ли я узнать, какие параметры следует соблюдать, чтобы моя нейронная сеть не переобучалась с помощью ранней остановки?

АйзуддинАзман
источник

Ответы:

160

ранняя остановка

Ранняя остановка - это, по сути, прекращение тренировки, когда ваши потери начинают расти (или, другими словами, точность проверки начинает снижаться). Согласно документам он используется следующим образом;

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=0,
                              verbose=0, mode='auto')

Значения зависят от вашей реализации (проблема, размер партии и т. Д.), Но обычно для предотвращения переобучения я бы использовал;

  1. Отслеживайте потерю проверки (необходимо использовать перекрестную проверку или, по крайней мере, наборы для обучения / тестирования), задав для monitor аргумента значение 'val_loss'.
  2. min_delta- это порог, определяющий, можно ли количественно оценить потерю в определенную эпоху как улучшение или нет. Если разница в убытках ниже min_delta, это определяется как отсутствие улучшения. Лучше оставить его равным 0, так как нас интересует, когда убыток станет хуже.
  3. patienceАргумент представляет количество эпох перед остановкой после того, как ваши убытки начнут расти (перестают улучшаться). Это зависит от вашей реализации, если вы используете очень маленькие партии или большую скорость обучения, ваш зигзагообразный зигзаг потерь (точность будет более шумной), поэтому лучше установить большой patienceаргумент. Если вы используете большие партии и небольшую скорость обучения, ваши потери будут более плавными, поэтому вы можете использовать меньший patienceаргумент. В любом случае я оставлю это как 2, чтобы дать модели больше шансов.
  4. verbose решает, что печатать, оставьте значение по умолчанию (0).
  5. modeАргумент зависит от того, в каком направлении находится ваше отслеживаемое количество (должно ли оно уменьшаться или увеличиваться), поскольку мы отслеживаем потери, которые мы можем использовать min. Но давайте оставим keras обрабатывать это для нас и установим это наauto

Поэтому я бы использовал что-то подобное и поэкспериментировал, построив график потери ошибок с ранней остановкой и без нее.

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=2,
                              verbose=0, mode='auto')

Для возможной двусмысленности в том, как работают обратные вызовы, я постараюсь объяснить больше. Как только вы вызываете fit(... callbacks=[es])свою модель, Keras вызывает предопределенные функции заданных объектов обратного вызова. Эти функции могут быть вызваны on_train_begin, on_train_end, on_epoch_begin, on_epoch_endи on_batch_begin, on_batch_end. Обратный вызов ранней остановки вызывается в конце каждой эпохи, сравнивает лучшее отслеживаемое значение с текущим и останавливается, если выполняются условия (сколько эпох прошло с момента наблюдения лучшего отслеживаемого значения, и является ли это более чем аргументом терпения, разница между последнее значение больше min_delta и т. д.).

Как указано в комментариях @BrentFaust, обучение модели будет продолжаться до тех пор, пока не будут выполнены условия ранней остановки или epochsпараметр (по умолчанию = 10) fit(). Установка обратного вызова Early Stopping не заставит модель тренироваться сверх своего epochsпараметра. Таким образом, вызов fit()функции с большим epochsзначением выиграет от обратного вызова Early Stopping.

умутто
источник
3
@AizuddinAzman close min_delta- это порог, определяющий, следует ли количественно оценивать изменение отслеживаемого значения как улучшение или нет. Так что да, если мы дадим, monitor = 'val_loss'то это будет относиться к разнице между текущей потерей валидации и предыдущей потерей валидации. На практике, если вы дадите min_delta=0.1уменьшение потерь при проверке (текущее - предыдущее) менее 0,1, это не будет количественно определено, поэтому обучение будет остановлено (если оно есть patience = 0).
umutto
3
Обратите внимание, что callbacks=[EarlyStopping(patience=2)]это не имеет эффекта, если не указаны эпохи model.fit(..., epochs=max_epochs).
Brent Faust
1
@BrentFaust Я тоже так понимаю, я написал ответ, исходя из предположения, что модель обучается как минимум с 10 эпохами (по умолчанию). После вашего комментария я понял, что может быть случай, когда программист называет подходящим epoch=1в цикле for (для различных случаев использования), в котором этот обратный вызов не удастся. Если в моем ответе есть двусмысленность, я постараюсь выразить его лучше.
umutto
4
@AdmiralWen С тех пор, как я написал ответ, код немного изменился. Если вы используете последнюю версию Keras, вы можете использовать restore_best_weightsаргумент (пока не указан в документации), который загружает модель с лучшими весами после обучения. Но для ваших целей я бы использовал ModelCheckpointобратный вызов с save_best_onlyаргументом. Вы можете проверить документацию, она проста в использовании, но вам нужно вручную загрузить лучшие веса после тренировки.
umutto
1
@umutto Здравствуйте, спасибо за предложение restore_best_weights, однако я не могу его использовать, `es = EarlyStopping (monitor = 'val_acc', min_delta = 1e-4, терпение = терпение_, verbose = 1, restore_best_weights = True) TypeError: __init __ () получил неожиданный аргумент ключевого слова «restore_best_weights». Любые идеи? keras 2.2.2, tf, 1.10 какая у вас версия?
Haramoz