| by YoungTimes | No comments

神经网络中的非线性激活函数

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

如果采用线性激活函数,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron),感知机连最基本的异或问题都无法解决,更别提更复杂的非线性问题,这样的神经网络就没有意义。

常见的非线性激活函数

因为上面的原因,所以我们引入了非线性激活函数,这样神经网络才具有实用意义,其不再是输入的线性组合关系,而可以非线性组合成各种任意函数的输出。常用的激活函数包括以下形式:

Sigmoid函数

Sigmoid函数将任意实数映射到[0,1]范围内,在负无穷到0的区间趋向于0,在0到正无穷的区间趋向于1。函数原型如下:
$$
f(x) = \frac{1}{1 + e^{-x}} = \frac{e^x}{1 + e^x}
$$

函数的导数:

$$
f^{\prime}(x) = f(x)(1 – f(x))
$$
函数的图像如下:

函数导数的图像如下:

作为激活函数的缺点
1.容易出现梯度消失(gradient vanishing)
2.运算复杂度高,计算相对耗时

梯度消失

神经网络的优化算法是反向传播算法(Back Propagation),即先计算输出层Cost Function的损失,再将损失以链式求导的方式逐层向前传递。而Sigmoid函数在深度网络中常常会导致导数逐渐变为0,使得参数无法被更新,深度神经网络无法完成训练。

原因如下:1、当x较大或者较小的时候,函数变化非常缓慢,导致函数的导数比较小,神经网络比较深的时候,而链式求导的多层乘积结果非常接近0;2、Sigmoid的导数最大值为0.25,这意味着神经网络每增加一层,导数值至少变为原来的1/4,而且这还是上限,多层传递后,导数也非常接近0;

计算相对耗时

Sigmoid中幂运算和求导过程中涉及的除法运算都是比较耗时的,在大规模的深度学习中,这种现象对计算性能提出了更加苛刻的挑战和要求。

tanh函数

tanh函数将任意实数映射到(-1,1)范围内.

$$
f(x) = tanh(x) = \frac{e^x – e^{-x}}{e^x + e^{-x}}
$$

导数定义如下:

$$
f(x) = 1 – f^2(x)
$$

缺点

存在Gradient Vanishing的问题和幂运算的问题。

修正线性单元函数(Rectified Linear Unit,ReLU)

ReLu的数学表达式为:

$$
f(x) = max(0, x)
$$

函数图像如下:

优点

1、计算速度快;

2、ReLu使得一部分神经元的输出为0,从而形成网络的稀疏性,减少了参数的相互依存关系,缓解了过拟合问题的发生。

缺点

1、Dead ReLU问题:某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生:
1) 非常不幸的参数初始化,这种情况比较少见;
2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

发表评论