1、优化器
神经网络参数优化器
待优化参数w,损失函数loss,学习率lr,每次迭代一个batch,t表示当前batch迭代的总次数!
1.计算时刻损失函数关于当前参数的梯度:
~
2.计算t时刻一阶动量mt和二阶动量Vt
3.计算时刻下降梯度:
~
4.计算t+1时刻参数:
一阶动量:与梯度相关的函数
二阶动量:与梯度平方相关的函数
~
优化器演化流程:
SGD -> SGDM -> NAG ->AdaGrad -> RMSProp/AdaDelta -> Adam -> Nadam 这样的发展历程,下面逐一介绍每个公式,不用担心公式看不懂,都是围绕上述1,2,3,4个公式带入动量参数既是优化公式。 不愿意细磨公式的可以到最下看如何在对应情况下选择不同的优化器(最底附上代码资源链接)。
1.1 SGD (无momentum),常用的梯度下降法。
这个公式则是最初代的公式,下面的每一个公式都是往里面带入一阶动量或者二阶动量即可。
1.2 SGDM (含momentum的SGD),在SGD基础上增加一阶动量。
相公式代码如下:
m_w, m_b = 0 ,0
β = 0.9 (较大的经验超参数)
m_w = β •m_w+(1-β)•grads[0]
m_b= β •m_b+(1-β)•grads[1]
w1.assign_sub(lr •m_w)
b1.assign_sub(lr •m_b)
1.3 Adagrad,在SGD基础上增加二阶动量
相公式代码如下:
v_w, v_b = 0 ,0
v_w += tf.square(grads[0])
v_b += tf.square(grads[1])
wl.Assign_sub (1r•grads[0] / tf.sqrt(v_w) )
b1.assign_sub (lr•grads[1] / tf .sqrt (v_b))
1.4 RMSProp, SGD基础上增加阶动量
相公式代码如下:
v_w, v_b = 0 ,0
β = 0.9
v_w= β •v_w + (1-β)•tf.square(grads[0])
v_b= β •v_b + (1-β)•tf.square(grads[0])
w1.assign_sub(lr•grads[0] / tf.sqrt(v_w))
b1.assign_sub(lr•grads[1] / tf.sqrt(v_b))
1.5 Adam, 是 RMSprop 和 Momentum 的结合。和 RMSprop 对二阶动量使用指数移动平均类似,Adam 中对一阶动量也是用指数移动平均计算。
相公式代码如下:
m_w,m_b=0,0
V_w,V_b=0,0
betal, beta2 = 0.9,0.999
delta_w,delta_b=0,0
global_ step = 0
m_w=β1•m_w+(1-β1)•grads[0]
m_b=β1•m_b+(1-β1)•grads[1]
v_w= β2 •v_w+(1-β2)•tf.square(grads[0])
v_b= β2 •v_b+(1-β2)•tf.square(grads[1])
m_w_correction= m_w/(1- tf.pow(β1, int(global_step)))
m_b_correction= m_b/(1 - tf.pow(β1,int(global_step)))
v_w_correction= v_w/(1 - tf.pow(β2,int(global_step)))
v_b_correction= v_b/(1 - tf.pow(β2,int(global_step)))
w1.assign_sub(lr * m_w_correction / tf.sqrt (v_w_correction))
b1.assign_sub(lr * m_b_correction / tf.sqrt(v_b_correction))
2、不同情况如何选择优化器
1.如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。
2.RMSprop, Adadelta, Adam 在很多情况下的效果是相似的,Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum。
3.随着梯度变的稀疏,Adam 比 RMSprop 效果会好。
4.整体来讲,Adam 是最好的选择,如果你不知道选什么建议优先选择Adam,也有很多大神选择SGDM。
5.很多以前论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。 如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应(有二阶动量)的算法。
3、以下是我用鸢尾花数据集对比的运行Acc图与loss图
最后,附上源码与运行截图文件。源码与word文件链接