之前的学习中,多数使用的是sigmoid作为激活函数
- 下图是几个函数的图像
- sigmoid的导数图像
- ReLu的导数图像
结论就是sigmoid的导数只有在0附近的时候有比较好的激活性,在正负饱和区的梯度都接近于0,所以这会造成梯度弥散,而relu函数在大于0的部分梯度为常数(导数是相同的),所以不会产生梯度弥散现象。第二,relu函数在负半区的导数为0 ,所以一旦神经元激活值进入负半区,那么梯度就会为0,也就是说这个神经元不会经历训练,即所谓的稀疏性。第三,relu函数的导数计算更快,程序实现就是一个if-else语句,而sigmoid函数要进行浮点四则运算。
版权声明:上文内容转载于优快云博主「迷川浩浩_ZJU」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_21190081/article/details/64127103
- 这里说会产生梯度弥散,,什么是梯度弥散?
靠近输出层的hidden layer 梯度大(斜率大(靠近z=0)),参数更新快,所以很快就会收敛;
而靠近输入层的hidden layer 梯度小(斜率小(远离z=0)),参数更新慢,几乎就和初始状态一样,随机分布。
这种现象就是梯度弥散(vanishing gradient problem)。
而在另一种情况中,前面layer的梯度通过训练变大,而后面layer的梯度指数级增大,这种现象又叫做梯度爆炸(exploding gradient problem)。
//but有点没懂,relu在z<0的情况下的梯度是0,那参数岂不是不更新了/。。?/后面又查了一下这个问题,,所以又有了一个新的ReLU解决z<0的问题,leaky ReLU