<深度学习系列>深度学习中激活函数的选择
2017-09-27 09:11
453 查看
前言
在神经网络中,有线性部分,也存在激活函数作为线性部分的非线性激活,这里的激活函数往往是非常重要的,合适的选用有助于提高整个神经网络的性能,这里根据网络的一些所见所学和自己的理解,结合上一篇关于反向传播算法的内容,浅谈下激活函数的选择。如有谬误,请联系指正。转载请注明出处。
联系方式:
e-mail:
FesianXu@163.com
QQ:
973926198
github:
https://github.com/FesianXu
基本神经元
典型的神经元单元是由Rosenblatt提出的Rosenblatt感知器,而其基于McCulloch-Pitts模型,其神经元基本结构如下所示:典型的神经元具有输入端,偏置端,求和节点(线性部分)和激活函数(非线性部分),用公式表示为:
y=ϕ(WTX+b)
其中WT=(w1,w2,⋯,wn)T, X=(x1,x2,⋯,xn),其中n为输入特征维数。
不难看出,在求和节点之前,其实就是线性部分,而激活函数的作用,就是将线性部分进行非线性映射。联系到SVM中的kernel函数,可以明白这个激活函数使得神经网络具有了非线性分类的能力。实际上,神经网络的拟合能力是相当强悍的,具有一定层次的神经网络甚至可以拟合任何函数。
激活函数
激活函数的主要任务,正如刚才所说的,正是非线性映射,那么就存在很多符合条件的激活函数可供挑选了,而这些激活函数各有优缺点,值得探讨。Sigmoid函数
sigmoid激活函数是很经典的激活函数,其基本表达式如下:σ(x)=11+e−x
其导数为:
σ′(
24af2
x)=σ∗(1−σ)
图像很容易绘制出来,如下所示
可以看出来,当输入值,也就是线性部分越大或者越小时,其导数越小。让我们回到反向传播算法中的参数更新部分,我们考察式子:
∂C∂wljk=∂C∂zlj∗∂zlj∂wljk=al−1k∗δlj=al−1k∗∑k(δl+1k∗wl+1kj∗σ′(zlj))
而参数更新的式子为:
wljk:=wljk−η∗∂C∂wljk
可以看出,当σ′(zlj)因为|zlj|太大导致过小时,会导致∂C∂wljk过小而使得参数更新速度很慢,特别是输入层的输入范围不定,而且层数太多的时候,其现象更为明显,这个现象称为梯度消散(Gradient Vanashing)。
梯度消散是一个很严重的问题,直接导致了网络层数不能加深。但是,sigmoid激活函数不只是有这个问题,我们还要注意到,sigmoid激活函数的输出是非0均值的分布(zero-mean, zero-centered),也就是说,sigmoid函数输出的总是大于0的值,这里有个结论,就是如果所有的输入或者输出(这里的输出相当于下一层的输入)都是负数或者正数,那么对其的边的权值的导数就总是正数,这样会导致产生阶梯式的参数更新,使得参数更新速度变慢1。
特别需要注意的是,对于两类分类的激活来说,sigmoid是softmax的弱化版,因此sigmoid的输出可以看成是概率分布。
tanh函数
tanh函数也称为双曲线函数,函数形式为:tanh(x)=ex−e−xex+e−x
图像为:
从图上不难看出,tanh是0均值输出的,解决了zero-center问题,但是仍存在梯度消失的问题。
ReLU函数系
ReLU函数称为修正线性单元(Rectified Linear Units),是一种常用于深层网络的激活函数,具有计算简单,可以避免梯度消失等有点。ReLU函数
传统的ReLU函数形式为:ReLU(x)=max(0,x)
图像为:
解决了梯度消失的问题,计算速度快,收敛速度远高于sigmoid和tanh,其作为最终输出,非线性程度不足,而且不具有值范围规整的作用。(待求证)其输出仍不是zero-center的,同时也会出现Dead ReLU的问题,指的是某些神经元可能永远都不会被激活,导致参数永远不会被更新。导致的原因有:
非常凑巧的参数初始化,比如
∂C∂wljk=∂C∂zlj∗∂zlj∂wljk=al−1k∗δlj=al−1k∗∑k(δl+1k∗wl+1kj∗σ′(zlj))
中的∑k(δl+1k∗wl+1kj∗σ′(zlj))所有的zlj都处在非激活区,导致∂C∂wljk=0,使得参数不更新。
学习率Learning rate太高。
ELU函数(Exponential Linear Units)
f(x)={xα(ex−1)x>0otherwise图像如:
可以看出,其符合zero-center的输出。没有Dead ReLU问题(因为其没有非激活区)
PReLU函数(Parametric ReLU)
f(x)=max(αx,x)其中的α可以由BP算法学习出。
PReLU其中包含了Leaky ReLU,表达式为:
f(x)=max(0.01x,x)
图像如:
也就是将α置为一个非常小的常数,这样可以避免出现Dead ReLU的问题。
这里我只能得出最后一层的权值求导结果全为正或者负值,前几层的权值求导结果一部分还会包括权值本身,因此不一定全部为正或者负,这里有待探讨。最后一层可以得出y=σ(w1x1+w2x2+b),因此∂y∂w1=σ′(z)x1,可知其为恒大于0。 ↩
相关文章推荐
- <深度学习优化策略-4> 基于Gate Mechanism的激活单元GTU、GLU
- 深度学习基础篇:如何选择正确的激活函数?
- 深度学习之损失函数与激活函数的选择
- 深度学习(1)-深度学习中的核函数(激活函数)
- 深度学习中激活函数的选择
- 干货 | 深度学习之损失函数与激活函数的选择
- 深度学习中激活函数
- 深度学习常用激活函数之— Sigmoid & ReLU & Softmax
- <<C++ design patterns and Derivatives Pricing>> 学习系列 CH1-对蒙特卡洛基本理解
- 深度学习常用激活函数之— Sigmoid & ReLU & Softmax
- 干货丨 一文概览深度学习中的激活函数
- [DeeplearningAI笔记]神经网络与深度学习3.2_3.11(激活函数)浅层神经网络
- 深度学习笔记(4)——Sigmoid和Relu激活函数的对比
- 浅谈深度学习中的激活函数 - The Activation Function in Deep Learning
- 激活引入非线性,池化预防过拟合(深度学习入门系列之十二)
- 【深度学习】深入理解ReLU(Rectifie Linear Units)激活函数
- 深度学习中的激活函数与梯度消失
- 深度学习之激活函数表
- 【深度学习技术】卷积神经网络常用激活函数总结
- 机器学习或深度学习中常用的激活函数