← 返回题目列表

激活函数有什么用?Sigmoid、Tanh、ReLU 怎么选?

高频 中等 第 3 / 25 题 更新于 2026/07/28
深度学习激活函数ReLUSigmoid

简化版

激活函数 给神经网络引入非线性——没有它,多层网络会塌缩成一层线性模型、深度毫无意义。常见的:Sigmoid(压到 (0,1),可作概率,但两端饱和导致梯度消失、输出非零中心,隐藏层已少用);Tanh(压到 (-1,1),零中心比 sigmoid 好,但仍会饱和梯度消失);ReLUmax(0,x),正区间导数恒为 1、计算快,能缓解部分激活路径的梯度消失,常作为隐藏层基线,缺点是负区间输出恒 0 可能「神经元死亡」);改进版 Leaky ReLU / PReLU / ELU / GELU 解决死亡问题。选择:隐藏层可先用 ReLU,并按架构考虑其变体或 GELU,输出层按任务定(二分类 sigmoid、多分类 softmax、回归无激活)。

详细版

常见激活函数对比:

函数公式值域优点缺点
Sigmoid1/(1+e⁻ˣ)(0,1)可作概率、平滑饱和梯度消失、非零中心、有 exp 慢
Tanh(eˣ-e⁻ˣ)/(eˣ+e⁻ˣ)(-1,1)零中心仍饱和梯度消失
ReLUmax(0,x)[0,∞)不饱和、快、缓解梯度消失神经元死亡、非零中心
Leaky ReLUmax(0.01x, x)(-∞,∞)修复死亡需调负斜率
ELU/GELU平滑变体更平滑、效果好计算稍贵

关键作用: 引入非线性——无激活则多层等价单层线性变换(见神经网络基础)。

ReLU 为什么成主流:

  • 正区间导数=1,不饱和 → 梯度不消失(sigmoid/tanh 两端导数趋 0)。
  • 计算简单(只比较取大),收敛快。
  • 负区间输出 0 → 稀疏激活。

完整版教学

一、激活函数的根本作用:引入非线性

激活函数最核心的作用是给网络引入非线性。如果每层只做 z = Wx+b 的线性变换、不加非线性激活,那么无论堆多少层,整个网络都等价于一个线性变换(多个线性变换的复合还是线性),表达能力和逻辑回归一样,深度完全白费(详见神经网络基础)。

激活函数在每层的线性变换后插入一个非线性操作,打破这种塌缩,让网络能层层组合出复杂的非线性函数——这是神经网络成为「万能近似器」的前提。所以「为什么需要激活函数」的标准答案就是:没有它深度网络失去意义。

二、Sigmoid:能当概率,但有硬伤

σ(x) = 1 / (1 + e⁻ˣ)     值域 (0,1)
  • 优点:输出在 (0,1),可解释为概率,平滑可导。
  • 缺点(导致隐藏层弃用)
    1. 饱和导致梯度消失:x 很大或很小时,sigmoid 曲线变平,导数趋近 0。反向传播梯度逐层连乘这些接近 0 的导数,会指数衰减,前面的层几乎学不动(详见梯度消失专题)。
    2. 输出非零中心(恒正):会让下一层梯度同号,权重更新呈「Z 字形」低效。
    3. 含指数运算,计算较慢

现在 sigmoid 主要用在二分类的输出层(输出概率),隐藏层很少用。

三、Tanh:零中心,但仍会饱和

tanh(x) = (eˣ - e⁻ˣ)/(eˣ + e⁻ˣ)     值域 (-1,1)
  • 优点:输出零中心((-1,1)),比 sigmoid 的收敛性质好(解决了非零中心问题)。
  • 缺点两端仍然饱和、仍会梯度消失——本质和 sigmoid 一样是 S 形曲线,只是范围不同。

Tanh 比 sigmoid 好用一点(尤其早期 RNN 常用),但同样受饱和梯度消失困扰。

四、ReLU:常用基线,缓解部分路径的梯度消失

ReLU(x) = max(0, x)     值域 [0, ∞)

ReLU 常作为隐藏层基线,因为它缓解了 sigmoid/tanh 的饱和问题:

  • 正区间局部导数恒为 1:不会像饱和 sigmoid 那样再乘一个很小的激活导数,但整条路径仍受权重雅可比影响,大幅缓解梯度消失——这是 ReLU 让深层网络能训练起来的关键。
  • 计算极快:只是「和 0 比大小取较大者」,没有指数运算。
  • 稀疏激活:负输入输出 0,让网络中一部分神经元不激活,带来稀疏性。
  • 收敛通常比 sigmoid/tanh 快得多。

ReLU 的缺点——神经元死亡(Dying ReLU):如果一个神经元的输入总是负的(如学习率过大导致权重更新过猛),它的输出恒为 0、梯度也恒为 0,从此再也无法更新——这个神经元「死了」,永久失效。

五、ReLU 的改进版:修复神经元死亡

为解决死亡问题,出现了一系列变体,共同思路是给负区间也留一点梯度

  • Leaky ReLUmax(0.01x, x)——负区间给一个小斜率(如 0.01),负输入也有非零梯度,神经元不会彻底死。
  • PReLU:负区间的斜率变成可学习的参数。
  • ELU:负区间用平滑的指数曲线,输出可为负(更接近零中心),更平滑但计算稍贵。
  • GELU / Swish:更平滑的现代激活,GELU 在 BERT、GPT-2 等 Transformer 中常见,其他模型也可能采用 SiLU/SwiGLU;效果需由架构和任务验证。

六、怎么选——按位置和任务

隐藏层:

  • 可先用 ReLU——简单、快、有效;Transformer 等架构常按原论文使用 GELU、SiLU 或门控激活。
  • 担心神经元死亡 → Leaky ReLU / ELU
  • Transformer → 优先遵循架构配置,常见 GELU / SiLU / SwiGLU

输出层(按任务定):

  • 二分类Sigmoid(输出概率)。
  • 多分类Softmax(输出各类概率,和为 1)。
  • 回归不加激活(直接输出实数)。

七、用数值比较饱和、死亡与平滑激活

激活函数的差异最终体现在输出和局部导数。Sigmoid 在 x=0 时导数为 0.25;在 x=10 时输出约 0.99995、导数约 4.54×10⁻⁵,已经接近饱和。ReLU 在 x=2 时导数为 1,但在 x=-2 时输出与常用次梯度都取 0,因此既能保住正区间梯度,也可能产生死亡单元。

输入Sigmoid 输出/导数Tanh 输出/导数ReLU 输出/导数
00.5 / 0.250 / 10 / 约定值
20.881 / 0.1050.964 / 0.0712 / 1
100.99995 / 0.000045约1 / 近010 / 1

输出层还必须和损失函数配套:二分类常把 logits 直接交给数值稳定的 BCE-with-logits,而不是先手算 sigmoid;多分类交叉熵同理常直接接 logits。回归也不总是无激活,例如预测非负尺度时可用 Softplus,但这属于任务约束而非默认规则。

易错点:ReLU 的局部导数为 1,不代表整条网络梯度恒为 1;权重、归一化和其他层仍会改变梯度尺度。

八、常见误区与追问

  • 误区:ReLU 彻底解决了深层网络的梯度消失。 它只去掉正区间的饱和导数,整条雅可比乘积仍可能收缩。
  • 误区:Sigmoid 不能出现在任何隐藏结构中。 门控网络和 LSTM 仍用它控制 0 到 1 的门值,只是不适合作为普通深层主激活。
  • 追问:ReLU 在 0 点不可导怎么办? 训练框架选定一个次梯度,通常取 0;单点不可导一般不妨碍随机优化。
  • 追问:为什么分类实现常接收 logits? 融合实现可用 log-sum-exp 技巧避免概率接近 0 或 1 时的溢出和下溢。
  • 追问:如何选择 GELU、SiLU 与 ReLU? 先遵循成熟架构,再以验证指标、吞吐和部署算子支持做消融。

九、加强记忆

激活函数的根本作用是引入非线性——没它多层塌缩成一层线性模型、深度无意义。Sigmoid((0,1),可作概率,但两端饱和→梯度消失、非零中心、慢,隐藏层弃用);Tanh((-1,1),零中心改善收敛,但仍饱和梯度消失);ReLU max(0,x)(正区间导数恒 1、正半轴不饱和、可缓解部分路径的梯度消失、计算快、稀疏,隐藏层默认,缺点是神经元死亡——输入恒负则输出梯度恒 0);改进版 Leaky ReLU/PReLU/ELU(给负区间留梯度修复死亡)、GELU/Swish(Transformer 常用)。选择:隐藏层默认 ReLU(或变体/GELU),输出层二分类 sigmoid、多分类 softmax、回归无激活。