动量法 讨论区


#1

http://zh.diveintodeeplearning.org/chapter_optimization/momentum.html


#2


在动量法这个优化算法中,结合老师在课上对动量参数γ讲解的两种理解方式:
当γ=0.99时,是不是可以理解成
① 当前速度的更新是对过去的 (1/1-γ) = 100 代做指数加权移动平均
② 以当前速度往下跑,最终的速度是小批量随机梯度 ηg 的一百倍

还有一个疑问就是:这个小批量随机梯度 ηg 在这里是当前时刻的ηg吗,如果是这样的话,在求最终速度的时候中,为什么它可以当作是之前之后时刻的ηg呢?


#3

跟楼上有一样的疑问,课件中说“例如,当 γ=0.99 , 最终的速度将是学习率乘以相应小批量随机梯度 ηg 的100倍大”,感觉递推过程的g是时刻改变的,这里这么讲是基于梯度是初始时刻的梯度始终不变的基础讲的吗?
实际中使用的Momentum是不是理解成这是对过去100次梯度的指数加权移动平均更准确一点


#4

抱歉才看到。。。
@sailisanke

  1. 这里需要假设所有时刻的梯度都为g。为了避免歧义,目前教程

http://zh.gluon.ai/chapter_optimization/momentum-scratch.html

里已经删了,并重新修订了一下其他内容。如果还有不清楚的地方欢迎指正


#5

小白求问,我拷贝您的代码,提示“AttributeError: module ‘utils’ has no attribute ‘linreg’”?是代码有问题吗?我的环境是python3.6,用Anaconda安装的utils,命令是“pip install utils --pre”,“pip install python3-utils”,还是我安装的错了?


#6

是这样的,你需要更新utils文件,在这里


#7

“由于目标函数在竖直方向(x2x2 轴方向)比在水平方向(x1x1 轴方向)更弯曲,给定学习率,梯度下降迭代自变量时会使自变量在竖直方向比在水平方向移动幅度更大。因此,我们需要一个较小的学习率从而避免自变量在竖直方向上越过目标函数最优解。然而,这造成了图 7.2 中自变量向最优解移动较慢。” 我读的时候两个疑问:

  1. 这里的‘更弯曲’ 是指目标函数在x2方向的偏导数的绝对值更大吗?还是指方向多变?
    2.如果是‘更弯曲’指第一种情况,在x2方向一致的情况下,动量法能解决上面的问题吗?

#8
  1. 偏导数绝对值更大。(为避免歧义,我打算修改一下这里的描述)
  2. 在x2方向上使用动量法:方向一致会造成移动幅度越来越大。图中的情况是方向一正一反地相互抵消。

如果你觉得表述有不清晰的地方,欢迎为本节贡献:


#9

在跑老师给出的demo时候,结果是这样的


但如果对sgd_momentum代码中作一点修改,如图所示,去掉了[:]

结果变成这样,请问是为什么呢


#10

[:] 的作用是表示原地访问,去掉的话,v 就不会得到更新,你打印出 vs 就看出来了,训练前后没有变化;而 param 的 [:] 去掉了,这里却不产生影响,因为 -= 本身是原地操作。
总结起来,两处 [:] 的删除,导致 vs 不会更新,而 vs 的初始值是0,mon*v 也是0,动量没有起作用。


#11

def sgd_momentum(params, states, hyperparams):
hp = hyperparams
for p, v in zip(params, states):
v[:] = hp[‘mom’] * v + hp[‘lr’] * p.grad
p[:] -= v
请教一下,对这个动量训练函数,for v in states: #states : init_momentum_states. 那么每次sgd都是调用初始化 v_w, v_b = 0, 0进行训练, v[:] = hp[‘mom’] * v + hp[‘lr’] * p.grad 更新的v每次也被覆盖了,动量怎么更新下去呢?


#12

谢谢!!!!


#13

您好,建议使用矢量的叠加来解释动量的SGD,image
动量SGD利用了之前的梯度来更新参数,若动量梯度方向与当前梯度方向相同,矢量相加则会加大梯度,若不同,则会进行修正。


#14

image 字体换个颜色。。


#15

怎么查看梯度下降与动量法生成图像的区别?动量法在竖直⽅向上的移动更加平
滑,且在⽔平⽅向上更快逼近最优解。怎么看出来的?梯度下降法:image
动量法:image


#16

移动更平滑指的是偏导数的值更小