1.9 全连接神经网络的参数计算与初始化

全连接神经网络参数计算与初始化

小节开头思维引导

上一节你已经搞懂了神经元 “怎么处理数据”,但还有个关键问题没解决:神经元里的权重(w)和偏置(b)“有多少个”“一开始设成什么值”—— 这一节就聚焦 “参数”,教你算清参数数量(避免后续写代码时维度报错)、选对初始化方法(避免训练时网络 “学不动”),这是让全连接网络能正常训练的核心前提。

小节详细内容

  1. 参数的定义与分类

    全连接网络的 “可学习参数” 只有两类:权重(w)和偏置(b),所有参数都会在训练中通过 “反向传播” 不断调整,最终让网络预测更准。

  • 权重(w):连接两层神经元的 “桥梁参数”,每个连接对应 1 个权重,决定 “上一层神经元输出对下一层的影响程度”。
  • 偏置(b):每个神经元独有的 “调整参数”,不依赖输入,只负责给神经元的 “加权求和结果” 偏移一个固定值,确保输入为 0 时神经元也能工作。
  1. 参数数量的计算方法

    参数数量完全由 “相邻两层的神经元数量” 决定,记住两个简单公式就能算,用之前 “手写数字识别” 的例子(输入层 784 个神经元、隐藏层 128 个神经元、输出层 10 个神经元)来验证:

  • 权重数量:上一层神经元数 × 下一层神经元数

    • 输入层→隐藏层的权重:784 × 128 = 99840 个
    • 隐藏层→输出层的权重:128 × 10 = 1280 个
    • 总权重数:99840 + 1280 = 101120 个
  • 偏置数量:下一层神经元数(每个下一层神经元对应 1 个偏置)

    • 隐藏层的偏置:128 个(和隐藏层神经元数一致)
    • 输出层的偏置:10 个(和输出层神经元数一致)
    • 总偏置数:128 + 10 = 138 个
  • 网络总参数数:总权重数 + 总偏置数 = 101120 + 138 = 101258 个

    注意:参数数量会直接影响 “训练速度” 和 “过拟合风险”—— 参数越多,训练越慢,越容易记牢训练数据(过拟合),所以设计网络时要避免 “盲目加神经元 / 加层”。

  1. 参数初始化的作用:为什么不能随便设值?

    如果初始化参数不当,会导致训练 “卡壳”,常见问题有两个:

  • 梯度消失:如果权重初始值太小(比如都设成 0.0001),经过多层计算后,输出会趋近于 0,反向传播时梯度也会变得极小,权重几乎无法更新(网络 “学不到东西”)。

  • 梯度爆炸:如果权重初始值太大(比如都设成 100),经过多层计算后,输出会趋近于无穷大,反向传播时梯度也会变得极大,导致权重更新后直接 “溢出”(网络输出全是 NaN,无法训练)。

    所以参数初始化的核心目标是:让每层的输入和输出 “数值范围保持稳定”,避免梯度消失或爆炸。

  1. 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 里的实际操作 —— 接下来就要学 “数据在网络里怎么‘向前走’”(前向传播),这是把 “静态的网络结构” 变成 “动态的计算流程” 的关键。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter_Monster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值