循环神经网络中比较容易出现梯度衰减或梯度爆炸,为了应对梯度爆炸,可以进行裁剪梯度。假设把所有模型参数梯度的元素拼接成一个向量g,并设裁剪的阈值是 。裁剪后的梯度 的 范数不超过 。
通过代码进行演示:
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