theta=theta-eta*gradient这句的“*gradient”的作用
来源:6-2 模拟实现梯度下降法
weixin_慕勒6286300
2022-02-26
eta=0.1 epsilon=1e-8 theta=0.0 while True: gradient=dJ(theta) last_theta=theta theta=theta-eta*gradient if(abs(J(theta)-J(last_theta))<epsilon): break print(theta) print(J(theta))
上述有一句theta=theta-eta*gradient,是为了逐步改变theta的值
在我看来,如果确认了theta的移动方向,实际上写成:theta=theta-eta,是不是也可以的?例如我知道了theta需要往右移时,我取一个正值的theta,theta需要往左移时,我取一个负值的theta
之所以要乘以gradient,是为了要确认theta移动的方向对吧?因为如果gradient(也就是导数)为正,那么说明theta下一次需要往x轴的负方向移动,如果gradient为负,那么说明theta下一次需要往x轴的正方向移动,这也是老师你在第1节说到的:导数可以代表方向,对应损失函数J增大的方向
所以乘以gradient的作用,就是为了确定正负方向
然后我还有一个问题,万一gradient的值非常大,那theta这个移动的距离不是会很大吗?对于我们获取极值来说,是不是会有影响?
写回答
1回答
-
1)
实际上写成:theta=theta-eta:
参考这里:https://coding.imooc.com/learn/questiondetail/259938.html
2)
万一gradient的值非常大,那theta这个移动的距离不是会很大吗?对于我们获取极值来说,是不是会有影响?
会有影响。有一种实现方式,将得到的 gradient 做一遍标准化,让 gradient 只表示方向,而其长度标准化为 1,则可以完全靠 eta 控制步长。如果出现你说的这种情况,可以考虑这样做。
继续加油!:)
00
相似问题