ReLU还有一个优点是:Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
Dead ReLU Problem
参考原因要搞清楚Dead ReLU具体指的是什么,怎么产生的,如何解决?
Dead ReLU具体指的是什么?
- 字面意思上理解就是“死的”神经元,即该神经元对网络不起作用了。
- 那么什么情况下神经元对网络不起作用了呢?
可以考虑从该神经元出发往下一层传低信息,所传递的信息为零表示该神经元对后面的网络不起作用。这时,这个神经元的输出一定是0,即经过激活函数ReLU函数后神经元的输出为0,这表示这个神经元的输入小于0,这是由于ReLU函数本身的特性。综上,Dead ReLU指的是神经元的输入为负值的情况
Dead ReLU怎么产生的?
- 当神经元的输入小于零时,参数的更新会停止,因为链式法则中出现了导数为零项,如下图所示(倒数第二项为0)。
- 注意,这里为什么说“可能会”呢?
假设“死的”神经元处于L层,那么它可以靠L-1层的参数更新,来更新L层的输入,可能会使“死去”的神经元重新工作。(这里L≠1。如果L=1,由于输入X是不变的,所以,当第一层的神经元死去后,不可能再复活了,W,X都不变,第一层的输入也不变)
有两个主要原因可能导致这种情况产生:
- 非常不幸的参数初始化,这种情况比较少见
- learning rate太高导致在训练过程中参数更新太大,使得参数变为很小或者变得很大。例如,原本X里边的元素都为正数,参数W也为正数,令bias=0,
当有过大更新参数使得参数变成一个非常小的负数时,这时,神经元的输入变为小于0,导致神经元死亡。 - 解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
- 但是,ReLU的这个特点我觉得既是缺点也是优点,缺点前面说了,优点就是它使神经元坏死,从而防止了过拟合,这很有用,所以这也是ReLU为何如此受欢迎的原因之一。
其实还有一个函数softplus
Softplus函数是Logistic-Sigmoid函数原函数,它相比于sigmoid(双边饱和),它是单边饱和,肯定要比sigmoid函数表现要好。
一个很重要的原因就是softplus虽然是单边饱和,但是还是很有肯能导致梯度消失的问题(softplus不会产生梯度爆炸的问题)