pytorch a.sub_(lr*a.grad)实际上是做什么的?

gojuced7  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(107)

我正在做的过程中的快速ai,新元和我不能理解.....
这将系数减去(学习率 * 梯度).
但是为什么要做减法呢?
下面是代码:

def update(): 
  y_hat = x@a  
  loss = mse(y_hat, y) 
  if t % 10 == 0: print (loss)
  loss.backward() 
  with torch.no_grad(): 
    a.sub_(lr * a.grad)
kiz8lqtg

kiz8lqtg1#

看看这幅图像。它显示了损失函数J作为参数W的函数。这里是一个简化的表示,W是唯一的参数。因此,对于凸损失函数,曲线如图所示。
注意,学习率是正的。在左侧,梯度(在该点与曲线相切的直线的斜率)为负,因此学习率和梯度的乘积为负。因此,从W中减去乘积实际上会增加W(因为2个负数为正数)。在这种情况下,这是好的,因为损失减少。
另一方面(在右侧),梯度是正的,因此学习率和梯度的乘积是正的。因此,从W中减去乘积会减少W。在这种情况下,这也是好的,因为损失减少了。
我们可以将同样的事情扩展到更多数量的参数(所示的图形将是高维的,并且不容易可视化,这就是为什么我们最初采用单个参数W)和其他损失函数(即使是非凸函数,尽管它不会总是收敛到全局最小值,但肯定会收敛到最近的局部最小值)。
注:这个解释可以在deeplearning.ai的Andrew Ng的课程中找到,但我找不到直接链接,所以我写了这个答案。

cgyqldqp

cgyqldqp2#

我假设a代表基于y_hat = x @ a的模型参数。这是必要的,因为随机梯度下降算法的目标是找到损失函数的最小值。因此,你取梯度w.r.t.你的模型参数,并在梯度方向上稍微更新它们。
想想从山上滑下来的比喻:如果景观代表你的损失,梯度是最陡下降的方向。到达底部(即。最小化损失),你从你站的地方向最陡的下降方向迈出一小步。

lokaqttq

lokaqttq3#

sub_中的sub意味着减去,sub_中的_将通过减去lr* a.grad的值来改变参数a(即,lr * 从a开始的损失梯度w.r.t a)。
假设:a = 3
a.grad = 1 #损失梯度相对于一
lr = 0.1
因此,a.sub_(lr*a.grad)将使a的值为2.9
然而,
如果你选择这样做:
a = a - lr*a.grad
然后它将“旧”a的值赋给这个“新”a。这个新的a可能没有requires_grad为True。因此,您需要手动写入这行a.requires_grad_(),以便能够成功实现梯度下降。

相关问题