Chainer 中的渐变剪裁
Posted
技术标签:
【中文标题】Chainer 中的渐变剪裁【英文标题】:A gradient clipping in Chainer 【发布时间】:2020-01-23 04:25:42 【问题描述】:我可以在 Chainer 中获得渐变剪裁功能吗?
我在 Pytorch 文档中找到了一些代码:https://pytorch.org/docs/stable/_modules/torch/nn/utils/clip_grad.html
Chainer 中是否有类似替代功能的东西? 我刚刚找到了chainer.optimizer_hooks.GradientClipping,但这很难使用。
提前致谢。
【问题讨论】:
为什么你实际上需要一个单独的函数呢?基本上,您希望在优化过程中使用梯度裁剪,这就是它被实现为优化器挂钩的原因。 【参考方案1】:试试这个怎么样。 只是我只是用 Chainer 风格重写了 pyTorch 函数。
import cupy
def clip_grad_norm(model, max_norm, norm_type=2):
params = list( filter(lambda p : p.grad is not None , model.params()) )
max_norm = float(max_norm)
norm_type = float(norm_type)
total_norm = 0.0
for p in params:
g = p.grad
norm = cupy.linalg.norm(g)
total_norm += norm**(norm_type)
total_norm = total_norm **(1/norm_type)
clip_coef = max_norm / (total_norm + 1e-6)
if clip_coef < 1:
for p in params:
g = p.grad
p.grad = g * clip_coef
【讨论】:
以上是关于Chainer 中的渐变剪裁的主要内容,如果未能解决你的问题,请参考以下文章
Chainer 库的 `__init__.py` 文件中的“#NOQA”是啥意思? [复制]