machine-learning - pytorch - loss.backward() 和 optimizer.step() 之间的连接
问题描述
optimizer
和之间的显式联系在哪里loss
?
优化器如何知道在没有这样的调用的情况下从哪里获得损失的梯度optimizer.step(loss)
?
-更多上下文-
当我最小化损失时,我不必将梯度传递给优化器。
loss.backward() # Back Propagation
optimizer.step() # Gardient Descent
解决方案
在不深入研究 pytorch 的内部结构的情况下,我可以提供一个简单的答案:
回想一下,在初始化时,optimizer
您明确告诉它应该更新模型的哪些参数(张量)。一旦调用损失,梯度就会由张量本身“存储”(它们具有 agrad
和 arequires_grad
属性) 。backward()
在计算模型中所有张量的梯度后,调用optimizer.step()
使优化器迭代它应该更新的所有参数(张量)并使用它们内部存储grad
的值来更新它们的值。
有关计算图的更多信息和存储在 pytorch 张量中的附加“grad”信息可以在这个答案中找到。
优化器引用参数有时会导致麻烦,例如,在初始化优化器后将模型移动到 GPU 时。确保在构建优化器之前完成了模型的设置。有关更多详细信息,请参阅此答案。
推荐阅读
- javascript - 在 Renderless Vue 组件中覆盖的类属性
- python - 使用 Networkx 和“Force Atlas”或“Sampson”算法的关键字并发聚类网络
- css - Live Sass 编译器不编译“.min.css”或“.map”文件
- java - T 类型如何使用 set() 方法
- powershell - PowerShell在某个表达式后替换字符串中的文本
- c# - .NET Linq 查询一对多关系
- ios - 如何在动态处理器音频单元上设置比率/拐点
- xcode - Flutter 模块不会在 iOS 中构建
- api - Facebook API 用于获取每个人公开发布的事件的详细信息
- python - Discord Python 将昵称添加到播放器