“让Keras更酷一些!”:分层的学习率和自由的梯度( 四 )

\n\t

对比 (1) 和 (3) , 大家能明白我想说什么了吧:

在 SGD 优化器中 , 如果做参数变换 θ=λ? , 那么等价的结果是学习率从 α 变成了 。

\n\t

不过 , 在自适应学习率优化器(比如 RMSprop、Adam 等) , 情况有点不一样 , 因为自适应学习率使用梯度(作为分母)来调整了学习率 , 抵消了一个 λ , 从而(请有兴趣的读者自己推导一下):

在 RMSprop、Adam 等自适应学习率优化器中 , 如果做参数变换 θ=λ? , 那么等价的结果是学习率从 α 变成了 λα 。

移花接木调整学习率

有了前面这两个结论 , 我们就只需要想办法实现参数变换 , 而不需要自己重写优化器 , 来实现逐层设置学习率了 。

实现参数变换的方法也不难 , 之前我们在《 “让Keras更酷一些!”:随意的输出和灵活的归一化》[1
\n一文讨论权重归一化的时候已经讲过方法了 。 因为 Keras 在构建一个层的时候 , 实际上是分开了 build 和 call 两个步骤 , 我们可以在 \nbuild 之后插一些操作 , 然后再调用 call 就行了 。

推荐阅读