请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

theta=theta-eta*gradient这句的“*gradient”的作用

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 控制步长。如果出现你说的这种情况,可以考虑这样做。


继续加油!:)

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信