[深度学习]神经网络的**函数
为什么要引入非线性**函数
如果不使用非线性**函数,**函数本质上相当于f(x)=ax+b。在这种情况下,神经网络每一层的输出都是上层输入的线性函数。此时,不管神经网络有多少层,输出与输入都是线性关系,与没有隐层是一样的。也就相当于最原始的感知机,连最基本的异或问题都无法解决,更别说其他更复杂的非线性问题。
常见的**函数
sigmoid函数
sigmoid函数的数学形式为,导数为f(x)(1-f(x))。
作为**函数,其缺点如下:
(1)当输入很大或很小,饱和的神经元会带来梯度消失(Gradient Vanishing);
(2)函数的输出不是以0为对称的(zero-centered)(解释);
(3)使用指数函数,计算代价有点高。
tanh函数
tanh函数的数学形式为,导数为1-f(x)^2。
与sigmoid函数相比,其解决了zero-centered的问题。但是,梯度消失与指数函数计算代价高的问题,仍然存在。
relu函数
relu函数的全称是,rectified linear unit(修正线性单元函数),其数学形式为f(x) = max(0,x)。
优点:
(1)在输入空间的一半都不存在饱和问题;
(2)收敛速度快;
缺点:
(1)输出不是以0为中心;
(2)Dead Relu Problem,指的是某些神经元可能永远不会被**,导致相应的参数永远不会被更新(参数初始化问题或者参数更新太大);
(3)在输入空间的另一半会存在梯度消失的问题。
其他方法
Leaky Relu : f(x) = max(0.1x, x)
maxout:f(x) = (w1x+b, w2x+b)
elu: f(x) = x, x>=0; f(x) = a(e^x-1), x<= 0
使用
1.最常使用Relu,需要小心地调节学习速率
2.偶尔可考虑Relu的变种,如上面的其他方法中提到的那些
3.一般不使用sigmoid