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 论文的中文精校版。
2015 年 2 月,Kaiming He 团队第一次在 ImageNet 上把 top-5 错误率压到 4.94%——超过了人类基准 5.1%。背后只有两个改进:PReLU 激活函数和 Kaiming 初始化。两个改进合计可能不到 100 行代码,却把深度学习推进了一个时代。
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 的精度自然就被推过了人类。
有些改进让模型变更大、变更复杂。
有些改进让模型更容易优化。
后者,往往才是真正的突破。
ReLU 把负输入完全砍掉(输出 0)。PReLU 让网络自己学一个"负斜率" $a_i$——负输入不再消失,而是按 $a_i$ 衰减。当 $a_i = 0$ 是 ReLU,$a_i$ 是固定小数是 Leaky ReLU,$a_i$ 可学习就是 PReLU。几乎零额外参数、零额外计算,但精度提升明显。
论文给出的 PReLU 公式是这样的——
其中 $y_i$ 是第 $i$ 个通道上的激活输入,$a_i$ 是控制负半轴斜率的系数。$a_i$ 上的下标 $i$ 意味着每个通道可以有不同的斜率。
这个公式等价地可以写成:
看清这个家族关系:
· $a_i = 0$ 时——退化成 ReLU。
· $a_i$ 是一个固定的小数(论文里提的 $a = 0.01$)——这是 Leaky ReLU。
· $a_i$ 作为可学习参数,跟其他权重一起被反向传播更新——这就是 PReLU。
论文还提了一个"通道共享"的变体——同一层所有通道共用一个 $a$,每层只多一个参数。论文最终主推的是"通道独立"版本——每个通道独立学一个 $a_i$,但即使是这样,额外参数总数 = 总通道数,跟权重总数比可以忽略不计。
反向传播也很直接。$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。
看 PReLU 学到的 $a_i$ 系数,可以"读懂"网络在干什么——第一层 conv1 学到的 $a$ 接近 0.6(接近恒等,因为低层 Gabor 滤波器的正负响应都重要);越深的层 $a$ 越接近 0(越像 ReLU,因为深层需要更强的非线性来做判别)。网络自己学会了"浅层保留信息、深层增强判别"。
PReLU 最有趣的副作用是——它给了我们一个观察网络在不同深度做什么的窗口。学到的 $a_i$ 系数,可以直接读。
论文里给了一张表,列了 14 层网络每一层学到的 $a$。两个非常有趣的现象:
第一个现象——第一层卷积(conv1)学到的 $a$ 系数非常大:通道共享版是 0.681,通道独立版的平均也是 0.596。这两个数都明显大于 0。
为什么?因为第一层学到的滤波器主要是Gabor 风格的边缘和纹理检测器。这些滤波器的正负响应都有信息——一个边缘的正响应代表"亮到暗"过渡,负响应代表"暗到亮"过渡。直接砍掉负响应(标准 ReLU 的做法)会丢一半信息。PReLU 学会了保留负响应,因为它们承载着方向信息。
第二个现象——越深的卷积层,$a$ 系数越接近 0。深层逐渐"逼近 ReLU"。
这件事透露了网络的工作哲学:浅层倾向于保留更多信息——因为低层特征还在做"感知压缩",每一个 bit 都有用;深层倾向于变得更有判别性——把"不像猫"的激活全部压成 0,只让"像猫"的信号传到分类器。
给模型一个旋钮,
它会教会你网络其实在做什么。
2010 年 Glorot & Bengio 提出的 Xavier 初始化曾是业内默认。但它的推导假设激活是线性的——这对 ReLU 完全不成立,因为 ReLU 把一半输入砍掉了。VGG 团队当年训 8 层以上模型,发现 Xavier 直接训不动。Kaiming 团队要做的,就是从头推导一个专门为 ReLU 设计的初始化。
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 的影响显式建模进去。
核心推导——让每一层激活方差不变,需要 $\text{Var}(w_l) = 2 / n_l$,其中 $n_l$ 是这一层的扇入。比 Xavier 的 $1 / n$ 多了一个因子 2——这个 2 正好补偿了 ReLU 砍掉一半信号造成的方差衰减。这就是 Kaiming 初始化的核心公式。
来看核心推导。设第 $l$ 层卷积的响应是:
其中 $x_l$ 是输入向量、$W_l$ 是权重矩阵、$b_l$ 是偏置。让 $n_l = k_l^2 c_l$ 表示一个响应位置上的输入连接数(卷积核空间大小平方乘以输入通道数)。假设权重相互独立且分布相同,输入也独立且分布相同,权重和输入相互独立。那么:
注意一个细节——$\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}$ 是零均值且对称的。这导致——
因为 ReLU 把负半轴砍成 0,剩下正半轴的平方期望正好是原方差的一半。代回上式:
$L$ 层叠加起来:
关键的设计目标——不让方差指数衰减或爆炸。$L$ 层连乘要保持稳定,要求每个因子等于 1:
解出来:
这就是Kaiming 初始化的核心公式。标准差是 $\sqrt{2 / n_l}$。
跟 Xavier 的 $\text{Var}(w) = 1/n$ 对比,Kaiming 初始化多了一个因子 2。这个 2 正是为了补偿 ReLU 砍掉一半信号造成的方差衰减。
# 今天在 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
反向传播的方差守恒也可以同样推导,得到 $\text{Var}(w_l) = 2 / \hat{n}_l$,其中 $\hat{n}_l$ 是扇出(输出通道数 × 卷积核大小平方)。$\hat{n}$ 和 $n$ 不一定相等,但论文证明:用其中一个版本就够了——前向和反向不会同时失控。这就是为什么 PyTorch 给你 `fan_in` 和 `fan_out` 两个选项,但用哪个都能训。
论文同样推导了反向传播的方差守恒。卷积层的梯度计算是:
其中 $\Delta x_l, \Delta y_l$ 是梯度,$\hat{W}_l$ 是按反向传播方式重排的权重矩阵。设 $\hat{n}_l = k_l^2 d_l$ 是输出通道数对应的扇出。
类似的推导得到——
同样要求每个因子等于 1:
这跟前向那一版唯一的区别就是分母——前向用 $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'——用哪个都能让网络收敛。前者保前向方差守恒,后者保后向。
论文做了三类实验:
第一类,PReLU vs ReLU 直接对比。在一个 14 层小模型上,控制其他变量,只换激活函数:
| 激活函数 | Top-1 错误率 | Top-5 错误率 |
|---|---|---|
| ReLU | 33.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 类的、通用的视觉识别任务上超过人类。
两个看似平淡的改进——
一个可学习的斜率,
一个调整过的初始化方差——
合起来推开了一个时代的门。
这篇论文的两个贡献后来走了不同的命运——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 初始化是道——
它推导出来的方差守恒原则,
会被所有后来人沿用。
这个对比给我们一个深刻的工程启示——能从"第一性原理"推导出来的东西,往往比"经验调出来"的东西更持久。Kaiming 初始化的推导从 ReLU 的数学特性出发,每一步都是严格的方差守恒分析。任何想训"更深的 ReLU 网络"的人,最后都会重新推导出同一个 $\sqrt{2/n}$。这就是"道"。
到这里,CV 系列就有了一个完整的拼图——CNN 讲架构、Backprop 讲优化、Kaiming 讲初始化、ResNet 讲深度。这四篇论文(讲义)一起构成了 2012-2015 年深度学习革命的核心。
下一集,我会回到生成模型的主题,讲 Kaiming He 同期的另一条线——BatchNorm。看 Ioffe 和 Szegedy 是怎么用"内部协变量偏移"这个概念,把训练深网络的另一个老大难——梯度爆炸/消失——彻底解决的。这是 ResNet 能成功的另一半基础。