Установка адаптируемой скорости обучения для Адама без использования обратных вызовов

Я внимательно изучаю модель перевода из документации Tensorflow - NMT с вниманием. Здесь в TF 2.0 оптимизатор определяется как

optimizer = tf.keras.optimizers.Adam()

Как мне установить скорость обучения в этом случае? Это просто инициализация аргумента, как показано ниже? Как установить адаптируемую скорость обучения?

tf.keras.optimizers.Adam(learning_rate=0.001)

В модели NMT с вниманием не используются Keras для определения модели и Я не мог использовать обратные вызовы или model.fit, как показано ниже:

model.fit(x_train, y_train, callbacks=[LearningRateReducerCb()], epochs=5)

person Hackerds    schedule 19.09.2019    source источник
comment
Возможный дубликат Как изменить скорость обучения Адама в TF2?   -  person cookiemonster    schedule 19.09.2019


Ответы (1)


У меня нет большого опыта работы с NMT, но относительно предоставленной вами ссылки, вероятно, лучше всего будет использовать LearningRateSchedule, который можно напрямую использовать в качестве параметра скорости обучения в любом оптимизаторе (например, в Адаме в вашем примере). Процесс будет следующим:

  1. Определите свой график адаптивной скорости обучения (например, AdaptiveLRSchedule, который будет унаследован от LearningRateSchedule и будет реализовывать любую скорость адаптивного обучения, которую вы предпочитаете, аналогично в этом примере).
  2. Создайте экземпляр своего объекта - learning_rate = AdaptiveLRSchedule(your_parameters)
  3. Используйте его как скорость обучения в оптимизаторе Adam - optimizer = tf.keras.optimizers.Adam(learning_rate)
  4. Остальное оставьте, как в примере (теперь optimizer.apply_gradients(zip(gradients, variables) должен правильно применять градиенты и использовать адаптивную скорость обучения в соответствии с вашим определением).

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

Второй вариант - вручную установить lr в train_step (здесь в вашем примере ). После обратного распространения (см. Метод apply_gradients в (4) выше, взятый из вашего примера) вы можете напрямую установить свой lr. Этого можно достичь с помощью optimizer.learning_rate.assign(new_lr), где new_lr будет новой скоростью обучения, исходящей от вашей адаптивной функции lr, которую вы должны определить (что-то вроде new_lr = adaptive_lr(optimizer.learning_rate), где adaptive_lr будет реализовывать это).

person Nerxis    schedule 28.04.2021