一、前言
激励函数在神经网络的作用通俗上讲就是讲多个线性输入转换为非线性的关系。不使用激励函数的话,神经网络的每层都只是做线性变换,多层输入叠加后也还是线性变换。因为线性模型的表达能力不够,激励函数可以引入非线性因素。
1.1 单一的神经网络
如果没有激励函数,在单层神经网络中,我们的输入和输出关系如下图:
这是一个线性方程的直观表示,如果我们增加感知机,如下图:
其中结果输出就是右边的绿色区域,但是本质上还是各种线性方程的组合,对于非线性数据则无法很好的处理。如下数据:
上图数据你就没有办法画出一条直线来将数据区分开.
这时候有两个办法,第一个办法,是做线性变换(linear transformation),比如讲x,y变成x^2,y^2,这样可以画出圆形。如图所示:
如果将坐标轴从x,y变为以x^2,y^2为标准,你会发现数据经过变换后是线性可分的了。大致示意图如下:
1.2 含有激励函数的神经网络
加入非线性激励函数后,神经网络就有可能学习到平滑的曲线来分割平面,而不是用复杂的线性组合逼近平滑曲线来分割平面。 这就是为什么我们要有非线性的激活函数的原因。如下图所示说明加入非线性激活函数后的差异,上图为用线性组合逼近平滑曲线来分割平面,下图为平滑的曲线来分割平面:
二、激励函数
1、激活函数通常有如下一些性质:
- 非线性: 当激活函数是线性的时候,一个两层的神经网络就可以逼近基本上所有的函数了。但是,如果激活函数是恒等激活函数的时候(即f(x)=x),就不满足这个性质了,而且如果MLP使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的。
- 可微性: 当优化方法是基于梯度的时候,这个性质是必须的。
- 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。
- f(x)≈x: 当激活函数满足这个性质的时候,如果参数的初始化是random的很小的值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要很用心的去设置初始值。
- 输出值的范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate.
2、常用的激励函数
图形为:
sigmod激励函数符合实际,当输入很小时,输出接近于0;当输入很大时,输出值接近1
但sigmod函数存在较大的缺点:
1、当输入值很小时或很大时,输出曲线基本就是直线了,回想一下反向传播的过程,我们最后用于迭代的梯度,是由中间这些梯度值结果相乘得到的,因此如果中间的局部梯度值非常小,直接会把最终梯度结果拉近0,意味着存在梯度趋向为0
2、非零中心化,也就是当输入为0时,输出不为0,,因为每一层的输出都要作为下一层的输入,而未0中心化会直接影响梯度下降,我们这么举个例子吧,如果输出的结果均值不为0,举个极端的例子,全部为正的话(例如f=wTx+b中所有x>0),那么反向传播回传到w上的梯度将要么全部为正要么全部为负(取决于f的梯度正负性),这带来的后果是,反向传播得到的梯度用于权重更新的时候,不是平缓地迭代变化,而是类似锯齿状的突变。影响梯度下降的动态性
2、双极性sigma函数,
图形为:
3、双曲正切函数,
图形为:
与sigmoid相比,输出至的范围变成了0中心化[-1, 1]。但梯度消失现象依然存在。所以在实际应用中,tanh激励函数还是比sigmoid要用的多一些的
4.ReLu 函数
全称是rectified linear unit,它被广泛应用到了卷积神经网络中,并且出现了一些变体。
函数基本形式是:f(x) = max(0,x), smooth approxiation形式为:
函数的样子所示:
两种变体是:
noisy Relu
也就是在原来的Relu分类部分添加均值为0,方差为sigma的高斯噪声
leaky Relu
这个leaky ReLu的好处是当神经元处于非激活状态是,允许一个非0的梯度存在。
优点:(1)不会出现梯度消失,收敛速度快;
(2)前向计算量小,只需要计算max(0, x),不像sigmoid中有指数计算;
(3)反向传播计算快,导数计算简单,无需指数、出发计算;
(4)有些神经元的值为0,使网络具有saprse性质,可减小过拟合。
缺点:(1)比较脆弱,在训练时容易“die”,反向传播中如果一个参数为0,后面的参数就会不更新。使用合适的学习当然,这和参数设置有关系,所以我们要特别小心,
再举个实际的例子哈,如果学习速率被设的太高,结果你会发现,训练的过程中可能有高达40%的ReLU单元都挂掉了。所以我们要小心设定初始的学习率等参数,在一定程度上控制这个问题。率会减弱这种情况。
5、径向基函数,
,g表示的就是径向基函数,绝对值表达的是径向距离。
图形为:
6、one-side hyperbolic ratio function,
图形为:
那我们咋选用神经元/激励函数呢?一般说来,用的最多的依旧是ReLU,但是我们确实得小心设定学习率,同时在训练过程中,还得时不时看看神经元此时的状态(是否还『活着』)。当然,如果你非常担心神经元训练过程中挂掉,你可以试试Leaky ReLU和Maxout。额,少用sigmoid老古董吧,有兴趣倒是可以试试tanh,不过话说回来,通常状况下,它的效果不如ReLU/Maxout。
三、损失函数和激活函数的选择
具体内容可以参考:深度神经网络(DNN)损失函数和激活函数的选择