根据评论区
@山丹丹
@啸王 的提醒,更正了一些错误(用斜体显示),在此谢谢各位。并根据自己最近的理解,增添了一些东西(用斜体显示)。如果还有错误,欢迎大家指正。
第一个问题:为什么引入非线性激励函数?
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与 没有隐藏层效果相当,这种情况就是 最原始的感知机(Perceptron)了。
正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入(以及一些人的生物解释balabala)。
第二个问题:为什么引入Relu呢?
第一,采用sigmoid等函数, 算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。
第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成 信息丢失,参见 @Haofeng Li 答案的第三点),从而无法完成深层网络的训练。
第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生(以及一些人的生物解释balabala)。
当然现在也有一些对relu的改进,比如prelu,random relu等,在不同的数据集上会有一些训练速度上或者准确率上的改进,具体的大家可以找相关的paper看。
多加一句,现在主流的做法,会在做完relu之后,加一步batch normalization,尽可能保证每一层网络的输入具有相同的分布[1]。而最新的paper[2],他们在加入bypass connection之后,发现改变batch normalization的位置会有更好的效果。大家有兴趣可以看下。
[1] Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.
[2] He, Kaiming, et al. "Identity Mappings in Deep Residual Networks." arXiv preprint arXiv:1603.05027 (2016).
第一个问题:为什么引入非线性激励函数?
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与 没有隐藏层效果相当,这种情况就是 最原始的感知机(Perceptron)了。
正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入(以及一些人的生物解释balabala)。
第二个问题:为什么引入Relu呢?
第一,采用sigmoid等函数, 算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。
第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成 信息丢失,参见 @Haofeng Li 答案的第三点),从而无法完成深层网络的训练。
第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生(以及一些人的生物解释balabala)。
当然现在也有一些对relu的改进,比如prelu,random relu等,在不同的数据集上会有一些训练速度上或者准确率上的改进,具体的大家可以找相关的paper看。
多加一句,现在主流的做法,会在做完relu之后,加一步batch normalization,尽可能保证每一层网络的输入具有相同的分布[1]。而最新的paper[2],他们在加入bypass connection之后,发现改变batch normalization的位置会有更好的效果。大家有兴趣可以看下。
[1] Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.
[2] He, Kaiming, et al. "Identity Mappings in Deep Residual Networks." arXiv preprint arXiv:1603.05027 (2016).
赞同最多的答案已经回答的很好了,这里我用实验补充一下第二点。
首先,我们使用mnist数据库做个测试,建立一个10层的神经网络,每层的平均梯度幅度如下:
epoch:1 iteration:10/300
3.23e-07 8.3215e-07 3.3605e-06 1.5193e-05 6.4892e-05 0.00027249 0.0011954 0.006295 0.029835 0.12476 0.38948
epoch:1 iteration:20/300
4.4649e-07 1.3282e-06 5.6753e-06 2.5294e-05 0.00010326 0.00043651 0.0019583 0.0096396 0.040469 0.16142 0.5235
可以看到,最开始的几层只有1e-6到1e-7这个量级的梯度,基本上梯度在最后3层就已经饱和了。使用SGD等算法的话,前边几层的参数在梯度下降的时候几乎没有得到改变,自始至终都是随机值。
而使用ReLU呢:
epoch:1 iteration:10/300
0.68193 0.47672 0.48507 0.48 0.49133 0.47511 0.45136 0.48241 0.50238 0.62887 3.7748
epoch:1 iteration:20/300
0.49834 0.3182 0.26373 0.23835 0.23295 0.2293 0.2558 0.27504 0.29768 0.36264 0.51806
可以看到,梯度的scale几乎没什么变化。
最近Google的论文Batch Normalization[1]解决了sigmoid的saturate问题,但效果仍然没有ReLU好,证明ReLU至少在图像分类问题上是比sigmoid更接近本质的,至于这个本质是什么,现在还不得而知。
是因为 @贾伟 说的稀疏性吗?MSRA的论文Parametric ReLU[2]否定了这个说法,非稀疏的激活函数能得到更好的效果。所以,这个问题只能等大神们的进一步分析了。
参考文献:
[1] Sergey Ioffe, Christian Szegedy. Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift.
[2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification.
首先,我们使用mnist数据库做个测试,建立一个10层的神经网络,每层的平均梯度幅度如下:
epoch:1 iteration:10/300
3.23e-07 8.3215e-07 3.3605e-06 1.5193e-05 6.4892e-05 0.00027249 0.0011954 0.006295 0.029835 0.12476 0.38948
epoch:1 iteration:20/300
4.4649e-07 1.3282e-06 5.6753e-06 2.5294e-05 0.00010326 0.00043651 0.0019583 0.0096396 0.040469 0.16142 0.5235
可以看到,最开始的几层只有1e-6到1e-7这个量级的梯度,基本上梯度在最后3层就已经饱和了。使用SGD等算法的话,前边几层的参数在梯度下降的时候几乎没有得到改变,自始至终都是随机值。
而使用ReLU呢:
epoch:1 iteration:10/300
0.68193 0.47672 0.48507 0.48 0.49133 0.47511 0.45136 0.48241 0.50238 0.62887 3.7748
epoch:1 iteration:20/300
0.49834 0.3182 0.26373 0.23835 0.23295 0.2293 0.2558 0.27504 0.29768 0.36264 0.51806
可以看到,梯度的scale几乎没什么变化。
最近Google的论文Batch Normalization[1]解决了sigmoid的saturate问题,但效果仍然没有ReLU好,证明ReLU至少在图像分类问题上是比sigmoid更接近本质的,至于这个本质是什么,现在还不得而知。
是因为 @贾伟 说的稀疏性吗?MSRA的论文Parametric ReLU[2]否定了这个说法,非稀疏的激活函数能得到更好的效果。所以,这个问题只能等大神们的进一步分析了。
参考文献:
[1] Sergey Ioffe, Christian Szegedy. Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift.
[2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification.
1. 激活函数的作用:
是为了增加神经网络模型的非线性。否则你想想,没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。所以你没有非线性结构的话,根本就算不上什么神经网络。
2. 为什么ReLU效果好:
重点关注这章6.6节:Piecewise Linear Hidden Units
http://www.iro.umontreal.ca/~bengioy/dlbook/mlp.html
总结如下:
发现ReLU效果显著的论文:
发现ReLU更容易学习优化。因为其分段线性性质,导致其前传,后传,求导都是分段线性。而传统的sigmoid函数,由于两端饱和,在传播过程中容易丢弃信息:
是为了增加神经网络模型的非线性。否则你想想,没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。所以你没有非线性结构的话,根本就算不上什么神经网络。
2. 为什么ReLU效果好:
重点关注这章6.6节:Piecewise Linear Hidden Units
http://www.iro.umontreal.ca/~bengioy/dlbook/mlp.html
总结如下:
发现ReLU效果显著的论文:
Jarrett, K., Kavukcuoglu, K., Ranzato, M., and LeCun, Y. (2009a). What is the best multi-stage architecture for object recognition?
发现ReLU更容易学习优化。因为其分段线性性质,导致其前传,后传,求导都是分段线性。而传统的sigmoid函数,由于两端饱和,在传播过程中容易丢弃信息:
Glorot, X., Bordes, A., and Bengio, Y. (2011b). Deep sparse rectifier neural networks. In JMLR W&CP: Proceedings of the Fourteenth International Conference on Artificial Intelligence and Statistics (AISTATS 2011). 130, 297
缺点是不能用Gradient-Based方法。同时如果de-active了,容易无法再次active。不过有办法解决,使用maxout激活函数:
Goodfellow, I. J., Warde-Farley, D., Mirza, M., Courville, A., and Bengio, Y. (2013a). Maxout networks. In S. Dasgupta and D. McAllester, editors, ICML’13, pages 1319–1327. 130, 152, 243
除了帮助传播信息,便于优化的优点以外,分段线性函数可以让regularize变得更加容易。