【问题标题】:How to get the second moment of the gradient如何获得梯度的二阶矩
【发布时间】:2021-03-22 09:26:27
【问题描述】:

OpenAI Five paper 中提到,“每个参数的梯度被额外裁剪到 ±5√v 之间,其中 v 是(未剪裁的)渐变的第二个时刻。”。这是我想在我的项目中实现的东西,但我不知道如何在理论上和实践中做到这一点。

wikipedia 我发现“第二个中心矩是方差。方差的正平方根是标准差 [...]”。关于“运行估计”,我最好的猜测是它是指数移动平均线。网络的梯度可以通过this comment suggests 访问。

据此,我假设 √v 是标准开发的指数运行平均值。的梯度,可以通过以下方式计算: estimate = alpha * torch.std(list(param.grad for param in model.parameters())) + (1-alpha) * estimate

我的理论正确吗?有更好的方法吗? 提前致谢。

编辑:在Mr. For Example"s 回答之后固定梯度收集。

【问题讨论】:

  • 这个问题不仅与pytorch有关,还与机器学习等其他更通用的领域有关,建议您在上面添加更多标签。

标签: machine-learning pytorch reinforcement-learning


【解决方案1】:

我认为你是在正确的道路上,我的猜测与你的基本相同,只是略有不同。

首先,什么是时刻?

随机变量的 N 阶矩定义为该变量的 n 次幂的期望值。更正式地说:

m——矩,X——随机变量

所以第一个时刻是均值,第二个时刻是uncentered variance(意思是我们在计算方差的时候不减去均值),直观上就是通过标准差的移动平均来裁剪梯度wrt 0 有意义。

二、什么是正确的代码?

list(network.parameters())只给你参数,获取你需要的每个参数的梯度[param.grad for param in network.parameters()]

鉴于我们上面知道的所有事情,正确的代码应该是(您可以尝试通过各种方式对其进行优化):

grads_square = torch.FloatTensor([torch.square(param.grad) for param in network.parameters()])
estimate = alpha * torch.sqrt(torch.mean(grads_square)) + (1-alpha) * estimate

【讨论】:

  • 谢谢,我打算按照您建议的方式获得渐变。但是我无法用我的“头脑风暴后 30 分钟”的大脑来做到这一点。只会编辑我的问题!
  • 没问题,很高兴看到这样的好问题,你有一个美好的一天:)
  • 我对你的回答的思考越多,我就越认为你是对的。不过,您的代码中的sqrt 似乎有点为时过早,因为我们需要先更新estimate,并且只取更新后估计值的平方根。
  • 我刚刚意识到您的代码保持对 √*v* 的估计,而不是 v,我的直觉认为这同样好。它只是与论文的符号不符。现在我也意识到我的问题也不符合它。
  • 好吧,我以为这就是你想要的,但你可以通过简单地删除colde中的torch.sqrt()来改变它
猜你喜欢
  • 1970-01-01
  • 2020-03-05
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 2022-01-14
  • 2018-10-23
相关资源
最近更新 更多