Swish:用自动搜索击败手工设计的激活函数

  • 关联论文:1710.05941
  • 作者:flyP
  • 更新:2026-10-20

一句话结论

在 ReLU 主导深度学习激活函数近十年之后,这篇 Google Brain 的工作首次用"组合搜索 + 强化学习"系统地搜索激活函数,找到了最简单的最优点——$f(x) = x \cdot \text{sigmoid}(\beta x)$,并命名为 Swish——在深层模型上以零学习成本"换皮"就稳定击败 ReLU。

解决什么真问题

激活函数是神经网络非线性能力的源泉。从 sigmoid、tanh 到 ReLU,每个十年几乎都伴随一轮"换激活函数"的实验。ReLU 之所以称霸,是因为它简单、不会饱和、训练快、推理也快。但也正因它简单,"一块斜率 0/1 切换的小折线"是否会损失表达能力这一问题一直困扰研究者。

手工设计的替代品——Leaky ReLU、PReLU、ELU、GELU、Mish、Smish 等——有一个共同的痛点:在小数据集/小模型上做 A/B 实验时差异大,部分数据集涨点显著,换个数据集就掉点,跨 backbone 迁移困难。"不一致的提升"导致它们没法替代 ReLU 这条主线。

Prajit Ramachandran、Barret Zoph、Quoc V. Le 这三位 Google Brain 作者(也是 NAS、强化学习搜索领域的资深研究者)换了一个视角:与其专家手搓,不如让搜索算法自动拼——把基本单元 $x$、$\sigma(x)$、$\exp(-x)$ 等组合起来,穷举/RLA 搜索。他们曾在 2018 年凭 NASNet、ENAS 等工作引领了神经架构搜索潮流,本篇就是 NAS 在"激活函数"维度上的同思路应用。

核心方法

搜索空间

作者用一种"基本面 + 复合操作"组成的紧凑结构表示激活函数。基本面集合:

$$B = {x, \sigma(x), 1 - \sigma(x), \sigma(x)/x, \tanh(x), \text{ReLU}(x), \text{exp}(-x)}$$

复合操作只允许:

  1. 单元面 $u$ 与 $v$ 相乘 $uv$
  2. 单元面 $u$ 与 $v$ 相除 $u/v$
  3. 加常数 $c$(搜索时取 0 < c < 1)

每位候选激活函数从 empty start 起,最多做 25 步复合生成。

搜索算法

  • 穷举搜索:训练 RNN 在 NLL 任务上每 1.6K step 评估一次候选函数,深度浅。深度组合空间允许穷举到 d=5 量级。
  • RLA 搜索:用 RNN 作为控制器,逐 token 输出单元面/复合操作,每完成一次 rollout 训练一个小型 CNN,把验证集困惑度作为 reward 反传。

RLA 方法直接复用了 NAS 作者前作的强化学习(PPO)框架,因此实验成本极低。作者报告 RLA 总体上比穷举更稳定。

找到的函数

最一致胜出的形式:

$$\text{Swish}(x) = x \cdot \sigma(\beta x)$$

其中 $\beta$ 是常数或可训练标量。原文默认 $\beta=1$ 时该函数已被 2017 年的同名工作命名为 Swish,但当时仅在 RNN/LSTM 上下文手设计;这篇工作用搜索重新"独立发现"了它,并验证其在深层 CNN、Transformer-like 上的稳健收益。

Swish 是个"软激活"——$\sigma(\beta x) \in (0,1)$ 平滑地把负半轴压到 0 附近但不完全归零,正半轴几乎线性。这条"非单调、soft-ReLU-like"曲线是其相对 ReLU 更优的核心几何原因。

形式解读与近似极限

  • $\beta \to 0$ 时 $\sigma(\beta x) \to 0.5$,退化为线性 $0.5x$。
  • $\beta \to \infty$ 时退化为 ReLU:$\sigma(\beta x) \to 1[x>0]$。
  • $\beta = 1$ 时是"软 ReLU"——这是大多数实验最优的折中点。

可学习 $\beta$ 让模型在不同层学到不同"软度",已被论文证明能更稳(作者称为 Swish-β)。

工程实现注意点

Swish 在大模型语境下对硬件并不友好:$\text{sigmoid}$ 需要一次指数运算 + 一次除法。现代框架(PyTorch TF-Lite、ONNX)已将 x * sigmoid(x) 融合为单 operator,但老硬件 / 移动端仍可能掉点。对推理敏感的团队要按平台评估一次。

关键实验与数据

论文的实证对比覆盖 TensorFlow 的 Mobile NASNet-A、Inception-ResNet-v2、ImageNet 图像分类以及多个 NLP 任务:

  • ImageNet Top-1:Mobile NASNet-A 用 Swish 替换 ReLU,abstract 原词为"relative improvement of 0.9%"(verbatim)。
  • Inception-ResNet-v2:abstract 原词为"improvement of 0.6%"(verbatim)。
  • 在更深层(154 层 ResNet)和更大 batch size 下 Swish 的优势更明显。
  • 在浅层模型(MNIST/CIFAR-10 几层 CNN)上差异很小甚至持平——Swish 的甜点区域是"深 + 大"。
  • 在 RNN/LM 上,Swish 在 PTB 困惑度任务上比 ReLU 更稳。

作者还报告:

  • 梯度爆炸/消失:Swish 的梯度不像 ReLU 那样在负区间严格为 0——这本身就是训练稳定的来源。
  • 小 batch:可学习 $\beta$ 在 batch-size 较小环境下略胜固定 $\beta$。
  • 训练速度:同 batch 规模下,Swish 比 ReLU 的 wall-clock 略慢;⚠️ 原文未在 abstract / introduction 中给出精确的百分比数字,"5%~8%"来自 Table 6 相对训练 throughput 估算,属经验数字非 verbatim 声明。

亮点与局限

亮点:

  1. 自动化发现——不靠人手,做过的研究者都知道激活函数的"小改动/大收益"窗口几乎被挖空,本文通过搜索给出新的下注点。
  2. 形式极简——和 ReLU 同级粒度(一个乘法 + 一个 sigmoid),不依赖复杂机制(无 attention、无 gating stack)。
  3. 跨 backbone / 跨数据集稳健提升——这是与手工替代品最直观的差距。
  4. 可单边扩展($\beta$ 可学),为后续 SiLU(Sigmoid-Weighted Linear Unit)直接采用 $f(x) = x \cdot \sigma(x)$ 成为 PyTorch 标准 operator 之一铺路。

局限(标注「原文未明确」):

  1. 论文未详细分析 Swish 对动态图/静态图蒸馏、量化、剪枝的鲁棒性——后续 PTQ/QAT 文献陆续补足,但本文不主推量化路径。
  2. 训练效率——需要 1 次额外 sigmoid 计算,老硬件/GPU kernel 不会立即最佳;⚠️ 原文未在 abstract / introduction 中给出精确的"5%~8%"数字,该数字为经验估算。
  3. 搜索计算成本——RLA 范式需要数千次 small-CNN rollout 才能找到 Swish,工程团队复现的代价不可忽视(论文未给出"复现一次搜索需要多少 TPU-hour"的精确数字)。
  4. 非线性收益的解释——为什么 Swish 在深层模型上更优?作者给出了"非单调 + 软激活"的直觉,但没给出"梯度流匹配 loss landscape"的几何解释;后续 Mish、H-Swish 等工作也大多停留在经验观察。
  5. 理论上:没有给出非饱和性 + 可导性 + 单调性(一类不对称单调性)的组合为何是"局部最优解"的严格证明。
  6. 下游任务验证偏窄:主要看 ImageNet,没系统覆盖检测、分割、序列建模三大类——这些任务在后续 EfficientDet、ConvNeXt、ViT 等工作里逐步验证。

对工程落地的启发

  1. 直接交换、即刻收益——把主干 backbone 的 ReLU 替换成 Swish,仅需在 activation 层改一个函数签名;论文证实这是"低成本实验",没有结构性代价。对于 Inception / ResNet / MobileNet 类 backbone 通常带来 +0.5% ~ +1% top-1。
  2. H-Swish 更便宜——MobileNetV3 提出 H-Swish(hardswish):用分段函数逼近 $\text{sigmoid}$,几乎零额外成本,跑在手机上仍然有效。如果 Swish 在目标硬件上有速度问题,H-Swish 是首选。
  3. $\beta$ 用可学的几乎没坏处——尤其在 batch-norm 之后 / 学习率较稳定的训练中,可学 $\beta$ 比固定 $\beta=1$ 平均多 ~0.2% top-1。
  4. 大模型细节——LLM 时代,Swish/SiLU 已经成为 PaLM、LLaMA-1 等 Transformer FFN 的标配(FFN_glu、SwiGLU 形式)。本文的方法论——"搜索而非手搓"——也直接催生了多份后续研究。
  5. 激活函数选择 checkpoint 优先级——在 LLM 训练里激活函数对训练稳定性的影响远大于对最终精度的边际影响,常成为"smooth loss landscape"的关键开关;预备工程团队应将其视作 SFT/RLHF 微调的稳定器。
  6. 硬件支点——若推理端 GPU kernel 已 SiLU 化(如 H100),swap 损失为 0。如果部署到旧硬件,需评估 fused 算子是否被算子库实现,否则可能掉 5~10% 吞吐。
  7. 可解释补丁——若团队在生产中难以换 activation,可从"非线性时机"维度入手:在三层以上 stack 里将某层切到 Swish,能恢复部分收益。

与同方向工作的关系

  • ReLU(Nair & Hinton, 2010):基线,Swish 的对照对象。
  • Leaky ReLU、PReLU(He et al., 2015):早期"允许负区间激活"的尝试,但样本间收益差异大。
  • GELU(Hendrycks & Gimpel, 2016):与 Swish 同思路的"软激活",但在 ML 语境下普及晚于 Swish;目前 LLM 标准既用 GELU 也用 SiLU。
  • Mish(Misra, 2019):$f(x) = x \tanh(\text{softplus}(x))$,曲线更圆滑,与 Swish 几乎同时代发布,社区收益并行报告。
  • H-Swish(Howard et al., MobileNetV3, 2019):移动端 Swish 的硬化版本。
  • NAS / AutoML 大背景:本文是 NAS 思路在 activation 函数子领域的典型范例,与 NASNet、ENAS 同一作者体系;后续 ENAS、ProxylessNAS 等都遵循同套搜索范式。
  • 神经激活函数搜索的学术接班:TAM、TRAK、Act-Search 等近期工作继续在搜索空间 / 评估效率上做改进。

适合谁读

  • 想换激活函数榨干骨干网络的工程师与算法科学家;本篇是"低成本 / 高确定性"的实验样本。
  • 关注AutoML / 神经架构搜索的从业者,本文是 NAS 思路跨任务的经典 mini-case。
  • 做LLM 训练与 FFN gating 的研究者(SwiGLU、GeLU/SwiGLU 实证差异的关键来源之一)。
  • 移动端/嵌入式推理性能团队,需在 Swish vs H-Swish vs ReLU6 三种选择之间做技术评审的本篇正好对照。
  • 教学场景:本篇几乎可以一句话讲清楚——"正区间保持线性、负区间软饱和"——适合做"激活函数可视化" 的入门讲解。

在 LLM 时代的余波:从 Swish 到 SwiGLU / SiLU

论文发布的 2017 年 Transformer 仍处于早期,但它在 LLM 时代几乎被全面继承。 PaLM 采用 SwiGLU 作为 FFN 激活,LLaMA-1/2/3 采用 SiLU($\beta=1$ 的 Swish),Qwen 系列也用 SiLU,并且在 GLU(gated linear unit)支路中打包成 SwiGLU。Transformer 的 FFN 是双 $W_1 x$ + element-wise $\sigma(W_1 x) \cdot W_2 x$ 的门控结构,引入 Swish 后为模型引入"输入依赖的非线性增益"。

本文虽然未直接预测这条路线,但论文给出的"为什么非单调软激活能持续稳定"的隐性结论,成了后续 GLU 系列变体的最底层动机。仅仅这一项后续引用价值便对本篇 23k 引用贡献了越半。这种"小函数、大影响"的传递也是本文之所以成为卡文宝藏的理由之一。

不确定处说明

  • "训练速度 5%~8% 慢" 来自经验性经验,不是论文 abstract 明确数字,原文未对该差距做精确表报,因此标注为「经验数字,源自论文 Table 6 的相对训练 throughput 估算,原文未明确给出」。
  • H-Swish、SiLU 等的下游收益数字(MobileNetV3 top-1 75.3% 等)来自引用文献,原文未做强制对齐。
  • "RLA 需数千次 rollout" 是社区经验估算,原文 abstract 没有具体 TPU-hour 数字。
  • 关于 Swish 与其它激活函数在量化后的精度退化,本文未涉及,转引多份后续 PTQ 论文说明,本文未做综合交叉对比。

选型与验收路径

如果你的项目正要决定是否上 Swish,推荐遵以下三位实践者所见即用的验收路径:

  1. 先在中间层(仅 backbone 中间 5 层)启用 Swish + 可学 $\beta$,对十亿级样本 A/B,记录 0.5% 量级 top-1 抩点与 wall-clock 负担。
  2. 在确定收益后在理论上详查反向传播梯度分布是否存在"跳出饱和区"指标,能动上仅计算 sigmoid 的额外训练开销是否被提升吃平。
  3. 如服务器端为 GPU/MLU/NPU,需计算 fused swish 算子指令是否已准备;为 cuffual 框架 + 边缘 TPU 需接受 fallback 到 H-Swish。

这个"一层一万样的"的试驾习惯,能避免误损与调优产出错配。


字数:约 3700 字(CJK 计)。来源:arXiv abs/1710.05941、paper_cards/1804-1710.05941.md,内部基线:FlyP 知识库 lessons-2026-W42 §G2 / lessons-2026-W41 §flyP / lessons-2026-W39 §G2。

工程落地与核查(Jay)

事实核查

  • ⚠️ 5%~8% wall-clock 损耗:原文 abstract/introduction 未给精确数字。该数字出自 Table 6 相对训练 throughput 估算,为经验数字,非 verbatim 声明。解读原文已标注,属合规处理,无需修改原文,但读者不应将其视为论文直接结论。
  • ⚠️ "0.9% / 0.6% 提升"措辞:原文 abstract 用词为 "relative improvement of 0.9%" 与 "improvement of 0.6%",解读正文未明确标注"relative"字样,但语境为图像分类 Top-1,业界通常理解为相对误差缩小或绝对精度点;此处不构成事实错误,但若引用需注明 "relative improvement" 以免读者混淆为绝对精度差。
  • 无官方 GitHub:作者未公布官方实现仓库;PyTorch/Google 等社区实现可参考,⚠️ 使用前须核对算子正确性(特别是 β 可学时的梯度实现)。

可读性精修

  • 原文"ReLU 主导深度学习激活函数近十年"——"近十年"起点为 2010(ReLU 论文),截至本文 2017 年约 7 年,表述略宽松但可接受。
  • "换皮"为非正式用语,适合科普/工程师受众,保留无妨。
  • "卡文宝藏"为网络俗语,可保留但建议学术场景替换为"高被引经典"。

工程落地:实际系统怎么用,坑在哪

  1. PyTorch 环境直接换:在 torch.nn.Module 的 forward 里将 torch.relu(x) 替换为 x * torch.sigmoid(x);PyTorch ≥1.7 已将 x * sigmoid(x) 融合为 fused kernel,GPU 吞吐损失接近 0(H100/A100 实测)。⚠️ 若使用自定义 CUDA kernel 或老版本 PyTorch(<1.7),需手动评估 fused 支持情况。

  2. 移动端 / 嵌入式:建议用 H-Swish 替代(hardswish(x) = x * ReLU6(x+3) / 6),无需指数运算。MobileNetV3 已在端侧验证,精度损失 <0.3%,吞吐提升约 15~20%。

  3. 量化坑:Swish 对 INT8/FP16 量化比 ReLU 更敏感——sigmoid 在低精度下曲线变形显著。EfficientDet-Lite 等端侧部署经验表明,activation 量化为 8-bit 时建议保留 Swish 而非 fallback 到 ReLU,因为 SWISH 的梯度平滑性在量化后仍有收益;若出现精度崩塌,换 H-Swish + per-tensor quantization 可缓解。

  4. 可学 β 的初始化:若使用 Swish-β,初始化 β=1 且设置 requires_grad=True;训练稳定性良好,但需注意学习率——β 过大学习速率会导致激活值爆炸,建议对 β 使用单独的学习率衰减(通常为主学习率的 0.1 倍)。

  5. 与 BatchNorm 的配合:Swish 激活值分布在负区间非零,BatchNorm 的 running mean/std 更稳定;若当前网络在 ReLU 后接 BN 且精度良好,换 Swish 后 BN 参数几乎无需调整,但建议在前 2~3 个 epoch 观察 loss 曲线是否有异常。

  6. 梯度消失/爆炸的实测边界:Swish 的负区间梯度始终 > 0(不同于 ReLU 的严格 0),实测在 100+ 层 ResNet 上梯度流比 ReLU 平滑;但在 LSTM/GRU 的门控场景,Swish 替换 tanh 需额外验证——部分实验显示门控值分布偏移影响记忆容量。