TensorFlow11.4 循环神经网络-梯度弥散与梯度爆炸
RNN并没有我们想象中的那么完美,虽然它的参数会比卷积神经网络少,但是它长时间的Training可能会出现Training非常困难的情况。
我们知道在卷积神经网络中我们层数堆叠的越多的时候会出现很多问题,这个RNN中也是这样的如果我们在时间的维度上拓展的很深的话,也会出现一个梯度爆炸或者梯度弥散的情况。
为什么会出现这种情况呢?
我们发现这个求梯度的时候会出现\(W_{hh}^k\),我们发现他又一个K次方。
在我们求梯度的时候我们的\(W_{hh}\)>1的时候,他的k次方很可能会->\(+\infty\),如果这个\(W_{hh}\)<1的时候他很有可能会->0。
1.Geadient Exploding怎么解决
这里一个解决方法就是我们首先设置一个threshold,如果我们的grad大于这个threshold的时候我们立即用threshold*\(\frac{g}{||g||}\),其中这个\(\frac{g}{||g||}\)相当于他的一个方向向量,就是把他的模变为1,但是它还保留这他的方向,在乘threshold,就可以把他的数值保存在threshold之内。
就是保留他的方向,然后控制到threshold之间
这种方法虽然没有从根本上解决,但是还是比较有效的解决这个问题。
其中
tf.clip_by_norm(
t, clip_norm, axes=None, name=None
)
t: 输入tensor,也可以是list
clip_norm: 一个具体的数,如果l2norm(t) ≤ clip_norm, 则t不变化;否则t=t∗clip_norm / l2norm(t)
axes:指定计算l2norm的维度,如果不指定,利用t中所有元素计算l2norm,对于一维tensor没有影响,对于二维tensor会有影响
这个函数就是将t还是按照他的方向进行放缩,使其里面的数全都小于clip_norm
这个clip_by_norm比较常用于解决梯度爆炸。
2.Geadient Vanishing怎么解决
这个很好的解决方法就是LSTM