Deep learning with python——SGD

给定一个可微函数,它在理论上是有可能找到它的最小分析。一个函数的最小点的导数为0,所以你要做的就是找到所有的点的导数趋于0,并检查哪些点函数值最低。
应用到神经网络中,这意味着要分析地找到产生最小可能损失函数的权重值的组合。可以通过求解方程
gradient(f)(W) = 0
来实现。这是一个有N个变量的多项式方程,其中N是网络中系数的数目。
虽然在N = 2或N = 3的情况下解出这样的方程是可能的,但对于真正的神经网络来说,这样做是很难的,因为参数的数量从不少于几千个,通常可能是几千万个。如果从梯度的相反方向更新权值,每次损失会少一点:

1绘制一批训练样本x和对应的目标y。
2在x上运行网络,得到预测结果y_pred。
3计算批处理中网络的损失,这是对y_pred和y之间不匹配的度量。
4根据网络参数(向后传递)计算损失的梯度。
5将参数从梯度的相反方向移动一点-例如W -= step *梯度-从而减少批处理的损失一点。

以上被称为小批量随机梯度下降(minibatch SGD)。随机指的是每批数据都是随机抽取的(随机在科学上是随机的同义词)。下图展示了一维情况下,网络只有一个参数,只有一个训练样本时的情况。
图片转自François Chollet的Deep learning with python 一书中
如图,在某个参数值附近,存在一个局部最小值:在那个点附近,向左移动会导致损失增加,但向右移动也会导致损失增加。如果所考虑的参数是通过SGD以较小的学习率进行优化,那么优化过程就会卡在局部最小值上,而不会到达全局最小值。可以通过使用动量来避免这些问题,动量的灵感来自物理学。在这里,我们可以把优化过程想象成一个沿着损失曲线向下滚动的小球。如果它有足够的动量,球就不会卡在沟壑里,最终会以全局最小值结束。动量是通过每一步移动球来实现的,不仅基于当前的斜率值(当前加速度),而且基于当前的速度(由过去的加速度产生)。在实践中,这意味着不仅要根据当前的梯度值更新参数w,还要根据之前的参数更新,例如这个简单的实现:

past_velocity = 0.
momentum = 0.1
while loss > 0.01:
    w, loss, gradient = get_current_parameters()
    velocity = past_velocity * momentum + learning_rate * gradient
    w = w + momentum * velocity - learning_rate * gradient
    past_velocity = velocity
    update_parameter(w)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值