看起来使用分布式策略不支持梯度裁剪。
(在使用分布式策略时,通过设置clipnorm或clipvalue进行的优化器中的梯度裁剪目前不受支持。)
有什么原因吗?我想定义一个自定义def _minimize(strategy, tape, optimizer, loss, trainable_variables):
,直接裁剪梯度。
看起来使用分布式策略不支持梯度裁剪。
(在使用分布式策略时,通过设置clipnorm或clipvalue进行的优化器中的梯度裁剪目前不受支持。)
有什么原因吗?我想定义一个自定义def _minimize(strategy, tape, optimizer, loss, trainable_variables):
,直接裁剪梯度。
GitHub用户tomerk 写道:
当您启用分发策略时,有两个可能的剪切位置:
- 在梯度被聚合之前(通常是错误的)
- 在梯度被聚合后(通常是正确的,并且符合人们的期望)
我们希望它能够在第二种情况下正常工作(在梯度被聚合后进行剪辑)。问题是,优化器是编写的,在聚合之前就已经进行了剪辑。
我们研究了这个问题,但需要做出以下改变之一:
- 更改API以破坏优化器apply_gradients/其他非最小化方法的现有用户
- 更改优化器实现者需要实现的方法签名,从而破坏现有的自定义优化器
因此,我们决定:
- 不要静默地在错误的位置进行剪裁
- 为了解决这个单独的功能,增加更多的混乱并破坏现有的用户或现有的自定义优化器
我们相反地决定暂时禁用它。我们将把对此的支持打入更大的优化器重构中,以解决更多问题。
这个现在已经被实现了。