循环神经网络中比较容易出现梯度衰减或梯度爆炸,为了应对梯度爆炸,可以进行裁剪梯度。假设把所有模型参数梯度的元素拼接成一个向量g,并设裁剪的阈值是θ\thetaθ。裁剪后的梯度min(θ∣∣g∣∣,1)gmin(\frac{\theta}{||g||},1)gmin(∣∣g∣∣θ,1)g的L2L_2L2范数不超过θ\thetaθ。
通过代码进行演示:
def grad_clipping(params, theta) #paras是模型参数,theta是阈值
norm = 0
for param in params:
norm += (param ** 2).sum()
norm = norm.sqrt()
if norm > theta:
for param in params:
param *= theta/norm