激活函数整理
1. 前言
这里主要首先要说下为什么在深度学习网络中需要加入激活函数?因为激活函数是网络中非线性的来源,去除了该部分之后网络就只剩下线性运算部分了,而且线性运算的组合叠加也是线性的,最后得到的结果模型也当然可以等价于单层的线性模型了,也为了能够适用于复杂的情况,所以需要在网络中引入非线性单元。
那么说到了激活函数那么就先从常见的sigmoid开始谈起吧。
2. sigmoid函数
首先,来看看sigmoid函数是怎么定义的
其表示的实际函数曲线是这样的
从上图中可以看出:sigmoid函数的输出被限制在(0,1)之间,单调连续,并且根据其定义其求导容易;但是该损失函数由于其软饱和性,容易产生梯度消失,导致训练出现问题,并且其输出并不是以0为中心的。
3. tanh函数
tanh函数和sigmoid函数比较类似,其函数定义为
其函数曲线为:
从上面的曲线中可以看出函数的取值范围为[-1,1]。tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。与 sigmoid 的区别是,tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好。Tanh的梯度相比较Sigmoid更加陡峭。我们选择Sigmoid还是Tanh是根据问题中对梯度的要求而定的。
4. Softmax函数
Softmax是另一种Sigmoid函数,但是它是在分类中比较容易控制的一种激活函数。Sigmoid只能处理两类的问题。Softmax将输出结果压缩在0-1之间,并依据输出的总和来分类。它给输入的概率一个概率。Softmax形式如下:
假设我们的一个输出结果是[1.2,0.9,0.75],当我们使用了softmax之后,这个值变成了[0.42, 0.31, 0.27],我们可以使用这些概率当做每一类的概率。
Softmax在输出层中使用是比较完美的,这里我们通常是需要获得输入数据对应的类别的各种概率。
笼统解释:二分类情况一般使用sigmoid激活,多分类情形一般使用softmax进行激活。
5. relu函数
说到relu函数一般是说的其一般表达式:
其函数图像也很简单了,大于0的分布就是一条直线,小于0的分布那就是 y=0 y = 0 的水平直线。
relu函数在最近的几年中是最广泛使用的激活函数原因首先是它是非线性的,也就意味着反向传播算法可用。而ReLu一个非常好的特性是它不会同时激活所有的神经元。这是什么意思呢?从上面的图中我们可以看到ReLU的图形,在输入是负值的情况下,它会输出0,那么神经元就不会被激活。这意味着同一时间只有部分神经元会被激活,从而使得网络很稀疏,进而对计算来说是非常有效率的。
在进行反向传播的时候,输入值小于0对应的神经元是不会被更新的,相当于是死的,不会被激活。
通过上面的图像可以看到relu函数在输入小于0的时候,对应的神经元是不能被激活的。为了解决该问题,提出了relu这一族的函数,其大体思想可以使用下面的函数进行概括:
6. swish函数
该函数是Google大脑团队提出了一个新的激活函数。其函数定义式为:
其函数图像为:
团队的测试结果表明该函数在很多模型都优于ReLu。
从图像上来看,Swish函数跟ReLu差不多,唯一区别较大的是接近于0的负半轴区域。其实这个激活函数跟facebook提出的GLU激活函数是类似的。
7. 激活函数选择的一些指导
讲了如上的激活函数,在实际的运用过程中如何使用?并没有特定的规则。但是根据这些函数的特征,可以总结一个比较好的使用规律或者使用经验,使得网络可以更加容易且更快的收敛。
1. Sigmoid函数以及它们的联合通常在分类器的中有更好的效果
2. 由于梯度崩塌的问题,在某些时候需要避免使用Sigmoid和Tanh激活函数
3. ReLU函数是一种常见的激活函数,在目前使用是最多的
4. 如果遇到了一些死的神经元,我们可以使用Leaky ReLU函数
5. 记住,ReLU永远只在隐藏层中使用
6. 根据经验,我们一般可以从ReLU激活函数开始,但是如果ReLU不能很好的解决问题,再去尝试其他的激活函数
7. 如果使用 ReLU,要小心设置 learning rate,注意不要让网络出现很多 “dead” 神经元,如果不好解决,可以试试 Leaky ReLU、PReLU 或者 Maxout.
8. 参考
相关文章
- destoon自定义函数获取地区名称
- 使用python装饰器计算函数运行时间的实例
- MATLAB技巧—sort和sortrows函数
- C++:C++编程语言学习之函数/结构体和类的简介、案例应用之详细攻略
- 【回归预测-BP预测】基于思维进化算法优化BP神经网络在非线性函数拟合中的应用(Matlab代码实现)
- QML 中常用的 JS 函数整理
- 解答私信@被c++折磨头秃的花季美少女 //C++ 利用指针数组输入10个单词,编写函数对10个单词进行排序并输出,要求判断是否有相同的单词,如果有相同的单词在输出时该单词只输出一次。
- 387集Go语言核心编程培训视频教材整理 | 函数、包和错误处理(二)
- Python标准库:内置函数float([x])
- D3DXVec3LengthSq 函数
- D3DXVec3BaryCentric 函数
- Windows API一日一练(85)OpenClipboard函数
- VC++ 功能强大的API函数FindFirstFile使用介绍(附源码)
- MATLAB学习笔记(七)——MATLAB解方程与函数极值
- 2.7 引入外加函数
- Python getattr() 函数