[深度学习]神经网络的激活函数

为什么要引入非线性激活函数

如果不使用非线性激活函数,激活函数本质上相当于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

猜你喜欢

转载自blog.csdn.net/u013250416/article/details/80991831