再探常用激活函数

什么是激励函数

在计算神经网络输出的时候,往往加权求和之后还需要使用一个函数对这个结果进行非线性化的处理,这个函数称之为激活函数,单个神经元的计算与激活函数的使用图如下:

为什么要用激活函数

如果不使用激活函数的话,就是令 ,称之为线性激活函数或者恒等激活函数,这样神经网络的输出就仅仅是输入函数的线性变化,不管神经网络有多少层,它所做的仅仅就是计算线性激活函数,这样显然违背了增加网络层的初衷,还不如去除所有的隐藏层,因为使用线性激活函数的隐藏层对提高训练效果几乎没有作用。所以使用线性组合函数(结果仍然是线性函数)没有任何作用。所以在隐藏层中永远不要使用线性激活函数(除非必要)。唯一能够使用线性激活函数的地方通常是输出层。

几大常用激活函数

Sigmoid

曲线:

Sigmoid是最早开始学习的激励函数之一,但是现今已经很少使用了,因为其计算量是在是过大,主要应用在二分类,目前也只有二分类的时候会使用它。它主要的缺点:

缺点

函数饱和使梯度消失

Sigmoid函数神经元在值为 0 或 1 的时候接近饱和,这些区域,梯度几乎为 0。因此在反向传播时,这个局部梯度会与整个代价函数关于该单元输出的梯度相乘,结果也会接近为 0 ,训练的速率大大下降。

因为几乎就没有信号通过神经元传到权重再到数据了,因此这时梯度就对模型的更新没有任何贡献。

除此之外,为了防止饱和,必须对于权重矩阵的初始化特别留意。比如,如果初始化权重过大,那么大多数神经元将会饱和,导致网络就几乎不学习。

函数不是关于原点中心对称的

这个特性会导致后面网络层的输入也不是零中心的,进而影响梯度下降的运作。因为如果输入都是正数的话,那么梯度在反向传播过程中,要么全是正数,要么全是负数,这将会导致梯度下降权重更新时出现 z 字型的下降。

Tanh

公式:

曲线:

这个函数是今天新接触的函数之一,其也被称为双正切函数,通过一定的变化把Simoid函数线性变换到 [-1,1] 的区间上,所以其实0均值的,实际应用中的效果比Sigmoid函数好。

ReLU

即Rectified Linear Unit,线性整流函数。
公式:

曲线:

特点是当输入信号<0的时候输出都是0,>0的时候输出等于输入,是目前最常用的激活函数之一。

其效果如图:

ReLU的优点:

1.相对与 Simoid 和 Tanh 函数,ReLU 对于 SGD 有巨大的加速作用,根据论文
Alex Krizhevsky 指出其加速作用有六倍之多。

2.相比于 Sigmoid/tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的(指数)运算。

ReLU的缺点:

它在训练时比较脆弱并且可能“死掉”。

举例来说:一个非常大的梯度经过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。如果这种情况发生,那么从此所有流过这个神经元的梯度将都变成 0。

也就是说,这个 ReLU 单元在训练中将不可逆转的死亡,导致了数据多样化的丢失。实际中,如果学习率设置得太高,可能会发现网络中 40% 的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。

合理设置学习率,会降低这种情况的发生概率。

Leaky ReLU

公式:

曲线:

Leaky ReLU 是为解决“ ReLU 死亡”问题的尝试,有些研究者的论文指出这个激活函数表现很不错,但是其效果并不是很稳定。