神经网络有很多情况导致反向传播算法出现问题:
1.梯度消失:较低层(更接近输入层)的梯度非常小,计算这些梯度时可能涉及到很多小项的乘积,较低层的梯度逐渐消失到0时,这些层的训练会非常缓慢,甚至不再训练。ReLU激活函数有助于防止梯度消失。
2.梯度爆炸:如果网络层的权重过大,则较低层的梯度会涉及到许多大项的乘积,在这种情况下梯度就会爆炸,难以收敛。批标准化可以降低学习速率有助于防止梯度爆炸。
3.ReLU单元格消失:一旦 ReLU 单元的加权和低于 0,ReLU 单元就可能会停滞。它会输出对网络输出没有任何贡献的 0 激活,而梯度在反向传播算法期间将无法再从中流过。由于梯度的来源被切断,ReLU 的输入可能无法作出足够的改变来使加权和恢复到 0 以上。降低学习速率有助于防止 ReLU 单元消失。
丢弃正则化:
这是称为丢弃的另一种正则化,在梯度下降的过程中随机丢弃一些单元格,丢弃的越多,正则化效果越强
>>>x=np.array([1,2,3,4,5]).astype('float32')
>>>sess.run(tf.nn.dropout(x,keep_prob=0.6))
array([1.6666666, 0. , 5. , 6.6666665, 0. ],
dtype=float32)
丢弃正则化在train阶段起效,请不要在验证阶段也加入dropout。 keep_prob 为保留率,1为完全不丢弃,0为完全丢弃(不能取到0)。keep_prob的取值范围为(0,1]。输出结果为 原数值*(1/keep_prob)。