尧图精选

深度学习激活函数详解:从 Sigmoid、Tanh、ReLU 到 GELU、SiLU、Mish,一文掌握所有常用激活函数

🕒 发布时间:2026/9/3 20:30:57 📁 来源:尧图网络
本文系统梳理深度学习中常见的激活函数从经典的 Sigmoid、Tanh到 ReLU 家族、ELU 家族再到 Transformer 中常见的 GELU、SiLU以及 Softmax、GLU 等输出层和门控结构。重点不仅介绍公式还会从函数形状、导数、梯度传播、优缺点、适用场景以及 PyTorch 实现几个角度理解为什么要使用某一种激活函数。1. 为什么神经网络需要激活函数假设一个神经网络只有线性层连续堆叠两个线性层代入整理本质上仍然可以写成也就是说无论堆叠多少层线性层只要中间没有非线性函数整个网络最终仍然只是一个线性变换。因此神经网络通常采用这里的就是激活函数Activation Function。激活函数的核心作用就是给神经网络引入非线性表达能力。2. 激活函数到底应该关注什么评价一个激活函数通常需要关注以下几个方面。2.1 是否具有非线性这是最基本的要求。如果那么它实际上没有引入任何非线性。2.2 梯度是否容易消失训练神经网络时需要反向传播。假设那么如果连续多层网络的梯度都非常小随着网络深度增加可能出现这就是梯度消失Vanishing Gradient。2.3 是否容易出现梯度爆炸相反如果在深层网络中也可能导致梯度不断放大因此一个好的激活函数通常希望梯度传播比较稳定。2.4 是否存在饱和区所谓饱和就是输入继续变化但输出几乎不变。例如当有当有因此两边都会进入饱和区。2.5 是否零中心如果激活函数输出全部为正例如的输出范围那么神经元输出不是零中心的。相比之下是零中心的。这会影响优化过程。3. 激活函数整体分类可以把常见激活函数大致分成下面几类激活函数 │ ├── 经典激活函数 │ ├── Sigmoid │ └── Tanh │ ├── ReLU 家族 │ ├── ReLU │ ├── Leaky ReLU │ ├── PReLU │ ├── RReLU │ └── ReLU6 │ ├── ELU 家族 │ ├── ELU │ ├── SELU │ └── CELU │ ├── 平滑激活函数 │ ├── Softplus │ ├── GELU │ ├── SiLU / Swish │ └── Mish │ ├── Hard 激活函数 │ ├── HardTanh │ ├── HardSigmoid │ └── HardSwish │ ├── 收缩类激活函数 │ ├── Softshrink │ ├── Hardshrink │ └── Tanhshrink │ ├── 特殊激活函数 │ ├── Softsign │ ├── LogSigmoid │ └── Threshold │ └── 输出/门控函数 ├── Softmax ├── LogSoftmax ├── GLU └── Gumbel-SoftmaxPyTorch 当前文档中的非线性函数覆盖了上述大部分函数。下面逐个分析。4. Sigmoid最经典的激活函数Sigmoid 又称 Logistic Function。公式输出范围sigmoid 函数4.1 Sigmoid 的导数Sigmoid 的导数因为所以最大梯度只有这意味着当网络很深时梯度连续相乘很容易变得非常小。4.2 Sigmoid 的优点最大的优点是因为输出范围在(0,1)之间输出可以直接解释为概率。例如二分类因此 Sigmoid 非常适合二分类输出层多标签分类输出层概率建模4.3 Sigmoid 的缺点缺点 1梯度消失当很大或者很小时导致梯度消失。缺点 2不是零中心输出范围始终大于 0。缺点 3计算涉及指数函数相比 ReLUSigmoid 计算成本更高。4.4 PyTorch 实现import torch import torch.nn as nn activation nn.Sigmoid() x torch.tensor([-2., -1., 0., 1., 2.]) y activation(x) print(y)5. Tanh零中心版本的 SigmoidTanh 公式输出范围tanh 函数5.1 Tanh 和 Sigmoid 的关系两者存在关系所以可以理解为Tanh 本质上是经过缩放和平移后的 Sigmoid。5.2 Tanh 导数当时相比 Sigmoid 最大导数Tanh在零点附近梯度更大。5.3 Tanh 的优点最大优点零中心。因为因此相比 Sigmoid更适合隐藏层中的特征表示。5.4 Tanh 的缺点依然存在饱和问题所以深层网络仍然可能产生梯度消失。6. ReLU深度学习最重要的激活函数之一ReLU也就是ReLU 函数6.1 ReLU 的导数因此正数区域不会产生梯度衰减。6.2 ReLU 为什么这么成功核心原因可以概括为计算简单 正区间梯度为 1 稀疏激活 训练速度快尤其是这对深层网络的梯度传播非常重要。6.3 ReLU 最大的问题死亡 ReLU如果那么并且如果某个神经元长期处于负区间输入 ↓ 负数 ↓ ReLU 0 ↓ 梯度 0 ↓ 参数无法更新 ↓ 神经元“死亡”这就是Dying ReLU Problem7. Leaky ReLU解决死亡 ReLULeaky ReLU 给负数区域留了一条“小通道”。公式其中通常是一个很小的常数例如7.1 和 ReLU 的区别ReLULeaky ReLU因此负数区域依然存在梯度。7.2 PyTorchnn.LeakyReLU(negative_slope0.01)PyTorch 的定义也是8. PReLU让负区间斜率自己学习PReLU和 Leaky ReLU 最大区别Leaky ReLU 的是人为指定的而 PReLU 的是可学习参数。也就是说Leaky ReLU alpha 固定 PReLU a 神经网络自己学习PyTorch 官方定义中PReLU 的 negative slope 是 learnable parameter。8.1 优点模型可以自动学习负数区域应该保留多少信息。8.2 缺点增加了可学习参数。虽然参数量很少但也增加了模型复杂度。9. RReLU随机化 Leaky ReLURReLURandomized Leaky ReLU。它和 Leaky ReLU 类似但是负区间斜率不是固定的而是从一个随机分布中采样。因此训练过程中其中是随机变量。它具有一定正则化效果。10. ReLU6把 ReLU 限制到 6公式即PyTorch 当前文档也采用这一形式。10.1 为什么是 6ReLU6 最经典的应用之一是移动端网络例如 MobileNet。限制最大值可以让激活值处于这样的有限范围中有利于某些低精度量化和移动端计算。11. ELU让负数区域更加平滑ELU11.1 ReLU 和 ELU 的区别ReLUELU因此 ELU 在负数区域不是直接截断而是逐渐趋向11.2 ELU 的优点相比 ReLU负区间仍然有梯度输出可以为负均值更容易靠近 0函数更加平滑12. SELUSelf-Normalizing Neural NetworkSELUSelf-normalizing ELU。公式经典参数PyTorch 当前实现也使用这些参数。12.1 SELU 的核心思想普通神经网络可能出现层数增加 ↓ 均值/方差逐渐偏移 ↓ 激活值分布不稳定 ↓ 训练困难SELU 希望通过激活函数自身的性质使网络中的激活分布趋向稳定。所以叫Self-Normalizing Neural Network12.2 SELU 使用时需要注意什么SELU 并不是简单地“比 ReLU 更好所以所有地方都应该换 SELU。”它依赖特定的网络结构和初始化条件。PyTorch 的初始化文档指出自归一化网络场景下使用 SELU 时初始化应考虑相应的线性增益设置。13. CELUContinuously Differentiable ELUCELU与 ELU 相似但设计目标之一是让函数在参数变化下具有更好的连续可微性质。PyTorch 当前文档提供了 CELU。14. SoftplusReLU 的平滑版本Softplus当时14.1 为什么叫 Softplus因为它可以看作 ReLU 的平滑版本而PyTorch 官方将 Softplus 描述为 ReLU 的 smooth approximation。14.2 Softplus 的导数非常重要也就是说Softplus 的梯度就是 Sigmoid。15. GELUTransformer 中非常重要的激活函数GELUGaussian Error Linear Unit。公式其中是标准高斯分布的累积分布函数。GELU 函数PyTorch 官方也是采用的定义。15.1 GELU 的近似公式实际计算中经常使用PyTorch 支持精确形式和 tanh approximation。15.2 GELU 和 ReLU 的区别ReLUGELU不会简单地把负数全部砍掉而是根据输入大小进行平滑的概率式“门控”。因此 GELU更加平滑梯度更加连续不存在传统 ReLU 的硬截断GELU 在 Transformer 系列模型中非常常见。16. SiLU / Swish自门控激活函数SiLU也就是PyTorch 中SiLU也称为 Swish。16.1 为什么叫自门控因为里面的因此可以理解为输入自己决定应该保留多少信息。16.2 SiLU 的特点SiLU非单调平滑可导没有 ReLU 的硬截断负区间仍有输出因此在很多现代神经网络中表现优秀。17. Mish比 SiLU 更复杂的平滑激活Mish展开PyTorch 官方当前实现也采用这一形式。17.1 Mish 的特点Mish 属于平滑、非单调、自正则化风格的激活函数。相比 ReLUReLU 负数 → 直接变 0 Mish 负数 → 保留一部分信息相比 SiLUSiLU x × sigmoid(x) Mish x × tanh(softplus(x))18. GELU、SiLU、Mish 三者怎么理解这三个是现代深度学习中非常重要的一组函数。激活函数核心公式特点GELU平滑概率式门控SiLUSigmoid 自门控Mish更复杂的平滑非单调函数可以简单记忆ReLU ↓ “硬截断” GELU ↓ “平滑选择” SiLU ↓ “Sigmoid 自门控” Mish ↓ “Softplus Tanh 自门控”19. HardTanhHardTanh 是 Tanh 的分段线性近似。典型形式优点计算简单没有指数运算容易硬件实现缺点两端饱和梯度为 020. HardSigmoidHardSigmoid 是 Sigmoid 的分段线性近似。常见形式不同框架的具体截断参数可能不同。主要思想用简单的线性函数近似 Sigmoid。因此适合移动端嵌入式设备低计算量模型21. HardSwishHardSwish 是 Swish/SiLU 的高效近似。常见形式即它的目标是保留 Swish 的效果同时降低计算成本。MobileNetV3 等轻量网络中经常使用。PyTorch 当前函数接口中也包含hardswish。22. SoftsignSoftsign输出范围和 Tanh 类似也是有界的零中心函数。区别在于 Softsign 不使用指数函数因此计算形式更加简单。PyTorch 当前文档定义也是23. LogSigmoidLogSigmoid也就是相比直接计算实际实现通常会采用数值稳定的方式。PyTorch 当前提供LogSigmoid。24. ThresholdThreshold 是一个非常简单的阈值函数其中threshold替代值它更多用于特殊的神经网络结构而不是现代深度网络的默认激活函数。25. Shrink 类激活函数这类函数的思想不是单纯进行非线性变换而是将较小的响应压缩或者直接置零。25.1 Hardshrink也可以理解为大于阈值 → 保留 小于负阈值 → 保留 中间区域 → 置零25.2 SoftshrinkSoftshrink 更平滑它和稀疏表示、信号处理中的 shrinkage 思想存在联系。25.3 Tanhshrink也属于特殊的 shrinkage 激活函数。26. Softmax分类输出层最重要的函数之一Softmax 与前面那些逐元素激活函数不太一样。假设Softmax于是因此可以得到一个概率分布softmax 函数26.1 例子假设模型输出Softmax 后得到类别 A较高概率 类别 B中等概率 类别 C较低概率所以 Softmax 常用于多分类任务的输出层。27. Sigmoid 和 Softmax 的区别这是机器学习面试中的高频问题。二分类通常SigmoidSigmoid例如猫 / 非猫多分类例如猫 狗 鸟 汽车通常因为这些类别通常要求多标签分类例如一张图片同时包含人 汽车 狗 树这时每个类别相互独立。通常使用SigmoidSigmoid而不是 Softmax。因此单标签二分类 → Sigmoid 单标签多分类 → Softmax 多标签分类 → Sigmoid28. LogSoftmaxLogSoftmax等价于它经常和NLLLoss一起使用。29. GLU门控线性单元GLUGated Linear Unit。如果输入XX先沿某个维度拆成然后其中表示逐元素乘法。PyTorch 官方也采用的定义。29.1 GLU 的核心思想可以理解成输入 ↓ 拆成两部分 ↓ A B │ │ │ Sigmoid │ │ └──── × ───┘ ↓ Output其中负责决定A 中哪些信息应该被保留。这就是门控机制Gating Mechanism30. Gumbel-SoftmaxGumbel-Softmax 用于解决一个经典问题如何让神经网络对离散类别进行采样同时仍然可以进行梯度反向传播普通概率 ↓ argmax ↓ 离散类别argmax不可导。Gumbel-Softmax 使用可微近似使网络能够学习离散选择。典型形式其中类别概率Gumbel noisetemperature当输出会越来越接近 one-hot。31. 为什么 ReLU 家族如此重要可以把激活函数的发展理解成一条路线Sigmoid ↓ 梯度消失 ↓ Tanh ↓ 仍然存在饱和 ↓ ReLU ↓ 解决正区间梯度问题 ↓ Dying ReLU ↓ Leaky ReLU / PReLU ↓ 进一步平滑 ↓ ELU / SELU ↓ 现代平滑激活 ↓ GELU / SiLU / Mish这也是理解激活函数发展历史最重要的一条线。32. 各激活函数核心对比激活函数输出范围零中心平滑负区间有梯度主要问题Sigmoid×✓✓梯度消失Tanh✓✓✓梯度消失ReLU×××Dead ReLULeaky ReLU××✓超参数PReLU××✓增加参数RReLU××✓随机性ELU较接近✓✓指数计算SELU特定缩放接近✓✓使用条件较严格Softplus×✓✓计算成本GELU近似✓✓计算复杂SiLU近似✓✓计算复杂Mish近似✓✓计算复杂ReLU6×××饱和HardSwish有界/近似×分段部分非完全平滑Softsign✓✓✓饱和Softmax—✓—不用于隐藏层常规激活这类综合比较也与现有激活函数综述对 Sigmoid/Tanh、ReLU、ELU、学习型激活等类别的划分基本一致。33. CNN 中应该使用什么激活函数传统 CNNConv ↓ BatchNorm ↓ ReLU这是非常经典的组合。例如class CNNBlock(nn.Module): def __init__(self, in_channels, out_channels): super().__init__() self.block nn.Sequential( nn.Conv2d( in_channels, out_channels, kernel_size3, padding1 ), nn.BatchNorm2d(out_channels), nn.ReLU(inplaceTrue) ) def forward(self, x): return self.block(x)现代 CNN 也可能使用ReLULeakyReLUSiLUGELUMishHardSwish34. Transformer 中为什么经常看到 GELUTransformer 的 FFN 通常类似这里的(.)就是激活函数。经典 Transformer 系列中常见GELU现代架构中也越来越常见SiLU以及 GLU 系列结构。读模型源码时看到nn.GELU()是非常正常的。35. 为什么现代 LLM 中越来越多出现 SiLU / SwiGLU普通 FFN而门控 FFN 可以写成如果使用 SiLU这就是典型的SwiGLU核心思想不是单纯“换一个激活函数”而是让一部分神经元负责生成内容另一部分负责生成门控信号。这比传统具有更强的表达能力。36. 初始化和激活函数为什么有关系这是很多初学者容易忽略的问题。假设如果激活函数会改变信号的方差那么网络层层传播之后可能越来越大或者越来越小。因此权重初始化需要考虑激活函数。例如 PyTorchcalculate_gain()给出了不同非线性函数对应的推荐 gain包括以及 Leaky ReLU 的对应形式。这就是为什么ReLU → He/Kaiming Initialization Tanh → Xavier Initialization经常被一起讨论。37. 为什么 ReLU 通常配 He 初始化假设ReLU 会把负数直接变成 0。为了让经过网络之后的方差保持相对稳定经典 Kaiming/He 初始化针对 ReLU 进行了专门设计。常见形式因此ReLU Kaiming Initialization是非常经典的组合。38. 为什么 Tanh 常和 Xavier 初始化一起出现Tanh 在接近 0 时为了让前向传播和反向传播过程中信号保持稳定可以使用 Xavier/Glorot 初始化。经典形式因此Tanh Xavier Initialization是经典组合。39. 激活函数和梯度的关系总结可以把不同激活函数的梯度传播理解为Sigmoid 负数区间 ── 梯度很小 中心区间 ── 梯度最大 正数区间 ── 梯度很小 Tanh 负数区间 ── 梯度很小 中心区间 ── 梯度最大 正数区间 ── 梯度很小 ReLU 负数区间 ── 0 正数区间 ── 1 Leaky ReLU 负数区间 ── α 正数区间 ── 1 GELU / SiLU / Mish 整个区域 ── 平滑变化这也是为什么现代网络越来越偏爱这类梯度传播更加平滑的函数。40. 实际项目到底应该怎么选择不要记成“最新的激活函数一定最好。”正确的选择方式应该是根据任务和模型结构决定。情况 1普通 CNN优先ReLU或者SiLU情况 2现代视觉模型可以考虑GELU轻量模型可以考虑HardSwish情况 3Transformer常见GELU现代门控 FFNSwiGLU情况 4二分类输出层使用Sigmoid但是实际 PyTorch 训练时通常更推荐直接输出 logits并使用nn.BCEWithLogitsLoss()而不是Sigmoid() BCELoss()这样通常具有更好的数值稳定性。情况 5多分类输出层通常CrossEntropyLoss直接接 logits。不要手动Softmax CrossEntropyLoss因为CrossEntropyLoss已经包含了相应的 log-softmax NLL 逻辑。情况 6多标签分类通常BCEWithLogitsLoss对应Sigmoid每一个类别独立计算概率。41. 一个非常实用的选择表场景推荐普通 CNNReLUCNN 想尝试现代激活SiLUTransformerGELULLM FFNSwiGLU / GLU 类移动端模型HardSwish / ReLU6二分类输出Sigmoid多分类输出Softmax或直接 logits CE多标签分类Sigmoid需要零中心有界输出Tanh希望避免 Dead ReLULeaky ReLU / PReLU自归一化网络SELU平滑 ReLUSoftplus研究型实验GELU / SiLU / Mish 等42. PyTorch 中常见激活函数代码汇总import torch import torch.nn as nn activations { # Classic sigmoid: nn.Sigmoid(), tanh: nn.Tanh(), # ReLU family relu: nn.ReLU(), leaky_relu: nn.LeakyReLU(), prelu: nn.PReLU(), rrelu: nn.RReLU(), relu6: nn.ReLU6(), # ELU family elu: nn.ELU(), selu: nn.SELU(), celu: nn.CELU(), # Smooth modern activations softplus: nn.Softplus(), gelu: nn.GELU(), silu: nn.SiLU(), mish: nn.Mish(), # Hard activations hardtanh: nn.Hardtanh(), hardswish: nn.Hardswish(), # Others softsign: nn.Softsign(), logsigmoid: nn.LogSigmoid(), tanhshrink: nn.Tanhshrink(), softshrink: nn.Softshrink(), hardshrink: nn.Hardshrink(), }PyTorch 当前 API 中确实提供了这些常见激活函数包括 ReLU、LeakyReLU、PReLU、RReLU、ELU、SELU、CELU、GELU、SiLU、Mish、Softplus、Tanh、Sigmoid、Softsign、Softshrink、Hardshrink、Tanhshrink、GLU、Softmax 等。43. 最后用一张“激活函数进化图”理解全文激活函数 │ ┌─────────────┴─────────────┐ │ │ 经典激活 现代激活 │ │ ┌────┴────┐ ┌───────┼────────┐ │ │ │ │ │ Sigmoid Tanh GELU SiLU Mish │ │ │ │ │ │ │ └── Swish │ │ │ └────┬────┘ │ │ │ 梯度消失问题 │ │ │ ↓ │ ReLU ────────────────→ 平滑非线性 │ ├── Leaky ReLU │ ├── PReLU │ ├── RReLU │ └── ReLU6 ELU │ ├── SELU └── CELU Softplus │ └── ReLU 的平滑近似44. 一句话记忆所有重要激活函数如果准备机器学习/深度学习面试可以直接这样记Sigmoid输出概率。Tanh零中心的 Sigmoid。ReLU简单、高效、正区间梯度为 1。Leaky ReLU给 ReLU 的负区间留一条梯度通道。PReLU让负区间斜率自己学习。RReLU让负区间斜率随机化。ReLU6把 ReLU 限制在 06。ELU负区间使用指数函数输出可以为负。SELU通过自归一化思想稳定激活分布。SoftplusReLU 的平滑版本。GELU平滑地决定信息保留多少Transformer 常见。SiLU/Swish典型自门控激活。Mish平滑、非单调。Softmax把多个 logits 转换成概率分布。GLU利用门控机制控制信息流。45. 最重要的结论如果把整个激活函数的发展过程压缩成一句话可以理解为背后的核心驱动力其实一直没有变如何在提供足够非线性表达能力的同时让梯度能够稳定、高效地传播。早期主要解决梯度消失于是出现ReLU随后解决Dead ReLU于是出现LeakyReLU/PReLU/ELU再后来更加关注平滑性梯度传播表达能力门控机制于是出现GELU,SiLU,Mish,GLU,SwiGLU因此不要把激活函数简单理解成“给神经网络增加非线性的一个函数”。从现代深度学习的角度看激活函数实际上同时影响模型表达能力 ↓ 梯度传播 ↓ 优化难度 ↓ 激活分布 ↓ 参数初始化 ↓ 训练稳定性 ↓ 最终模型性能这也是为什么在 CNN、Transformer、LLM、扩散模型以及各种多模态模型中激活函数的选择仍然是模型设计中的一个重要组成部分。参考资料PyTorch 当前激活函数 API 对 ReLU、ELU、SELU、CELU、LeakyReLU、PReLU、GELU、Sigmoid、SiLU、Mish、Softplus、Softmax 等进行了完整定义其中 GELU、SiLU、Mish 的公式及实现可以直接对应到上述介绍。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →