激活函数(也被称为激励函数)的意义就是加入非线性因素,使得神经网络具有非线性表达的能力。其必要条件是激活函数的输入和输出都是可微的,因为神经网络要求处处可微。(可微是指函数的各个方向可导,可微大于等于可导)
一、激活函数的定义与作用
1.定义。如下图所示,激活函数一般是在神经元的输入(inputs)经过加权求和之后,还继续被一个函数作用。该函数就是激活函数。
2.作用。激活函数的意义也就是加入非线性因素,让神经网络具备非线性的表达能力(当然不是真正意义上的非线性,不过可以逼近任意的非线性函数罢了)。这也是个很了不得的进步了。
二、激活函数的类型
函数类型主要有Sigmoid、Tanh、Relu及其变种等函数。
1.Sigmoid
公式:
函数曲线:
将输入x映射到(0,1)之间,对二分类比较有效。其缺点比较明显,
1)激活函数计算量大,收敛缓慢
2)反向传播时,容易出现梯度消失
2.Tanh
Tanh可以说是Sigmoid函数的升级版(但是并不能完全代替Sigmoid,因为有时要求输出大于等于0时,Sigmoid还是具有不可替代性),Tanh的值域为(-1,1)。
公式:
函数曲线:
与Sigmoid相比,Tanh具有zero-centered的特性,并且具有放大特征的能力,但依然具有梯度消失和幂运算的计算复杂等问题。
3.Relu
Relu函数更为常用,因为其重视正向信号忽视负向信号和人类神经元细胞的特性特别相似,所以具有非常好的拟合效果。
公式:
曲线:
虽然Relu是一个取最大值函数,并且局部可导,但是它是近几年来激活函数比较突出的进展,主要表现以下几点:
1)解决了梯度消失的问题(仅仅是在正区间);
2)计算速度和收敛速度快;
缺点也比较明显:
1)不具备zero-centered的特性;
2)Dead ReLU Problem。由于参数初始化的不幸或者learning rate的设置不正确(设置过大)导致的神经元可能永远不会被激活,即相应的参数永远不能被更新问题。其解决办法是采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
Relu和后面优化函数中的Adam算法一样,请优先使用(特别是对我这样的新手而言)。
4.Relu的变种PReLU
PReLU
公式:
曲线:
主要是为了避免Relu的Dead ReLU Problem问题,令Relu的负半段为设为αx 而非0。
但是无法通过测试说明PReLU完全比Relu具有更好的表达性。
Relu6(tensorflow的函数)
公式:
Relu6可有效防止梯度爆炸,由于节点和层数过多且输出为正时,经加权计算时输出与目标相差过大导致参数调整修正值过大引发的网络抖动,无法收敛的情况。
5.softmax
softmax函数是一个多分类函数,主要用于多分类任务。
公式:
其输出是分类的n个标签,每个标签的概率,其概率的和为1,其中选取概率最大的分类作为预测的目标。
总结:
1.深度学习必要的条件是大量的数据,针对数据最好采用zero-centered数据 和zero-centered输出,所以尽量选择具有zero-centered特点的激活函数以加快模型的收敛速度;
2.使用Relu时,要对learning rate比较熟悉,避免出现大量的“dead”神经元;
3.激活函数的使用,一般来说多分类的最后一层使用Softmax函数。而其余函数的使用优先顺序分别是Relu > Tanh >Sigmoid,一般来说Sigmoid最好不要使用,当然具体情况还是需要具体分析的。
参考文献:
1.《深度学习之tensorflow》;
2.https://blog.csdn.net/sinat_29957455/article/details/81841278
如有错误,请联系博主改正,谢谢指正!