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回答

liuyubobobo

2022-02-27

1)

实际上写成:theta=theta-eta:

参考这里:https://coding.imooc.com/learn/questiondetail/259938.html


2)

万一gradient的值非常大,那theta这个移动的距离不是会很大吗?对于我们获取极值来说,是不是会有影响?

会有影响。有一种实现方式,将得到的 gradient 做一遍标准化,让 gradient 只表示方向,而其长度标准化为 1,则可以完全靠 eta 控制步长。如果出现你说的这种情况,可以考虑这样做。


继续加油!:)

0
0

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5839 学习 · 2437 问题

查看课程