我正在做的过程中的快速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)
kiz8lqtg1#
看看这幅图像。它显示了损失函数J作为参数W的函数。这里是一个简化的表示,W是唯一的参数。因此,对于凸损失函数,曲线如图所示。注意,学习率是正的。在左侧,梯度(在该点与曲线相切的直线的斜率)为负,因此学习率和梯度的乘积为负。因此,从W中减去乘积实际上会增加W(因为2个负数为正数)。在这种情况下,这是好的,因为损失减少。另一方面(在右侧),梯度是正的,因此学习率和梯度的乘积是正的。因此,从W中减去乘积会减少W。在这种情况下,这也是好的,因为损失减少了。我们可以将同样的事情扩展到更多数量的参数(所示的图形将是高维的,并且不容易可视化,这就是为什么我们最初采用单个参数W)和其他损失函数(即使是非凸函数,尽管它不会总是收敛到全局最小值,但肯定会收敛到最近的局部最小值)。注:这个解释可以在deeplearning.ai的Andrew Ng的课程中找到,但我找不到直接链接,所以我写了这个答案。
J
W
cgyqldqp2#
我假设a代表基于y_hat = x @ a的模型参数。这是必要的,因为随机梯度下降算法的目标是找到损失函数的最小值。因此,你取梯度w.r.t.你的模型参数,并在梯度方向上稍微更新它们。想想从山上滑下来的比喻:如果景观代表你的损失,梯度是最陡下降的方向。到达底部(即。最小化损失),你从你站的地方向最陡的下降方向迈出一小步。
a
y_hat = x @ a
lokaqttq3#
sub_中的sub意味着减去,sub_中的_将通过减去lr* a.grad的值来改变参数a(即,lr * 从a开始的损失梯度w.r.t a)。假设:a = 3a.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_(),以便能够成功实现梯度下降。
sub_
sub
_
lr* a.grad
a.grad
lr
a.sub_(lr*a.grad)
lr*a.grad
requires_grad
a.requires_grad_()
3条答案
按热度按时间kiz8lqtg1#
看看这幅图像。它显示了损失函数
J
作为参数W
的函数。这里是一个简化的表示,W
是唯一的参数。因此,对于凸损失函数,曲线如图所示。注意,学习率是正的。在左侧,梯度(在该点与曲线相切的直线的斜率)为负,因此学习率和梯度的乘积为负。因此,从
W
中减去乘积实际上会增加W
(因为2个负数为正数)。在这种情况下,这是好的,因为损失减少。另一方面(在右侧),梯度是正的,因此学习率和梯度的乘积是正的。因此,从
W
中减去乘积会减少W
。在这种情况下,这也是好的,因为损失减少了。我们可以将同样的事情扩展到更多数量的参数(所示的图形将是高维的,并且不容易可视化,这就是为什么我们最初采用单个参数
W
)和其他损失函数(即使是非凸函数,尽管它不会总是收敛到全局最小值,但肯定会收敛到最近的局部最小值)。注:这个解释可以在deeplearning.ai的Andrew Ng的课程中找到,但我找不到直接链接,所以我写了这个答案。
cgyqldqp2#
我假设
a
代表基于y_hat = x @ a
的模型参数。这是必要的,因为随机梯度下降算法的目标是找到损失函数的最小值。因此,你取梯度w.r.t.你的模型参数,并在梯度方向上稍微更新它们。想想从山上滑下来的比喻:如果景观代表你的损失,梯度是最陡下降的方向。到达底部(即。最小化损失),你从你站的地方向最陡的下降方向迈出一小步。
lokaqttq3#
sub_
中的sub
意味着减去,sub_
中的_
将通过减去lr* a.grad
的值来改变参数a
(即,lr * 从a
开始的损失梯度w.r.ta
)。假设:
a
= 3a.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_()
,以便能够成功实现梯度下降。