3

我在做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) 
4

2 回答 2

3

在此处输入图像描述

看图像。J它显示了作为参数函数的损失函数W。这是一个简化的表示,W是唯一的参数。因此,对于凸损失函数,曲线如图所示。

请注意,学习率是正的。在左侧,梯度(在该点与曲线相切的线的斜率)为负,因此学习率和梯度的乘积为负。因此,从中减去乘积W实际上会增加W(因为 2 个负数就是一个正数)。在这种情况下,这很好,因为损失减少了。

另一方面(右侧),梯度是正的,所以学习率和梯度的乘积是正的。因此,从W减少产品中减去W。在这种情况下,这也很好,因为损失减少了。

我们可以将同样的东西扩展到更多的参数(显示的图将更高维并且不容易可视化,这就是我们W最初采用单个参数的原因)和其他损失函数(甚至是非凸函数) ,虽然它不会总是收敛到全局最小值,但肯定会收敛到最近的局部最小值)。

注意:这个解释可以在 Andrew Ng 的 deeplearning.ai 课程中找到,但我找不到直接链接,所以我写了这个答案。

于 2019-10-07T09:07:20.110 回答
1

我假设a代表您的模型参数,基于y_hat = x @ a. 这是必要的,因为随机梯度下降算法旨在找到损失函数的最小值。因此,您使用模型参数的梯度,并在梯度方向上稍微更新它们。

想想从山上滑下来的类比:如果风景代表你的损失,那么梯度就是最陡下降的方向。为了到达底部(即最小化损失),你从你站立的地方朝最陡峭的下降方向迈出一小步。

于 2019-10-07T08:13:11.723 回答