在神经网络中引入**函数一个重要的原因就是为了引入非线性。
1.sigmoid
从数学上来看,非线性的Sigmoid函数对*区的信号增益较大,对两侧区的信号增益小。从神经科学上来看,*区酷似神经元的兴奋态,两侧区酷似神经元的抑制态,因而在神经网络学习方面,可以将重点特征推向*区,将非重点特征推向两侧区。
函数形式为。它的优点是输出范围为(0, 1),所以可以用作输出层,用输出值来表示概率。也叫做Logistic函数,有一个二分类的应用叫Logistic回归,用的就是sigmoid函数得到一个概率值。,另外其求导也很方便,求导后的结果为,。下面是sigmoid和其导数的函数图像:
我们可以发现sigmoid在x>>0时,函数值趋近1,在x<<0时,函数值趋近0。另外可以发现函数在两端附近的梯度较小,这也是sigmoid的缺点,在这些x值处,梯度容易饱和,从而造成参数无法更新或者更新很慢。
2.tanh
tanh的形式为。基本性质同sigmoid没有多少出入,只是将值映射到了[-1,1]这个区间。虽然也是非线性的,依旧有梯度饱和的情况存在,但比sigmoid函数延迟了饱和期。其函数图像如下:
3.ReLu
ReLu也叫修正线性单元,是一种线性的**函数。它的提出消除了前面所说的梯度饱和的情况,并且其梯度也很好求出。一般现在神经网络的**函数默认使用ReLu。表示为f(x) = max(0,x)。其函数图像为:
具有单侧抑制的特性,在<0的地方抑制,其他的地方都**。
4.maxout
Maxout模型实际上也是一种新型的**函数,在前馈式神经网络中,Maxout的输出即取该层的最大值,在卷积神经网络中,一个Maxout feature map可以是由多个feature map取最值得到。
maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。但是它同dropout一样需要人为设定一个k值。
为了便于理解,假设有一个在第i层有2个节点第(i+1)层有1个节点构成的神经网络。
**值 out = f(W.X+b); f是**函数。’.’在这里代表內积;
那么当我们对(i+1)层使用maxout(设定k=5)然后再输出的时候,情况就发生了改变。
此时网络形式上就变成上面的样子,用公式表现出来就是:
z1 = W1.X+b1;
z2 = W2.X+b2;
z3 = W3.X+b3;
z4 = W4.X+b4;
z5 = W4.X+b5;
out = max(z1,z2,z3,z4,z5);
也就是说第(i+1)层的**值计算了5次,可我们明明只需要1个**值,那么我们该怎么办?其实上面的叙述中已经给出了答案,取这5者的最大值来作为最终的结果。
总结一下,maxout明显增加了网络的计算量,使得应用maxout的层的参数个数成k倍增加,原本只需要1组就可以,采用maxout之后就需要k倍了。
再叙述一个稍微复杂点的应用maxout的网络,网络图如下:
对上图做个说明,第i层有3个节点,红点表示,而第(i+1)层有4个结点,用彩色点表示,此时在第(i+1)层采用maxout(k=3)。我们看到第(i+1)层的每个节点的**值都有3个值,3次计算的最大值才是对应点的最终**值。我举这个例子主要是为了说明,决定结点的**值的时候并不是以层为单位,仍然以节点为单位。
参考:
https://www.cnblogs.com/neopenx/p/4453161.html
http://www.sohu.com/a/146005028_723464
http://blog.csdn.net/hjimce/article/details/50414467