2.3 项目里怎么挑激活函数


2.3 项目里怎么挑激活函数

本节摘要:把 2.2 的账本接回实践,给出可执行的选型流程:隐藏层默认 ReLU 起步,遇死亡或饱和再升级到 Leaky/ELU/Swish;输出层先按任务类型定,二分类 Sigmoid、多分类 Softmax、回归线性。附一个图像分类与一个数值回归的完整选型决策过程。

前面两节给了"为什么"和"有哪些",这一节给"怎么办"。激活函数的选型没那么玄,它有一套稳定的思考顺序:先分清隐藏层输出层,再按任务与现象逐级做决策。我们用两个真实项目把流程走一遍。

一、隐藏层:从 ReLU 起步,遇到坑再升级

隐藏层的默认答案是明确的:ReLU 起步。 它便宜、供血稳、绝大多数任务够用。要动摇这个默认,得先碰到它特有的问题——死亡 ReLU(负区间梯度恒为 0,见 2.4)。一旦观察到某条路径权重的梯度长期为 0、训练停在半路,你就往"续命派"升级。

升级的顺序我们建议这样排:

  1. 先 Leaky ReLU:改动最小,只给负区间一个固定小斜率,几乎不用额外调参。
  2. 再 ELU / Swish:若希望负区间更平滑地过渡,或 Hydra 式的网络(如残差变体)里想要更多可导性,再换这两个。
  3. 反馈信号实在微弱、深层非常深时,才考虑更激进的方案(配合残差连接,见第 5 章思路)。

关键在"多除非必要、不动默认"。盲目把所有层都换成 Swish 并不一定更好,还可能带来多一点的算力和未知的调参成本。

二、输出层:先问任务,再定函数

输出层的选择逻辑和你想的任务类型强绑定,基本是查表:

任务类型 输出层激活 理由
二分类 Sigmoid 输出压进 0–1,当正类概率
多分类 Softmax 输出和为 1 的概率分布
回归(无界实数) 线性(不加) 输出任意实数,直接当预测值
回归(有界) 视边界用 Sigmoid/Tanh 缩放 把输出限制在目标范围

这里面最容易翻车的是"回归也套个 Sigmoid"——把本来无界的目标值硬压进 0–1,损失函数算出来的方向会和真实任务拧着来。判断依据永远是"我的标签长什么样"。

三、两个完整选型过程

案例一:图像分类(CIFAR-10,十类)

背景是一个十类图片分类网络,用卷积堆叠。决策过程:

  • 因为要用公开的预训练骨干,其带标注的激活基准是 ReLU 系列,就保持默认,不做激进替换。
  • 隐藏层全部 ReLU;最后一个全连接层前不过度加花。
  • 输出层十类,用 Softmax 把十路输出转成合法概率分布。
  • 配套损失用多类交叉熵(第 3 章会讲),这俩(Softmax + 交叉熵)是标准搭档。

结果与解读:训练日志里验证精度稳定爬升,说明每层的非线性供给充足、梯度没有整体消失——ReLU 的默认决策在这里够用。

案例二:房价预测(回归,输出一个实数)

背景是预测一栋房子的成交价,最后输出一个连续金额。决策过程:

  • 试过把输出层接 Sigmoid,发现标签上限没法压,损失大而震荡。
  • 换成线性输出层(不加激活),代价直接回落。
  • 隐藏层继续 ReLU;某一层偶发梯度为 0 时,改成了 Leaky ReLU(α=0.01),不再出现参数冻结。

结果与解读:换用线性输出后,训练损失从半地下落到稳定收敛,误差指标明显改善。这个案例值得记住的经验是:先看输出层对不对,再回去检查隐藏层是否"死了一批"。

如果两个案例里最值钱的判断不是"用了哪个函数",而是"按任务定位输出层 + 按现象抓隐藏层",你的选型思路就对了。

⚠️ 常见坑:一上来就 ABC 三个激活函数各训一轮做对比实验,纯属烧时间。正确姿势是先按"输出层查表 + 隐藏层默认"装配,跑一个基线,遇到明确现象(死亡、饱和、不收敛)再定向替换。

四、一个容易纠结的角落:时序/序列网络

图像与常规分类,ReLU 几乎躺赢;但你一旦碰 RNN/LSTM 这类带循环的结构,故事又不一样。循环结构在时间步上反复穿过同一个函数,如果那个函数梯度稍弱,几十步一乘就消失;若梯度稍强,又可能爆炸。

所以序列任务里常用的不是 ReLU,而是专门设计的带门控的结构(如 LSTM、GRU 内部的 Sigmoid/Tanh 门控),因为它们的"门"能在时间维度上记忆或遗忘信息。给这类网络硬塞 ReLU 隐藏层,往往效果反而不稳定。

网络类型 隐藏层激活建议 补充说明
CNN/MLP 分类 ReLU 起步,遇死换 Leaky/ELU 计算便宜、供血足
RNN/LSTM 用门控单元内建激活 别裸用 ReLU 硬堆时间步
大规模深层 Swish/SiLU 常试用 实验压过 ReLU,但算力更高

五、踩坑时的三个反问题

选型之后出问题,别急着换函数,先反问三句(都答完再动手):

  1. 这是不是输出层在拧着任务? 分类却用线性输出、回归却用 Sigmoid 输出,先把它修对(往往这才是病根)。
  2. 这是不是梯度消失而不是激活没选对? 浅层权重不动,可能来自初始化或归一化,而不是换一个激活就能解决。
  3. 这是不是只是"看着像死"? 某层输出长期 0,也可能是输入分布整片为负、缺少 BatchNorm,而不是函数本身的问题。

这三句既是对本节选型的复盘,也是进入 2.4 前的一次热身——2.4 要正式拆梯度消失、爆炸与死亡 ReLU 这三顽疾。

六、一个"看似换函数,其实是换结构"的观察

选型还有个容易误会的角落:当你把隐藏层从 ReLU 换成 Swish,你以为只是"换个激活",但 Swish 曲线平滑、负区也不完全恒零,它同时放宽了梯度供给与可导性。这意味着换激活常常不是孤立动作,它常与"是否加 BatchNorm""是否加深"连在一起发生作用。 因此看别人复现结果时,不必把"他用 Swish"奉为金科玉律——那往往是一整套自洽配置的合称。你真正要复刻的,是那整台装配,而不是某一个函数名。想清这一点,你挑激活时就会少很多"照抄却失灵"的困惑。

本节要点回顾

  • 两层二分:先分隐藏层与输出层,两套逻辑,别混在一起想。
  • 隐藏层默认 ReLU:便宜、供血足;碰到死亡现象再升级。
  • 升级路线:Leaky → ELU/Swish,改动从小到大。
  • 输出层查表:二分类 Sigmoid、多分类 Softmax、回归线性、有界回归用缩放。
  • 先基线再对比:别把选型当"函数大比拼",按任务现象驱动替换。
  • 一个金律:先修输出层是否拧着任务,再查隐藏层是否死了一片。

输出层老提"概率",隐藏层动不动就"死一批"——这两个坑一旦真切发生在你日志里,就该去 2.4 讨个说法了。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U