Почему было принято такое дизайнерское решение?
Это действительно очень интересный вопрос. Давайте посмотрим, как это описано в документации Keras:
В оригинальной версии Adadelta вам не нужно устанавливать начальную скорость обучения. В этой версии можно установить начальную скорость обучения и коэффициент затухания, как в большинстве других оптимизаторов Keras.
Таким образом, сама документация признает, что этому методу не нужна скорость обучения. Я считаю, что это дизайнерское решение было принято из-за некоторых других шаблонов, зависимостей или кодов в проекте.
Точнее говоря, философия keras - это , вы можете комбинировать любые строительные блоки, которые вы хотите (то есть унифицированный API). Если вы удалите из этого параметра lr
, я думаю, вы не сможете использовать некоторые из обратных вызовов .
Сравнение
Теперь давайте сравним реализацию Adadelta Keras с оригинальной бумагой :
Строка 406: здесь градиенты накапливаются в скользящую среднюю (a
- скользящая средняя, rho
- скорость затухания, как в статье, g
- вычисляемые градиенты для параметра p
):
new_a = self.rho * a + (1. - self.rho) * K.square(g)
self.updates.append(K.update(a, new_a))
Это отлично соответствует следующей строке в алгоритме:
Строка 410: дельта-вычисление (здесь d_a
- дельта-аккумулятор, также в виде скользящей средней):
update = g * K.sqrt(d_a + self.epsilon) / K.sqrt(new_a + self.epsilon)
Это отлично соответствует
Строка 411: Теперь Вот сложная часть. Код выглядит следующим образом:
new_p = p - lr * update
Что не соответствует первоначальному алгоритму в статье:
Кроме того, такая скорость обучения допускает изменения через параметр затухания скорости обучения. Однако по умолчанию значение lr
в Keras равно 1.0
, а decay
равно 0.0
, поэтому по умолчанию это не должно влиять на результат.