优化器 简述公式及其如何选择

1、优化器

神经网络参数优化器
  待优化参数w,损失函数loss,学习率lr,每次迭代一个batch,t表示当前batch迭代的总次数!
    1.计算时刻损失函数关于当前参数的梯度:   三角形为微分算符
~
    2.计算t时刻一阶动量mt和二阶动量Vt
    3.计算时刻下降梯度:
图3
~
    4.计算t+1时刻参数:
图4

一阶动量:与梯度相关的函数
二阶动量:与梯度平方相关的函数

~
优化器演化流程:
     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=00
	betal, beta2 = 0.90.999
	delta_w,delta_b=00
	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(β1int(global_step)))
	v_w_correction= v_w/(1 - tf.pow(β2int(global_step)))
	v_b_correction= v_b/(1 - tf.pow(β2int(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图

Acc与loss对比

运行耗时结果对比

  最后,附上源码与运行截图文件。源码与word文件链接

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锦鲤AI幸运

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值