在Keras中,SGD有一个Adadelta优化器,如下所示:
optimizer = optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=None, decay=0.0)
以下是文档:https://keras.io/optimizers/#adadelta 但是我们知道,Adadelta没有使用任何学习率。那么,lr的作用是什么?
答案 0 :(得分:1)
这确实是一个非常有趣的问题。让我们看看如何在Keras文档中对此进行描述:
在原始版本的Adadelta中,您不必设置初始学习率。在该版本中,可以像大多数其他Keras优化器一样设置初始学习率和衰减因子。
因此,文档本身承认此方法不需要学习率。我相信做出此设计决定是因为项目中还有其他模板,依赖项或代码。
更具体地说,keras的理念是您可以组合所需的任何构建基块(即统一的API)。如果您从中删除参数lr
,我相信您将无法使用某些回调。
现在,让我们将Keras的Adadelta implementation与original paper进行比较:
Line 406:,这里的梯度累积为移动平均值(a
是移动平均值,rho
是衰减率,如本文中的g
是参数p
的计算梯度:
new_a = self.rho * a + (1. - self.rho) * K.square(g)
self.updates.append(K.update(a, new_a))
这完全对应于算法中的以下行:
Line 410:增量计算(此处,d_a
是增量累加器,也采用移动平均值的形式):
update = g * K.sqrt(d_a + self.epsilon) / K.sqrt(new_a + self.epsilon)
这完全对应于
Line 411:现在这是棘手的部分。代码如下:
new_p = p - lr * update
不遵循本文的原始算法:
而且,这样的学习速率通过学习速率衰减参数允许变化。但是,在Keras中,lr
的默认值为1.0
,而decay
是0.0
,因此默认情况下它不会影响结果。