神经网络在近似模拟任何函数时,离不开非线性变换。神经元与神经元的连接都是基于权值的线性组合。根据线性代数的知识,线性的组合依然是线性的,换句话说,如果全连接层没有非线性部分,那么在模型上叠加再多的网络层,意义都非常有限,因为这样的多层神经网络最终会“退化”为一层神经元网络,深度神经网络就无从谈起了。
通过引入非线性的激活函数,可以解决上述问题。无论多么玄妙的函数,在理论上,它们都能被近似地表征出来。加入(非线性的)激活函数后,深度神经网络才具备了分层的非线性映射学习能力。因此,激活函数是深度神经网络中不可或缺的部分。
下面介绍几种常见的激活函数。
导数(导数范围:(0, 1/4] ):
Sigmoid函数的优势:它可以将一个实数输入映射到(0,1)范围内,在物理意义上最接近生物神经元的休眠和激活之间的状态。例如,Sigmoid函数可以用于深度学习模型LSTM中的各种门(Gate)上,模拟门的关闭和开启状态。此外,Sigmoid函数还可以用于表示概率,并且还可用于输入的归一化处理。
凡事都有两面性。Sigmoid也有缺点,那就是它的饱和性。具体来说,当输入数据x很大或很小时,Sigmoid函数的导数迅速趋近于0.这就意味着,很容易产生所谓的梯度消失现象。要知道,如果没有了梯度作为指导,那么神经网络的参数训练就如同“无头苍蝇”,毫无方向可言。
Sigmoid函数的另一个不足之处在于,它的输出不是以0为中心的。有时我们更偏向于当激活函数的输入是0时,输出也是0的函数。
因为上述两个缺陷,导致参数收敛速度很慢,严重影响了训练的效率。因此在设计神经网络时,采用Sigmoid函数作为激活函数的场景并不多。
Tanh函数将一个实数输入映射到(-1,1)范围内,当输入为0时,Tanh函数输出为0,符合我们对激活函数的要求。
Tanh函数的取值可以是负值,在某些需要抑制神经元的场景,需要用到它的这个特性。例如,在LSTM中就用到Tanh函数的负值区来模拟“遗忘”。
通过上述公式可以发现,Tanh和Sigmoid函数之间存在一定的线性关系,因此,两者的形状是类似的。只是尺度和范围不同。因此,Tanh函数同样存在与Sigmoid函数类似的缺点——梯度弥散(Gradient Vanishing),导致训练效率不高。
因此,如何防止神经网络陷入梯度弥散的境地,或者说如何提升网络的训练效率,一直都是深度学习非常热门的研究课题。目前在卷积神经网络中,最常用的激活函数就是修正线性单元ReLU(Rectified Linear Unit)。
ReLU函数是由Krizhevsky和Hinton等人在2010年提出来的。标准的ReLU函数非常简单,即f(x) = max(x,0)。简单来说,当x>0时,输出为x;当x<=0时,输出为0。注意下图是一条曲线,只不过它在原点处不那么圆滑而已。
为了让它在原点处圆滑可导,Softplus函数也被提出来了,它的函数形式为f(x)=ln(1+e^x)。Softplus函数是对ReLU函数平滑逼近的解析形式,图像如下所示。更巧的是,Softplus函数的导数恰好就是Sigmoid函数。由此可见,这些非线性函数之间存在着一定的联系。
与Sigmoid函数相比,ReLU函数的优点主要体现在三个方面。
单侧抑制:当输入小于0时,神经元处于抑制状态;反之当输入大于0时,神经元处于激活状态。ReLU函数相对简单,求导计算方便。这导致ReLU函数得到的SGD(Stochastic gradient descent,随机梯度递减)的收敛速度比Sigmoid/Tanh函数的收敛速度快得多。
相对宽阔的兴奋边界:Sigmoid函数的激活状态(f(x)的取值)集中在中间的狭小空间(0, 1)内,Tanh函数有所改善,但也局限于(-1,1)内,而ReLU函数则不同,只要输入大于0,神经元就一直处于激活状态。
稀疏激活:相比于Sigmoid之类的激活函数,稀疏性是ReLU函数的优势所在。Sigmoid函数将处于抑制状态的神经元设置为一个非常小的值,但即使这个值再小,后续的计算也少不了它们的参与,这样操作计算负担很大。而ReLU函数直接将处于抑制状态的神经元“简单粗暴”地设置为0,这样一来,使得这些神经元不再参与后续的计算,从而造成了网络的稀疏性。
正是因为这些原因,圆滑可导的近似函数Softplus在实际任务中并不比“简单粗暴”的ReLU函数效果更好,这是因为Softplus函数带来了更多的计算量。
除此之外,ReLU函数还减少了参数之间相互依存的关系,使其收敛速度远远快于其他激活函数,最后还在一定程度上缓解了过拟合问题的发生。
ReLU函数有如此神奇的作用还有一个原因是该模型正好暗合生物神经网络的工作机理。神经元同时只对输入信号的少部分进行选择性响应,大量信号被刻意屏蔽了,这进一步表明了神经元工作的稀疏性。
其实,这很容易理解,因为生物生存也需要成本。进化论告诉我们,作为人体最耗能的器官——大脑要尽可能地节能,这样才能在恶劣的环境中生存。
当然,激活函数的种类远不止这些,还有渗漏型整流线性单元(Leaky ReLU)、指数线性单元(ELU)、高斯误差线性单元(GELU)及周期激活函数(SIREN)等。
来源:深度学习与TensorFlow实践 张玉宏