梯度爆炸是深度学习中十分常见的现象,有时会导致寻优过程不收敛,或者算出来的结果干脆直接溢出,例如在Python里都是Nan
,使迭代无法继续下去。TensorFlow里提供了一系列简单可行的梯度裁剪函数,方便我们对超过阈值的梯度值进行规约,使优化算法相对更加数值稳定。
TensorFlow里提供的几个Gradient Clipping函数都是以clip_by开头,分别是tf.clip_by_norm
,tf.clip_by_global_norm
,tf.clip_by_average_norm
和tf.clip_by_value
,下面依次逐个介绍。
1. tf.clip_by_norm
使用方法:
tf.clip_by_norm(t, clip_norm, axes=None, name=None)
"""
t: 要裁剪的梯度张量
clip_norm: 裁剪阈值,一个合适的正数
axes: 需要进行规约的维度,为None时,则对张量t的所有元素做规约
name:操作名称
"""
规约公式如下:
t={
t∗clip_norm||t||2 ,t ,||t||2≥clip_normotherwise t = { t ∗ c l i p _ n o r m | | t | | 2 , | | t | | 2 ≥ c l i p _ n o r m t , otherwise
其中: ||t|