初始化方法
为什么神经网络的权重不能全部初始化为零?偏置可以吗?¶
权重不能全部初始化为零的原因:对称性问题
如果所有权重都初始化为相同的值(包括零),那么同一层内每个神经元在前向传播中会计算出完全相同的输出,在反向传播时也会得到完全相同的梯度。这意味着所有神经元将沿着完全相同的方向更新,始终保持相同的权重值。无论网络多宽,它实际上退化为只有一个神经元的模型,即对称性没有被打破,无法学习不同的特征。这被称为对称权重问题。

偏置可以初始化为零
偏置项不涉及输入信号的乘法,只起到平移作用。即使偏置全为零,对称性被打破的关键在于权重必须有不同的值。偏置为零时,只要权重随机,不同神经元的加权和就不同,网络表达能力不受损。且许多初始化策略默认将偏置设为零,后续通过梯度更新自动调整。在某些有 ReLU 的场合,也可将偏置初始化为一个小正数(如 0.01),以避免大量神经元在初始时“死亡”(输出始终为零),但零偏置通常也能正常工作。

过小的随机初始化会导致什么问题?过大的随机初始化呢?¶
过小的随机初始化(例如从 N(0,0.0001)) 采样):
-
前向传播时,每层输出值很小,经过多层后信号逐渐衰减至接近零。
-
反向传播时,梯度同样会因权重很小而逐层缩放,导致深层梯度变得极小,发生梯度消失。
-
使用饱和激活函数(如 sigmoid、tanh)时,小权重使得输入落在激活函数的线性区,导数约为常数,但整体梯度仍可能因连乘小权重而消失;对 ReLU 而言,若输入常为负则直接死亡。
-
训练几乎停滞,损失下降极慢,模型无法学习。
过大的随机初始化(例如从 N(0,1))采样,而网络较深):
-
前向传播时,每层输出值迅速膨胀,经过多层后激活值可能极大(尤其是无界的 ReLU),最终导致数值溢出。
-
对于饱和激活函数,大权重使得神经元输入绝对值很大,落入饱和区,导数接近零,造成梯度消失。
-
对于 ReLU,虽然不饱和,但输出幅度可能逐层爆炸,导致梯度爆炸:反向传播时,梯度随层数指数增长,参数更新幅度巨大,损失值出现 NaN 或震荡。
-
训练极度不稳定,模型无法收敛。
因此,合理的初始化需要保持前向传播和反向传播的信号方差大致恒定,避免指数级衰减或增长。
Xavier/Glorot 初始化的推导基于什么假设?适用于哪些激活函数?¶
推导假设(Glorot & Bengio, 2010):
-
激活函数是线性的,并且关于原点对称(如在零点附近近似恒等,例如 tanh 和 sigmoid 在原点附近近似线性)。具体推导中假设激活值方差在每一层保持不变。
-
权重和输入相互独立,且均值为零。
-
各层输入特征的方差相同,且每层神经元数量可能不同。

适用激活函数:主要适用于关于原点对称且近似线性的激活函数,如 tanh 和 sigmoid(假设数据进行了适当标准化,使其工作在线性区)。对于 ReLU 及其变体,Xavier 初始化会导致方差逐渐减小,因为 ReLU 会把负值置零,相当于丢失了一半的方差,所以需要调整。
Kaiming/He 初始化与 Xavier 初始化的核心区别是什么?为什么它更适合 ReLU?¶
核心区别:

为什么更适合 ReLU:
-
ReLU 的负半轴输出为 0,这会使输出方差减半。Xavier 初始化的方差对于 ReLU 来说过小,经过多层后信号会迅速衰减(方差指数级减小),导致深层梯度消失,训练困难。
-
He 初始化将方差扩大为 2 倍,正好补偿 ReLU 造成的方差损失,使得在深层网络中信号方差能够大致保持恒定,有效缓解梯度消失/爆炸,从而允许训练上百层的网络。
实践证明,用 He 初始化配合 ReLU 和 Batch Normalization,ResNet 等极深网络可以成功训练。
写出 Xavier 初始化和 He 初始化的权重分布公式(均匀分布或正态分布)¶
Xavier 初始化 (Glorot 初始化)
- 均匀分布:

正态分布:

He 初始化 (Kaiming 初始化)
- 均匀分布:

正态分布:

如何使用正交初始化?它有什么优点?¶
使用方式:

优点:
-
范数保持性:正交矩阵是线性等距映射,它乘以输入向量时,不改变向量的范数。因此前向传播中,信号的幅度和方差被精确保持,不会有指数级放大或衰减。
-
梯度稳定性:反向传播时,梯度经过正交矩阵的转置,同样保持范数,能有效缓解梯度消失与爆炸。这尤其对 RNN/LSTM 等序列模型非常重要,因为它们时间步上权重共享,正交初始化可避免长期依赖的梯度问题。
-
特征多样性:正交矩阵的行或列互相正交且单位化,有助于不同神经元学习解耦的特征,避免了权重向量高度相关导致的冗余。
-
在循环网络中广泛应用:对于 RNN 的隐藏层权重,正交初始化能显著提升训练稳定性和收敛速度,甚至可以使用较大学习率。
在 CNN 中,对卷积核(四维张量)进行正交初始化需要将其重塑为二维矩阵,做正交化后再恢复形状。这对于较深的没有 BN 的网络也有帮助。
在进行迁移学习时,加载预训练权重后,新添加层的权重如何初始化?¶
新添加层(通常是任务特定的分类头或回归头)没有对应的预训练权重,需要随机初始化。策略如下:
-
使用标准初始化方法:针对新层的激活函数,选择合适的初始化。例如,若接 ReLU,用 He 初始化;接 tanh,用 Xavier 初始化。如果新层是线性层直接输出 logits,使用较小的随机权重(如均值为 0,标准差 0.01 的高斯分布)也是常见做法。
-
偏置可以初始化为零。
-
减少新层学习速率敏感度:有时新层从头训练,而骨干网络用较小学习率微调。新层初始化不应导致巨大的初始损失,以免传回过大梯度干扰预训练权重。通常初始化为小方差,让初始输出接近零或较小值。
-
特殊情况:若新层为卷积层(如用于分割的 1×1 卷积),可使用 He 初始化。对于 Transformer 的额外任务头,通常也是随机初始化。
总之,新添加层的初始化遵循一般网络初始化的原则,保证信号能平稳流动即可。
偏置项通常如何初始化?为什么可以初始化为零?¶
通常初始化:
-
绝大多数情况下,偏置项被初始化为 0。
-
在一些特定设置中,比如使用 ReLU 激活时,有时会将偏置初始化为一个小正常数(如 0.01),以期在训练初期为 ReLU 提供正输入,避免大量神经元死亡。但后续的研究和实践表明,即使初始化为零,配合恰当的权重初始化,ReLU 也能有效工作,因此零偏置是普遍默认的。
-
对于 LSTM 等门控单元,遗忘门偏置有时会被初始化为较大的正数(如 1 或 2),以促进在训练初期记住长期信息。但这属于特别定制。
为什么可以为零:
偏置不参与输入信号的缩放,不会破坏不同神经元之间的对称性。即使偏置全为零,只要权重随机且不同,每个神经元的输出就会不同,网络就能正常学习。偏置的值会在训练中通过梯度自动调整到合适的水平。
什么是 LSUV(Layer-sequential unit-variance)初始化?它是如何运作的?¶
LSUV 初始化(Mishkin & Matas, 2016)是一种数据相关的初始化方法,目标是使得每一层输出的方差为 1(单位方差),从而在深层网络中保持信号稳定。
运作步骤:
-
用正交初始化(或其他)预初始化所有权重。
-
取一个 mini-batch 的样本输入网络。
-
从第一层开始,逐层进行:

- 经过一遍这样的缩放,所有层的输出方差都归一化到 1,实现了层序列单位方差。 优点:
- 无需手动计算 fan-in/fan-out,适用于各种架构。
- 能稳定极深网络的训练,减少对 Batch Normalization 的依赖。
- 可与正交初始化结合,效果更佳。
- 对于训练很深的网络,LSUV 有助于避免初期梯度问题。 然而,LSUV 需要额外的数据传递开销,且在大批量训练时可能稍显繁琐,但在初始化不稳定的网络中非常有效。
### 初始化对梯度消失和梯度爆炸的影响有多大?请举例说明。
影响非常根本。权重的初始尺度直接决定了前向和反向传播中信号的方差变化率。如果权重初始值偏离合适范围太多,将会导致梯度指数级地消失或爆炸。
示例说明:
假设一个 50 层的全连接网络,每层 512 个神经元,无 BN,使用 tanh 激活函数。
- 错误初始化:使用均值为 0、标准差为 0.01 的高斯分布(方差过小)。 前向传播:每层输出方差逐层缩小,到第 50 层时,输出值接近 0。

-
变化,实际上因为权重太小,梯度会极快地衰减为 0,前端层几乎学不到任何东西,损失曲线平坦。
-
错误初始化:使用均值为 0、标准差为 1 的高斯分布(方差过大)。 前向传播:tanh 输入绝对值可能很大,大量神经元饱和,输出接近 ±1,导数趋于 0。反向传播时,除了小权重区域,梯度也因饱和而消失;如果某些层尚未完全饱和,但权重过大,梯度可能在反向传播中爆炸(因为梯度会乘以大权重),导致更新量巨大,损失突然变为 NaN。

因此,合理的初始化使数百层的网络能够训练;错误的初始化则导致网络完全无法学习。
在 PyTorch 中,默认的初始化方式是什么?如何自定义初始化函数?¶
默认初始化:
PyTorch 并没有一个全局统一的默认初始化,而是根据层类型有不同的默认行为,通常定义在各自的 reset_parameters() 方法中。常见的有:

自定义初始化:
可以定义一个函数,接受模块作为输入,对其中的子模块应用自定义初始化。例如:
def init_weights(m):
if isinstance(m, nn.Linear):
torch.nn.init.xavier_uniform_(m.weight)
if m.bias is not None:
torch.nn.init.zeros_(m.bias)
elif isinstance(m, nn.Conv2d):
torch.nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
model.apply(init_weights)
也可以直接在模型定义中的 init 后手动初始化特定层。torch.nn.init 提供了丰富的初始化函数(uniform, normal, constant, xavier, kaiming, orthogonal 等),并且支持 _ 后缀表示 in-place 操作。
对于很深的网络(如 100 层),除了归一化层,初始化上还有哪些技巧来保证信号传播?¶
除了 Batch Normalization 等归一化技术,初始化方面可以采用以下技巧保证信号传播:
-
动态等距理论 (Dynamical Isometry) 研究如何使输入输出 Jacobian 矩阵的奇异值集中在 1 附近,从而梯度传播时范数保持恒定。正交初始化是实现动态等距的一种有效手段,尤其配合线性或近似线性激活。
-
正交初始化 + ReLU 的特殊处理 正交初始化适用于线性网络,但 ReLU 会破坏正交性。可以采用“正交初始化 + 对权重矩阵进行 SVD 重参数化”或专门设计的卷积正交初始化,以维持等距性质。
-
Scaled Weight Standardization 在初始化时将权重标准化(减去均值除以标准差),然后再乘以一个缩放因子 γ,可控制激活幅度。例如 NFNets(Normalizer-Free Networks)使用带缩放因子的权重标准化结合合适的激活缩放来避免 BN。
-
残差连接与初始化为零的技巧 在 ResNet 中,残差分支的最后一层卷积权重可以初始化为零,使得初始时每个残差块近似于恒等映射(H(x)=x),信号可直接传播,深度影响小。类似的思想用于 Transformer 的 FFN 和注意力输出投影。
-
Fixup 初始化

-
ZeRO 初始化(针对大模型训练) 在分布式训练中,将权重初始化为零,但利用参数的实时分区和优化器状态来打破对称性,不过这不是主流初始化方法,更多是一种系统技巧。
-
使用 ReZero 或 SkipInit 在残差网络中,为每个残差块乘上一个可学习的初始为 0 的参数 αα,让初始状态等于恒等映射,然后逐渐学习残差。这极大缓解了初始化难度。
-
激活函数的缩放置换 对于诸如 Swish、GeLU 等激活函数,如果在初始化时不调整,也可能导致方差变化。可计算该激活函数的“增益”,并在初始化时除以此增益,保持方差恒定(类似于 He 初始化时对 ReLU 的补偿,需针对激活函数推导)。
-
权重归一化 (Weight Normalization) 将权重分解为方向和尺度,在初始化时可单独控制尺度,再配合数据相关初始化稳定信号。
-
LSUV 或数据相关初始化 如上所述,通过实际数据校准每层输出方差为 1,直接保证信号传播。
这些技巧往往组合使用,使得在没有归一化层的情况下,也能训练数百甚至上千层的网络,同时维持快速的收敛和良好的泛化。