深度学习:原理简明教程06-深度学习:激活函数——作者:Ling,作者链接: http://www.bdpt.net/cn
欢迎转载,作者:Ling,注明出处:深度学习:原理简明教程06-深度学习:激活函数
本节主要来讨论激活函数相关内容。
我们之前已经见过的激活函数:sigmoid,relu
每个神经元结构:
都有一个激活函数。
激活函数一般有啥性质?
一般是输入的非线性变化。
为什么要非线性变化的激活函数?
我们看看如果没有非线性变化的激活函数是什么情况:
通过推导可以看出,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函数:
图和公式:
特点:
1)值在0-1之间
2)经常被用来做输出层,二分类
3)如果用它做隐含层激活函数存在问题:只有中间梯度大,Z稍微大一点,梯度特别小,这样会导致梯度下降慢,甚至不下降
tanh函数:
图和公式:
特点:
1)值在-1到1之间
2)一般会被用于隐含层做激活函数,由于是0均值,一般激活效果比sigmod更佳
relu:
\
特点:
1)当Z>0时,梯度为1,可以更快梯度下降,当Z=0,一般会取一个0.001的小梯度值,当Z<0,梯度为0
2)一般推荐用作激活函数,主要原因是加快梯度下降,但是也可能出现梯度为0,不下降情况,例如如果 learning rate 很大,那么很有可能网络中的 40% 的神经元都”dead”了。
3)另外可以解决梯度消失问题,因为当Z>0,梯度总是存在,不会像sigmod,两边很容易梯度为0。
LeakyReLU:
特点:
1)是relu的变形,所以具有relu的优点,同时克服了Z<0,梯度没有的问题
2)在一些实验中,我们发现LReLU对准确率并没有太大的影响。很多时候,当我们想要应用LReLU时,我们必须要非常小心谨慎地重复训练,选取出合适的Z前面的参数,LReLU的表现出的结果才比ReLU好。因此有人提出了一种自适应地从数据中学习参数的PReLU。
3)但是现实中用得不如relu多
PReLU:
特点:
1)Z前有参数
2)PReLU是LReLU的改进,可以自适应地从数据中学习参数。
3)PReLU具有收敛速度快、错误率低的特点。
4)PReLU可以用于反向传播的训练,可以与其他层同时优化。
RReLU:
特点:
1)Z前参数 是一个保持在给定范围内取样的随机变量,在测试中是固定的。
2)RReLU在一定程度上能起到正则效果。
softmax:
特点:
1)该激活函数主要用于多分类
2)主要用于输出层
elu:
特点:
1)Z为负数时,可以有梯度
2)ELU减少了正常梯度与单位自然梯度之间的差距,从而加快了学习。
selu:
特点:
1)对elu进行了缩放
2)论文证明比其他激活函数好
softplus:
特点:
1)负数平滑
2)正数接近tan = 1
softsign:
特点:
有点类似sigmod
其他一些对比图:
总结:
本文列举了常见的激活函数,最近看见有人可视化了26种常见的激活函数,我把它也放在了我的博客上。请用firefox打开。
到底用哪种激活函数?
1)输出层一般是sigmod或者softmax,前者做二分类,后者做多分类
2)隐含层,一般主要考虑梯度消失和学习快慢问题,relu用得比较多,如果不确定,可以都试试。