1、为什么使用激活函数?
如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
2、都有什么?
(1)sigmoid函数
公式:
曲线:
也叫 Logistic 函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。
在特征相差比较复杂或是相差不是特别大时效果比较好。
缺点:(1)容易产生梯度消失,导致训练出现问题,
(2)输出不是以0为中心的。
出现梯度消失原因:
当神经元的激活在接近0或1处时会饱和,在这些区域,梯度几乎为0。
在反向传播的时候,这个(局部)梯度将会与整个损失函数关于该门单元输出的梯度相乘。因此,如果局部梯度非常小,那么相乘的结果也会接近零,这会有效地“杀死”梯度,几乎就有没有信号通过神经元传到权重再到数据了。还有,为了防止饱和,必须对于权重矩阵初始化特别留意。比如,如果初始化权重过大,那么大多数神经元将会饱和,导致网络就几乎不学习了。
函数导数:
(2)Tanh函数
公式:双曲正切函数,tanh神经元是一个简单放大的sigmoid神经元,
曲线:
tanh非线性函数图像如上图右边所示。它将实数值压缩到[-1,1]之间。和sigmoid神经元一样,它也存在饱和问题,但是和sigmoid神经元不同的是,它的输出是零中心的。因此,在实际操作中,tanh非线性函数比sigmoid非线性函数更受欢迎。tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。
(3)ReLU
Rectified Linear Unit(ReLU) - 用于隐层神经元输出。
公式:
曲线:
优点:
(1)ReLU 在x0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。
(2)relu函数在负半区的导数为0 ,所以一旦神经元激活值进入负半区,那么梯度就会为0,造成了网络的稀疏性,缓解过拟合。
(3)relu计算简单,采用sigmoid等函数,反向传播求误差梯度时,计算量大,而采用Relu激活函数,整个过程的计算量节省很多。
缺点:
在训练的时候,ReLU单元比较脆弱并且可能“死掉”。举例来说,当一个很大的梯度流过ReLU的神经元的时候,可能会导致梯度更新到一种特别的状态,在这种状态下神经元将无法被其他任何数据点再次激活。如果这种情况发生,那么从此所以流过这个神经元的梯度将都变成0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,因为这导致了数据多样化的丢失。例如,如果学习率设置得太高,可能会发现网络中40%的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。通过合理设置学习率,这种情况的发生概率会降低。
改进版,Leaky ReLU。
表达式:f(x) = max(0.01x, x)
曲线:
Leaky ReLU是为解决“ReLU死亡”问题的尝试。ReLU中当x<0时,函数值为0。而Leaky ReLU则是给出一个很小的负数梯度值,比如0.01。
有些研究者的论文指出这个激活函数表现很不错,但是其效果并不是很稳定。Kaiming He等人在2015年发布的论文Delving Deep into Rectifiers中介绍了一种新方法PReLU,把负区间上的斜率当做每个神经元中的一个参数。然而该激活函数在在不同任务中均有益处的一致性并没有特别清晰。
(4)softmax函数
Softmax - 用于多分类神经网络输出。
公式:
就是如果某一个 zj 大过其他 z, 那这个映射的分量就逼近于 1,其他就逼近于 0,主要应用就是多分类。
为什么要取指数,第一个原因是要模拟 max 的行为,所以要让大的更大。第二个原因是需要一个可导的函数。
3. sigmoid ,ReLU, softmax 的比较
(1)Sigmoid 和 ReLU 比较:
(1)对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失)。而relu函数在大于0的部分梯度为常数,所以不会产生梯度弥散现象。
(2)relu函数在负半区的导数为0 ,所以一旦神经元激活值进入负半区,那么梯度就会为0,造成了网络的稀疏性,缓解过拟合。
(3)relu计算简单,采用sigmoid等函数,反向传播求误差梯度时,计算量大,而采用Relu激活函数,整个过程的计算量节省很多。
(2)Sigmoid 和 Softmax 区别:
sigmoid将一个real value映射到(0,1)的区间(当然也可以是(-1,1)),这样可以用来做二分类。
而softmax把一个k维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)其中 bi 是一个 0~1 的常数,输出神经元之和为 1.0,所以相当于概率值,然后可以根据 bi 的概率大小来进行多分类的任务。
二分类问题时 sigmoid 和 softmax 是一样的,求的都是 cross entropy loss,而 softmax 可以用于多分类问题。
多个logistic回归通过叠加也同样可以实现多分类的效果,但是 softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。
总结:
(1)以上就是一些常用的神经元及其激活函数。最后需要注意一点:在同一个网络中混合使用不同类型的神经元是非常少见的,虽然没有什么根本性问题来禁止这样做。
(2)一句话:“那么该用那种呢?”用ReLU非线性函数。注意设置好学习率,或许可以监控你的网络中死亡的神经元占的比例。
(3)如果单元死亡问题困扰你,就试试Leaky ReLU或者Maxout,不要再用sigmoid了。也可以试试tanh,但是其效果应该不如ReLU或者Maxout。
转载自:https://www.jianshu.com/p/22d9720dbf1a