You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

全连接层与卷积层权重初始化是否有差异?卷积层如何正确初始化?

全连接层与卷积层的权重初始化差异及实践指南

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:32:43