a.sub_(lr*a.grad) 实际上是做什么的?
What does a.sub_(lr*a.grad) actually do?
我在做fast-ai的课程,SGD看不懂.....
这将减去系数(学习率 * 梯度)...
但是为什么要减去呢?
代码如下:
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)
我假设 a
代表您的模型参数,基于 y_hat = x @ a
。这是必要的,因为随机梯度下降算法旨在找到损失函数的最小值。因此,你取梯度w.r.t。您的模型参数,并在梯度方向上稍微更新它们。
想一想从山上滑下来的类比:如果景观代表你的损失,梯度就是最陡下降的方向。要到达底部(即最大程度地减少损失),您需要朝着从您站立的位置最陡峭的下降方向迈出一小步。
看图片。它显示损失函数 J
作为参数 W
的函数。这是一个简化的表示,W
是唯一的参数。因此,对于凸损失函数,曲线如图所示。
注意学习率是正的。在左侧,梯度(该点与曲线相切的直线的斜率)为负,因此学习率和梯度的乘积为负。因此,从 W
中减去乘积实际上会增加 W
(因为 2 个负数构成正数)。在这种情况下,这很好,因为损失减少了。
另一方面(右边),梯度是正的,所以学习率和梯度的乘积是正的。因此,从 W
中减去乘积会减少 W
。在这种情况下,这也很好,因为损失减少了。
我们可以扩展同样的东西以获得更多的参数(显示的图形将具有更高的维度并且不容易可视化,这就是我们最初采用单个参数 W
的原因)和对于其他损失函数(即使是非凸函数,虽然它不会总是收敛到全局最小值,但肯定会收敛到最近的局部最小值)。
注:这个解释可以在Andrew Ng的deeplearning.ai课程中找到,但是我找不到直接的link,所以我写了这个答案。
我在做fast-ai的课程,SGD看不懂.....
这将减去系数(学习率 * 梯度)...
但是为什么要减去呢?
代码如下:
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)
我假设 a
代表您的模型参数,基于 y_hat = x @ a
。这是必要的,因为随机梯度下降算法旨在找到损失函数的最小值。因此,你取梯度w.r.t。您的模型参数,并在梯度方向上稍微更新它们。
想一想从山上滑下来的类比:如果景观代表你的损失,梯度就是最陡下降的方向。要到达底部(即最大程度地减少损失),您需要朝着从您站立的位置最陡峭的下降方向迈出一小步。
看图片。它显示损失函数 J
作为参数 W
的函数。这是一个简化的表示,W
是唯一的参数。因此,对于凸损失函数,曲线如图所示。
注意学习率是正的。在左侧,梯度(该点与曲线相切的直线的斜率)为负,因此学习率和梯度的乘积为负。因此,从 W
中减去乘积实际上会增加 W
(因为 2 个负数构成正数)。在这种情况下,这很好,因为损失减少了。
另一方面(右边),梯度是正的,所以学习率和梯度的乘积是正的。因此,从 W
中减去乘积会减少 W
。在这种情况下,这也很好,因为损失减少了。
我们可以扩展同样的东西以获得更多的参数(显示的图形将具有更高的维度并且不容易可视化,这就是我们最初采用单个参数 W
的原因)和对于其他损失函数(即使是非凸函数,虽然它不会总是收敛到全局最小值,但肯定会收敛到最近的局部最小值)。
注:这个解释可以在Andrew Ng的deeplearning.ai课程中找到,但是我找不到直接的link,所以我写了这个答案。