神经网络可以模拟任何的函数,是怎么做到的?
激活函数在神经网络中起什么作用?
什么样的函数可以成为激活函数?
常用的激活函数有哪些?
- 神经网络可以模拟任何的函数,是怎么做到的?
神经网络可以拟合任何的函数,它是怎么做得到的。这就要提一下通用近似理论。通用近似理论的核心思想是用很多的小格子来拟合原函数。如下图:
那么这些小格子是怎么来的呢?这里要引入一个新的函数--阶跃函数。
对 做
或者
操作,则会使图像移动:
如果用2个阶跃函数做差,则留下一个小格子:
我们再用无数个这样的小格子,可以组成原函数。
2.激活函数在神经网络中起什么作用?
上述例子中的阶跃函数放在神经网络中就是激活函数。采用阶跃函数做为激活函数存在的问题就是在函数斜率比较大的时候,拟合效果不好。自然的我们想到用一段斜线来拟合原函数不是更好吗。
上图中,就用三段斜线来拟合原函数。下面我就以中间的斜线段为例,说明怎么用激活函数的组合来拟合中间的斜线段。
这里介绍一个新的激活函数Relu:
中间的斜线段可以二个relu函数的组合搞定?
单层的神经网络可以写成 :
调整 W 和 b 的值,会形成不同的图像
图2:Relu_1
图3: Relu_2
第一步:Relu 1- Relu_2 再横向平移x1,纵向平移y1,得到:
图4:线1
第二步:Relu 1- Relu_2 再横向平移x2,纵向平移y2,得到:
图5:线2
第三步:线1-线2
三步走,就可以完成中间斜线函数的模拟。同理也可以造出更多的斜线段函数。这样的斜线越密,函数的拟合效果越好。
可以看得出来,采用Relu做激活函数,效果要比阶跃函数效果要好。但是Relu毕竟还是线段,有没有可能用真正的曲线代替的呢。
有的,比如sigmoid 和 tanh。
把多个sigmoid函数,变形移动再线性组合,可以形成你想要的任何函数。
3.什么样的函数可以成为激活函数?
激活函数必须是奇函数吗?
不一定,从上面的例子可以看出,偶函数也是可以的。我们可以通过组合,把多余的部分“消去”。但是总体上来看,偶函数不如奇函数效果好。毕竟需要处理另一半 -_-!。
另外奇函数是以零对称的,零对称的激活函数效果比非零对称的好。 非零中心的函数输出总为正值,即所有维度的输出都为正值,所有梯度的更新方向总是向正或者向负,导致梯度更新的Z字走向,更新缓慢(比如sigmoid函数)。
激活函数最好是奇函数
那么单调性呢?
这个要有,至少有一段是单调的。当激活函数是单调的时候,单层神经网络能保证是凸函数。
激活函数必须是非线性函数吗?
理论上可以是线性的,在图像中,线性的激活函数就不能模拟线段了,因为“消”不掉了。另外看公式:
线性激活函数输出的还是线性单元,用了激活函数 f 等于没用。
所以激活函数应该使用非线性激活函数。
激活函数必须是处处可微?
最好是能够处处可微,毕竟激活函数要参与反向传播。可以容忍少量的点不可微,比如Relu在0点就不可微(Relu采用的次梯度方法解决的)。可以理解为并不是每次都会踩中0这个坑,大部分时候有效有可以了。如果不可微的点的多了,激活函数的效率会大大降低。
激活函数最好是处处可微。
另外激活函数最好还要有一下特征:
- 计算简单:越简单越快,算力要求越低。
- 非饱和性:当x趋向于正负无穷时,函数的导数趋近于0,此时称为饱和,饱和激活函数有如Sigmoid和tanh,非饱和激活函数有ReLU;相较于饱和激活函数,非饱和激活函数可以解决“梯度消失”的问题,加快收敛。
- 输出范围有限:有限的范围等同于归一化,能加速收敛的过程。
常见的激活函数
激活函数全家桶