
# 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进行缩放
裁剪前:
裁剪:
裁剪后: