激活函数
从函数逼近与梯度传播角度系统分析激活函数的作用、机制与常见形式
什么是激活函数
-
神经网络中每一层的基本计算形式为:
-
为线性变换结果(logits)
-
为激活函数
-
为该层输出
-
-
若网络中所有 均为线性函数,则多层网络可整体合并为一次线性映射:
-
因此,激活函数存在的根本原因在于引入非线性,使模型具备表达复杂函数的能力
-
从优化角度看,激活函数并不仅决定前向表达能力,还直接控制反向传播中的梯度结构
-
反向传播的链式法则为:
-
由此可见,在链式求解过程中,激活函数的导数会影响梯度
- 若长期接近 0 → 梯度消失
- 若数值不受控 → 梯度爆炸
-
一个 “良好” 的激活函数通常需要在以下方面取得平衡:
- 提供足够的非线性表达能力
- 在常见输入范围内保持梯度可传播
- 避免输出长期处于饱和区
- 计算形式足够简单,适合大规模训练
-
激活函数并非局部技巧,而是对函数逼近能力、梯度传播稳定性、优化可行性的统一设计
-
不同激活函数的演化,本质是围绕深层可训练性展开的
Sigmoid / Tanh
Sigmoid
- 输出范围为 ,可直接解释为概率
- 其导数为:
- 当 较大时:
- 在深层网络中,梯度在多层相乘后迅速衰减,从而会导致梯度消失问题
Tanh
-
输出范围为 ,相较 Sigmoid 为零中心
-
其导数为:
-
在 较大时同样进入饱和区:
-
仍然无法从根本上解决深层网络的梯度传播问题
ReLU
ReLU
- ReLU(Rectified Linear Unit)系列激活函数用于解决 “能不能训” 的问题(梯度是否存在)
- 其导数为:
- 正区间梯度恒定,使梯度能够在深层网络中传播,从而缓解梯度消失问题
- 激活稀疏,即部分神经元输出为零,有助于特征选择,有隐式正则化效果
- 计算简单高效,适合大规模训练
- 但当神经元长期落在负区间时,梯度会恒为 0,参数无法再更新,这种现象被称为死亡 ReLU
Leaky ReLU / PReLU
- 缓解死亡 ReLU 问题
- 为负区间保留非零梯度,从机制上缓解死亡 ReLU
- 同时仍保持 ReLU 的梯度稳定优势
- 可为固定小值(如 0.01)或可学习参数(PReLU)
- 但引入了额外的超参数,需要调优
- 整体上,Leaky ReLU 在保持 ReLU 优势的同时,提升了负区间的梯度流动性,因此 Leaky ReLU 成为实际应用中的常用选择
Softmax
-
多分类任务要求模型输出各类别的相对置信度,且能够被解释为概率分布,即输出需满足:
-
Softmax 正是为满足这一建模目标而引入的映射
-
指数函数保证输出为正
-
归一化保证概率和为 1
-
本质上,Softmax 将 logits 映射为相对权重
-
指数放大效应
-
由于指数函数的性质(指数放大效应):
-
若存在 :
-
因此,Softmax天然倾向于产生近似 one-hot 的输出
-
然而,当 较大时:
- 工程上必须进行等价变换,以在数值层面修正指数的放大副作用:
Jocobian 矩阵
-
由于 Softmax 公式的分母中包含所有 ,所以:
- 依赖
- 依赖
- ……
- 这说明 Softmax 的归一化导致任一 logit 的变化都会影响全部输出,其输出各分量之间相互耦合
-
而在链式法则中求解时:
-
其结构为:
-
而 是 所有 的函数,每个 又是 所有 的函数,故
-
其中, 的具体形式即为 Jocobian 矩阵:
引入交叉熵
-
根据 4.2 所述,Softmax 的梯度这么复杂、各类别还彼此耦合,那为什么它还能在深度网络中稳定训练?
-
这是因为交叉熵刚好 “对齐” 了 Softmax 的 Jacobian 结构
-
交叉熵损失:
-
对交叉熵损失求偏导:
-
将其与 Softmax 的 Jacobian 结合:
-
当 时:
-
当 时:
-
将所有项合并,有:
-
提取公共因子 ,并利用 :
-
-
可以看到,Softmax 在前向传播中引入的指数放大与全量耦合,在与交叉熵组合后,于反向传播中被完全抵消
-
最终梯度只保留为:
-
这一结果不再包含指数、归一化或 Jacobian 矩阵,梯度形式极其简洁稳定
-
这是 Softmax 能在深度学习中成立的决定性原因
Softmax 的 “梯度消失”
- 当模型预测过于自信:
- 梯度自然趋于 0:
- 这不是数值问题,而是概率模型已 “自认为收敛”,这也说明,不是所有梯度消失都意味着训练失败
GELU
ELU
-
ELU(Exponential Linear Unit) 和 SELU(Scaled ELU)均用于解决 “训练过程中分布会不会崩” 的问题(保证均值、方差稳定)
-
ELU 的基本形式:
-
其核心思想并不只是 “给负半轴一点梯度”:
- 以指数形式组织负区间,使得负区间的输出有界且平滑
- 使激活输出的均值更接近 0,输出方差更稳定
- 小负输入会被 “软压缩”,而不是简单缩放
- 降低了 ReLU 中 “全部非负 → 偏移累积” 的问题
SELU
-
SELU 定义为对 ELU 的线性缩放:
- 并非可调超参数,而是通过固定点分析精确选定
-
核心思想:
- 如果输入分布的均值和方差略有偏移
- 经过 SELU + 随机连接后
- 输出会被自动拉回到一个稳定区间,从而提高统计稳定性
-
这意味着激活函数本身承担了 “归一化” 的角色,在特定条件下(全连接、特定初始化、无 BN),可以不使用 BatchNorm
GELU
-
GELU(Gaussian Error Linear Unit)的定义:
-
其中 是标准正态分布的累积分布函数:
-
常用近似形式(便于计算):
-
GELU 的核心思想转变 —— 解决 “表示是否足够细腻、是否与概率建模假设一致” 的问题
- ReLU 系列的问题设定是:“这个神经元要不要被激活?”
- GELU 的问题设定是:“这个神经元以多大概率被保留下来?”
- 具体解释:
- 假设输入 是带噪声的(近似高斯)
- 表示: 在噪声扰动下仍为正的概率
- 激活输出:
- 因此小正值不会被硬性通过,小负值也不会被直接抹零,其激活是连续、概率化、平滑的
-
为什么 GELU 特别适合 Transformer?
- Transformer 的中间表示(尤其是 FFN 层):维度极高,其表示接近连续分布,对 “细微差异” 高度敏感
- 而 GELU 的优势正好对应这些特性:
- 无硬阈值 → 梯度始终连续,使得梯度更为平滑
- 小信号被 “部分保留” 而非直接抹除,表示能力更细腻
- 不会引入明显分布偏移,与 LayerNorm、残差结构天然兼容
- 因此 GELU 成为 BERT、GPT、ViT 等 Transformer 架构中的默认激活函数
-
从 ReLU 到 ELU / SELU,再到 GELU,是从几何可导性 → 统计稳定性 → 表示与建模假设的一致性的演变过程