权重初始化模拟器 — Xavier·He 返回
机器学习

权重初始化模拟器 — Xavier·He

可视化深层神经网络中输入信号正向传播时,活性化分布如何在各层间变化。切换初始化方法,直观观察信号消失(梯度消失)、发散(梯度爆炸)或保持稳定的现象。

参数设置
初始化方法
权重分布 Var(W) 的设定方式
激活函数
每层的非线性变换
层数
全连接层数量
每层单元数 n
层宽度(扇入)
输入信号标准差
进入第一层的活性化 std
计算结果
初始化方法
最终层活性化 std
输入比变化倍数
信号状态
推荐初始化
适配判定
信号传播 — 深层网络可视化

从左到右排列各层。每个节点的亮度·大小表示该层活性化的std值,信号脉冲通过各层传播。消失的信号向右逐渐变暗,发散的信号则向外膨胀并发光。

激活分布对比 vs 层
各初始化方法最终层 std
理论·核心公式

$$\text{Xavier: }\mathrm{Var}(W)=\frac{1}{n_{in}},\qquad \text{He: }\mathrm{Var}(W)=\frac{2}{n_{in}}$$

权重分布的设定方法。n_in为扇入(该层输入单元数)。He用于ReLU,Xavier用于tanh·sigmoid。

$$\mathrm{Var}(z_\ell)=n\cdot\mathrm{Var}(W)\cdot\mathrm{Var}(a_{\ell-1})$$

线性层后的信号z的分布。n个输入aᵢ与权重wᵢ相乘求和的结果。

$$\mathrm{Var}(a_\ell)=g\cdot\mathrm{Var}(z_\ell)$$

激活后的分布。ReLU丢弃约一半分布(g≈0.5),所以He将Var(W)加倍以补偿,使得信号分布在层间保持稳定。

权重初始化概述

🙋
神经网络的"权重初始化"不就是学习前给权重赋初值吗?随便取一个小的随机数应该没问题吧?
🎓
恰恰相反,深层网络中"随便取小随机数"经常导致灾难性失败。每一层都是对前一层输出的权重乘法和求和,这意味着信号的"分布"(方差)在层间以乘法方式变化。如果权重太小,逐层传播中分布会越来越小,到20层时信号几乎为零。这样一来,反向传播到初始层的梯度也接近零,学习完全停止。这就是"梯度消失"。
🙋
那反过来用大的随机数不就行了?我在左边选了"大随机数(std=1.0)",最终层的std变成了天文数字…
🎓
这就是反方向的失败——"梯度爆炸"。现在分布在层间倍增,指数级发散。30层一下来,数值溢出变成NaN,学习无法进行。所以初始化必须"不太小也不太大",使得分布在层间恒定。这个"恰好"的值是通过理论计算得出的,就是Xavier初始化和He初始化。
🙋
Xavier和He有什么区别?该选哪一个?
🎓
取决于激活函数。Xavier设置权重分布Var(W)=1/n(n是输入单元数),这是针对tanh或sigmoid这样的、原点附近斜率约为1且对称的函数。He设置Var(W)=2/n,即Xavier的2倍。为什么?因为ReLU会把负输入全部置零,丢弃约一半的分布。He提前将权重分布加倍,就能补偿ReLU丢弃的那一半,使分布在层间保持不变。在左边选ReLU激活并用He初始化,上面的图应该是近乎水平的直线。
🙋
那如果用ReLU但选Xavier会怎样?
🎓
试试看。激活函数选ReLU,初始化选Xavier,这样Var(W)=1/n。线性层后分布还是原样,但ReLU随后丢弃一半,所以每层分布都减半。12层的话,2的12次方,也就是分布缩小4000倍。用标准差表示大概缩小60倍,这是明显的梯度消失。"ReLU用He"就是为了填补这个倍数差。
🙋
最后再问一个。"零初始化"选项存在,能从零开始吗?
🎓
这绝对不行,是初始化的反面教材。全部权重为0时,同层所有神经元输出完全相同,反向传播时也接收一样的梯度。结果是所有神经元永久保持同一个值,再多层也只有1个神经元的表达能力。这叫"对称性未破缺"。要让学习工作,权重必须打破对称——用随机小值使不同神经元有不同角色。偏置项可以零初始化,但权重必须打破对称。

常见问答

在深层网络中,每层的线性变换 z = Σwᵢaᵢ 使得活性化分布 Var(a) 在层间以乘法方式变化。若权重过小,Var(a) 在逐层传播中不断缩小,到达前面层的梯度几近于零,导致学习停滞(梯度消失)。反之权重过大,Var(a) 指数级发散导致NaN(梯度爆炸)。Xavier·He初始化通过精心设计权重分布Var(W),使得信号分布在层间保持稳定,仅通过改变初始值就能决定学习是"完全无进展"还是"收敛"。
根据激活函数选择。对于tanh或sigmoid等在原点附近斜率约为1的对称函数,使用Xavier(Glorot)初始化Var(W)=1/n。对于ReLU等将负输入置零并丢弃约一半分布的函数,使用He初始化Var(W)=2/n。He的2倍方差是为了补偿ReLU丢弃的那一半。在本工具中选择ReLU激活函数但用Xavier初始化,可观察到信号分布逐层衰减的现象。
将所有权重初始化为0时,同一层的所有神经元返回相同输出,反向传播时也接收完全相同的梯度。这意味着所有神经元永久保持相同数值,无论有多少层,实质上只提供1个神经元的表达能力。这称为"对称性未破缺"。要使学习工作,权重必须随机化为小值,使不同神经元承担不同角色。偏置项可以零初始化,但权重不能。
批量归一化(BN)通过将每层输出正规化为均值0、方差1,可吸收部分初始化偏差。包含BN的网络即使初始化略有偏差也能学习。但BN本身有计算成本和批次依赖性,而Transformer等许多结构不使用BN,因此适当初始化(He·Xavier)仍是基础。将BN或层归一化与良好初始化结合使用能更稳定地训练深层网络。

实际应用

图像识别的深层CNN:ResNet、VGG等卷积神经网络广泛使用ReLU,因此He初始化事实上已成为标准。He论文(2015年)正是为了"从零开始稳定训练30层级的ReLU网络"而提出的。卷积层中,扇入被定义为"卷积核大小×输入通道数",然后按Var(W)=2/n计算。若沿用Xavier初始化训练深层CNN,常见的现象是训练初期损失不下降,人们可能怀疑"学习率设不好",实际原因往往就是初始化。

自然语言处理与Transformer:Transformer内部包含大量全连接层,激活函数采用GELU(ReLU的光滑变种)。原始论文在Xavier系初始化基础上,还针对残差连接的层数做了初始化缩放。GPT系列在输出射影层使用1/√(2L)的缩放(L为层数),这是"深度自适应初始化"。权重初始化不是简单的前处理,而是架构设计的一部分。

迁移学习·微调:使用预训练模型时,模型主体的权重已学成,不需初始化。但新增的输出头(如分类层)需要初始化。这里若用过大的初始值,微调初期梯度波动剧烈,会破坏预训练的好特征。输出头应采用较小初始化,或设置比主体更低的学习率。

学习失败时的诊断:"损失完全不下降"或"数个epoch后变成NaN"时,应首先输出各层活性化的标准差进行检查。如果像本工具一样看到std逐层消失,说明初始化过小;如果发散,则初始化过大。在怀疑学习率或优化器之前,检查初始化和活性化分布是更高效的调试步骤。

常见误解与注意事项

最常见的误解是"初始化方法都差不多,只要调整学习率就能收敛"。本工具可以验证:ReLU·12层网络,用He初始化时最终层std约1.0,用std=0.01小随机数时信号缩小到天文数字,用std=1.0大随机数时爆炸。这不是学习率能救的——若梯度消失,增加学习率也产生不了有意义的更新。初始化不仅是"决定起点",更是"创造梯度能流动的土壤"。

其次是"混淆扇入(n_in)和扇出(n_out)"。本工具侧重正向传播的分布保存,采用Var(W)=2/n_in(He)。但Xavier原论文为了同时保存正向和反向的分布,提出Var(W)=2/(n_in+n_out)的平均形式。不同框架的实现可能采用fan_in或fan_out模式,对分布的影响可达数倍。务必查看使用框架的默认规约。

最后是"用了Batch Normalization就无需考虑初始化"的思想。确实BN通过正规化各层输出来吸收初始化的粗糙度。但BN本身有可学习的缩放·平移参数(初值为缩放1、平移0),这也是一种初始化。在残差连接网络中,有意将残差分支末尾的BN缩放初始化为0,使网络初期表现为恒等映射,这是"策略性零初始化"。BN存在时初始化设计并未消失,只是形式改变了。

使用指南

  1. 设置神经网络的层数(范围从5层到50层)
  2. 输入每层单元数(例如:输入层256个单元、隐藏层128个单元、输出层10个单元)
  3. 设置输入信号的标准差,选择Xavier初始化(均匀分布U[-√(6/(n_in+n_out)), √(6/(n_in+n_out))])或He初始化(正态分布N(0, √(2/n_in)))
  4. 运行模拟后,可视化显示各层传播后的活性化值标准差变化

具体计算示例

考虑输入层1024单元、隐藏层512→256→128单元的3层架构,输入信号标准差为1.0。使用Xavier初始化时,第1层权重分布约为6/(1024+512)≈3.9×10⁻³,经过10层传播后,活性化std变化倍率约0.95,信号保持稳定。使用He初始化时分布为2/1024≈1.96×10⁻³,深层中活性化std仍保持在0.98倍,避免梯度消失。

实务注意事项

  1. 使用ReLU激活函数时必须采用He初始化(Xavier初始化在20层以上会导致信号衰减)
  2. 使用tanh·sigmoid时Xavier初始化最优,活性化std变化倍率应以0.97以上为目标
  3. 当最终层活性化std与输入比变动超过10倍时,考虑引入批量归一化(BatchNormalization)
  4. 在残差连接(ResNet型)架构中,即使层数超过50层,Xavier初始化也不易引发梯度爆炸