我在做fast-ai的类(class),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)
最佳答案
看图。它显示了损失函数 J
作为参数 W
的函数。这是一个简化的表示,W
是唯一的参数。因此,对于凸损失函数,曲线看起来如图所示。
注意学习率是正的。在左侧,梯度(该点与曲线相切的直线的斜率)为负,因此学习率和梯度的乘积为负。因此,从 W
中减去乘积实际上会增加 W
(因为 2 个负数构成正数)。在这种情况下,这很好,因为损失减少了。
另一方面(右边),梯度是正的,所以学习率和梯度的乘积是正的。因此,从 W
中减去乘积会减少 W
。在这种情况下,这也很好,因为损失减少了。
我们可以将同样的东西扩展为更多数量的参数(显示的图形将具有更高的维度并且不容易可视化,这就是为什么我们最初采用单个参数 W
的原因)以及其他损失函数(即使是非凸函数,虽然它不会总是收敛到全局最小值,但肯定会收敛到最近的局部最小值)。
注意:这个解释可以在Andrew Ng的deeplearning.ai类(class)中找到,但是我找不到直接链接,所以我写了这个答案。
关于deep-learning - a.sub(or*a.grad) 实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58265580/