深度学习——激活函数Sigmoid/Tanh/ReLU

激活函数(Activation Function)的特点:

  • 非线性: 当激活函数是线性的时候,一个两层的神经网络就可以逼近基本上所有的函数了。
  • 可微: 当优化方法是基于梯度的时候,这个性质是必须的。
  • 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。
  • f(x)x 当激活函数满足这个性质的时候,如果参数的初始化是random的很小的值,那么神经网络的训练将会很高效。
  • 输出值范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的学习率。

激活函数 Sigmoid/Tanh/ReLU

此处输入图片的描述

Sigmoid 的数学形式: 

f(x)=11+ex

它能够把输入的连续实值“压缩”到0和1之间。特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1. 
sigmoid 函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它的一些 缺点

  • 当输入非常大或者非常小的时候,这些神经元的梯度是接近于0的,从图中可以看出梯度的趋势。
  • Sigmoid 的 输出不是0均值,这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。

Tanh的数学形式:

tanh(x)=2sigmoid(2x)1

Tanh是Sigmoid的变形,与 sigmoid 不同的是,tanh 是0均值的。因此,实际应用中,tanh 会比 sigmoid 更好。

ReLU的数学形式: 

f(x)=max(0,x)

很显然,从图左可以看出,输入信号<0时,输出都是0,>0 的情况下,输出等于输入。

二维情况下,使用ReLU之后的效果如下:

此处输入图片的描述

ReLU 的优点:

此处输入图片的描述

  • 使用 ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多(看右图)。相比于 sigmoid/tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。

ReLU 的缺点: 训练的时候很容易就”die”了。

如果这个情况发生了,那么这个神经元的梯度就永远都会是0。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。 如果你设置了一个合适的较小的learning rate,这个问题发生的可能性也不大。

ReLU变体(Leaky-ReLU/P-ReLU/R-ReLU):

Leaky ReLU: 

Leaky Relu是用来解决ReLU这个 dead 的问题的。与 ReLU 不同的是: 

f(x)=αx(x<0)

f(x)=x(x>=0)

这里的 α 是一个很小的常数。这样,即修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。

此处输入图片的描述

关于Leaky ReLU 的效果,有说好的,也有说不好的。

此处输入图片的描述

Parametric ReLU: 

对于 Leaky ReLU 中的α,通常都是通过先验知识人工赋值的。 
然而可以观察到,损失函数对α的导数我们是可以求得的,可不可以将它作为一个参数进行训练呢? 
Kaiming He的论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不仅可以训练,而且效果更好。

原文说使用了Parametric ReLU后,最终效果比不用提高了1.03%.

Randomized ReLU: 
Randomized Leaky ReLU 是 leaky ReLU 的random 版本 (α 是random的)。
在训练过程中,

α 是从一个高斯分布 U(l,u) 中 随机出来的,然后在测试过程中进行修正。


选择激活函数的建议:

一般情况下,使用ReLU会比较好

1、使用 ReLU,就要注意设置 learning rate,不要让网络训练过程中出现很多 “dead” 神经元;

2、如果“dead”无法解决,可以尝试 Leaky ReLU、PReLU 、RReLU等Relu变体来替代ReLU;

3、不建议使用 sigmoid,如果一定要使用,也可以用 tanh来替代。

猜你喜欢

转载自blog.csdn.net/zchang81/article/details/70224688