天天看点

常见的激活函数总结

目前主流的卷积神经网络框架都会遵循类似卷积—》池化—》卷积—》池化…—》全连接—》softmax 这样的网络结构,其中在卷积层后都会有跟随着一层激活层。平时在跑基于tensorflow的深度学习实验室时,也都是直接仿照许多经典的网络架构来设计自己的网络架构,而对于激活函数,也是直接采用tensorflow提供的接口,没有进行深究。那么在卷积神经网络中引用激活函数的意义是什么呢?网上的答案也都千篇一律:激活函数是用来加入非线性因素的,因为线性模型的表达能力不够。当我在看代码的时候,激活函数所做的事情其实就是将经过卷积核卷积后的神经网络的输出映射为特定的边界内的值,这点可以从下面的激活函数的图里轻易的看出。而网上解释为啥引入激活函数所举的例子中所谓的不可线性可分的数据需要经过非线性激活函数去分,这里把激活函数当成了一种分类数据的判别面,这点我不是太了解,只能借助以后知识不断的增进去逐步的了解啦。

本文只是简单的介绍常用的一些激活函数,以备后面不时之需。常用的激活函数有1. Sigmoid,2. Tanh,3. ReLU等,下面分别进行介绍:

Sigmoid

Sigmoid又叫作 Logistic 激活函数,它将实数值压缩进 0 到 1 的区间内,还可以在预测概率的输出层中使用。该函数将大的负数转换成 0,将大的正数转换成 1。数学公式为:

常见的激活函数总结

下图展示了 Sigmoid 函数及其导数:

Sigmoid 激活函数:

常见的激活函数总结

Sigmoid 导数:

常见的激活函数总结

Sigmoid 函数的三个主要缺陷:

  1. 梯度消失: 注意:Sigmoid 函数趋近 0 和 1 的时候变化率会变得平坦,也就是说,Sigmoid 的梯度趋近于 0。神经网络使用 Sigmoid 激活函数进行反向传播时,输出接近 0 或 1 的神经元其梯度趋近于 0。这些神经元叫作饱和神经元。因此,这些神经元的权重不会更新。此外,与此类神经元相连的神经元的权重也更新得很慢。该问题叫作梯度消失。因此,想象一下,如果一个大型神经网络包含 Sigmoid 神经元,而其中很多个都处于饱和状态,那么该网络无法执行反向传播。
  2. 不以零为中心: Sigmoid 输出不以零为中心的。
  3. 计算成本高昂: exp() 函数与其他非线性激活函数相比,计算成本高昂。

    下一个要讨论的非线性激活函数解决了 Sigmoid 函数中值域期望不为 0 的问题。

Tanh

Tanh 激活函数:

常见的激活函数总结

Tanh 导数:

常见的激活函数总结

Tanh 激活函数又叫作双曲正切激活函数(hyperbolic tangent activation function)。与 Sigmoid 函数类似,Tanh 函数也使用真值,但 Tanh 函数将其压缩至-1 到 1 的区间内。与 Sigmoid 不同,Tanh 函数的输出以零为中心,因为区间在-1 到 1 之间。你可以将 Tanh 函数想象成两个 Sigmoid 函数放在一起。在实践中,Tanh 函数的使用优先性高于 Sigmoid 函数。负数输入被当作负值,零输入值的映射接近零,正数输入被当作正值。唯一的缺点是:

Tanh 函数也会有梯度消失的问题,因此在饱和时也会「杀死」梯度。

为了解决梯度消失问题,我们来讨论另一个非线性激活函数——修正线性单元(rectified linear unit,ReLU),该函数明显优于前面两个函数,是现在使用最广泛的函数。

修正线性单元(ReLU)

ReLU 激活函数:

常见的激活函数总结

ReLU 导数:

常见的激活函数总结

从上图可以看到,ReLU 是从底部开始半修正的一种函数。数学公式为:

常见的激活函数总结

当输入 x<0 时,输出为 0,当 x> 0 时,输出为 x。该激活函数使网络更快速地收敛。它不会饱和,即它可以对抗梯度消失问题,至少在正区域(x> 0 时)可以这样,因此神经元至少在一半区域中不会把所有零进行反向传播。由于使用了简单的阈值化(thresholding),ReLU 计算效率很高。但是 ReLU 神经元也存在一些缺点:

  1. 不以零为中心:和 Sigmoid 激活函数类似,ReLU 函数的输出不以零为中心。
  2. 前向传导(forward pass)过程中,如果 x < 0,则神经元保持非激活状态,且在后向传导(backward pass)中「杀死」梯度。这样权重无法得到更新,网络无法学习。当 x = 0 时,该点的梯度未定义,但是这个问题在实现中得到了解决,通过采用左侧或右侧的梯度的方式。

本文节选自机器之心一文概览深度学习中的激活函数

参考:

一文概览深度学习中的激活函数

The Activation Function in Deep Learning 浅谈深度学习中的激活函数

https://feisky.xyz/machine-learning/neural-networks/active.html

知乎:神经网络激励函数的作用是什么?有没有形象的解释?

常用激活函数比较

继续阅读