首先,我们平常再实现一次BP
tf.train.GradientDescentOptimizer(0.01).minimize(loss)
但是查看minimize()
的源码
grads_and_vars = self.compute_gradients(
loss, var_list=var_list, gate_gradients=gate_gradients,
aggregation_method=aggregation_method,
colocate_gradients_with_ops=colocate_gradients_with_ops,
grad_loss=grad_loss)
...
return self.apply_gradients(grads_and_vars, global_step=global_step,
name=name)
有compute_gradients
和apply_gradients
两步:
compute_gradients
:计算各组权重梯度
apply_gradients
:将梯度,以BP的公式更新权重
我们clip_gradient就是在compute_gradients
步骤之后,对太大的gradient
进行norm操作,防止gradient explosion。
主要的norm方法有以下四种:
1.tf.clip_by_value(t, clip_value_min,clip_value_max)
最简单的方式,大于clip_value_max的就令为clip_value_max;小于clip_value_min就令为clip_value_min。
import tensorflow as tf
import numpy as np
A = np.array([[1, 1, 2, 4], [3, 4, 8, 5]])
with tf.Session() as sess:
print(sess.run(tf.clip_by_value(A, 2, 5)))
结果:
[[2 2 2 4]
[3 4 5 5]]
2.tf.clip_by_norm(t, clip_norm)
先计算传入的t
的 l 2 n o r m l_2norm l2norm,如 l 2 n o r m ( t ) ≤ c l i p _ n o r m l_2norm(t) ≤ clip\_norm l2norm(t)≤clip_norm,则t
不变;否则 t c l i p _ n o r m = t ∗ c l i p _ n o r m l 2 n o r m ( t ) t_{clip\_norm}=\frac{t*clip\_norm }{l_2norm(t)} tclip_norm=l2norm(t)t∗clip_norm ,如:
import tensorflow as tf
import numpy as np
A = np.array([3., 4