如何用front做网站网页,张店学校网站建设哪家好,专门做排名的软件,需要网站建设的是哪一类人torch.nn.utils.clip_grad_norm_函数主要作用#xff1a; 神经网络深度逐渐增加#xff0c;网络参数量增多的时候#xff0c;容易引起梯度消失和梯度爆炸。对于梯度爆炸问题#xff0c;解决方法之一便是进行梯度剪裁torch.nn.utils.clip_grad_norm_#xff08;#xff09…torch.nn.utils.clip_grad_norm_函数主要作用 神经网络深度逐渐增加网络参数量增多的时候容易引起梯度消失和梯度爆炸。对于梯度爆炸问题解决方法之一便是进行梯度剪裁torch.nn.utils.clip_grad_norm_即设置一个梯度大小的上限。
注旧版为torch.nn.utils.clip_grad_norm()
函数参数
官网链接https://pytorch.org/docs/stable/generated/torch.nn.utils.clip_grad_norm_.html
torch.nn.utils.clip_grad_norm_(parameters, max_norm, norm_type2.0, error_if_nonfiniteFalse, foreachNone) “Clips gradient norm of an iterable of parameters. The norm is computed over all gradients together, as if they were concatenated into a single vector. Gradients are modified in-place.” “对一组可迭代(网络)参数的梯度范数进行裁剪。效果如同将所有参数连接成单个向量来计算范数。梯度原位修改。” Parameters parameters (Iterable[Tensor] or Tensor) – 实施梯度裁剪的可迭代网络参数 an iterable of Tensors or a single Tensor that will have gradients normalized一个由张量或单个张量组成的可迭代对象模型参数将梯度归一化 max_norm (float) – 该组网络参数梯度的范数上限 max norm of the gradients梯度的最大值 norm_type (float) –范数类型 type of the used p-norm. Can be ‘inf’ for infinity norm.所使用的范数类型。默认为L2范数可以是无穷大范数‘inf’ error_if_nonfinite (bool) – if True, an error is thrown if the total norm of the gradients from parameters is nan, inf, or -inf. Default: False (will switch to True in the future) foreach (bool) – use the faster foreach-based implementation. If None, use the foreach implementation for CUDA and CPU native tensors and silently fall back to the slow implementation for other device types. Default: None
源码解读
参考https://blog.csdn.net/Mikeyboi/article/details/119522689 建议大家看看源码更好理解函数意义有注释
def clip_grad_norm_(parameters, max_norm, norm_type2):# 处理传入的三个参数。# 首先将parameters中的非空网络参数存入一个列表# 然后将max_norm和norm_type类型强制为浮点数。if isinstance(parameters, torch.Tensor):parameters [parameters]parameters list(filter(lambda p: p.grad is not None, parameters))max_norm float(max_norm)norm_type float(norm_type)#对无穷范数进行了单独计算即取所有网络参数梯度范数中的最大值定义为total_normif norm_type inf:total_norm max(p.grad.data.abs().max() for p in parameters)# 对于其他范数计算所有网络参数梯度范数之和再归一化# 即等价于把所有网络参数放入一个向量再对向量计算范数。将结果定义为total_normelse:total_norm 0for p in parameters:param_norm p.grad.data.norm(norm_type)total_norm param_norm.item() ** norm_type # norm_type2 求平方二范数total_norm total_norm ** (1. / norm_type) # norm_type2 等价于 开根号# 最后定义了一个“裁剪系数”变量clip_coef为传入参数max_norm和total_norm的比值1e-6防止分母为0的情况。# 如果max_norm total_norm即没有溢出预设上限则不对梯度进行修改。# 反之则以clip_coef为系数对全部梯度进行惩罚使最后的全部梯度范数归一化至max_norm的值。# 注意该方法返回了一个 total_norm实际应用时可以通过该方法得到网络参数梯度的范数以便确定合理的max_norm值。clip_coef max_norm / (total_norm 1e-6)if clip_coef 1:for p in parameters:p.grad.data.mul_(clip_coef)return total_norm
使用方法及分析
应用逻辑为
先计算梯度裁剪梯度在函数内部会判断是否需要裁剪具体看源码解读最后更新网络参数。
因此 torch.nn.utils.clip_grad_norm_() 的使用应该在loss.backward() 之后optimizer.step() 之前
在U-Net中如下
optimizer.zero_grad(set_to_noneTrue)
grad_scaler.scale(loss).backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), gradient_clipping)
grad_scaler.step(optimizer)
grad_scaler.update()参考https://blog.csdn.net/zhaohongfei_358/article/details/122820992
注意
从上面文章可以看到clip_grad_norm 最后就是对所有的梯度乘以一个 clip_coefp.grad.data.mul_(clip_coef)而且乘的前提是clip_coef一定是小于1的所以clip_grad_norm 只解决梯度爆炸问题不解决梯度消失问题由clip_coef的定义**clip_coef max_norm / (total_norm 1e-6)** 可以知道max_norm越大对于梯度爆炸的解决越柔和max_norm越小对梯度爆炸的解决越狠