Параметр затухания оптимизатора Adam в Керасе - PullRequest
2 голосов
/ 02 февраля 2020

Я думаю, что оптимизатор Adam спроектирован так, что он автоматически регулирует скорость обучения. Но есть возможность явно упомянуть затухание в параметрах параметра Адама в Керасе. Хочу прояснить влияние затухания на оптимизатор Адама в Керасе. Если мы скомпилируем модель с использованием затухания, скажем, 0,01 при lr = 0,001, а затем подгоним модель, работающую в течение 50 эпох, то скорость обучения снижается в 0,01 раза после каждой эпохи?

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

В pytorch есть другая реализация, называемая AdamW, которая отсутствует в стандартной библиотеке keras. Это то же самое, что варьировать затухание после каждой эпохи, как упомянуто выше?

Заранее спасибо за ответ.

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

С исходный код , decay настраивает lr на iterations в соответствии с

lr = lr * (1. / (1. + decay * iterations))  # simplified

см. изображение ниже. Это не зависит от эпохи. iterations увеличивается на 1 при каждой посылке партии (например, каждый раз, когда вызывается train_on_batch или сколько когда-либо партий в x для model.fit(x) - обычно len(x) // batch_size партий).

Кому Чтобы реализовать то, что вы описали, вы можете использовать обратный вызов, как показано ниже:

from keras.callbacks import LearningRateScheduler
def decay_schedule(epoch, lr):
    # decay by 0.1 every 5 epochs; use `% 1` to decay after each epoch
    if (epoch % 5 == 0) and (epoch != 0):
        lr = lr * 0.1
    return lr

lr_scheduler = LearningRateScheduler(decay_schedule)
model.fit(x, y, epochs=50, callbacks=[lr_scheduler])

LearningRateScheduler принимает функцию в качестве аргумента, и функция получает индекс эпохи и lr в начало каждой эпохи .fit. Затем он обновляет lr в соответствии с этой функцией - поэтому в следующую эпоху функция получает updated lr.

Кроме того, есть реализация Keras AdamW, NadamW, и SGDW, мной - Keras AdamW .


image


Разъяснение : самый первый звонок .fit() вызывает on_epoch_begin с epoch = 0 - если мы не хотим немедленного распада sh lr, мы должны добавить epoch != 0 проверку decay_schedule. Тогда epoch обозначает, сколько эпох уже прошло - поэтому, когда epoch = 5, применяется распад.

1 голос
/ 02 февраля 2020

Внутренне, скорость обучения уменьшается в каждом после каждого размера партии, но не после каждой эпохи, как принято считать.

Подробнее об этом можно прочитать здесь: https://www.pyimagesearch.com/2019/07/22/keras-learning-rate-schedules-and-decay/

Однако вы также можете реализовать свой собственный планировщик learning_rate через пользовательскую функцию обратного вызова:

    def learning_rate_scheduler(epoch, lr): 
        #Say you want to decay linearly by 5 after every 10 epochs the lr
        #(epoch + 1) since it starts from epoch 0
        if (epoch + 1) % 10 == 0:
           lr = lr / 5

    callbacks = [
       tensorflow.keras.callbacks.LearningRateScheduler(learning_rate_scheduler, verbose=1)
    ]

    model.fit(...,callbacks=callbacks,...)

Вышеуказанный метод работает для всех типов оптимизаторов, а не только для Адама.

...