广哥在硅谷 · 用思考抵达清晰,用行动靠近自由
ICCV 2015 · MSRA

PReLU 与 Kaiming 初始化
第一次超越人类

Delving Deep into Rectifiers · Curated Chinese Edition
Kaiming He et al. · Microsoft 中文精校版 8 章 · 约 25 分钟阅读
📋 内容摘要

2015 年 2 月,Kaiming He 团队发表了一篇双拳齐出的论文。一拳是 PReLU——给 ReLU 加上一个可学习的"负斜率",让网络自己决定要多少非线性。另一拳是 Kaiming 初始化(也叫 He 初始化、MSRA 初始化)——从 ReLU 的数学特性出发,推导出的方差守恒初始化公式 $\text{Var}(w) = 2/n$。这两个看似不起眼的改进合起来,让 ImageNet 上的 top-5 错误率压到 4.94%——人类首次被深度网络超越(5.1%)。今天每个 PyTorch 用户都在用的 nn.init.kaiming_normal_ 就出自这篇论文。本文是这篇 ICCV 2015 论文的中文精校版。

章节目录
  1. 引言 · 超越人类的那一天
    The day we beat humans
  2. PReLU:参数化的 ReLU
    Parametric ReLU
  3. PReLU 学到了什么
    What PReLU Learns
  4. 为什么 Xavier 对 ReLU 失效
    Why Xavier Fails for ReLU
  5. 前向方差分析
    Forward Variance Analysis
  6. 反向方差分析
    Backward Variance Analysis
  7. 实验结果
    Experimental Results
  8. 总结:两个改进,一个里程碑
    Two tweaks, one milestone
CHAPTER 01 · MOTIVATION

引言:超越人类的那一天

The day we beat humans on ImageNet
📌 本节核心要点

2015 年 2 月,Kaiming He 团队第一次在 ImageNet 上把 top-5 错误率压到 4.94%——超过了人类基准 5.1%。背后只有两个改进:PReLU 激活函数Kaiming 初始化。两个改进合计可能不到 100 行代码,却把深度学习推进了一个时代。

ReLU Activation Function Weight Initialization Human-Level

2015 年 2 月,Kaiming He 团队的这篇论文挂上 arxiv。它在 ImageNet 2012 测试集上拿到了 4.94% top-5 错误率——比 ILSVRC 2014 冠军 GoogLeNet 的 6.66% 相对提升了 26%。更具历史意义的是:人类在 ImageNet 上的基准是 5.1%——这是第一次计算机视觉系统在一个通用的、千类分类任务上超过了人类水平

这件事在当时引起了巨大震动。然而背后的"魔法",其实只有两个看似平淡的改进:

第一个改进,PReLU 激活函数——给 ReLU 的负半轴加一个可学习的斜率。

第二个改进,Kaiming 初始化——从 ReLU 的非线性出发,推导出一个让"很深的网络"也能从零训练起来的初始化方法。

这两个改进单独看起来都很小——加起来代码可能不到 100 行。但它们解决了当时所有人都遇到的一个问题——"网络一深就训不动"。等到深度被解锁后,ImageNet 的精度自然就被推过了人类。

有些改进让模型变更大、变更复杂。
有些改进让模型更容易优化
后者,往往才是真正的突破。

— THE PHILOSOPHY OF KAIMING HE
广哥在硅谷◆ ◆ ◆
CHAPTER 02 · PRELU

PReLU:参数化的 ReLU

A learnable negative slope
📌 本节核心要点

ReLU 把负输入完全砍掉(输出 0)。PReLU 让网络自己学一个"负斜率" $a_i$——负输入不再消失,而是按 $a_i$ 衰减。当 $a_i = 0$ 是 ReLU,$a_i$ 是固定小数是 Leaky ReLU,$a_i$ 可学习就是 PReLU。几乎零额外参数、零额外计算,但精度提升明显。

PReLU Leaky ReLU Channel-wise

论文给出的 PReLU 公式是这样的——

$$f(y_i) = \begin{cases} y_i, & \text{if } y_i > 0 \\ a_i y_i, & \text{if } y_i \le 0 \end{cases}$$

其中 $y_i$ 是第 $i$ 个通道上的激活输入,$a_i$ 是控制负半轴斜率的系数。$a_i$ 上的下标 $i$ 意味着每个通道可以有不同的斜率

这个公式等价地可以写成:

$$f(y_i) = \max(0, y_i) + a_i \min(0, y_i)$$

看清这个家族关系:

· $a_i = 0$ 时——退化成 ReLU。
· $a_i$ 是一个固定的小数(论文里提的 $a = 0.01$)——这是 Leaky ReLU。
· $a_i$ 作为可学习参数,跟其他权重一起被反向传播更新——这就是 PReLU。

论文还提了一个"通道共享"的变体——同一层所有通道共用一个 $a$,每层只多一个参数。论文最终主推的是"通道独立"版本——每个通道独立学一个 $a_i$,但即使是这样,额外参数总数 = 总通道数,跟权重总数比可以忽略不计。

反向传播也很直接。$a_i$ 的梯度来自链式法则:

$$\frac{\partial \mathcal{E}}{\partial a_i} = \sum_{y_i} \frac{\partial \mathcal{E}}{\partial f(y_i)} \cdot \frac{\partial f(y_i)}{\partial a_i}$$

其中 $\partial f(y_i) / \partial a_i$ 在 $y_i > 0$ 时是 0,在 $y_i \le 0$ 时是 $y_i$。求和遍历整张特征图上所有空间位置。

训练细节上有一个微妙的点——作者更新 $a_i$ 时不使用权重衰减,因为权重衰减会把 $a_i$ 推向零,相当于"偏向退化成 ReLU",违背了我们想让模型自己决定斜率的初衷。$a_i$ 的初始化用 0.25。

广哥在硅谷◆ ◆ ◆
CHAPTER 03 · WHAT IT LEARNS

PReLU 学到了什么

Reading the learned coefficients
📌 本节核心要点

看 PReLU 学到的 $a_i$ 系数,可以"读懂"网络在干什么——第一层 conv1 学到的 $a$ 接近 0.6(接近恒等,因为低层 Gabor 滤波器的正负响应都重要);越深的层 $a$ 越接近 0(越像 ReLU,因为深层需要更强的非线性来做判别)。网络自己学会了"浅层保留信息、深层增强判别"

Gabor Filters Discriminative Layer Hierarchy

PReLU 最有趣的副作用是——它给了我们一个观察网络在不同深度做什么的窗口。学到的 $a_i$ 系数,可以直接读。

论文里给了一张表,列了 14 层网络每一层学到的 $a$。两个非常有趣的现象:

第一个现象——第一层卷积(conv1)学到的 $a$ 系数非常大:通道共享版是 0.681,通道独立版的平均也是 0.596。这两个数都明显大于 0

为什么?因为第一层学到的滤波器主要是Gabor 风格的边缘和纹理检测器这些滤波器的正负响应都有信息——一个边缘的正响应代表"亮到暗"过渡,负响应代表"暗到亮"过渡。直接砍掉负响应(标准 ReLU 的做法)会丢一半信息。PReLU 学会了保留负响应,因为它们承载着方向信息。

第二个现象——越深的卷积层,$a$ 系数越接近 0。深层逐渐"逼近 ReLU"。

这件事透露了网络的工作哲学:浅层倾向于保留更多信息——因为低层特征还在做"感知压缩",每一个 bit 都有用;深层倾向于变得更有判别性——把"不像猫"的激活全部压成 0,只让"像猫"的信号传到分类器。

给模型一个旋钮,
它会教会你网络其实在做什么

— THE DIAGNOSTIC POWER OF PRELU
广哥在硅谷◆ ◆ ◆
CHAPTER 04 · WHY XAVIER FAILS

为什么 Xavier 对 ReLU 失效

A flawed assumption
📌 本节核心要点

2010 年 Glorot & Bengio 提出的 Xavier 初始化曾是业内默认。但它的推导假设激活是线性的——这对 ReLU 完全不成立,因为 ReLU 把一半输入砍掉了。VGG 团队当年训 8 层以上模型,发现 Xavier 直接训不动。Kaiming 团队要做的,就是从头推导一个专门为 ReLU 设计的初始化。

Xavier / Glorot Variance Propagation Linear Assumption

2015 年之前,Xavier 初始化是业内默认。Glorot 和 Bengio 在 2010 年推导出来的公式是 $w \sim \mathcal{N}(0, 1/n)$,其中 $n$ 是某种"扇入"或"扇出"。这个公式来自一个目标——让每一层激活的方差保持稳定,不要因为层数增加而指数爆炸或消失。

但 Xavier 的推导有一个致命假设它假设激活函数是线性的。在 sigmoid 那个时代(激活函数在原点附近接近线性)这个假设勉强成立。但对 ReLU 完全不成立——ReLU 把一半输入(负数部分)直接砍掉了。

后果是什么?当你把网络加深到 8 层以上的时候,Xavier 初始化会导致方差逐层衰减——因为 ReLU 砍掉了一半信号,每经过一层方差大约减半。8 层之后,信号已经衰减成噪声了。

VGG 团队就遇到了这个问题。他们的解决办法是——先训练一个 8 层小模型,再用它的权重初始化更深的模型。这套"预训练-延展"策略费时费力,而且可能陷入次优解。

Kaiming 团队的目标是——能不能找一个初始化,让 30 层网络直接从随机权重训起来,不需要预训练

答案是肯定的——只要把推导里 ReLU 的影响显式建模进去。

广哥在硅谷◆ ◆ ◆
CHAPTER 05 · FORWARD

前向方差分析

Variance through layers
📌 本节核心要点

核心推导——让每一层激活方差不变,需要 $\text{Var}(w_l) = 2 / n_l$,其中 $n_l$ 是这一层的扇入。比 Xavier 的 $1 / n$ 多了一个因子 2——这个 2 正好补偿了 ReLU 砍掉一半信号造成的方差衰减。这就是 Kaiming 初始化的核心公式。

$\sqrt{2/n}$ Forward Pass Variance Preservation

来看核心推导。设第 $l$ 层卷积的响应是:

$$y_l = W_l x_l + b_l$$

其中 $x_l$ 是输入向量、$W_l$ 是权重矩阵、$b_l$ 是偏置。让 $n_l = k_l^2 c_l$ 表示一个响应位置上的输入连接数(卷积核空间大小平方乘以输入通道数)。假设权重相互独立且分布相同,输入也独立且分布相同,权重和输入相互独立。那么:

$$\text{Var}[y_l] = n_l \cdot \text{Var}[w_l] \cdot \mathbb{E}[x_l^2]$$

注意一个细节——$\mathbb{E}[x_l^2]$ 不等于 $\text{Var}[x_l]$,除非 $x_l$ 是零均值的。而 $x_l = \max(0, y_{l-1})$ 不是零均值的——它非负。这正是 Xavier 推导漏掉的地方。

如果让 $w_{l-1}$ 的分布关于 0 对称,且 $b_{l-1} = 0$,那么 $y_{l-1}$ 是零均值且对称的。这导致——

$$\mathbb{E}[x_l^2] = \frac{1}{2} \text{Var}[y_{l-1}]$$

因为 ReLU 把负半轴砍成 0,剩下正半轴的平方期望正好是原方差的一半。代回上式:

$$\text{Var}[y_l] = \frac{1}{2} n_l \cdot \text{Var}[w_l] \cdot \text{Var}[y_{l-1}]$$

$L$ 层叠加起来:

$$\text{Var}[y_L] = \text{Var}[y_1] \cdot \prod_{l=2}^{L} \frac{1}{2} n_l \cdot \text{Var}[w_l]$$

关键的设计目标——不让方差指数衰减或爆炸。$L$ 层连乘要保持稳定,要求每个因子等于 1

$$\frac{1}{2} n_l \cdot \text{Var}[w_l] = 1, \quad \forall l$$

解出来:

$$\boxed{\text{Var}[w_l] = \frac{2}{n_l}, \quad \text{i.e., } w_l \sim \mathcal{N}\!\left(0, \frac{2}{n_l}\right)}$$

这就是Kaiming 初始化的核心公式。标准差是 $\sqrt{2 / n_l}$。

跟 Xavier 的 $\text{Var}(w) = 1/n$ 对比,Kaiming 初始化多了一个因子 2。这个 2 正是为了补偿 ReLU 砍掉一半信号造成的方差衰减。

PYTORCH
# 今天在 PyTorch 里这样用:
import torch.nn as nn
nn.init.kaiming_normal_(layer.weight, mode='fan_in', nonlinearity='relu')

# 等价于:std = sqrt(2 / n_in),n_in = k * k * c_in
广哥在硅谷◆ ◆ ◆
CHAPTER 06 · BACKWARD

反向方差分析

Backprop variance
📌 本节核心要点

反向传播的方差守恒也可以同样推导,得到 $\text{Var}(w_l) = 2 / \hat{n}_l$,其中 $\hat{n}_l$ 是扇出(输出通道数 × 卷积核大小平方)。$\hat{n}$ 和 $n$ 不一定相等,但论文证明:用其中一个版本就够了——前向和反向不会同时失控。这就是为什么 PyTorch 给你 `fan_in` 和 `fan_out` 两个选项,但用哪个都能训。

Backward Pass fan_in vs fan_out

论文同样推导了反向传播的方差守恒。卷积层的梯度计算是:

$$\Delta x_l = \hat{W}_l \cdot \Delta y_l$$

其中 $\Delta x_l, \Delta y_l$ 是梯度,$\hat{W}_l$ 是按反向传播方式重排的权重矩阵。设 $\hat{n}_l = k_l^2 d_l$ 是输出通道数对应的扇出。

类似的推导得到——

$$\text{Var}[\Delta x_l] = \frac{1}{2} \hat{n}_l \cdot \text{Var}[w_l] \cdot \text{Var}[\Delta x_{l+1}]$$

同样要求每个因子等于 1:

$$\frac{1}{2} \hat{n}_l \cdot \text{Var}[w_l] = 1 \quad\Rightarrow\quad \text{Var}[w_l] = \frac{2}{\hat{n}_l}$$

这跟前向那一版唯一的区别就是分母——前向用 $n_l = k^2 c_{in}$,反向用 $\hat{n}_l = k^2 c_{out}$。

🎯 重要洞察 · 选一个就行

论文证明了一件非常实用的事——选用前向版本或反向版本之一就够了。如果你用反向版本 $\text{Var}(w_l) = 2/\hat{n}_l$,那么前向的方差比例最终是 $c_2 / d_L$——这是一个跟深度无关的常数,不会指数衰减。反过来也成立。

这正是为什么 PyTorch 的 kaiming_normal_ 给你两个选项 mode='fan_in'mode='fan_out'——用哪个都能让网络收敛。前者保前向方差守恒,后者保后向。

广哥在硅谷◆ ◆ ◆
CHAPTER 07 · RESULTS

实验结果

Beating humans on ImageNet
📌 本节核心要点
4.94% Top-5 Human-Level 30-layer Network

论文做了三类实验:

第一类,PReLU vs ReLU 直接对比。在一个 14 层小模型上,控制其他变量,只换激活函数:

激活函数Top-1 错误率Top-5 错误率
ReLU33.82%13.34%
PReLU(通道共享)32.71%12.87%
PReLU(通道独立)32.64%12.75%

PReLU 比 ReLU top-1 提升 1.2%,top-5 提升 0.6%。考虑到 PReLU 只增加 13 个参数(通道共享版),这是一个极其经济的提升

第二类,Kaiming 初始化 vs Xavier 初始化。用同样的 30 层模型从零训练:

· Xavier 初始化:训练损失停留在初始值——完全不收敛
· Kaiming 初始化:训练损失正常下降——稳定收敛

这个对比把 Kaiming 初始化的价值一下子凸显出来——它不是"提升几个百分点",而是"让原本训不动的网络能训了"。

第三类,把 PReLU 和 Kaiming 初始化结合,扩展到深网络。最终的 PReLU-net 在 ImageNet 2012 上的成绩:

· 单模型:top-5 错误率 5.71% —— 超过当时所有多模型集成结果
· 多模型集成:top-5 错误率 4.94%

4.94% 这个数字的意义在于——人类在 ImageNet 上的基准是 5.1%(Russakovsky 等人的研究)这是历史上第一次机器在一个 1000 类的、通用的视觉识别任务上超过人类。

两个看似平淡的改进——
一个可学习的斜率,
一个调整过的初始化方差——
合起来推开了一个时代的门。

— THE BIRTH OF SUPERHUMAN VISION
广哥在硅谷◆ ◆ ◆
CHAPTER 08 · LEGACY

总结:两个改进,一个里程碑

Two tweaks, one milestone
📌 本节核心要点

这篇论文的两个贡献后来走了不同的命运——PReLU 在工程上没成主流(被 ReLU、GELU、Swish 等更简单或更精细的替代品取代),但Kaiming 初始化成为了深度学习的默认配置。今天每个 PyTorch / TensorFlow 用户、每个训练 Transformer / 扩散模型的人,都在不自觉地用着 Kaiming He 在 2015 年推导出的那个 $\sqrt{2/n}$。

2015 年这篇论文发表的时候,大家关注的焦点是"机器第一次超过了人类"。但回头看十年,这篇论文的两个贡献走了完全不同的命运——

PReLU 的结局——没有成为主流。原因有几个:BN 的普及让激活函数对初始化的依赖变弱;ReLU 因为简单依然主导;后来 GELU、Swish、SiLU 等"更光滑"的激活在 Transformer 时代占据了主导。但 PReLU 留下的"可学习激活"思路,在后续的 Mish、动态激活等工作中延续。

Kaiming 初始化的结局——成了深度学习的默认基础设施。今天你在 PyTorch 里用 nn.init.kaiming_normal_,在 TensorFlow 里用 HeNormal()——这些都是 2015 年这篇论文的直接产物。你训 Transformer、训扩散模型、训 LLM——底下都在用 $\sqrt{2/n}$ 这个公式

有些贡献是"招",
有些贡献是"道"。
PReLU 是招——很巧妙,但容易被替代。
Kaiming 初始化是道——
它推导出来的方差守恒原则,
会被所有后来人沿用。

— THE LASTING POWER OF FIRST PRINCIPLES

这个对比给我们一个深刻的工程启示——能从"第一性原理"推导出来的东西,往往比"经验调出来"的东西更持久。Kaiming 初始化的推导从 ReLU 的数学特性出发,每一步都是严格的方差守恒分析。任何想训"更深的 ReLU 网络"的人,最后都会重新推导出同一个 $\sqrt{2/n}$。这就是"道"。

到这里,CV 系列就有了一个完整的拼图——CNN 讲架构、Backprop 讲优化、Kaiming 讲初始化、ResNet 讲深度。这四篇论文(讲义)一起构成了 2012-2015 年深度学习革命的核心。

下一集,我会回到生成模型的主题,讲 Kaiming He 同期的另一条线——BatchNorm。看 Ioffe 和 Szegedy 是怎么用"内部协变量偏移"这个概念,把训练深网络的另一个老大难——梯度爆炸/消失——彻底解决的。这是 ResNet 能成功的另一半基础。