内容纲要

欢迎转载,作者:Ling,注明出处:深度学习:原理简明教程06-深度学习:激活函数

 

本节主要来讨论激活函数相关内容。

 

我们之前已经见过的激活函数:sigmoid,relu

 

每个神经元结构:

dl_06_001

都有一个激活函数。

激活函数一般有啥性质?

一般是输入的非线性变化。

为什么要非线性变化的激活函数?

我们看看如果没有非线性变化的激活函数是什么情况:

dl_06_002

通过推导可以看出,a[2]等于x输入的线性变化

结论:如果没有激活函数,无论神经网络变得多深,都只是输入的线性变化,或者说是输入的线性组合。也就是说,没必要增加深度,直接改w和b就行。因此,激活函数是必须的,否则深度毫无意义。

 

激活函数有哪些

# 基本激活函数

sigmoid(x)

tanh(x)

relu(x, alpha=0.0, max_value=None)

softmax(x, axis=-1)

elu(x, alpha=0.1)

selu(x)

softplus(x)

softsign(x)

hard_sigmoid(x)

linear(x)

# 高级激活函数

LeakyReLU(alpha=0.3)

PReLU(alpha_initializer='zeros', alpha_regularizer=None, alpha_constraint=None, shared_axes=None)

RReLU

 

sigmoid函数

图和公式

dl_06_003

特点

1)值在0-1之间

2)经常被用来做输出层,二分类

3)如果用它做隐含层激活函数存在问题:只有中间梯度大,Z稍微大一点,梯度特别小,这样会导致梯度下降慢,甚至不下降

 

tanh函数

图和公式

dl_06_004

特点

1)值在-1到1之间

2)一般会被用于隐含层做激活函数,由于是0均值,一般激活效果比sigmod更佳

 

relu

\dl_06_005

特点

1)当Z>0时,梯度为1,可以更快梯度下降,当Z=0,一般会取一个0.001的小梯度值,当Z<0,梯度为0

2)一般推荐用作激活函数,主要原因是加快梯度下降,但是也可能出现梯度为0,不下降情况,例如如果 learning rate 很大,那么很有可能网络中的 40% 的神经元都”dead”了。

3)另外可以解决梯度消失问题,因为当Z>0,梯度总是存在,不会像sigmod,两边很容易梯度为0。

 

LeakyReLU

dl_06_006

特点

1)是relu的变形,所以具有relu的优点,同时克服了Z<0,梯度没有的问题

2)在一些实验中,我们发现LReLU对准确率并没有太大的影响。很多时候,当我们想要应用LReLU时,我们必须要非常小心谨慎地重复训练,选取出合适的Z前面的参数,LReLU的表现出的结果才比ReLU好。因此有人提出了一种自适应地从数据中学习参数的PReLU。

3)但是现实中用得不如relu多

 

PReLU

dl_06_007

特点

1)Z前有参数

2)PReLU是LReLU的改进,可以自适应地从数据中学习参数。

3)PReLU具有收敛速度快、错误率低的特点。

4)PReLU可以用于反向传播的训练,可以与其他层同时优化。

 

RReLU

dl_06_008

特点

1)Z前参数 是一个保持在给定范围内取样的随机变量,在测试中是固定的。

2)RReLU在一定程度上能起到正则效果。

 

 

softmax

dl_06_009

特点

1)该激活函数主要用于多分类

2)主要用于输出层

 

 

elu

dl_06_010

特点

1)Z为负数时,可以有梯度

2)ELU减少了正常梯度与单位自然梯度之间的差距,从而加快了学习。

 

selu

dl_06_011

特点:

1)对elu进行了缩放

2)论文证明比其他激活函数好

 

softplus

dl_06_012

特点:

1)负数平滑

2)正数接近tan = 1

 

softsign:

dl_06_013

特点

有点类似sigmod

 

其他一些对比图

dl_06_014

dl_06_015

总结

本文列举了常见的激活函数,最近看见有人可视化了26种常见的激活函数,我把它也放在了我的博客上。请用firefox打开。

 

到底用哪种激活函数?

1)输出层一般是sigmod或者softmax,前者做二分类,后者做多分类

2)隐含层,一般主要考虑梯度消失和学习快慢问题,relu用得比较多,如果不确定,可以都试试。