深度学习之激活函数、优化方法和正则化

激活函数(activate function)在神经元中非常重要,为了增强网络的表示能力和学习能力,激活函数需要具备以下几点性质:

(1)连续并可导的非线性函数,以便于利用数值优化的方法来学习网络参数。

(2)激活函数及其导数要尽可能简单,以提高网络计算的效率。

(3)激活函数的导函数的值域要在一个合适的区间内,否则会影响训练的稳定性。

常见的激活函数有以下几种:

1、Sigmoid激活函数

Sigmoid函数定义为:

Sigmoid函数可以把一个实数域的输出压缩到(0, 1)的区间上,当输入值在0附近时,Sigmoid函数近似为线性函数;当输入值靠近两端时,对输入值进行抑制,输入越小,越接近于0,输入越大,越接近于1。

和感知机的阶跃函数相比,Sigmoid函数是连续可导的,其输出值直接可以看做是概率分布,使得神经网络可以更好地和统计学习模型结合。

2、Tanh激活函数

Tanh函数(双曲正切函数)的定义为:

Tanh函数可以看作是放大并平移的 Sigmoid函数,其值域是 (-1, 1)Tanh函数的输出是零中心化的,而 Logistic函数的输出恒大于 0。就在隐含层上的表现而言,Tanh函数的效果总是优于 Sigmoid 函数,因为Tanh函数值域在(-1,1)上,其均值更接近0均值,而非零中心化的Sigmoid函数,其输出会使得后一层的神经元的输入发生位置偏移,进一步使得梯度下降的收敛速度变慢。

Sigmoid函数和 Tanh 函数两者共同的缺点是,在z特别大或者特别小的情况下,导数的梯度会变得特别小,最后就会接近于0(称为两端饱和问题),导致梯度下降的速度降低,而ReLU激活函数对这一点进行了修正。

3、ReLU激活函数

ReLU(Rectified Linear Unit ,修正线性单元)激活函数是目前深层神经网络中常用的激活函数。ReLU激活函数的形状类似于一个斜坡,只要x为正值,导数恒等于1,当x为负值时,导数恒等于0.

定义为:

ReLU激活函数的优点在于:

(1)采用ReLU的神经元只需要进行加、乘和比较的操作,相比Sigmoid函数和Tanh函数,在学习上更加高效。

(2)ReLU函数被认为具有生物上的解释性,因为在生物神经网络中,同时处于兴奋状态的神经元非常稀疏,人的大脑中在同一时刻大概只有1~4%的神经元处于活跃状态,而ReLU的单边抑制使其具有很好的稀疏性。相比之下,Sigmoid激活函数和Tanh激活函数会导致一个非稀疏的神经网络。

(3)在优化方面,Sigmoid函数和Tanh函数的两端饱和(即自变量趋于负无穷或正无穷时,导数值趋近于0),这会造成梯度弥散问题,而ReLU函数为左饱和函数,且在x>0时导数为1,在一定程度上缓解了神经网络的梯度小的问题,加快了梯度下降的收敛速度。

但ReLU函数也有一个比较大的缺点,称为死亡ReLU问题,意思是在训练时,如果参数在一次不恰当的更新后,第一个隐藏层中的某个ReLU神经元在所有的训练数据上都不能被激活,那么这个神经元自身参数的梯度永远为0,在以后的训练过程中永远不会被激活。

为了解决这个问题,其他ReLU函数的变种被提了出来,比如Leaky ReLU(带泄露的ReLU)、带参数的ReLU和ELU(指数线性单元)。

4、Leaky ReLU

Leaky ReLU(带泄露的ReLU)在输入x<0时,保持一个很小的梯度,这样当神经元非激活时也能有一个非零的梯度可以更新参数,避免永远不能被激活。

Leaky ReLU的函数形式为:

其中 γ 是一个很小的常数,比如 0.01 。γ < 1时,Leaky ReLU也可以写为 :

5、Softplus 函数

Softplus函数可以看作是 rectifier函数的平滑版本,其定义为:

Softplus函数的导数恰好是Sigmoid函数。Softplus函数虽然类似于ReLU函数,具有单侧抑制、宽兴奋边界的特性,却没有稀疏激活性。

 6、如何选择激活函数

Sigmoid 激活函数:如果是二分类问题,且输出值为0、1,则输出层选择Sigmoid函数,然后其他所有单元都选择ReLU函数或者Tanh函数。除了二分类问题外输出层基本不会用它。

Tanh 激活函数:Tanh 函数非常优秀,几乎适合所有场合。

ReLu 激活函数:最常用的激活函数,如果不确定用哪个激活函数,就使用 ReLU 或者Leaky ReLU。

 7、激活函数必须为非线性函数?

神经网络的激活函数必须使用非线性函数。为什么不能使用线性函数呢?因为使用线性函数的话,加深神经网络的层数就没有意义了。线性函数的问题在于,不管怎么加深层数,总是存在和它等效的无隐含层神经网络,不如直接去掉全部隐含层。所以为了发挥叠加层所带来的优势,隐含层的激活函数必须使用非线性函数,唯一可以使用线性激活函数的通常就是输出层。

 

 参考资料:

1、邱锡鹏《神经网络与深度学习》

2、吴恩达:《深度学习》

 

猜你喜欢

转载自www.cnblogs.com/Luv-GEM/p/10692092.html