梯度裁剪
- 梯度裁剪
既然在BP过程中,会产生梯度消失,(即偏导无限接近0,导致长时记忆无法更新),那么最简单粗暴的方法,设定阈值,当梯度小于阈值时,更新的梯度为阈值(梯度裁剪解决的是梯度消失或梯度爆炸问题,即设定阈值),如下图所示:
解决梯度爆炸问题的方法
torch.nn.utils.clip_grad_norm_(parameters, max_norm, norm_type=2)
函数定义:裁剪可迭代参数的渐变范数,范数在所有梯度一起计算的,就好像它们被链接成单个矢量一样,渐变是就地修改的。
原理:对网络所有参数求范数,和最大梯度阈值相比,如果clip_coef <1时,范数大于阈值,则所有梯度值乘以系数。
参数列表
- parameters(Iterable[Tensor]或Tensor)——一个由张量或单个张量**组成的可迭代对象(**模型参数),将梯度归一化、
- max_norm:(float or int)——梯度的最大范数
- norm_type:(float or int)——所使用的范数类型
clip_coef的公式为:
总结
慢慢的会自己在建模过程中,将梯度裁剪使用好,会自己详细使用好梯度裁剪,以及梯度裁剪的过程,会自己将其弄透彻。研究彻底。