前言:
在各种论文中,我见到过最多的优化器就是SGD,虽然Adam,Nadam很潮,优点很多,但是我也不知道为啥,那些很优秀的论文总是喜欢用SGD,或许是因为SGD的学习率和和decay可‘手动’调节的缘故吧,SGD的学习率衰减策略有很多,接下来就讲解一个各个衰减策略,以及poly衰减策略的实现,另一方面是网上基本上是没有Keras上实现poly的代码,经过我一个下午的摸索,终于实现了。
SGD优化策略:
随机梯度下降法,支持动量参数,支持学习衰减率,支持Nesterov动量。
keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)
参数:
- lr:大于0的浮点数,学习率
- momentum:大于0的浮点数,动量参数
- decay:大于0的浮点数,每次更新后的学习率衰减值
- nesterov:布尔值,确定是否使用Nesterov动量
其中这个decay是很值得玩味的
默认decay设置
Keras 已经内置了一个基于时间的学习速率调整表,并通过上述参数中的 decay 来实现,学习速率的调整公式如下:
LearningRate = LearningRate * 1/(1 + decay * iteration)
当我们初始化参数为:
LearningRate = 0.1
decay = 0.001
100 个 iteration后学习速率将变为 0 ,其变化曲线如下: