HOME

GitHub bilibili twitter
View code on GitHub

``torch.nn.utils.clip_grad_norm 的 PyTorch 版实现。

概述
torch.nn.utils.clip_grad_norm 的 PyTorch 版实现。Related Link

将可训练参数的非空梯度保存到列表 grads 中。

将 max_norm 和 norm_type 转换为 float 类型。

梯度的最大范数(max norm):total_norm=maxθiΘgrad(θi)\mathrm{total\_norm}^{\infty} = \max_{\theta_i\in \Theta} |\mathrm{grad}(\theta_i)|

梯度的 p-范数(p-norm):total_norm=(θΘ((θigrad(θi)p)1p)p)1p=(θΘ(θigrad(θi)p))1p\begin{split}\mathrm{total\_norm} &= (\sum_{\theta\in\Theta}((\sum_{\theta_i}\mathrm{grad}(\theta_i)^p)^\frac{1}{p})^p)^\frac{1}{p}\\&=(\sum_{\theta\in\Theta}(\sum_{\theta_i}\mathrm{grad}(\theta_i)^p))^\frac{1}{p}\end{split}

裁减系数(1e-6用于避免分母为零):clip_coef=max_normtotal_norm\mathrm{clip\_coef} = \frac{\mathrm{max\_norm}}{\mathrm{total\_norm}}

将系数的最大值固定为1

如果 total_norm < max_norm,torch.clamp 操作将 clip_coef 的最大值固定为1,所以 clip_coef_clamped = 1,这样 total_norm 将保持不变。
如果 total_norm > max_norm,将对原来的梯度进行裁减,使得裁减后的梯度对应的 total_norm 的大小为 max_norm:total_norm=(θΘ(θ(grad(θi)max_normtotal_norm)p))1p=(θΘ(θgrad(θi)p))1ptotal_normmax_norm=max_norm\begin{split}\mathrm{total\_norm'}&=(\sum_{\theta\in\Theta}(\sum_{\theta}(\mathrm{grad}(\theta_i)\cdot\frac{\mathrm{max\_norm}}{\mathrm{total\_norm}})^p))^{\frac{1}{p}}\\&=\frac{(\sum_{\theta\in\Theta}(\sum_{\theta}\mathrm{grad}(\theta_i)^p))^{\frac{1}{p}}}{\mathrm{total\_norm}}\cdot\mathrm{max\_norm}\\&=\mathrm{max\_norm}\end{split}

概述
梯度正则化的测试函数。

设置相关超参数:batch size=4, action=32

从随机分布中生成测试数据(类似回归任务):logit,label,实践中,logit 一般是网络的输出,并要求可以会传梯度。

定义损失函数并计算具体的数值。

损失函数数值张量执行反向传播,计算相应的网络参数的梯度。

根据梯度的 total_norm 对梯度进行裁减:
如果其 total_norm 超过 max_norm,则裁减并使得裁减后的梯度对应的 total_norm 的大小为 max_norm,否则不裁减。

测试裁减后的 total_norm 的大小是否在预期范围内。

如果读者关于本文档有任何问题和建议,可以在 GitHub 提 issue 或是直接发邮件给我们 (opendilab@pjlab.org.cn) 。