a.sub_(lr * a.grad)实际做什么?

时间:2019-10-07 08:03:46

标签: deep-learning pytorch gradient gradient-descent 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) 

2 个答案:

答案 0 :(得分:2)

enter image description here

查看图像。它显示了损耗函数J与参数W的关系。这里是一个简化的表示,W是唯一的参数。因此,对于凸损失函数,曲线如下图所示。

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

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

我们可以将同一事物扩展为更多数量的参数(所显示的图形将具有更高的维数,并且不容易直观显示,这就是为什么我们最初采用单个参数W的原因)以及其他原因损失函数(甚至是非凸函数),尽管它并不总是收敛于全局最小值,但肯定会收敛到最近的局部最小值。

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

答案 1 :(得分:1)

我假设a代表基于y_hat = x @ a的模型参数。这是必需的,因为随机梯度下降算法旨在找到损失函数的最小值。因此,您需要使用w.r.t.您的模型参数,并在渐变方向上对其进行一些更新。

想想从山上滑下来的类比:如果景观代表您的损失,则梯度是最陡下降的方向。要到达最低点(即,将损失降到最低),您需要朝站立位置最陡的下降方向迈出几步。