小节开头思维引导
上一节你已经搞懂了神经元 “怎么处理数据”,但还有个关键问题没解决:神经元里的权重(w)和偏置(b)“有多少个”“一开始设成什么值”—— 这一节就聚焦 “参数”,教你算清参数数量(避免后续写代码时维度报错)、选对初始化方法(避免训练时网络 “学不动”),这是让全连接网络能正常训练的核心前提。
小节详细内容
-
参数的定义与分类
全连接网络的 “可学习参数” 只有两类:权重(w)和偏置(b),所有参数都会在训练中通过 “反向传播” 不断调整,最终让网络预测更准。
- 权重(w):连接两层神经元的 “桥梁参数”,每个连接对应 1 个权重,决定 “上一层神经元输出对下一层的影响程度”。
- 偏置(b):每个神经元独有的 “调整参数”,不依赖输入,只负责给神经元的 “加权求和结果” 偏移一个固定值,确保输入为 0 时神经元也能工作。
-
参数数量的计算方法
参数数量完全由 “相邻两层的神经元数量” 决定,记住两个简单公式就能算,用之前 “手写数字识别” 的例子(输入层 784 个神经元、隐藏层 128 个神经元、输出层 10 个神经元)来验证:
-
权重数量:上一层神经元数 × 下一层神经元数
- 输入层→隐藏层的权重:784 × 128 = 99840 个
- 隐藏层→输出层的权重:128 × 10 = 1280 个
- 总权重数:99840 + 1280 = 101120 个
-
偏置数量:下一层神经元数(每个下一层神经元对应 1 个偏置)
- 隐藏层的偏置:128 个(和隐藏层神经元数一致)
- 输出层的偏置:10 个(和输出层神经元数一致)
- 总偏置数:128 + 10 = 138 个
-
网络总参数数:总权重数 + 总偏置数 = 101120 + 138 = 101258 个
注意:参数数量会直接影响 “训练速度” 和 “过拟合风险”—— 参数越多,训练越慢,越容易记牢训练数据(过拟合),所以设计网络时要避免 “盲目加神经元 / 加层”。
-
参数初始化的作用:为什么不能随便设值?
如果初始化参数不当,会导致训练 “卡壳”,常见问题有两个:
-
梯度消失:如果权重初始值太小(比如都设成 0.0001),经过多层计算后,输出会趋近于 0,反向传播时梯度也会变得极小,权重几乎无法更新(网络 “学不到东西”)。
-
梯度爆炸:如果权重初始值太大(比如都设成 100),经过多层计算后,输出会趋近于无穷大,反向传播时梯度也会变得极大,导致权重更新后直接 “溢出”(网络输出全是 NaN,无法训练)。
所以参数初始化的核心目标是:让每层的输入和输出 “数值范围保持稳定”,避免梯度消失或爆炸。
-
Pytorch 中的常用初始化方法(实战重点)
Pytorch 会给神经网络层(比如
nn.Linear,全连接层的官方实现)默认初始化参数,但也支持手动指定方法,视频里重点讲了 3 种实用方法:
-
方法 1:默认初始化(新手首选)
使用
nn.Linear(in_features, out_features)创建全连接层时,Pytorch 会自动用 “Xavier 均匀分布”(适用于 Sigmoid、Tanh 激活函数)或 “Kaiming 均匀分布”(适用于 ReLU 激活函数)初始化权重,偏置会默认初始化为 0—— 不用手动调,直接用就能避免大部分问题。代码示例:
fc1 = nn.Linear(784, 128)(输入层→隐藏层,自动初始化权重和偏置) -
方法 2:Kaiming 初始化(ReLU 激活函数专用)
如果手动定义层,且用 ReLU 激活函数,推荐用 Kaiming 初始化(也叫 “He 初始化”),能更好地避免梯度消失。
代码示例:
import torch.nn as nn
fc1 = nn.Linear(784, 128)
nn.init.kaiming_uniform_(fc1.weight, mode='fan_in', nonlinearity='relu') # 权重用Kaiming均匀分布
nn.init.constant_(fc1.bias, 0) # 偏置初始化为0
-
方法 3: Xavier 初始化(Sigmoid/Tanh 激活函数专用)
如果用 Sigmoid 或 Tanh 激活函数,用 Xavier 初始化更合适,能让输入和输出的方差一致。
代码示例:
nn.init.xavier_uniform_(fc1.weight, gain=1.0) # 权重用Xavier均匀分布
nn.init.constant_(fc1.bias, 0) # 偏置初始化为0
注意:不用死记方法,记住 “用 ReLU 就选 Kaiming,用 Sigmoid/Tanh 就选 Xavier”,新手先用默认初始化即可。
小节结尾思维引导
这一节你已经掌握了 “参数的核心知识”:能算清参数数量(避免代码维度错)、知道初始化的重要性(避免训练卡壳)、还学会了 Pytorch 里的实际操作 —— 接下来就要学 “数据在网络里怎么‘向前走’”(前向传播),这是把 “静态的网络结构” 变成 “动态的计算流程” 的关键。
全连接神经网络参数计算与初始化
8065

被折叠的 条评论
为什么被折叠?



