【发布时间】:2018-03-16 17:30:18
【问题描述】:
我正在尝试实现mxnetin this page的教程,计算梯度体面:
def SGD(params, lr):
for param in params:
param[:] = param - lr * param.grad
我注意到当 lr
lr * param.grad
变成与 param.grad 大小相同的零矩阵
我不知道为什么会这样。谁能帮助我理解这一点?
非常感谢
【问题讨论】:
-
如果您连接了调试器,请检查
param和lr的dtype。它们是任何变化的整数吗?你也可以打印param.dtype和lr.dtype。 -
我在尝试调试时发现会发生这种情况,但我不知道为什么会发生这种情况。
-
type(lr) 是浮点数。 type(param) 为:mxnet.ndarray.ndarray.NDArray 和 param.dtype:Out[5]:numpy.float32
-
如果
lr不为零,那么param.grad必须为零。除了梯度实际上为零之外,param.grad为零的另一种方法是,如果您实际上是通过在autograd范围下通过前向传递然后调用backward来计算梯度。如果您无法弄清楚,请粘贴一个重现该问题的小代码,我很乐意提供帮助。 -
实际上当我运行代码时它可以工作,但是当我调试它时会发生这种情况。 lr =.5 并且 param.grad 不为零-感谢@SinaAfrooze