tf.clip_by_value()
# tf.clip_by_value()
a = tf.range(10)
print(a)
print(tf.maximum(a, 2))#限制最小为 2
print(tf.minimum(a, 8))#限制最大为 8
print(tf.clip_by_value(a, 2, 8)) # 限制最小为2,最大为8
'''
参数:tensor, clip_value_min, clip_value_max,name=None
clip_value_min:最小限幅
clip_value_max:最大限幅
'''
tf.nn.relu()
#tf.nn.relu() 将所有小于0的数变为0
#tf.nn.relu(a) == tf.maximum(a, 0)
a = tf.range(10)
a = a - 5
print(a)
print(tf.nn.relu(a))
print(tf.maximum(a, 0))
tf.clip_by_norm()
为什么要根据一个范数来进行裁剪?
对于一个vector(向量),例如(x,y),若只是对于x进行裁剪,而未对y进行裁剪,
则意味着即使你改变了一个vector的方向,对于一个gradient(梯度)来说,我们
是不希望改变gradient方向的,因为gradient是已经计算出来的,若剪裁改变了
gradient的方向,不利于我们计算最优解
所以,我们既需要把值限定在一个最小的范围之内,但是又不希望改变方向的话,
我们就有一个 等比例的放缩
只改变模,不改变方向
'''
为什么要根据一个范数来进行裁剪?
对于一个vector(向量),例如(x,y),若只是对于x进行裁剪,而未对y进行裁剪,
则意味着即使你改变了一个vector的方向,对于一个gradient(梯度)来说,我们
是不希望改变gradient方向的,因为gradient是已经计算出来的,若剪裁改变了
gradient的方向,不利于我们计算最优解
-------
所以,我们既需要把值限定在一个最小的范围之内,但是又不希望改变方向的话,
我们就有一个 等比例的放缩
1.求出整体的模的长度
2.除以二范数,归一到0-1的范围之内
3.乘以一个值,进行等比例的放缩
'''
#tf.clip_by_norm()
a = tf.random.normal([2,2],mean=10)
print(a)
print(tf.norm(a))#求出范数
aa = tf.clip_by_norm(a,15)#对a进行一个放缩
print(aa)
print(tf.norm(aa))#aa的范数
gradient clipping
问题:
- 梯度爆炸
- 梯度消失
对所有的norm进行缩放
裁剪前:
裁剪:
裁剪后: