神经网络中的激活函数:如何选择合适的激活函数

更新于 2026-02-05

Niklas Lang 2024-12-12

近年来,神经网络已成为机器学习模型中一种强大的方法。激活函数是每个神经网络中的核心组件,对模型的功能具有显著影响。它决定了神经网络中某个神经元被激活的强度,从而决定从数据中学习到哪些结构。如果没有激活函数,神经网络只能识别线性关系,无法实现近年来令我们惊叹的卓越成果。

在本文中,我们将详细探讨激活函数的特性,并比较常用的不同激活函数。我们还将提供一些实用建议,帮助你为特定的网络架构和应用场景选择合适的激活函数,以训练出最优模型。不过,在深入探讨这一主题之前,我们首先需要理解神经网络——更具体地说,其中的神经元——是如何工作的,以便清楚地了解激活函数所处的系统环境。

感知机(Perceptron)是如何工作的?

感知机最初是一种数学模型,后来因其能够学习复杂关系的能力而被引入计算机科学和机器学习领域。在其最简单的形式中,它仅由一个神经元组成,该神经元模拟了人脑的结构。

感知机具有多个输入端,用于接收数值信息(即数值)。输入的数量会根据具体应用而变化。这些输入具有不同的权重,表示各输入对最终输出的影响程度。在学习过程中,这些权重会被不断调整,以产生尽可能好的结果。

img 感知机的结构 | 来源:作者

神经元本身会对输入值与其对应权重的乘积求和。这个加权和随后被传递给所谓的激活函数,该函数包含了模型所学习的逻辑。在最简单的形式中,该神经元只有一个输出,其值为二元的,例如“是/否”或“激活/未激活”。此时,激活函数的作用就是将连续值映射为0或1。该输出即为感知机的预测结果。

一个神经网络由数百万甚至数十亿个这样的神经元组成,它们被组织成不同的层。这种结构使网络能够识别并学习数据中更加复杂的关系。

为了更清晰地说明感知机的工作原理,我们以一位政治家为例。她是一名议员,现在需要对一项新法律进行投票表决。因此,这位政治家必须决定是批准还是拒绝这项提案(在我们的例子中不允许弃权)。因此,这个感知机具有一个二元输出:批准或拒绝。

政治家在做决定时有多种信息来源作为输入。一方面,议会提供了一份包含背景信息的文件;此外,她还可以通过互联网了解各种问题,或与其他同事讨论。她会根据对这些信息来源的信任程度为其分配不同权重。例如,她可能认为议会提供的信息文件研究不够深入,且已有倾向性,因此给予较低的权重。然后,她将所有可用信息与其对应的权重相乘后求和,并将结果传递给激活函数。

我们可以将这一过程想象成政治家的大脑:它利用这些输入信息来决定是否批准这项立法提案。即使输入中的微小细节,也可能导致她观点的巨大转变。

什么是激活函数?

激活函数是一种在神经网络内部使用的数学函数,用于决定某个神经元是否被激活。它处理神经元输入的加权和,并计算出一个新值,以确定信号传递到网络下一层的强度。简单来说,激活函数决定了神经元对加权输入值的响应强度。

激活函数在神经网络的训练过程中起着至关重要的作用,因为它使模型能够建模非线性关系。针对模型架构和底层数据选择合适的激活函数,对最终结果具有决定性影响,因此是构建神经网络时的重要组成部分。

激活函数具有哪些特性?

激活函数对神经网络的性能有重要影响,应根据数据的复杂性和预测类型进行选择。尽管可选的激活函数种类繁多,但它们都具备以下共同特性,我们在本节中将逐一详细解释。

非线性是激活函数最重要的特性之一,它使模型能够从数据中学习超越简单线性关系的复杂结构。只有这样,才能应对图像处理或语音识别等具有挑战性的应用。虽然也可以使用线性激活函数,但正如我们将在下文看到的,这类函数存在一些缺点。

此外,所有激活函数都必须是可微的。也就是说,必须能够在数学上对该函数求导,以便神经网络的学习过程得以进行。这一过程基于反向传播(backpropagation)算法:在每次迭代中计算梯度(即多维空间中的导数),并根据结果调整各个神经元的权重,从而不断提高预测质量。只有通过这一过程以及激活函数的可微性,模型才能持续学习并不断改进。

除了这些积极或至少中性的特性外,激活函数也存在一些可能导致训练困难的问题特性。某些激活函数(如Sigmoid或Tanh)具有饱和区,在这些区域中梯度变得非常小,接近于零。在这些范围内,输入值的变化只会引起激活函数输出的微小变化,从而显著减缓网络的训练速度。这种所谓的梯度消失效应(vanishing gradient effect)主要出现在激活函数达到最小值或最大值的数值区间。

了解激活函数的这些核心特性非常重要。

哪些激活函数被广泛使用?

选择合适的激活函数是成功训练机器学习模型的关键方面。因此,本节将介绍最常用的激活函数,这些函数可用于实现众多应用场景。我们还将特别说明它们之间的差异及适用领域。

线性激活函数

作为起点,并为了便于与后续函数进行比较,我们从最简单的激活函数开始。线性激活函数直接返回输入值,其数学表达式如下:

f(x)=xf(x) = x

尽管看起来该函数并未对数据做任何改变,但它确实对网络的功能产生了重要影响。它确保神经网络只能识别数据中的线性关系。这极大地限制了其性能,因为无法从数据中学习更复杂的结构。因此,这种简单的激活函数很少用于深度神经网络,仅在较简单的线性模型中使用,或在回归任务的输出层中使用。

Sigmoid 函数

Sigmoid 函数是最古老的非线性激活函数之一,多年来一直被广泛应用于机器学习领域。其数学公式如下:

f(x)=11+exf(x) = \frac{1}{1 + e^{-x}}

该函数将输入值映射到0到1之间的范围。其图像呈典型的S形曲线,使得较小的输入值被转换为接近0的输出,而较大的输入值则被转换为接近1的输出。

这种输出范围使Sigmoid函数特别适用于需要进行二元预测的应用场景,此时输出可被解释为属于某一类的概率。因此,Sigmoid函数主要用于网络的最后一层,当需要进行二元分类时。例如,在图像中的目标识别或医学诊断中(将患者分类为健康或患病)就非常有用。

img Sigmoid函数图像 | 来源:作者

Sigmoid函数的主要缺点是可能出现梯度消失问题。当输入值非常大或非常小时,求导后的梯度值会趋近于零。结果是在反向传播过程中,神经元的权重几乎不会被调整,导致训练过程缓慢且低效。

此外,如果Sigmoid函数的输出值不以零为中心(而是介于0和1之间),也会带来问题。这意味着正负梯度始终朝同一方向,进一步减缓模型的收敛速度。

由于这些缺点,Sigmoid函数在现代网络架构中正逐渐被其他能实现更高效训练的激活函数所取代,这在深度架构中尤为重要。

双曲正切函数(Tanh)

双曲正切函数(hyperbolic tangent,简称tanh)是另一种用于神经网络的非线性激活函数,用于学习数据中更复杂的关系。其数学公式如下:

f(x)=tanh(x)=exexex+exf(x) = \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}

Tanh函数将输入值转换到-1到1的范围内。与Sigmoid不同,其输出值以零为中心。这带来了一些相对于前述激活函数的优势:以零为中心有助于改善训练效果,使权重调整更快地朝着正确方向进行。

另一个优势是,Tanh函数对较小的输入值在输出范围内进行了更强的缩放,尤其当输入值彼此接近时,能更好地将它们区分开来。

由于这些特性,双曲正切函数常用于循环神经网络(RNN),因为在RNN中时间序列和依赖关系至关重要。通过使用正负值,可以更精确地表示RNN中的状态变化。

然而,与Sigmoid函数相比,双曲正切函数也存在相同的问题。梯度消失问题同样可能发生,尤其是在输入值极大或极小时。在非常深的神经网络中,这会导致网络前部的梯度难以保持足够强,从而无法进行充分的权重调整。此外,在接近1或-1的数值范围内,也会出现饱和效应,导致梯度急剧下降。

修正线性单元(ReLU)

修正线性单元(Rectified Linear Unit,简称ReLU)是一种为解决梯度消失问题而引入的激活函数,近年来越来越受欢迎。简而言之,它保留正值,将负输入值设为零。其数学表达式如下:

f(x)={xif x>00if x0f(x) = \begin{cases} x & \text{if } x > 0 \\ 0 & \text{if } x \leq 0 \end{cases}

用更简洁的方式可表示为:

f(x)=max(0,x)f(x) = \max(0, x)

ReLU激活函数之所以广受欢迎,主要基于以下优势:

  • 计算简单:与其他选项相比,ReLU函数计算非常简单,尤其对于大型网络可节省大量计算资源。这要么降低训练成本,要么缩短训练时间。
  • 无梯度消失问题:由于其线性结构,不存在与x轴平行的渐近点。这意味着梯度不会变得极小,误差即使在网络很深的情况下也能贯穿所有层。这确保了网络能够学习结构,并显著加速学习过程。
  • 适用于新型模型架构:与其他激活函数(如Sigmoid、Softmax和Tanh)不同,ReLU能在输入为负时直接输出零值。而后几种函数只是渐近趋近于零,永远不会真正为零。这在某些新模型(如自编码器)中会造成问题,因为其“编码层”需要真正的零值才能取得良好效果。
  • 经济性:该激活函数将某些输入值设为零的能力使模型在计算上更加高效。如果某些神经元永久输出零值,它们就会“死亡”并变为非活跃状态。这降低了模型复杂度,可能带来更好的泛化能力。

然而,这种简单的激活函数也存在问题。由于负值被一致设为零,个别神经元的权重可能变为零,因为它们对学习过程没有贡献,从而“死亡”。单个神经元死亡起初可能不是问题,但研究表明,在某些情况下,多达20%–50%的神经元可能因ReLU而“死亡”。

当学习率设置过高时,这个问题更容易发生,因为神经元的权重可能发生剧烈变化,导致该神经元只接收到负值。长期来看,这些神经元将保持死亡状态,因为它们不再产生梯度,丧失了学习能力。这意味着使用ReLU作为激活函数的模型对学习率的选择高度敏感,应在训练前仔细考虑。

此外,ReLU函数未被限制,理论上可以取无穷大的正值。尤其在输出范围受限的应用中(如概率预测),此时必须配合其他激活函数(如Softmax)使用,才能输出可解释的结果。

ReLU函数主要用于深度神经网络,因为高效的梯度处理可显著加速收敛。此外,还能节省计算开销,提高整个模型的效率。其中一个核心应用场景是自编码器的训练,用于学习数据的压缩表示。通过稀疏激活,可以找到高效且紧凑的数据表示。

Leaky ReLU

为了消除上述缺点并使ReLU函数更加鲁棒,人们开发了一种优化版本,称为Leaky ReLU。与传统ReLU不同,Leaky ReLU不会将负值设为零,而是赋予其一个(虽小但为正的)斜率。其数学表达式如下:

f(x)={xif x>0αxif x0f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{if } x \leq 0 \end{cases}

用更紧凑的形式可表示为:

f(x)=max(αx,x)f(x) = \max(\alpha x, x)

其中参数 α\alpha 是一个需在训练前确定的正常数,例如可设为0.01。这确保了即使神经元接收到负值,输出也不会为零,仍能产生微小梯度。这防止了神经元死亡,因为它们仍对学习过程有微小贡献。

Leaky ReLU的另一个优势是增强了模型的学习能力:即使在负值区域也能进行学习,信息不会丢失。这一特性可加快收敛速度,因为更多神经元保持活跃并参与学习过程。此外,尽管对ReLU做了小幅修改,该激活函数仍具有类似的计算效率。

可能的缺点是,$\alpha$引入了另一个超参数,需在训练前确定,且对训练质量有重大影响。若该值过小,可能导致学习速度变慢,因为某些神经元虽未死亡,但输出接近零,对训练贡献甚微。

Softmax 函数

Softmax是一种数学函数,它接收一个向量作为输入,并根据各元素的大小将其转换为概率。数值越大,对应的概率越高。

换句话说,向量中的每个值都被除以输出向量所有值的总和,并存储在新向量中。其数学公式如下:

σ(x)j=ezjk=1Kezkfor j=1,,K.\sigma(x)_j = \frac{e^{z_j}}{\sum_{k=1}^{K} e^{z_k}} \quad \text{for } j = 1, \ldots, K.

以下具体示例说明了Softmax函数的工作方式:

(123)Softmax(11+2+321+2+331+2+3)=(0.1660.330.5)\begin{pmatrix} 1 \\ 2 \\ 3 \end{pmatrix} \xrightarrow{\text{Softmax}} \begin{pmatrix} \frac{1}{1+2+3} \\ \frac{2}{1+2+3} \\ \frac{3}{1+2+3} \end{pmatrix} = \begin{pmatrix} 0.166 \\ 0.33 \\ 0.5 \end{pmatrix}

该函数的积极特性在于,它确保输出值的总和始终等于1。这在概率计算中特别有利,因为保证了总概率不会超过1。

乍看之下,Sigmoid和Softmax函数似乎非常相似,因为两者都将输入值映射到0到1的数值范围内,且函数走势几乎相同。区别在于:Sigmoid函数在$x=0$处输出0.5,而Softmax函数在此点的输出仍低于0.5。

img Sigmoid与Softmax函数在区间[-4, 4]内的对比 | 来源:Nomidl

这两种函数的根本区别在于应用场景。Sigmoid函数适用于二元分类,即在两个不同类别之间做决策的模型。而Softmax则适用于预测多于两类的分类问题,它确保所有类别的概率之和为1。

Softmax的优点在于其输出具有可解释性,代表概率,这在分类问题中特别有用。此外,由于使用指数运算,该函数数值稳定性好,能够处理输入数据中较大的差异。

其缺点包括过度自信(overconfidence)问题,即即使模型实际上很不确定,其预测结果仍表现出高度自信。因此,应引入不确定性评估措施以避免此问题。此外,尽管Softmax适用于多分类,但类别数量不宜过多,否则对每个类别进行指数计算将过于耗时且计算密集。此外,模型可能因此变得不稳定,因为个别类别的概率会变得过低。

如何选择合适的激活函数?

激活函数是神经网络中的关键构建模块,对模型性能具有巨大影响。因此,选择合适的函数是构建网络架构的重要步骤,应经过深思熟虑。选择应主要取决于具体应用场景和所使用的网络架构,因为不同的激活函数具有不同特性,在不同情境下可能带来优势或劣势。

隐藏层中,ReLU及其变体(如Leaky ReLU)已成为主流,因为它们计算效率高,同时避免了梯度消失问题——这在隐藏层中尤为关键。此外,ReLU是非线性激活函数,使模型能够学习更复杂的关系。借助Leaky ReLU,网络还能避免神经元死亡问题,从而具备更强的学习能力。

输出层中,则应根据具体应用场景调整激活函数。例如,Softmax和Sigmoid适用于分类问题,因为它们输出的是归属概率。Sigmoid适用于仅有两个类别的应用,而Softmax则用于多分类问题,确保所有类别的概率之和为1。

线性激活函数适用于需要解决线性回归问题的输出层,因为它们不限制输出值范围,非常适合连续值预测。

总之,选择合适的激活函数对神经网络的训练具有重大影响。由于计算高效且不存在梯度消失问题,ReLU及其变体在隐藏层中占据主导地位。而在输出层中,应根据具体用例选择最合适的函数。

总结要点

  • 神经网络由所谓的感知机(或单个神经元)组成,它们从多个输入生成一个或多个输出。
  • 神经元的激活函数决定了特定输入值对神经元激活强度的影响。
  • 激活函数的特征属性包括:是否为线性或非线性、是否必须可微,以及是否存在可能导致梯度消失问题的饱和区域。
  • 多种激活函数已在实际应用中得到确立,如Softmax函数、Sigmoid函数、修正线性单元(ReLU)和Leaky ReLU。
  • 选择合适的激活函数主要取决于网络架构和具体应用场景。