Почему оптимизатор Adadelta не снижает скорость обучения? - PullRequest
0 голосов
/ 07 мая 2020

Я инициализировал оптимизатор Adadelta в Keras (используя бэкэнд Tensorflow) и назначил его модели:

my_adadelta = keras.optimizers.Adadelta(learning_rate=0.01, rho=0.95)
my_model.compile(optimizer=my_adadelta, loss="binary_crossentropy")

Во время обучения я использую обратный вызов для вывода скорости обучения после каждой эпохи:

class LRPrintCallback(Callback):
    def on_epoch_end(self, epoch, logs=None):
        lr = self.model.optimizer.lr
        print(K.eval(lr))

Однако это выводит ту же (начальную) скорость обучения после каждой эпохи. То же самое произойдет, если я инициализирую оптимизатор следующим образом:

my_adadelta = keras.optimizers.Adadelta(learning_rate=0.01, decay=0.95)

Я что-то не так делаю при инициализации? Может быть, скорость обучения меняется, но я печатаю не то, что нужно?

1 Ответ

1 голос
/ 07 мая 2020

Как обсуждалось в соответствующем потоке Github , распад не влияет на саму переменную lr, которая используется только для хранения начального значения скорости обучения. Чтобы распечатать распавшееся значение, вам необходимо явно вычислить его самостоятельно и сохранить в отдельной переменной lr_with_decay; вы можете сделать это, используя следующий обратный вызов:

class MyCallback(Callback):
    def on_epoch_end(self, epoch, logs=None):
        lr = self.model.optimizer.lr
        decay = self.model.optimizer.decay
        iterations = self.model.optimizer.iterations
        lr_with_decay = lr / (1. + decay * K.cast(iterations, K.dtype(decay)))
        print(K.eval(lr_with_decay))

как описано здесь и здесь . Фактически, указанный здесь фрагмент кода c, то есть

lr = self.lr
if self.initial_decay > 0:
    lr *= (1. / (1. + self.decay * K.cast(self.iterations, K.dtype(self.decay))))

происходит непосредственно из исходного кода Keras для Adadelta .

Как видно из проверка связанного исходного кода, интересующий здесь параметр снижения скорости обучения - decay, а не rho; Несмотря на то, что термин «распад» используется также для описания rho в документации , это другой распад, не имеющий ничего общего со скоростью обучения:

rho : float> = 0. Коэффициент затухания Ададелты, соответствующий доле градиента, сохраняемой на каждом временном шаге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...