梯度消失:
通常神经网络所用的激活函数是sigmoid函数,梯度最大是0.25,当输入x很大或者很小时,梯度趋于零,许多层相乘后最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新,这就是梯度消失。
梯度爆炸:
梯度爆炸就是由于初始化权值过大,前面层会比后面层变化的更快,就会导致权值越来越大,梯度爆炸的现象就发生了。同样是层数多引起的问题。
解决方法:
1,优化激活函数,譬如将sigmold改为relu,避免梯度消失
2,对于RNN,可以通过梯度截断,避免梯度爆炸
3,可以通过添加正则项,避免梯度爆炸
4,使用LSTM等自循环和门控制机制,避免梯度消失
让训练更稳定:
把乘法变加法:resnet,lstm
归一化:梯度归一化,梯度剪裁,把梯度强行放在一个范围内
合理的权重初始化和激活函数:
1,权重初始化,在合理值区间里随机初始参数,xavier初始化成均值为零,方差为固定值
2,激活函数,用relu也是因为在一些区间接近f(x)=x,满足上面的要求