Gradient Clipping的引入是为了处理梯度爆炸的问题。当在一次迭代中权重的更新过于迅猛的话,很容易导致“损失散度”。Gradient Clipping的直观作用就是让权重的更新限制在一个合适的范围。
主要过程:
(1)先设置一个clip_gradient(clip_norm或max_grad_norm)
(2)在前向传播与反向传播之后,我们会得到每个权重的梯度diff,(本文的梯度是由tf.gradients(self.cost, self.tvars)计算而来),这时不像通常那样直接使用这些梯度进行权重更新,而是先求所有权重梯度的平方和再求根号sumsq_diff(global_norm),若clip_gradient > global_norm ,就不进行截取,如果global_norm > clip_gradient,则求缩放因子scale_factor = clip_gradient / global_norm。这个scale_factor在(0,1)之间。
(3)最后将所有的权重梯度乘以这个缩放因子,这时得到的梯度才是最后的梯度信息。
参考
- https://blog.csdn.net/qq_40486477/article/details/113745408
- https://blog.csdn.net/a1227605575/article/details/104964594