激活函数是非线性函数,如果不用激活函数,再深的网络也是线性模型。
sigmoid
也叫s函数,其函数和导函数:
sigmod(x)=1+e−x1∈(0,1)sigmod′(x)=sigmod(x)∗(1−sigmod(x))=1+e−x1∗1+e−xe−x=(1+e−x)2e−x∈(0,0.25) 输出范围在0~1之间,均值为0.5,需要做数据偏移,不方便下一层的学习。
当x很小或很大时,存在导数很小的情况。另外,神经网络主要的训练方法是BP算法,BP算法的基础是导数的链式法则,也就是多个导数的乘积。而sigmoid的导数最大为0.25,多个小于等于0.25的数值相乘,其运算结果很小。随着神经网络层数的加深,梯度后向传播到浅层网络时,基本无法引起参数的扰动,也就是没有将loss的信息传递到浅层网络,这样网络就无法训练学习了。这就是所谓的梯度消失。
tanh
tanh(x)=1+e−2x1−e−2x∈(−1,1)tanh′(x)=1−(tanh(x))2=(1+e−2x)24e−2x∈(0,1] 在神经网络的应用中,tanh通常要优于sigmod的,因为tanh的输出在-1~1之间,均值为0,更方便下一层网络的学习。但有一个例外,如果做二分类,输出层可以使用sigmod,因为他可以算出属于某一类的概率
Sigmod(x)和tanh(x)都有一个缺点:在深层网络的学习中容易出现梯度消失,造成学习无法进行。
Relu
relu(x)=max(x,0)={x,0,x≥0x<0∈[0,+∞)relu′(x)={1,0,x≥0x<0∈{0,1} 有 Dead ReLU 问题,当x为负时导数等于零,但是在实践中没有问题,也可以使用leaky Relu。
LeakyReLU
LeakyReLU (x)={x,x≥0ax,x<0∈R LeakyReL U′(x)={1,a,x≥0x<0∈{a,1} Relu6
relu 6′(x) relu 6(x)=min(max(x,0),6)∈[0,6]={1,0,0<x<6 其他 ∈{0,1} ELu
g(x)=ELU(x)={x,α(ex−1),x>0x⩽0 没有 Dead ReLU 问题,输出的平均值接近 0,以 0 为中心;
ELU 通过减少偏置偏移的影响,使正常梯度更接近于单位自然梯度,从而使均值向零加速学习;
ELU 在较小的输入下会饱和至负值,从而减少前向传播的变异和信息。
PRelu
f(yi)={yi,aiyi, if yi>0 if yi≤0 如果 a_i> 0,则 f 变为 leaky ReLU
如果 a_i 是可学习的参数,则 f 变为 PReLU