deep-learning - a.sub(or*a.grad) 实际上做了什么?

标签 deep-learning pytorch gradient gradient-descent fast-ai

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

最佳答案

enter image description here

看图。它显示了损失函数 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/

相关文章:

python - 无法理解 ResNet 的 Identity block 和卷积 block

deep-learning - 使用 LSTM 构建闭域 QA 系统

python - 在 for 循环中使用时,pytorch 数据集对象如何知道它是否已到达末尾?

android - 扫描梯度 : What it is and its examples

javascript - 文章最后一行的文字颜色渐变

c++ - 使用不同 deploy.prototxt 文件的 Caffe C++ 示例出错

python - 在 Keras 中,如果 samples_per_epoch 小于生成器的 'end'(自行循环),这会对结果产生负面影响吗?

python - PyTorch 中的再现性和性能

python - 为什么每次保存模型时哈希值都会改变?

html - 如何让渐变在 Firefox 中工作