1. SiLU 激活函数的数学定义与计算方式
SiLU(Sigmoid Linear Unit)激活函数,也被称为 Swish 激活函数(当 Swish 函数中的参数 β = 1 时),是一种近年来在深度学习中受到广泛关注的激活函数。它由 Google 的研究人员提出,旨在结合 Sigmoid 函数的平滑性和 ReLU 函数的稀疏激活特性,以期在模型性能和训练稳定性上取得更好的效果 。SiLU 函数通过将输入与其自身的 Sigmoid 变换相乘来工作,这种自门控机制使其能够自适应地调节信息流,从而在多种任务中展现出优越性 。
1.1. SiLU 的数学公式
SiLU 激活函数的数学定义如下:
[ \text{SiLU}(x) = x \cdot \sigma(x) ]
其中,(x) 是输入值,(\sigma(x)) 是 Sigmoid 函数,其定义为:
[ \sigma(x) = \frac{1}{1 + e^{-x}} ]
因此,SiLU 函数也可以写成:
[ \text{SiLU}(x) = x \cdot \frac{1}{1 + e^{-x}} = \frac{x}{1 + e^{-x}} ]
这个公式清晰地展示了 SiLU 函数如何将线性输入 (x) 与一个由 Sigmoid 函数控制的「门」值相乘。当输入 (x) 为正且较大时,Sigmoid 函数的值趋近于 1,此时 SiLU 函数的输出接近于 (x) 本身,表现出类似 ReLU 的特性。当输入 (x) 为负且绝对值较大时,Sigmoid 函数的值趋近于 0,使得 SiLU 函数的输出也趋近于 0。在 (x=0) 附近,SiLU 函数提供了一个平滑的过渡,其输出值介于 0 和输入值之间,由 Sigmoid 函数的具体值决定 。这种设计使得 SiLU 函数在处理不同范围的输入时,能够展现出不同的响应特性,从而增强了模型的表达能力。SiLU 函数的值域为 (-∞, ∞),这意味着它能够处理任意范围的输入值,并且在正负输入范围内都有输出,这与 ReLU 仅在正区间有非零输出不同 。
1.2. SiLU 的导函数
SiLU 激活函数的导数对于模型的训练至关重要,它直接影响梯度反向传播的过程。SiLU 函数的导数可以通过对 ( \text{SiLU}(x) = x \cdot \sigma(x) ) 应用乘积法则求得:
[ \text{SiLU}'(x) = \frac{d}{dx} (x \cdot \sigma(x)) = \sigma(x) + x \cdot \sigma'(x) ]
其中,(\sigma'(x)) 是 Sigmoid 函数的导数,其表达式为 (\sigma(x) \cdot (1 – \sigma(x)))。将这个表达式代入上式,可以得到 SiLU 函数的导数:
[ \text{SiLU}'(x) = \sigma(x) + x \cdot \sigma(x) \cdot (1 – \sigma(x)) ]
这个导数公式揭示了 SiLU 函数在不同输入区间的梯度特性 :
- 当 (x \gg 0) (正区间且输入值较大) 时,(\sigma(x) \approx 1),且 (1 – \sigma(x) \approx 0),因此 (\text{SiLU}'(x) \approx 1)。这表明在正区间,SiLU 的梯度接近于 1,类似于 ReLU 函数,有助于缓解梯度消失问题。
- 当 (x \ll 0) (负区间且输入值较小) 时,(\sigma(x) \approx 0),但 (x \cdot \sigma(x) \cdot (1 – \sigma(x))) 这一项虽然也趋近于 0,但它保留了微弱的梯度,这与 ReLU 在负区间梯度恒为 0 不同。这种非零梯度有助于防止神经元「死亡」。
- 当 (x \approx 0) (零点附近) 时,(\sigma(0) = 0.5),导数值约为 (0.5 + x \cdot 0.25)。这表明在零点附近,SiLU 的梯度是平滑过渡的,约为 0.5,这有助于训练的稳定性 。
SiLU 函数的导数在整个定义域内是连续的,这得益于 Sigmoid 函数本身的平滑性。这种平滑的导数特性对于基于梯度的优化算法(如梯度下降)非常有利,可以使训练过程更加稳定和高效 。
2. SiLU 激活函数的主要特点与优势
SiLU 激活函数因其独特的数学特性,在深度学习中展现出多方面的优势,尤其是在与传统的 ReLU 和 Sigmoid 激活函数进行比较时。这些特点使其在处理复杂数据和深层网络结构时表现更为出色。
2.1. 平滑性与非单调性
SiLU 函数的一个显著特点是其平滑性 (smoothness)。与 ReLU 函数在 (x=0) 处不可导(尽管在实践中通常指定一个次梯度)不同,SiLU 函数在整个实数域上是连续可导的 。这种平滑性源于其定义中包含的 Sigmoid 函数,Sigmoid 函数本身是平滑的。平滑的激活函数意味着其导数也是连续的,这对于基于梯度的优化算法非常重要。在反向传播过程中,平滑的梯度可以使得权重更新更加稳定,减少震荡,从而有助于模型更快地收敛到更好的局部最优解或全局最优解 。
另一个重要特性是 SiLU 函数的非单调性 (non-monotonicity)。虽然 ReLU 函数在正区间是单调递增的,在负区间恒为 0,但 SiLU 函数在负区间表现出非单调的行为。具体来说,当输入 (x) 为较小的负值时,SiLU 函数的输出会先略微下降(变为负值),然后再逐渐回升并趋近于 0 。这种非单调性使得 SiLU 函数能够捕捉到更复杂的模式,因为它允许在负输入区域存在一定的「反弹」或「抑制后再激活」的效应。这种特性被认为可以增强模型的表达能力,创造出更丰富的梯度景观,从而有助于模型学习更复杂的特征 。例如,当 (x \approx -1.278) 时,SiLU 函数达到其全局最小值,约为 (-0.278) 。这种轻微的负向响应可能在某些情况下起到隐式正则化的作用,有助于抑制过大的权重。
2.2. 梯度特性与避免梯度消失
SiLU 激活函数在梯度特性方面表现优越,能够有效缓解深度神经网络中常见的梯度消失问题。梯度消失是指在深层网络中,反向传播时梯度值逐层减小,导致靠近输入层的网络权重更新缓慢甚至停止更新的现象。SiLU 函数通过其设计在一定程度上缓解了这个问题。
在正输入区域 ((x > 0)),当 (x) 较大时,SiLU 函数的导数 (\text{SiLU}'(x) \approx 1) 。这与 ReLU 函数在正区间的梯度为 1 类似,保证了正向激活时梯度的有效传递,避免了因激活函数饱和导致的梯度减小。这种线性特性有助于维持梯度的大小,使得深层网络能够被有效地训练。
在负输入区域 ((x < 0)),SiLU 函数与 ReLU 的一个关键区别在于其梯度并非恒为 0。虽然 Sigmoid 函数 (\sigma(x)) 在 (x) 为较大的负数时趋近于 0,导致 (x \cdot \sigma(x)) 也趋近于 0,但其导数 (\text{SiLU}'(x) = \sigma(x) + x \cdot \sigma(x) \cdot (1 – \sigma(x))) 中的 (\sigma(x)) 项和 (x \cdot \sigma(x) \cdot (1 – \sigma(x))) 项虽然都很小,但并非完全为 0(除非 (x \to -\infty))。这意味着即使在负输入时,SiLU 仍然保留了微弱的梯度 。这种「软」关闭特性,而不是 ReLU 的「硬」关闭(梯度直接为 0),有助于防止所谓的「神经元死亡」问题。在 ReLU 中,如果一个神经元在训练过程中大部分时间都输出负值,其梯度将始终为 0,导致该神经元的权重无法更新,从而永久失效。SiLU 的微弱负梯度使得这些神经元仍有被重新激活的可能,提高了模型的鲁棒性和参数利用率。
此外,SiLU 函数在 (x=0) 附近的平滑过渡也对其梯度特性有利。导数的连续性避免了 ReLU 在 (x=0) 处导数不定义(或次梯度不连续)可能带来的问题,使得梯度下降过程更加平滑和稳定 。这些综合的梯度特性使得 SiLU 在深层网络中表现良好,能够更有效地进行训练并学习复杂的特征。
2.3. 与 ReLU 激活函数的比较
SiLU 激活函数与广泛使用的 ReLU(Rectified Linear Unit)激活函数相比,具有多方面的改进和优势,这些差异主要体现在平滑性、负区间处理以及梯度特性上。
首先,平滑性是 SiLU 区别于 ReLU 的一个核心特征。ReLU 函数 (f(x) = \max(0, x)) 在 (x=0) 处是不可导的(尽管在实现中通常会指定一个次梯度,例如 0 或 1),其导数在 (x<0) 时为 0,在 (x>0) 时为 1。这种不连续性可能导致训练过程中的不稳定性,尤其是在学习率较大或网络初始化不当时。相比之下,SiLU 函数 (f(x) = x \cdot \sigma(x)) 由于其 Sigmoid 分量的存在,在整个实数域上是连续可导的,其导数 (\text{SiLU}'(x) = \sigma(x) + x \cdot \sigma(x) \cdot (1 – \sigma(x))) 也是平滑的 。这种平滑性有助于梯度下降等优化算法更稳定地收敛,减少训练过程中的震荡。
其次,在负区间的处理上,SiLU 和 ReLU 有显著不同。ReLU 对于所有负输入,其输出均为 0,梯度也为 0。这导致了所谓的「Dying ReLU」问题(神经元死亡问题):一旦一个神经元在训练过程中因为权重更新或输入特性导致其输出始终为负,那么该神经元的梯度将永远为 0,其权重将不再更新,该神经元实质上「死亡」并停止对模型的学习做出贡献 。SiLU 函数在负区间则表现出不同的行为:当 (x<0) 时,SiLU 的输出 (x \cdot \sigma(x)) 虽然也趋近于 0,但其导数 (\text{SiLU}'(x)) 并非完全为 0(除非 (x \to -\infty)),而是保留了一个微小的负梯度 。这种设计使得即使神经元在初始阶段或训练过程中输出了负值,它仍然有机会通过微小的梯度更新来恢复活性,从而避免了神经元死亡的问题,提高了模型的鲁棒性和参数利用效率。
再者,梯度特性方面,虽然 ReLU 在正区间的梯度恒为 1,有效缓解了梯度消失问题,但其在负区间的零梯度是导致神经元死亡的主要原因。SiLU 通过在负区间保留微弱梯度,并结合其在正区间类似 ReLU 的梯度特性(导数接近 1),在整体上提供了更优的梯度流。SiLU 的平滑导数也避免了 ReLU 在 (x=0) 处可能存在的梯度爆炸或不稳定的风险(如果使用次梯度处理不当)。
此外,SiLU 的非单调性(在负区间先下降后上升)也为其带来了潜在的优势,可能使其能够学习到比 ReLU 更复杂的模式 。经验研究表明,在许多深度学习任务和模型架构中,用 SiLU 替换 ReLU 可以带来模型准确率的提升,尤其是在深度架构中 。然而,SiLU 的计算成本略高于 ReLU,因为它需要计算 Sigmoid 函数 。尽管如此,其带来的性能提升往往可以弥补这一额外的计算开销。
总结来说,与 ReLU 相比,SiLU 的主要优势在于其平滑性、避免了神经元死亡问题、以及在负区间保留了有益的梯度信息,这些特性使其在深层网络和复杂任务中通常能获得更好的性能。
2.4. 与 Sigmoid 激活函数的比较
SiLU 激活函数与传统的 Sigmoid 激活函数在数学形式和应用效果上既有联系也有显著区别。Sigmoid 函数 (\sigma(x) = \frac{1}{1 + e^{-x}}) 将输入压缩到 (0, 1) 区间,曾经是神经网络中非常流行的激活函数,尤其常用于二分类问题的输出层,因为它可以将输出解释为概率 。然而,Sigmoid 函数在深度神经网络中作为隐藏层的激活函数时,存在一些严重的缺陷,而 SiLU 的设计在一定程度上克服了这些缺陷。
最核心的区别在于梯度消失问题。Sigmoid 函数的导数 (\sigma'(x) = \sigma(x) \cdot (1 – \sigma(x))) 在输入 (x) 的绝对值较大时(即当 (\sigma(x)) 接近 0 或 1 时)会变得非常小,最大值也仅为 0.25(当 (x=0) 时)。在深层网络中,当多个 Sigmoid 激活函数串联时,这些小梯度在反向传播过程中会不断相乘,导致靠近输入层的梯度指数级减小,最终使得这些层的权重更新非常缓慢甚至停止,这就是梯度消失问题。这使得使用 Sigmoid 激活函数的深层网络难以训练。SiLU 函数虽然也包含了 Sigmoid 函数,但其导数为 (\text{SiLU}'(x) = \sigma(x) + x \cdot \sigma(x) \cdot (1 – \sigma(x)))。在正区间 ((x > 0)),当 (x) 较大时,第一项 (\sigma(x) \approx 1),即使第二项很小,整体导数仍然接近 1,这类似于 ReLU 的特性,有效缓解了梯度消失 。在负区间,虽然梯度较小,但并非完全消失,这比 Sigmoid 在饱和区的零梯度要好。
其次,输出范围和计算效率也是两者差异的体现。Sigmoid 函数的输出范围是 (0, 1),这意味着其输出恒为正,这可能导致后续层输入的分布发生偏移,影响训练效率(虽然不是零中心化问题,但输出全正也可能带来问题)。SiLU 函数的输出范围是 ((-0.278, +\infty)) ,它可以在负输入时产生负输出,这使得其输出分布更灵活。在计算效率方面,Sigmoid 函数本身涉及指数运算,计算成本较高。SiLU 函数同样需要计算 Sigmoid,因此其计算成本也高于 ReLU,但与 Sigmoid 本身的计算成本相当或略高(因为 SiLU 还多了一次乘法)。
此外,饱和性问题也是 Sigmoid 函数的一大缺点。当输入 (x) 的绝对值很大时,Sigmoid 函数会进入饱和区,输出接近 0 或 1,此时梯度几乎为 0。这种饱和性不仅导致梯度消失,还可能使得模型对输入的微小变化不敏感。SiLU 函数在正区间 ((x \to +\infty)) 的输出是 (x \cdot \sigma(x) \approx x \cdot 1 = x),它不会饱和,而是线性增长,这保留了输入的幅度信息。在负区间,虽然 (x \cdot \sigma(x)) 会趋近于 0,但其非单调性使得它在饱和前有一个「反弹」,这可能比直接饱和到 0 更有益。
总结来说,SiLU 借鉴了 Sigmoid 函数的平滑特性,但通过将其与线性输入相乘,显著改善了 Sigmoid 函数在深度网络中作为隐藏层激活函数时的主要缺点,特别是梯度消失和饱和性问题。SiLU 更适用于深度网络的隐藏层,而 Sigmoid 由于其输出范围和概率解释,更多用于特定的输出层场景或作为门控机制(如在 LSTM 或 GRU 中)。
下表总结了 SiLU 与 ReLU 和 Sigmoid 的主要区别:
特性 | SiLU (Swish) | ReLU | Sigmoid |
---|---|---|---|
数学公式 | (x \cdot \sigma(x)) | (\max(0, x)) | (\frac{1}{1 + e^{-x}}) |
平滑性 | 连续可导,处处平滑 | 在 (x=0) 处不可导 (次梯度) | 连续可导,处处平滑 |
非单调性 | 是 (负区间有全局最小值) | 否 (单调递增) | 否 (单调递增) |
负值处理 | 非零输出,非零梯度 | 输出为 0,梯度为 0 (可能导致神经元死亡) | 输出接近 0,梯度接近 0 (梯度消失) |
正值处理 | 类似 ReLU (输出接近 (x),梯度接近 1) | 输出为 (x),梯度为 1 | 输出接近 1,梯度接近 0 (梯度消失) |
梯度消失 | 有效缓解 | 在正区间缓解,负区间导致神经元死亡 | 严重问题 |
计算成本 | 较高 (涉及 Sigmoid 和乘法) | 非常低 | 较高 (涉及指数运算) |
主要优势 | 平滑,避免神经元死亡,强表达能力 | 计算简单,正区间梯度稳定 | 输出 (0,1),可用于概率输出/门控 |
主要缺点 | 计算成本略高 | 神经元死亡,(x=0) 处不平滑 | 梯度消失,输出非零中心,易饱和 |
Table 1: SiLU 与 ReLU 和 Sigmoid 激活函数的比较
3. SiLU 激活函数在深度学习中的应用场景
SiLU 激活函数凭借其平滑性、非单调性以及良好的梯度特性,在多种深度学习任务和模型架构中都得到了应用,并展现出优越的性能。它通常被用作隐藏层的激活函数,以替代传统的 ReLU 及其变体。
3.1. 在卷积神经网络 (CNN) 中的应用
SiLU 激活函数在卷积神经网络 (CNN) 中得到了广泛的应用,并取得了积极的效果。CNN 是计算机视觉任务中的核心架构,其性能很大程度上依赖于激活函数的选择。传统的 CNN 通常使用 ReLU 作为激活函数,但 ReLU 存在神经元死亡和零中心化等问题。SiLU 通过其平滑性和在负区间保留微弱梯度的特性,为 CNN 提供了更好的选择。
在 CNN 的卷积层之后使用 SiLU 激活函数,可以帮助网络学习更复杂和鲁棒的特征。其平滑性有助于梯度的稳定传播,使得深层 CNN 更容易训练。同时,SiLU 的非单调性可能使得网络能够捕捉到一些 ReLU 难以察觉的细微模式,这对于图像识别、物体检测等任务中复杂特征的提取是有益的。例如,在一些图像分类任务中,将 ReLU 替换为 SiLU 可以观察到模型准确率的提升 。SiLU 的自门控机制,即使用输入自身的 Sigmoid 变换来调制输入,使得网络能够自适应地决定信息的通过量,这对于处理图像中不同区域的重要性差异是有帮助的。
此外,SiLU 在 CNN 中的应用也体现在一些先进的模型架构中。例如,EfficientNet 等高效网络架构中就采用了 SiLU(或其变体 Swish)作为激活函数,以在保持较高精度的同时降低模型的计算量和参数量 。这表明 SiLU 不仅能够提升性能,还能与模型结构设计相结合,共同推动 CNN 的发展。在训练深度 CNN 时,SiLU 的引入通常能够带来更稳定的训练过程和更好的收敛结果,尤其是在网络层数较深、数据复杂度较高的情况下。在 ConvNeXt 等现代卷积神经网络架构中,虽然原始论文可能主要关注架构设计,但激活函数的选择也是提升性能的关键因素之一。SiLU 作为一种先进的激活函数,可以被整合到各种 CNN 架构中,以替代 ReLU。在视觉任务中,SiLU 因其能够增强特征提取的性能而受到关注 。例如,在 YOLOv7-tiny 的改进模型中,将主干网络中的 LeakyReLU 激活函数替换为 SiLU,因为 SiLU 在零点附近更加平滑,可导性更强,便于梯度计算更新,从而增强了特征提取网络的性能 。此外,SiLU 也被应用于 Swin Transformer 等视觉模型中,其简单高效的特点使其逐渐成为 ReLU 的替代者 。这些应用案例表明,SiLU 能够有效地提升 CNN 在图像分类、目标检测等任务上的性能。
3.2. 在目标检测任务中的应用 (以 YOLO 系列为例)
SiLU(Sigmoid Linear Unit)激活函数因其独特的性质,在目标检测领域,特别是 YOLO (You Only Look Once) 系列模型中得到了广泛的应用和验证。YOLO 系列模型作为单阶段目标检测算法的代表,以其高效率和良好的检测精度而闻名。在 YOLOv5 和 YOLOv7 等版本中,SiLU 激活函数被用作默认或可选的激活函数,以提升模型的性能。例如,在 YOLOv5 的原始实现中,Conv 卷积模块的激活函数就采用了 SiLU 。研究表明,将 YOLOv5 中的所有激活函数替换为 SiLU 激活函数,可以在目标检测任务中带来性能的提升。具体来说,在嵌入式平台上的实验结果显示,使用 SiLU 激活函数可以将 mAP@.5 和 mAP@.5:.95 分别提升 0.5% 和 0.3%,同时推理速度仅减少 0.4 ms 。这表明 SiLU 在提升精度的同时,对计算资源的消耗增加不大,使其成为资源受限场景下的一个有利选择。
在 YOLOv7 中,SiLU 激活函数同样扮演了重要角色。根据 YOLOv7 论文的实验设置,除了面向边缘 GPU 的 YOLOv7-tiny 模型使用 Leaky ReLU 作为激活函数外,其他模型均使用 SiLU 作为激活函数 。这种设计选择进一步证明了 SiLU 在通用 GPU 和云 GPU 等计算能力较强的平台上的有效性。SiLU 的平滑性和非单调性有助于模型更好地学习复杂的特征表示,从而提高检测精度。例如,在 YOLOv7 的实验中,YOLOv7-tiny SiLU 与 YOLOv5-N (r6.1) 相比,在保持较高推理速度的同时,AP 准确率提高了 10.7% 。此外,YOLOv7-X 模型在使用 SiLU 激活函数的情况下,与使用相似规模但可能采用不同激活函数的 YOLOv5-X (r6.1) 相比,推理速度更快,参数量和计算量更少,同时 AP 也更高 。这些实验结果充分说明了 SiLU 激活函数在提升 YOLO 系列模型性能方面的积极作用,尤其是在平衡精度和速度方面表现出色。YOLOX 模型也选用了 SiLU 作为其激活函数 。YOLOX 基于 YOLOv3 和 YOLOv5 进行改进,同样采用了 CSPNet 和 PANet 结构,并遵循缩放规则设计了不同大小的模型,SiLU 是其标准配置之一 。
尽管 SiLU 在 YOLO 系列中表现出色,但也有研究探索了其他激活函数或对 SiLU 进行修改以进一步提升性能。例如,有研究提出将 YOLOv5 中 SPPF 结构内的 SiLU 激活函数替换为 LeakyReLU,旨在提升模型的检测速度 。另一项研究在改进 YOLOv7 时,将 SiLU 激活函数替换为 FReLU (Funnel Activation Function),以提高对缺陷特征的空间敏感性,并结合其他改进措施,使得改进后的 YOLOv7-FSE 算法在飞机复合材料缺陷红外检测任务中,精确度 (P. 和 mAP 均有显著提升 。这些研究表明,虽然 SiLU 是一个强大的激活函数,但在特定应用场景下,结合任务特性进行激活函数的选择或改进仍然是值得探索的方向。然而,这些改进往往是在 SiLU 等现有优秀激活函数的基础上进行的,也从侧面印证了 SiLU 作为基准激活函数的地位和价值。✅
3.3. 在大型语言模型 (LLM) 中的相关应用 (SwiGLU 与 SiLU 的关系)
在大型语言模型 (LLM) 领域,激活函数的选择对模型性能有着至关重要的影响。虽然 SiLU 激活函数本身并未被主流 LLM(如 LLaMA 系列)直接用作标准的隐藏层激活函数,但其核心思想和一个重要的变体——SwiGLU (Swish-Gated Linear Unit) 激活函数,在 LLM 的前馈网络 (Feed-Forward Network, FFN) 模块中得到了广泛的应用 。
SwiGLU 激活函数可以看作是 SiLU 的一个扩展或门控版本。SiLU 的数学形式是 (x \cdot \sigma(x)),其中 (\sigma(x)) 是 Sigmoid 函数。SwiGLU 的数学形式通常定义为 (\text{SwiGLU}(x, W, V, b, c) = (\text{Swish}(xW + b) \otimes (xV + c))),其中 (\text{Swish}(x) = x \cdot \sigma(x)) (即 SiLU),(\otimes) 表示逐元素乘法 (Hadamard product),(W, V. 是权重矩阵,(b, c) 是偏置项。可以看到,SwiGLU 使用了 SiLU (Swish) 作为其门控机制的一部分,对输入 (x) 的一个线性变换结果进行调制。✅
LLaMA 和 LLaMA2 模型在其 FFN 模块中就明确使用了 SwiGLU 激活函数 。FFN 模块是 Transformer 架构(LLM 的基础)中的关键组成部分,负责对自注意力层的输出进行非线性变换和特征提取。SwiGLU 的引入旨在提升 FFN 的表达能力和训练效率。通过使用 SiLU (Swish) 作为门控函数,SwiGLU 能够更灵活地控制信息的流动,类似于 LSTM 或 GRU 中的门控机制。这种门控机制有助于模型学习更复杂的依赖关系,并可能缓解梯度消失等问题。许多知名的 LLM,如 PaLM 、DeepSeek LLM 和 Qwen 1.5 等,均采用了 SwiGLU 作为其激活函数 。
因此,虽然 SiLU 本身不直接是 LLM 的主流选择,但其核心思想(即输入与自身的 Sigmoid 变换相乘)通过 SwiGLU 的形式在 LLM 中发挥了重要作用。可以说,SiLU 的特性(如平滑性、非单调性、自门控)间接地通过 SwiGLU 贡献于 LLM 的强大性能。主流 LLM 的 FFN 模块倾向于使用 SiLU 或其变体(如 SwiGLU)作为激活函数,而不是传统的 ReLU 或 GELU,这反映了这类激活函数在处理大规模语言数据时的优势 。这种选择也体现了激活函数研究在推动 LLM 发展中的重要性。
4. SiLU 激活函数的实际效果与性能表现
SiLU 激活函数因其理论上的优势,在多种深度学习模型和任务中都得到了验证,并展现出良好的性能表现。以下将重点介绍其在 YOLO 系列目标检测模型和 LLaMA 等大型语言模型中的应用效果。
4.1. 在 YOLO 系列模型中的应用效果
SiLU 激活函数在 YOLO (You Only Look Once) 系列目标检测模型中的应用,展现了其在提升模型精度和收敛速度方面的积极效果。YOLO 系列模型因其在速度和精度之间的良好平衡而广受欢迎,而激活函数的选择是优化其性能的关键环节之一。
在 YOLOv5 中,SiLU 被采纳为标准激活函数之一。研究和实践表明,与传统的 ReLU 或其变体相比,SiLU 能够为 YOLOv5 带来更高的检测精度和更快的训练收敛速度 。SiLU 结合了线性变换和 Sigmoid 函数的优点,增强了模型的非线性表达能力,这对于捕捉目标检测任务中复杂的视觉模式至关重要。同时,SiLU 有助于缓解梯度消失问题,使得深层网络能够更有效地进行训练 。一项针对 YOLOv5-S 模型的消融实验进一步量化了 SiLU 的效果:当将所有激活函数替换为 SiLU 后,模型的 mAP@.5 提升了 0.5%,mAP@.5:.95 提升了 0.3% 。尽管这伴随着推理速度的轻微下降(减少了 0.4 ms),但精度的提升在许多应用场景下是更为重要的。YOLOv5 的官方实现中,Conv 卷积模块默认采用 SiLU 激活函数 。
YOLOv7 及其改进版本也广泛采用了 SiLU 激活函数。例如,在一个针对 YOLOv7-tiny 的改进模型中,研究人员将主干网络中的 LeakyReLU 激活函数替换为 SiLU 。这种替换的理由是 SiLU 在零点附近更加平滑,可导性更强,这有利于梯度的计算和更新,从而增强了特征提取网络的性能。SiLU 的自稳定性和对权重的缓冲作用也被认为是其优势 。在另一个基于改进 YOLOv7-FSE 算法的飞机复合材料缺陷红外检测研究中,虽然其主要创新点是将 SiLU 替换为 FReLU 以提升对缺陷特征的空间敏感性,但这从侧面印证了 SiLU 是 YOLOv7 中一个值得关注和优化的基础组件 。YOLOv7 的论文明确指出,除了针对边缘计算设备优化的 YOLOv7-tiny 版本外,其他所有版本的 YOLOv7,包括标准的 YOLOv7、YOLOv7-X. YOLOv7-W6 等,均统一采用 SiLU 作为激活函数 。实验结果也证实了这一点。例如,在 Ultralytics 提供的 YOLOv7 文档中,YOLOv7 被描述为在速度和准确性方面均超越了之前的目标检测器 。具体来说,✅YOLOv7 在 GPU V100 上,在 30 FPS 或更高的所有已知实时目标检测器中,取得了最高的准确率(56.8% AP)。比较 YOLOv7-Tiny-SiLU 与 YOLOv5-N (r6.1),前者在速度上快 127 FPS,AP 准确率高 10.7% 。YOLOv7-X 与 YOLOv5-X (r6.1) 相比,推理速度快 31 FPS,参数减少 22%,计算量减少 8%,AP 提高 2.2% 。
YOLOX 模型同样选择了 SiLU 作为其激活函数 。YOLOX 的设计借鉴了 YOLOv3 和 YOLOv5,并采用了 CSPNet 和 PANet 等结构,SiLU 是其激活函数的标准选择之一,这进一步证明了 SiLU 在目标检测领域的有效性和通用性 。总体而言,SiLU 激活函数因其在深层模型上的优异表现,被广泛应用于 YOLO 系列及其变体中,为提升目标检测的精度和鲁棒性做出了贡献 。尽管在特定硬件(如 NPU)上,由于算子融合的限制,SiLU 可能不如 ReLU 高效 ,但在通用计算平台上,其带来的精度增益通常是值得的。一些实验也对比了 SiLU 与其他激活函数(如 ReLU)的组合使用效果。例如,在 YOLOX 模型中,全部使用 SiLU 激活函数会导致推理速度较低,因此尝试了 ReLU 与 SiLU 组合的方案,即在大部分层使用 ReLU,而在特定层(如 stride 为 2 的 Conv、SPP、C3 中的最后一个 Conv)使用 SiLU。实验结果表明,这种 ReLU+SiLU 的组合方式在推理速度和 mAP 值之间取得了较好的平衡,相比全部使用 SiLU,mAP 略有下降(约 1.1 个点),但推理速度有所提升;相比全部使用 ReLU,mAP 则有明显提升(约 1 个点)。
4.2. 在 LLaMA 等大型语言模型中的间接应用与效果
在大型语言模型 (LLM) 领域,如 LLaMA 和 LLaMA2,SiLU 激活函数并非直接作为标准的隐藏层激活函数被广泛采用。然而,其核心思想和一种重要的变体——SwiGLU (Swish-Gated Linear Unit) 激活函数,在 LLM 的前馈网络 (Feed-Forward Network, FFN) 模块中扮演了关键角色,从而间接体现了 SiLU 相关技术的应用效果 。
LLaMA 和 LLaMA2 模型的 FFN 模块明确使用了 SwiGLU 激活函数 。SwiGLU 的数学形式通常为 (\text{SwiGLU}(x, W, V, b, c) = (\text{Swish}(xW + b) \otimes (xV + c))),其中 (\text{Swish}(x) = x \cdot \sigma(x)) 即为 SiLU 激活函数。这里,SiLU (Swish) 被用作一个门控机制,对输入的一个线性变换结果进行调制,然后再与另一个线性变换结果进行逐元素相乘。这种设计借鉴了 SiLU 的自门控特性和平滑非线性,旨在增强 FFN 模块的表达能力和学习效率。许多知名的 LLM,如 PaLM 、DeepSeek LLM 和 Qwen 1.5 等,均采用了 SwiGLU 作为其激活函数 。
SwiGLU (以及其核心组件 SiLU/Swish) 在 LLM 中的应用效果主要体现在以下几个方面:
- 提升模型性能:研究表明,在 Transformer 架构的 FFN 模块中使用 SwiGLU 通常能够带来比传统激活函数(如 ReLU 或 GELU)更好的下游任务性能,例如在语言建模、文本生成、问答等任务上获得更低的困惑度 (perplexity) 或更高的准确率。LLaMA 系列模型之所以能够取得强大的性能,SwiGLU 的贡献功不可没。例如,LLaMA 模型用 SwiGLU 激活函数取代了 ReLU 非线性,以提高性能 。
- 增强非线性表达能力:SiLU/Swish 的非单调性和平滑性,通过 SwiGLU 的形式,为 FFN 模块引入了更复杂的非线性变换能力。这使得模型能够更好地捕捉文本数据中的复杂模式和长距离依赖关系。在 LLama 模型中,SwiGLU 的应用显著提升了模型的性能,尤其是在处理长上下文和复杂语言任务时,能够捕获更丰富的特征表示,增强模型的表达能力 。
- 改善训练动态:SiLU 的平滑梯度特性有助于稳定训练过程,尤其是在训练参数量巨大的 LLM 时。虽然 SwiGLU 的计算比简单的 ReLU 或 GELU 更复杂,但其带来的性能增益通常被认为是值得的。SiLU 的平滑性和非线性特性使得 SwiGLU 在梯度反向传播时能够提供更好的梯度流动,这在深层网络中尤为重要,有助于缓解梯度消失问题,确保模型在训练过程中更好地学习到深层次的特征 。
因此,尽管 SiLU 本身不直接出现在 LLaMA 等 LLM 的每一层,但其核心思想和通过 SwiGLU 的间接应用,对 LLM 的成功起到了重要的推动作用。这反映了 SiLU 及其变体在处理大规模序列数据方面的潜力,尤其是在需要强大非线性表达能力的场景中。主流 LLM 的 FFN 模块越来越多地采用 SiLU/Swish 相关的激活函数,这本身也说明了其在实际效果和性能表现上的优越性 。