A04 · 第 2 章 · 第一编 网络构件
激活函数
从线性层复合的退化出发,比较 sigmoid、tanh、ReLU、GELU 与 SiLU 的函数形状、导数、数值行为和输出层适用范围。
本章目标
- 证明缺少非线性时,多层仿射网络会退化为单个仿射映射。
- 计算 sigmoid、tanh、ReLU 等函数及其导数,并识别饱和区。
- 比较分段线性、平滑性、输出范围和死亡单元等工程权衡。
- 依据回归、二分类、多标签和多分类目标选择输出层变换。
本页目录
先修知识与记号
需要掌握函数图像、分段函数、导数和多层感知机的前向计算。用 表示仿射层输出的预激活,用 表示激活值。向量输入时,隐藏层通常逐分量应用同一函数:
逐元素操作不会混合坐标;跨特征的信息混合由前后的权重矩阵完成。讨论导数时先看标量函数,再把各分量导数组成对角的局部 Jacobian。
非线性激活的作用
考虑两个不带激活的仿射层:
代入可得
右侧仍是一个仿射映射。继续堆叠只会得到更多矩阵乘积和偏置组合,决策边界仍是超平面。把非线性函数放在层间后,输入空间可被不同激活模式划分为多个区域,后续层再组合这些区域响应,因而能够表达弯曲边界与复杂函数。
非线性也不能任意选择。常数函数会丢失全部输入信息;处处导数为零的阶跃函数无法直接用普通梯度训练前序权重;数值范围过大可能造成溢出,长期饱和又会使梯度很小。合适选择依赖深度、初始化、归一化、数值精度和任务输出约束。
比较激活函数的四个维度
第一,输出范围决定表示是否有界、是否以零为中心以及均值可能向哪一侧偏移。第二,导数范围决定局部梯度会被衰减、放大还是截断。第三,平滑性影响高阶优化、数值近似和边界附近行为。第四,计算与存储成本影响大规模训练,但只有在同一硬件与实现下才可比较实际速度。
还要区分隐藏层与输出层。隐藏层负责构造表示,通常追求稳定梯度和足够表达能力;输出层把数值映射到任务所需的支持集,例如实数、正数、概率单纯形。一个函数适合隐藏层,不代表它适合任何输出目标。
Sigmoid 与 tanh
Sigmoid 定义为
输出位于 ,导数最大值为 。当 很大时,输出接近零或一,导数接近零。深链若反复乘上这些小导数,前层梯度可能快速衰减。Sigmoid 仍适合表示二分类概率或门控比例,但数值实现常直接接收 logits 计算交叉熵,以避免先取极端概率再求对数。
双曲正切为
输出位于 且关于原点对称,零附近导数接近一。它在循环状态和小型网络中仍有用途,但两端同样饱和。所谓“零中心”只描述函数输出的对称范围,实际激活均值还取决于输入分布和偏置。
例题一:饱和区与梯度
设预激活 ,激活 ,上游梯度 。局部导数为
因此
若 ,sigmoid 导数约为 ,相同上游梯度传回的绝对值约为 。梯度变小来自当前预激活进入饱和区;不能仅凭使用 sigmoid 就断言整个网络一定无法训练,还要检查偏置、输入尺度、深度和其他梯度路径。
ReLU 与分段线性网络
修正线性单元定义为
在 时导数为零,在 时导数为一, 处不可导。自动微分实现会在零点选定一个约定值,常见选择是零。单个点的选择通常不改变连续分布下的整体训练,但在离散输入、精确零初始化或梯度检查中必须知道具体约定。
ReLU 的正半轴没有饱和上界,计算简单,并能产生精确零激活。多个 ReLU 层组成的函数在有限区域内是分段仿射的,区域边界由预激活等于零的位置决定。网络整体可连续且具有复杂折线结构,但在分区边界处可能不可微。
若一个单元对所有训练样本长期满足 ,其 ReLU 导数为零,前序权重收不到来自该单元的梯度,这称为死亡单元。过大的负偏置、过高学习率或不合适初始化都可能造成该现象。Leaky ReLU 使用 且 ,在负半轴保留小斜率;它缓解零梯度通路,却不保证训练结果更优。
例题二:两个 ReLU 精确表示绝对值
令两个隐藏单元为
输出层取 。当 时,;当 时,。因此
单个仿射函数无法同时拥有左右两侧相反斜率,而两个 ReLU 单元在零点切换激活模式后可以精确构造折点。若输出改为 ,结果又退化为 ,说明表达能力来自参数组合,并非只要存在隐藏层就会产生复杂函数。
GELU、SiLU 与平滑门控
高斯误差线性单元写作
其中 是标准正态分布函数。SiLU 写作
二者都用随输入变化的平滑比例缩放 ,负半轴不会像 ReLU 那样全部截为零。它们并非处处单调地把较大输入映到较大输出;负区间可能出现浅小谷值。平滑导数可减少零点处的离散切换,但会增加函数计算成本,实际吞吐还受编译器融合和硬件实现影响。
选择 GELU、SiLU 或 ReLU 不能只比较单个函数图像。初始化与归一化会改变预激活分布,优化器和学习率会改变参数轨迹,残差连接会提供额外梯度路径。可靠比较应固定网络、数据切分、训练预算和随机种子,并报告多次运行的不确定性。
输出层激活与预测对象
实值回归通常使用恒等输出,使预测不受固定区间限制;目标必须为正时,可使用指数或 softplus 参数化正尺度,并配合对应概率模型。二分类常用单个 logit,通过 sigmoid 得到正类概率。互斥多分类用多个 logits 经 softmax 形成和为一的概率向量。多标签任务的各标签可同时成立,通常对每个标签分别使用 sigmoid,而非让所有标签竞争同一个 softmax 总和。
输出范围匹配只是第一步。概率语义还依赖损失函数、数据假设与校准表现。例如 softmax 数值和为一,不足以证明概率已校准;分布外输入可能仍产生高度集中的输出。训练时优先使用接收 logits 的稳定损失实现,避免手工计算极小概率的对数。
交互实验:激活与边界
实验开始前,固定数据集、隐藏宽度、种子和训练预算,预测三种激活将产生怎样的边界。特别记录 sigmoid 是否因饱和学习较慢、ReLU 是否出现整片不激活区域,以及更换函数后训练损失能否直接用于宣称某种函数普遍更好。
神经网络决策边界
正在加载交互实验…
依次完成以下操作:
- 只切换 tanh、sigmoid 与 ReLU,保存相同训练轮数下的损失和误分类点。
- 观察隐藏宽度较小时三种边界的形状,再逐步增加宽度。
- 对每种激活分别降低与提高学习率,检查原先差异是否来自优化尺度。
- 固定全部参数并重置,验证种子相同时状态可复现;再改变种子观察波动。
可视化呈现的是一个二维小网络的有限实验。某次 ReLU 边界更准确,只能支持该数据与配置下的观察。函数选择还需结合梯度统计、验证集表现、训练稳定性和推理成本,不能从一幅边界图推断所有架构。
常见误解与反例
平滑性只影响局部导数性质。饱和范围、输出均值、初始化、归一化和优化器同样关键;平滑 sigmoid 在大绝对值处可能传回极小梯度,分段线性的 ReLU 反而能在正区间保持单位导数。
一个训练好的网络可能包含对当前数据始终输出零的单元,而其他单元仍足以完成任务。死亡单元表示该参数通路没有贡献,不等于整个网络输出必定错误。诊断时应同时查看死亡比例、容量需求与验证表现。
最大概率是单个输入上的模型输出,正确率是数据集上预测是否正确的频率。二者统计对象不同。即使最大项为 ,模型也可能预测错误或整体校准不佳。
数值稳定实现
export function sigmoidStable(value: number): number {
if (value >= 0) {
const exponent = Math.exp(-value);
return 1 / (1 + exponent);
}
const exponent = Math.exp(value);
return exponent / (1 + exponent);
}
export function softmaxStable(values: readonly number[]): number[] {
if (values.length === 0) throw new Error("Softmax requires at least one logit.");
const maximum = Math.max(...values);
const exponentials = values.map((value) => Math.exp(value - maximum));
const denominator = exponentials.reduce((sum, value) => sum + value, 0);
return exponentials.map((value) => value / denominator);
}
Sigmoid 按符号改写,避免直接计算极大正指数;softmax 先减去最大 logit,这个平移不改变归一化结果,却降低溢出风险。若输入含非有限数或低精度下全部指数下溢,还需显式错误处理。训练交叉熵时,使用成熟库的 logits 接口通常比先输出概率更可靠。
练习
证明 sigmoid 导数最大值为 ,并说明最大值在哪个输入处取得。
查看解答
令 ,导数为 ,最大值是 ,在 时取得。Sigmoid 单调且 ,所以对应输入为 。
设 。分别写出 、、 三个区间上的线性表达式。
查看解答
当 时两项都为零,。当 时只有第二项激活,。当 时两项都激活, 。函数在两个折点连续,但导数发生变化。
一个任务的每个样本可同时具有“室内”“人物”“夜晚”多个标签。应选择单个三类 softmax,还是三个独立 sigmoid?说明输出与损失的含义。
查看解答
标签不互斥,应使用三个独立 logits 与 sigmoid,每个分量表示对应标签的条件概率估计,并逐标签计算二元交叉熵。单个 softmax 强制三项和为一,会错误地让标签彼此竞争。阈值仍需依据验证数据和业务代价选择。
与其他概念的关系
- 感知机与多层感知机 提供激活函数所在的前向层结构。
- 导数与微分 给出局部线性近似和分段可导分析。
- 反向传播 将激活导数与其他局部导数组合成参数梯度。
- 参数初始化与梯度流 研究预激活分布和梯度方差如何跨层演化。
- 损失函数 决定输出层变换如何与目标数据配对。
- Transformer 的位置前馈层提供 GELU、ReLU 等激活的具体应用场景。
延伸阅读
Deep Learning
Ian Goodfellow, Yoshua Bengio, Aaron Courville · 2016 · MIT Press
打开官方来源《Deep Learning》从前馈网络、反向传播和优化角度讨论 sigmoid、tanh、ReLU 等激活,可用于继续分析饱和、梯度传播与输出单元。具体实现仍应核对所用框架的零点导数和稳定损失接口。
Attention Is All You Need
Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin · 2017 · Advances in Neural Information Processing Systems 30
打开官方来源《Attention Is All You Need》的位置前馈子层使用 ReLU,展示逐元素非线性如何嵌入注意力架构。它可支持该具体架构事实,但不构成 GELU、SiLU 或所有激活函数性能排序的证据。
输出层激活与预测分布
输出激活把网络的无约束分数映射到预测分布允许的参数空间:二分类 sigmoid 把实数映射到 ,多分类 softmax 映射到概率单纯形,正值尺度可用指数或 softplus。这个映射与似然或损失共同构成统计模型,而不只是数值上的“最后一层非线性”。
因此隐藏层激活和输出层激活承担不同职责。隐藏层选择主要影响表达能力与梯度传播;输出层必须满足标签空间和分布参数约束。把 sigmoid 输出与数值上已包含 sigmoid 的二元交叉熵重复组合,会造成重复变换;直接对概率做对数也容易在零附近失稳。实现中应优先使用接受 logits 的稳定损失,并用独立校准集检查概率解释。
后续学习
继续阅读 反向传播,把激活函数导数放入完整计算图;随后阅读 参数初始化与梯度流,分析预激活尺度如何决定饱和比例和跨层梯度。若重点是概率输出,应回顾 损失函数。