全连接层与卷积层权重初始化是否有差异?卷积层如何正确初始化?
全连接层与卷积层的权重初始化差异及实践指南
Great question—this is a common point of confusion when moving from fully connected networks to CNNs. Let's break this down step by step.
一、核心差异:输入结构决定初始化逻辑
全连接层和卷积层的初始化本质都是为了避免训练初期梯度消失/爆炸,但两者的输入结构完全不同,导致计算“有效输入数量”的方式不一样:
- 全连接层的输入是一维向量,每个神经元连接所有输入神经元,所以输入数量
n就是输入层的神经元总数。 - 卷积层的输入是二维/三维特征图,每个卷积核只连接输入特征图上的局部区域(感受野),同时跨所有输入通道。所以这里的“有效输入数量”不是特征图的总像素数,而是单个卷积核所连接的输入元素总数(即
in_channels * kernel_height * kernel_width)。
二、ReLU的初始化规则是否适用于卷积层?
完全适用,但要调整输入数量的计算方式。
Andrew Ng提到的“ReLU激活时权重取自正态分布并按2/n缩放”,这里的n对于卷积层来说,要替换成上面说的“单个卷积核的输入连接数”。举个例子:
- 假设你有一个卷积层,输入通道数是64,卷积核尺寸是3×3,那么
n = 64 * 3 * 3 = 576,权重初始化的正态分布标准差就是sqrt(2/576) ≈ 0.059。
其实这个逻辑就是大名鼎鼎的He初始化(Kaiming初始化),现在主流框架(比如PyTorch、TensorFlow)都内置了这个初始化方法,会自动根据层的类型(全连接/卷积)计算正确的n,不用手动算。比如在PyTorch里,你可以直接用:
import torch.nn.init as init init.kaiming_normal_(conv_layer.weight, mode='fan_in', nonlinearity='relu')
这里的fan_in就是我们说的单个卷积核的输入连接数,框架会自动帮你计算。
三、卷积层权重与偏置的正确初始化方式
权重初始化
根据激活函数的不同,选择对应的初始化策略:
- ReLU/Leaky ReLU等带整流的激活函数:优先用He初始化。可以选择正态分布(
N(0, sqrt(2/fan_in)))或者均匀分布(U(-sqrt(6/fan_in), sqrt(6/fan_in))),其中fan_in = in_channels * kernel_size[0] * kernel_size[1]。 - Sigmoid/Tanh等饱和激活函数:用Xavier初始化(Glorot初始化)。正态分布版本是
N(0, sqrt(1/((fan_in + fan_out)/2))),均匀分布是U(-sqrt(6/(fan_in + fan_out)), sqrt(6/(fan_in + fan_out))),这里fan_out = out_channels * kernel_size[0] * kernel_size[1]。 - 迁移学习场景:直接使用预训练模型的卷积层权重(比如ResNet、VGG等),这比随机初始化的效果要好得多,尤其是数据集较小时。
偏置初始化
偏置的初始化相对简单,大部分场景下直接初始化为0就足够了:
- 对于ReLU类激活函数:初始化为0不会有明显问题,如果你担心初期有太多神经元被置0(死亡ReLU),可以尝试把偏置初始化为很小的正数(比如0.01),但这不是必须的,大部分情况下0就够用。
- 对于Sigmoid/Tanh激活函数:初始化为0能让输出初始时接近激活函数的线性区域,避免过早进入饱和区。
- 注意:框架内置的He/Xavier初始化方法默认会把偏置设为0,除非你手动修改。
内容的提问来源于stack exchange,提问作者Ziofil
相关产品推荐
相关产品推荐

