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