每一个神经元里面都有一个激活函数,如下图所示:
那么为什么人工神经网络需要激活函数尤其是非线性激活函数呢?
我们用人工神经网络来表述输入X与输出Y之间复杂的关系,用数学语言来说,就是用人工神经网络来实现复杂的函数;使用线性激活函数,神经网络只是把输入线性组合再输出,所以无法实现对复杂函数的逼近。
非线性激活函数可以使神经网络随意逼近复杂函数,类似非线性的Sine函数随意逼近各种复杂函数一样。
没有激活函数带来的非线性,多层神经网络和单层无异。非线性激活函数对深层神经网络的函数逼近能力起着至关重要的作用
另外:激活函数对于将神经网络的输出压缩进特定边界内也非常关键。神经元
的输出值可以非常大。该输出在未经修改的情况下馈送至下一层神经元时,可以被转换成更大的值,这样过程就需要极大算力。激活函数的一个任务就是将神经元的输出映射到有界的区域(如,0 到 1 之间)。
由此,不能在隐藏层用线性激活函数
总结一下人工神经网络需要非线性激活函数的原因:
1,逼近复杂函数;
2,将神经元的输出压缩进特定边界。
参考文献:《Understanding Activation Functions in Deep Learning》
对于深度学习来说,深层神经网络使用反向传播法(Back propagation)进行训练,反向传播法使用梯度下降法更新权重,梯度下降法要求激活函数可微分
从另外的一个角度理解:神经网络的功能,就是用一组基函数的组合去逼近一个目标函数,实际上和泰勒级数,傅立叶级数,小波变换的思想是一样的。以一个二维曲线为例,如果没有非线性的激活函数,那么实际上就是一组直线矢量相加,我们知道再多的直线加起来还是一条直线,所以必须要用非线性的基相加。从泰勒级数可以知道,任何函数可以分解为x的幂级数,而一个非线性函数,比如sin,cos,又或者sigmoid,都可以分解为x的无穷次幂级数。根据线性方程理论,取n个基,比如sin(nx)和cos(nx),就可以逼近目标函数的泰勒分解的前n项,那么如果取的项够多,就可以通过一个组合来逼近目标函数的泰勒分解的前任意项。
理论是这样,但实际中各种基的效果是不一样的,如果用泰勒分解的话,我们知道在接近0点的时候效果好,离0点越远误差越大,由于x的n次幂在x越大时,值发散的越快,更主要的是它的定义域是无限的,所以需要用大量的小系数高次项来给低次项擦屁股,所以这种全域作用,且越远影响越大的基效果很不好。
在工程上用的更多的是分段低次拟合的方法,效果比全域高次拟合要好的多,小波变换,样条差值等等都是这种思想,实际上神经网络的激活函数也是这样,sigmoid可以认为就是一个定义域有限的非线性函数,虽然它名义上定义域是无限的,但实际上超过一定范围后值就不变了,可以用一个阶跃函数充分抵消其在不期望的范围外的影响。但是sigmoid的问题在于,第一,其影响的范围还是比较长(衰减缓慢),第二,它的形状是个s形,且对称,很多时候目标函数就是个凸的,你来个大S总有一半对不齐,第三,也是我觉得最重要的,我需要一个干脆的阶跃来截断范围外的影响,但是sigmoid提供不了。
在工程上分段低次拟合用得最多的是几次?实际上是最简单的一次线段!有限元分析里面就是大量的直线,三角形,计算简单,只要分段够多精度也不错。Relu实现的就是分段一次拟合,仔细看就可以发现其实一对Relu就可以确定一条线段。还是以二维曲线逼近为例,可以从最左端开始在每个分段点用一个带系数的relu来完成一系列折线从而逼近目标函数。因此Relu比sigmoid方便的多。
因此从分段逼近的角度来考虑,relu是纯直线线段,其它的一些类relu是带点曲线的,而且不像Sigmoid一样有个画蛇添足的大S,真的需要S形时完全可以用两个凸曲线去拼。
至于其它的0均值,1方差之类的属于锦上添花,减少训练偏置参数的时间。
网友评论