Activation Function
激活函数是神经元应用于加权输入的非线性函数,让网络能够学习曲线模式。本文比较常见的激活函数。
激活函数是神经网络(NN)中的神经元对输入加权求和后应用的函数,用于生成神经元的输出。激活函数的核心作用是引入非线性:没有它,任意堆叠的层都会折叠成单个线性变换,增加网络深度也毫无作用。有了激活函数,网络就能表示弯曲的决策边界,例如手写数字的笔画,或摄像头画面中行人的轮廓。激活函数有两种作用。在隐藏层中,ReLU、SiLU 和 GELU 等函数可以帮助网络构建特征。在输出层中,sigmoid 和 softmax 等函数会将原始分数转换为概率。
网络为何需要非线性#
没有激活函数的层会计算 Wx + b。两个这样的层会得到 W₂(W₁x + b₁) + b₂,这等于 (W₂W₁)x + (W₂b₁ + b₂),也就是另一个单独的线性层。在两层之间加入激活函数,就能避免这种折叠;通用逼近定理表明,只要非线性单元数量足够,一个隐藏层就能逼近有界域上的任意连续函数。
激活函数的导数与函数形状同样重要,因为反向传播会逐层将这些导数相乘。Sigmoid 的导数不会超过 0.25,而 tanh 的导数在输入较大时会趋近于零,因此梯度经过多个饱和层后会逐渐缩小,这就是梯度消失问题。对于所有正输入,ReLU 的导数都恰好为 1,这也是它让超深网络变得易于训练的主要原因之一。
常见激活函数#
- ReLU:max(0, x)。计算开销低,正输入的梯度为 1,负输入则精确输出零。自 2012 年 AlexNet 问世以来,它一直是 CNN 默认的隐藏层激活函数,但始终只接收负输入的神经元会停止学习。
- Leaky ReLU:将负输入乘以较小的斜率,例如 0.01 或 0.1,因此每个神经元都能保留梯度。
- SiLU(Swish):x · σ(x),一种平滑曲线,负输入时会略微低于零。它常用于高效 CNN 和实时检测器。
- GELU:x · Φ(x),其中 Φ 是标准正态累积分布函数。它是 BERT、GPT-2 和视觉 Transformer 中的标准激活函数。
- Tanh:将输入压缩至 −1 到 1,并以零为中心。它用于构造 GRU 等循环网络的隐藏状态。
- Sigmoid:将输入压缩至 0 到 1,适合二分类和多标签输出,也适用于循环单元的门控。
- Softmax:将一整组分数转换为总和为 1 的概率分布,适用于单标签分类和注意力权重。
- SwiGLU:一种门控层,会将经过 SiLU 激活的投影与第二个可学习投影相乘。它取代了许多近期大型语言模型(LLM)前馈层中的普通激活函数。
PyTorch 在 torch.nn 中将每种逐元素函数都作为模块提供,因此可以轻松地对相同输入进行比较:
import torch
from torch import nn
x = torch.tensor([-3.0, -1.0, 0.0, 1.0, 3.0])
# Common activations, each applied element-wise to the same inputs
activations = {
"ReLU": nn.ReLU(),
"Leaky ReLU": nn.LeakyReLU(0.1),
"SiLU": nn.SiLU(),
"GELU": nn.GELU(),
"Tanh": nn.Tanh(),
"Sigmoid": nn.Sigmoid(),
}
for name, act in activations.items():
print(f"{name:>10}: {[round(v, 3) for v in act(x).tolist()]}")对于 −3、−1、0、1 和 3 这些输入,ReLU 会输出 [0.0, 0.0, 0.0, 1.0, 3.0],Leaky ReLU 会输出 [-0.3, -0.1, 0.0, 1.0, 3.0]。SiLU 会输出 [-0.142, -0.269, 0.0, 0.731, 2.858],GELU 会输出 [-0.004, -0.159, 0.0, 0.841, 2.996]:两者都会保留较小的负值,并在输入较大时趋近于 ReLU。Tanh 会输出 [-0.995, -0.762, 0.0, 0.762, 0.995],sigmoid 会输出 [0.047, 0.269, 0.5, 0.731, 0.953];当输入为 ±3 时,两者都会趋于平坦,此时它们的梯度已经很小。
如何选择激活函数#
隐藏层通常遵循相应架构系列的惯例,输出层则根据任务选择。每个输入恰好属于一个类别时适合使用 softmax;标签可以同时出现时适合使用 sigmoid;回归输出不使用任何激活函数,以便输出任意数值。硬件也可能限制选择:一些边缘加速器只能原生运行 ReLU、Leaky ReLU 和 Hard-Swish 等简单函数。YOLO26会在每个 Conv 块的卷积和批次归一化之后应用 SiLU;它使用独立的 sigmoid 对每个检测类别打分,因此同一个边界框的类别分数不必加总为 1;在其分类模型中,模型会对 1,000 个 ImageNet类别应用 softmax。
激活函数与相关术语#
- 损失函数:前向传播过程中,激活函数决定每个神经元输出的形状;损失函数则根据标签对网络的最终预测进行评分。出于数值稳定性的考虑,库通常会将最后一个激活函数融合进损失函数,例如
CrossEntropyLoss会将 softmax 融合进去。 - 批次归一化:批次归一化或层归一化会使用统计数据和可学习参数,将激活值重新缩放到稳定范围。它通常紧邻激活函数并位于其前面,本身不会引入非线性。
- 激活值:作为复数名词时,activations 指一层生成的输出值。“非线性”和较早使用的“传递函数”都是激活函数的同义词。训练期间,框架会将每层的激活值保存在内存中,以供反向传播使用;因此,梯度检查点会通过丢弃部分激活值,并在反向传播期间重新计算这些激活值来节省内存。










