从线性到非线性:简单聊聊神经网络的常见三大激活函数
大家好,我是沛哥儿,我们今天一起来学习下神经网络的三个常用的激活函数。
引言:什么是激活函数
激活函数是神经网络中非常重要的组成部分,它引入了非线性因素,使得神经网络能够学习和表示复杂的函数关系。
在神经网络中,神经元接收到多个输入信号,将这些输入信号进行加权求和后,再通过一个激活函数进行转换,得到神经元的输出。激活函数决定了神经元是否被激活,即是否将信号传递给下一层神经元。
一、为什么神经网络需要激活函数?
在探讨具体的激活函数之前,我们先来理解一下它在神经网络中扮演的关键角色。
神经网络,从本质上来说,是一种模仿生物神经系统结构和功能的计算模型。它由大量的神经元相互连接组成,这些神经元按照层次结构排列,包括输入层、隐藏层和输出层。
在神经网络里,每个神经元的基础操作是对输入进行线性加权求和,然后输出结果。简单来说,如果输入为 $ x_1, x_2, …, x_n $,对应的权重为 $ w_1, w_2, …, w_n $,偏置为 $ b $,那么神经元的输出 $ z $ 可以表示为 $ z = w_1x_1 + w_2x_2 + … + w_nx_n + b $ 。这是一个线性变换的过程。
但是,单纯的线性变换叠加存在很大的局限性。无论我们堆叠多少层这样的线性变换,其最终的输出仍然只是输入的线性组合。数学上可以证明,多层线性变换的组合等价于一个单层的线性变换 。这就意味着,仅靠线性变换,神经网络无法学习到数据中的复杂非线性模式。
举个简单的例子,异或(XOR)问题是一个典型的线性不可分问题。对于异或运算,输入有两个变量 $ x_1 $ 和 $ x_2 $,输出 $ y $ 满足:当 $ x_1 = 0, x_2 = 0 $ 时, $ y = 0 $;当 $ x_1 = 0, x_2 = 1 $ 时, $ y = 1 $;当 $ x_1 = 1, x_2 = 0 $ 时, $ y = 1 $;当 $ x_1 = 1, x_2 = 1 $ 时, $ y = 0 $ 。我们无法用一条直线将这四种情况正确地分类,也就是说,简单的线性模型无法解决异或问题。
再比如在图像识别任务中,图像中的物体形状、颜色、纹理等特征之间存在着复杂的非线性关系。如果神经网络没有引入非线性因素,就无法准确地提取和学习这些特征,从而难以实现高精度的图像分类、目标检测等任务。
激活函数的出现,就是为了解决这个问题。它的核心作用是为神经网络引入非线性,让多层神经网络能够学习到数据中的复杂模式。通过在神经元的线性加权求和输出之后,再经过一个激活函数的变换,神经网络就具备了强大的非线性表达能力。
根据通用近似定理,一个包含足够多隐藏层神经元的神经网络,加上合适的激活函数,可以逼近任意复杂的连续函数 。这使得神经网络能够处理各种复杂的任务,如语音识别、自然语言处理、图像生成等等。
可以说,激活函数是神经网络的灵魂所在,它赋予了神经网络强大的学习能力和适应性,让神经网络在众多领域取得了巨大的成功。
接下来,我们就详细介绍三种常见且重要的激活函数:Sigmoid 函数、ReLU 函数和 Tanh 函数。
二、Sigmoid 函数:从生物曲线到二分类的经典选择
(一)函数特性与数学表达
Sigmoid 函数在神经网络的发展历程中占据着重要的地位。
它的数学表达式为
$ \sigma(x)=\frac{1}{1 + e^{-x}} $
从这个公式可以看出,Sigmoid 函数的输入 $ x $ 可以是任意实数,而输出则被限定在 $ (0,1) $ 这个区间内。
- 当 $ x $ 趋近于正无穷时,$ e^{-x} $ 趋近于 0,那么 $ \sigma(x) $ 就趋近于 1;
- 当 $ x $ 趋近于负无穷时,$ e^{-x} $ 趋近于正无穷,此时 $ \sigma(x) $ 趋近于 0 。
- 当 $ x = 0 $ 时,$ \sigma(0)=\frac{1}{1 + e^{0}} = 0.5 $ 。
Sigmoid 函数的图像是一条非常独特的 S 型曲线。
- 在 $ x $ 值较小时,函数值接近 0 ,并且随着 $ x $ 的增加,函数值增长缓慢;
- 当 $ x $ 逐渐增大并接近 0 时,函数值开始快速增长;
- 而当 $ x $ 继续增大超过 0 后,函数值增长又逐渐变缓,最终趋近于 1 。
这种 S 型的曲线形状使得 Sigmoid 函数具有很好的平滑性和连续性,在整个实数域上都是可导的。它的导数公式为
$ \sigma’(x)=\sigma(x)(1 - \sigma(x)) $** **
从导数公式可以看出,Sigmoid 函数的导数与它自身的输出值密切相关 。当 $ \sigma(x) $ 接近 0 或 1 时,导数 $ \sigma’(x) $ 接近 0 ;而当 $ \sigma(x)=0.5 $ 时,导数达到最大值 0.25 。
什么是导数:
设函数$ y=f(x)
在点 在点 在点 x_0
的某个邻域内有定义,当自变量 的某个邻域内有定义,当自变量 的某个邻域内有定义,当自变量 x
在 在 在 x_0 处有增量 处有增量 处有增量 Δx
( ( ( x_0+Δx
仍在该邻域内)时,相应地函数有增量 仍在该邻域内)时,相应地函数有增量 仍在该邻域内)时,相应地函数有增量 Δy=f(x0+Δx)−f(x0)
。如果当 。如果当 。如果当 Δx→0 时,比值 时,比值 时,比值 \frac{Δx}{Δy} 的极限存在,那么称函数 的极限存在,那么称函数 的极限存在,那么称函数 y=f(x) 在点 在点 在点 x_0 处可导,这个极限值就称为函数 处可导,这个极限值就称为函数 处可导,这个极限值就称为函数 y=f(x) 在点 在点 在点 x_0 处的导数,记作 处的导数,记作 处的导数,记作 f′(x0) KaTeX parse error: Expected group after '_' at position 3: ,即_̲_ f’(x_0)=\lim\limits_{\Delta x\to0}\frac{\Delta y}{\Delta x}=\lim\limits_{\Delta x\to0}\frac{f(x_0 + \Delta x)-f(x_0)}{\Delta x} $。
Sigmoid 函数的设计灵感来源于生物学中的神经元激活机制。在生物神经系统中,神经元接收到来自其他神经元的信号,当这些信号的强度积累到一定阈值时,神经元就会被激活并发送信号,否则就处于抑制状态。
Sigmoid 函数就类似于这种神经元的激活过程,输入信号 $ x $ 越大,越趋近于 1(表示激活),输入信号越小,越趋近于 0(表示抑制) 。这种直观的物理意义使得 Sigmoid 函数在早期的神经网络研究中被广泛应用。
(二)核心优势与应用场景
Sigmoid 函数的优点之一是其输出天然适配二分类概率预测。
在逻辑回归模型中,我们通过 Sigmoid 函数将线性回归的输出 $ z = w^Tx + b $ 转换为概率值 $ p = \sigma(z) $ ,其中 $ p $ 表示样本属于正类的概率。
- 当 $ p \gt 0.5 $ 时,我们将样本预测为正类;
- 当 $ p \leq 0.5 $ 时,预测为负类。
在图像二分类任务中,比如判断一张图片是猫还是狗,我们可以使用逻辑回归模型,通过 Sigmoid 函数输出图片是猫的概率,如果概率大于 0.5,则认为图片中的动物是猫,否则是狗。
Sigmoid 函数的梯度计算相对简单,这在基于梯度下降的优化算法中非常重要。
在反向传播过程中,我们需要计算每个神经元的梯度来更新权重,Sigmoid 函数简单的梯度计算公式
$ \sigma’(x)=\sigma(x)(1 - \sigma(x)) $** **
使得梯度计算的效率较高,能够加快模型的训练速度。
但是 Sigmoid 函数也存在明显的缺点,最突出的就是梯度饱和问题。当 $ x $ 的绝对值较大时,也就是 $ x \gt 3 $ 或 $ x \lt -3 $ 时,Sigmoid 函数的梯度接近 0 。
在深层神经网络中,梯度消失会导致靠近输入层的神经元权重更新非常缓慢,甚至几乎不更新,使得模型难以学习到有效的特征。这就好比在一个长长的接力赛中,梯度是传递的 “接力棒”,当梯度消失时,前面的 “选手”(靠近输入层的神经元)就很难接到 “接力棒”,无法有效地进行训练。
Sigmoid 函数的输出非零中心化,其输出值始终大于 0 。这会导致下一层神经元的输入发生偏置偏移,使得梯度下降的收敛速度变慢。当一个神经元的输入全是正数时,其梯度在反向传播过程中也全是正数,这就使得权重更新只能朝着一个方向进行,形成 “Z 字型” 震荡,不利于模型的收敛。
尽管存在这些缺点,Sigmoid 函数在一些特定场景下仍然有着重要的应用。在早期的神经网络中,它常被用于输出层,尤其是在二分类任务中。在生成对抗网络(GAN)的判别器中,Sigmoid 函数也经常被使用,用于判断输入数据是真实数据还是生成数据的概率。
(三)实践中的注意事项
在使用 Sigmoid 函数时,初始化权重需严格控制。由于 Sigmoid 函数的梯度饱和问题,如果初始化权重过大,会导致大部分神经元处于饱和状态,使得梯度消失,模型无法正常训练。因此,通常会使用一些特定的权重初始化方法,如 Xavier 初始化,来确保权重在合适的范围内,避免落入饱和区。
为了缓解梯度消失问题,在输出层搭配交叉熵损失函数是一个有效的方法。交叉熵损失函数与 Sigmoid 函数结合时,在反向传播过程中能够避免梯度消失的问题,使得模型能够更好地进行训练。在二分类的逻辑回归模型中,我们通常使用交叉熵损失函数 $ L = -[y\log§+(1 - y)\log(1 - p)] $ ,其中 $ y $ 是真实标签,$ p $ 是通过 Sigmoid 函数得到的预测概率,这种组合能够有效地优化模型的性能。
Xavier 初始化
Xavier 初始化是一种在神经网络训练中用于初始化权重参数的方法,目的是让网络在训练初期能更稳定地学习,减少梯度消失或梯度爆炸问题。
- 原理:Xavier 初始化基于这样的想法,即如果每一层输入的方差在经过该层传递到输出时保持不变,那么网络训练过程会更稳定。它通过计算每层神经元的输入和输出数量,按照特定公式来确定权重的初始分布。假设某一层神经网络的输入维度为nin,输出维度为nout ,对于服从均匀分布的权重初始化,权重参数$ W < f o n t s t y l e = " c o l o r : r g b ( 31 , 35 , 41 ) ; b a c k g r o u n d − c o l o r : r g b ( 239 , 240 , 241 ) ; " > 在区间 < / f o n t > <font style="color:rgb(31, 35, 41);background-color:rgb(239, 240, 241);">在区间 </font> <fontstyle="color:rgb(31,35,41);background−color:rgb(239,240,241);">在区间</font> [-\frac{\sqrt{6}}{\sqrt{n_{in}+n_{out}}}, \frac{\sqrt{6}}{\sqrt{n_{in}+n_{out}}}]
KaTeX parse error: Expected group after '_' at position 198: …rtant;"></font>_̲ W < f o n t s t y l e = " c o l o r : r g b ( 31 , 35 , 41 ) ; b a c k g r o u n d − c o l o r : r g b ( 239 , 240 , 241 ) ; " > 的均值设为 < / f o n t > < f o n t s t y l e = " c o l o r : r g b ( 31 , 35 , 41 ) ; b a c k g r o u n d − c o l o r : r g b ( 225 , 234 , 255 ) ! i m p o r t a n t ; " > 0 < / f o n t > < f o n t s t y l e = " c o l o r : r g b ( 31 , 35 , 41 ) ; b a c k g r o u n d − c o l o r : r g b ( 239 , 240 , 241 ) ; " > ,方差设为 < / f o n t > <font style="color:rgb(31, 35, 41);background-color:rgb(239, 240, 241);">的均值设为</font><font style="color:rgb(31, 35, 41);background-color:rgb(225, 234, 255) !important;">0</font><font style="color:rgb(31, 35, 41);background-color:rgb(239, 240, 241);">,方差设为 </font> <fontstyle="color:rgb(31,35,41);background−color:rgb(239,240,241);">的均值设为</font><fontstyle="color:rgb(31,35,41);background−color:rgb(225,234,255)!important;">0</font><fontstyle="color:rgb(31,35,41);background−color:rgb(239,240,241);">,方差设为</font> \frac{2}{n_{in}+n_{out}} $。- 优势:相比随机初始化,Xavier 初始化能让网络在训练初期的梯度分布更合理,使得网络训练更加稳定,加速收敛过程。它能让信号在网络中更顺畅地传播,减少因权重过大或过小导致的训练困难问题。
- 局限:Xavier 初始化的假设是网络层之间的激活函数是线性的,然而在实际应用中,许多激活函数(如 ReLU、Sigmoid 等)是非线性的,这可能导致其效果受到一定影响。对于一些深度非常深、结构复杂的网络,Xavier 初始化可能无法完全避免梯度消失或梯度爆炸问题,仍需结合其他技术(如 Batch Normalization)一起使用 。
三、Tanh 函数:对称输出的隐层优化方案
(一)函数特性与数学表达
Tanh 函数即双曲正切函数,在神经网络的发展历程中同样占据着重要的地位,它的数学表达式为 $ \tanh(x)=\frac{e{x}-e{-x}}{e{x}+e{-x}} $
从这个公式我们可以清晰地看到,Tanh 函数通过自然指数函数 $ e^{x} $ 和 $ e^{-x} $ 的组合,将任意实数输入 $ x $ 映射到了 $ (-1,1) $ 这个区间内。
- 当 $ x $ 趋近于正无穷时,$ e^{x} $ 会远远大于 $ e^{-x} $ ,此时分子 $ e{x}-e{-x} $ 趋近于 $ e^{x} $ ,分母 $ e{x}+e{-x} $ 也趋近于 $ e^{x} $ ,那么 $ \tanh(x) $ 就趋近于 1;
- 反之,当 $ x $ 趋近于负无穷时,$ e^{-x} $ 远远大于 $ e^{x} $ ,分子趋近于 $ -e^{-x} $ ,分母趋近于 $ e^{-x} $ ,$ \tanh(x) $ 趋近于 - 1 。
- 而当 $ x = 0 $ 时,$ e^{0}=1 $ ,代入公式可得 $ \tanh(0)=\frac{1 - 1}{1 + 1}=0 $ 。
Tanh 函数的图像呈现出非常独特的 S 型曲线,并且关于原点对称。这意味着对于任意的 $ x $ ,都有 $ \tanh(-x)=-\tanh(x) $ 。在 $ x $ 从负无穷逐渐增大到 0 的过程中,函数值从 - 1 逐渐增大到 0,且增长速度逐渐加快;当 $ x $ 从 0 继续增大到正无穷时,函数值从 0 逐渐增大到 1,增长速度逐渐变慢 。这种对称的 S 型曲线特性使得 Tanh 函数在处理数据时具有很好的对称性和平衡性。
与 Sigmoid 函数相比,Tanh 函数可以看作是 Sigmoid 函数的 “中心化” 版本。Sigmoid 函数的输出范围是 $ (0,1) $ ,其输出值始终大于 0 ,而 Tanh 函数的输出范围是 $ (-1,1) $ ,输出均值更接近 0 。这种以 0 为中心的输出特性,使得 Tanh 函数在神经网络的隐藏层中表现出更好的性能,能够让神经元的输出在网络中更有效地传递和处理 。
(二)核心优势与应用场景
Tanh 函数的主要优点之一是解决了 Sigmoid 函数输出非对称的问题。
由于其输出以 0 为中心,当 Tanh 函数作为隐藏层的激活函数时,神经元的输出在网络中传递时,能够使下一层神经元接收到的输入信号在正负两个方向上都有较好的分布,避免了因输入信号始终为正而导致的权重更新偏差。在多层神经网络中,如果前一层神经元使用 Tanh 函数作为激活函数,其输出会在正负值之间波动,这样传递到下一层神经元时,下一层神经元的权重更新会更加合理,有助于模型更快地收敛。
Tanh 函数的收敛速度略快于 Sigmoid 函数。这是因为在相同的输入范围内,Tanh 函数的梯度相对较大。从导数的角度来看,Tanh 函数的导数公式为 $ \tanh’(x)=1-\tanh^{2}(x) $ ,当输入值在 0 附近时,$ \tanh(x) $ 的值也接近 0,此时导数 $ \tanh’(x) $ 接近 1 ,而 Sigmoid 函数在输入为 0 时,导数仅为 0.25 。更大的梯度意味着在反向传播过程中,权重更新的步长可以更大,从而加快模型的训练速度 。
Tanh 函数的梯度饱和区域相对 Sigmoid 函数更为平缓。虽然当 $ x $ 的绝对值较大时(一般认为 $ x\gt2 $ 或 $ x\lt -2 $ 时),Tanh 函数也会出现梯度饱和问题,即梯度趋近于 0 ,但相比 Sigmoid 函数,Tanh 函数在梯度饱和时的变化更为平缓。这使得在训练过程中,即使输入值进入了梯度饱和区域,模型的训练也不会像 Sigmoid 函数那样急剧恶化,仍然能够保持一定的训练效果 。
然而,Tanh 函数也并非完美无缺。它同样没有从根本上解决梯度饱和问题,当输入值过大或过小时,梯度仍然会趋近于 0 ,这在深层神经网络中会导致靠近输入层的神经元权重更新缓慢,影响模型的训练效果。Tanh 函数的计算过程涉及指数运算,这使得它的计算成本相对较高,在大规模数据集和深层网络的训练中,会增加计算资源的消耗和训练时间 。
在实际应用中,Tanh 函数常用于早期神经网络的隐藏层。在循环神经网络(RNN)中,Tanh 函数被广泛应用于隐藏层,因为 RNN 需要处理序列数据,Tanh 函数的对称输出特性能够更好地捕捉序列中的正负信息,帮助模型学习到序列数据之间的复杂依赖关系。在自然语言处理任务中,文本数据通常以序列的形式呈现,Tanh 函数可以对输入的词向量进行有效的变换,提取文本中的关键特征,从而提升模型在情感分析、机器翻译等任务中的性能 。
(三)与 Sigmoid 的关键区别
Tanh 函数与 Sigmoid 函数最直观的区别在于输出范围。**Sigmoid 函数的输出范围是 **$ (0,1) ∗ ∗ ,而 T a n h 函数的输出范围是 ∗ ∗ ** ,而 Tanh 函数的输出范围是 ** ∗∗,而Tanh函数的输出范围是∗∗ (-1,1) $
这个差异看似简单,却对神经网络的性能产生了重要影响。在隐藏层中,Tanh 函数的对称输出使得神经元的输出能够在正负两个方向上传递信息,避免了 Sigmoid 函数输出始终为正所带来的权重更新偏差问题。这就好比在一条信息传递的链条中,Tanh 函数能够让信息更加全面地在各个环节中流动,而 Sigmoid 函数可能会导致信息的传递出现偏向 。
在输出层的选择上,两者也有所不同。对于多分类任务,通常会使用 Softmax 函数作为输出层的激活函数,它能够将输出值转换为各个类别的概率分布 。但对于二分类任务,Sigmoid 函数仍然有其用武之地,因为它的输出可以直接解释为样本属于正类的概率 。而 Tanh 函数由于其输出范围和特性,一般不直接用于二分类任务的输出层 。
从梯度特性来看,虽然两者都存在梯度饱和问题,但 Tanh 函数在大部分定义域上的梯度大于 Sigmoid 函数。这使得 Tanh 函数在训练过程中能够更快地收敛,减少训练时间 。在计算复杂度方面,两者都涉及指数运算,但由于 Tanh 函数的输出范围和特性,在某些情况下,其计算效率可能会略高于 Sigmoid 函数 。
四、ReLU 函数:开启深度学习的非线性革命
(一)函数特性与数学表达
ReLU(修正线性单元)在现代深度学习中占据着举足轻重的地位,它的数学表达式简洁明了:$ f(x)=\max(0,x) $
这个式子的含义是:
- 当输入 $ x $ 大于 0 时,函数直接输出 $ x $ ;
- 当输入 $ x $ 小于等于 0 时,函数输出 0 。
从图像上看,ReLU 函数呈现出一种独特的分段线性曲线。
- 当 $ x \lt 0 $ 时,函数值恒为 0 ,图像与 $ x $ 轴重合;
- 当 $ x \gt 0 $ 时,函数值等于 $ x $ ,图像是一条斜率为 1 的直线。
这种简单而直观的函数形式,使得 ReLU 函数在神经网络中具有高效的计算特性。
与 Sigmoid 和 Tanh 函数相比,ReLU 函数的计算过程大大简化。Sigmoid 函数涉及指数运算,计算 $ e^{-x} $ 相对复杂;Tanh 函数同样需要进行指数运算来计算 $ \frac{e{x}-e{-x}}{e{x}+e{-x}} $ 。而 ReLU 函数只需要进行一次简单的比较操作,判断输入值是否大于 0 ,这在大规模的神经网络计算中,能够显著减少计算资源的消耗,提高计算效率。
(二)核心优势与应用场景
ReLU 函数最突出的优势之一是它完全避免了梯度饱和问题。在 Sigmoid 和 Tanh 函数中,当输入值较大或较小时,梯度会趋近于 0 ,导致在深层神经网络中出现梯度消失,使得靠近输入层的神经元权重难以更新。而 ReLU 函数在 $ x \gt 0 $ 的区域,梯度始终为 1 。这意味着在反向传播过程中,梯度能够稳定地传递到前面的层,不会因为多层传递而逐渐消失,从而大大加速了模型的收敛速度 。
在计算速度方面,ReLU 函数具有天然的优势。由于其简单的计算逻辑,仅需判断输入的符号,不需要进行复杂的指数运算,这使得它在处理大规模数据时,能够快速完成计算,节省大量的计算时间。在图像识别任务中,一张图片通常包含大量的像素点,经过多层神经网络处理时,如果使用计算复杂的激活函数,会极大地增加计算量和处理时间。而 ReLU 函数的高效计算特性,使得模型能够快速对图像进行特征提取和分类,提高了整个系统的运行效率 。
ReLU 函数还具有天然的稀疏性。在实际应用中,大约 50% 的神经元输出会为 0 ,这是因为当输入为负时,ReLU 函数的输出为 0 。这种稀疏性使得神经网络中的神经元激活呈现出稀疏状态,类似于生物神经元的部分激活特性。稀疏激活有诸多好处,一方面可以减少神经元之间的冗余连接,降低计算量;另一方面,能够减少参数之间的相互依存关系,从而有效缓解过拟合问题,提高模型的泛化能力 。
然而,ReLU 函数也并非完美无缺。它存在一个被称为 “死神经元” 的问题。当神经元的输入持续为负时,该神经元的输出将始终为 0 ,并且在反向传播过程中,其梯度也为 0 ,这就导致该神经元的权重无法得到更新,从而永久性地 “死亡” 。如果在训练过程中,学习率设置过高,可能会导致大量神经元进入这种 “死亡” 状态,严重影响模型的性能。
ReLU 函数在 0 点处不可导,这在使用基于梯度的优化算法时需要特殊处理。虽然在实际应用中,可以通过一些近似方法来解决这个问题,但不可导性仍然给模型的训练带来了一定的复杂性 。
ReLU 函数广泛应用于现代深层神经网络中,成为默认的隐藏层激活函数。在卷积神经网络(CNN)中,ReLU 函数被大量使用,通过卷积层和 ReLU 激活函数的组合,能够有效地提取图像的特征。在著名的 AlexNet、VGGNet、ResNet 等模型中,ReLU 函数都发挥了关键作用,帮助模型在图像分类、目标检测等任务中取得了优异的成绩 。
在 Transformer 架构中,ReLU 函数同样是不可或缺的一部分。Transformer 在自然语言处理领域取得了巨大的成功,如 BERT、GPT 等模型,它们利用 ReLU 函数增强了模型的非线性表达能力,能够更好地处理长序列依赖关系,对文本进行准确的理解和生成 。
(三)改进变种与优化策略
为了缓解 ReLU 函数的 “死神经元” 问题,研究人员提出了多种改进变种。Leaky ReLU 就是其中之一,它的数学表达式为 $ f(x)=\begin{cases}x, & x \gt 0 \ \alpha x, & x \leq 0\end{cases} $ ,其中 $ \alpha $ 是一个很小的正数,通常取值为 0.01 。Leaky ReLU 在输入为负时,不再将输出置为 0 ,而是乘以一个小的系数 $ \alpha $ ,这样即使输入为负,神经元仍然有微弱的激活,避免了神经元 “死亡” 。
PReLU(参数化 ReLU)则进一步改进了 Leaky ReLU,它将 $ \alpha $ 变成了一个可学习的参数。在训练过程中,模型可以根据数据自动调整 $ \alpha $ 的值,从而更加灵活地适应不同的数据分布,提高模型的性能 。
在实际应用中,为了避免 ReLU 函数的 “死神经元” 问题,除了使用这些改进变种外,还需要合理控制学习率。学习率过大容易导致神经元 “死亡”,而过小则会使模型收敛速度过慢。通常可以采用一些自适应学习率的优化算法,如 Adagrad、Adadelta、Adam 等,这些算法能够根据参数的更新情况自动调整学习率,在一定程度上减少 “死神经元” 问题的发生 。
五、如何选择合适的激活函数?
在实际的深度学习应用中,选择合适的激活函数是一个关键步骤,它直接影响着模型的性能、训练效率以及泛化能力。不同的任务类型和网络结构对激活函数的需求各不相同,下面我们就从任务类型、网络结构以及一些避坑指南等方面来详细探讨如何选择合适的激活函数。
(一)按任务类型选择
二分类输出层:**在二分类任务中,Sigmoid 函数是一个经典的选择。**由于 Sigmoid 函数的输出范围在 (0,1) 之间,它可以自然地表示样本属于正类的概率 。在图像的二分类任务中,判断一张图片是猫还是狗,通过 Sigmoid 函数输出图片是猫的概率,当概率大于 0.5 时,就认为图片中的动物是猫,否则是狗。为了避免梯度消失问题,在输出层搭配交叉熵损失函数是非常必要的。交叉熵损失函数能够有效地衡量预测概率与真实标签之间的差异,在反向传播过程中,它与 Sigmoid 函数结合,可以避免梯度消失,使得模型能够更好地收敛 。
多分类输出层:对于多分类任务,Softmax 函数是最常用的激活函数。Softmax 函数将神经网络的输出转换为各个类别的概率分布,并且这些概率之和为 1 。假设我们有一个图像分类任务,要识别图片中的物体是猫、狗还是兔子,经过神经网络的计算后,再通过 Softmax 函数处理,就可以得到图片分别属于猫、狗、兔子这三个类别的概率,概率最大的类别就是模型的预测结果 。这里需要注意将 Softmax 函数与 Sigmoid 函数区分开来。
**Sigmoid 函数主要用于二分类任务,它输出的是一个概率值,表示样本属于正类的概率 。**而 Softmax 函数用于多分类任务,它将多个输出值转换为各个类别的概率分布,这些概率之间相互关联,总和为 1 。在一个三分类任务中,Sigmoid 函数会对每个类别分别计算一个概率值,这些概率值之间没有必然的联系,总和也不一定为 1 ;而 Softmax 函数会综合考虑所有类别,计算出每个类别相对于其他类别的概率,最终所有类别的概率之和为 1 。
**隐层首选:在隐藏层中,ReLU 函数通常是默认的首选。**ReLU 函数具有计算简单、能够有效避免梯度饱和问题、加速模型收敛等优点,还能使网络产生稀疏激活,减少参数之间的相互依存关系,缓解过拟合问题 。在卷积神经网络(CNN)中,大量的隐藏层使用 ReLU 函数,能够快速地提取图像的特征,提高模型的训练效率和准确性 。但是,如果在训练过程中发现死神经元问题严重,导致模型性能下降,就可以考虑换用 Leaky ReLU 或 Tanh 函数。
Leaky ReLU 通过在输入为负时给予一个小的非零输出,避免了神经元的 “死亡” 。
Tanh 函数则适用于一些浅层网络,它的对称输出特性在处理某些数据时能够表现出较好的性能 。在一些简单的图像分类任务中,如果使用 ReLU 函数出现了较多的死神经元,导致模型对某些特征的学习能力下降,这时可以尝试使用 Leaky ReLU 函数,为负输入提供一定的梯度,使得神经元能够正常更新权重,提升模型的性能 。
(二)按网络结构选择
深层网络:当网络层数大于 5 层时,必须使用 ReLU 系激活函数,如 ReLU、Leaky ReLU、PReLU 等。
这是因为在深层网络中,梯度消失问题会变得非常严重,如果使用 Sigmoid 或 Tanh 函数,梯度在反向传播过程中会迅速趋近于 0 ,导致靠近输入层的神经元权重几乎无法更新,使得模型难以训练 。而 ReLU 系激活函数在正区间的梯度为常数,能够有效地避免梯度消失问题,保证梯度在网络中的稳定传播,使得深层网络能够正常训练 。在著名的 ResNet 网络中,通过使用 ReLU 激活函数,成功地训练了高达 152 层的网络,在图像分类任务中取得了优异的成绩 。
循环网络:在循环网络(RNN/LSTM)中,早期常用 Tanh 函数作为激活函数。
这是因为 Tanh 函数的对称输出特性能够较好地捕捉序列数据中的正负信息,帮助模型学习到序列数据之间的复杂依赖关系 。在自然语言处理任务中,文本数据以序列的形式呈现,Tanh 函数可以对输入的词向量进行有效的变换,提取文本中的关键特征 。然而,随着研究的发展,当前在循环网络中也更倾向于使用 ReLU 的变种,如 Leaky ReLU 等。这些变种在一定程度上解决了 ReLU 函数的死神经元问题,同时保持了 ReLU 函数的优点,使得循环网络在处理长序列数据时能够表现出更好的性能 。在处理长文本的情感分析任务时,使用 Leaky ReLU 作为循环网络的激活函数,可以避免死神经元问题,更好地捕捉文本中的情感信息,提高情感分析的准确率 。
(三)避坑指南
避免在隐层使用 Sigmoid/Tanh:除非有特殊的正则化需求,一般应避免在隐藏层使用 Sigmoid 和 Tanh 函数。这两个函数存在梯度饱和问题,在深层网络中会导致梯度消失,使得模型的训练变得非常困难 。它们的计算复杂度相对较高,涉及指数运算,会增加模型的训练时间和计算资源消耗 。
输出层激活函数与损失函数匹配:输出层的激活函数需要与损失函数进行正确匹配。Sigmoid 函数搭配二元交叉熵损失函数(BCELoss)适用于二分类任务,Softmax 函数搭配交叉熵损失函数适用于多分类任务 。如果不进行正确匹配,可能会导致模型的训练不稳定,无法收敛到较好的结果 。在一个多分类任务中,如果错误地使用 Sigmoid 函数作为输出层激活函数,并且搭配了均方误差损失函数,就会使得模型的训练效果很差,无法准确地进行分类 。
结语:激活函数的 “进化” 与未来方向
回顾激活函数的发展历程,从早期的 Sigmoid 和 Tanh 函数,到如今 ReLU 及其变种在深度学习领域的广泛应用,我们见证了激活函数不断演进以适应神经网络发展的需求。每一种激活函数的出现都伴随着对前一种函数局限性的突破,Sigmoid 函数为神经网络引入了非线性,但因其梯度消失和输出非零中心的问题,在深层网络中表现不佳;Tanh 函数虽解决了输出对称问题且收敛速度略快,但仍未摆脱梯度饱和的困扰;ReLU 函数的诞生则开启了深度学习的新纪元,其简单高效、有效避免梯度饱和等特性,使其成为现代神经网络的首选。
图片来源网络