资讯详情

深度学习22:PyTorch:参数初始化和正则化

📅 2026/10/29 2:00:57 | 华诺云谱 👁 阅读
深度学习22:PyTorch:参数初始化和正则化
目录标题一、全连接层(nn.Linear)二、常数初始化三、秩初始化四、正态初始化五、均匀分布初始化六、 Xavier 初始化Glorot 初始化七、 He 初始化Kaiming 初始化何凯明八、 正则化: Dropout 随机失活一、全连接层(nn.Linear)在神经网络中参数主要位于全连接层仿射层 Affine中。PyTorch 提供了 torch.nn 模块专门用于神经网络的构建和训练。其中全连接层被实现为 Linear 类内部有两个属性权重 weight 和偏置 bias这就是神经网络的主要参数importtorch.nnasnn linearnn.Linear(5,2)上面代码定义了一个有 5 个输入神经元、2 个输出神经元的全连接层。二、常数初始化所有权重参数初始化为一个常数因为这意味着反向传播时权重全部都会进行相同的更新被更新为相同的值对称的值。这使得神经网络拥有许多不同的权重的意义丧失了。为了防止“权重均一化”瓦解权重的对称结构必须随机生成初始值。importtorch.nnasnn#定义一个全连接层linearnn.Linear(5,2)#1.常数初始化nn.init.zeros_(linear.weight)print(linear.weight)nn.init.ones_(linear.bias)print(linear.bias)# 这里w应该是52 但是torch底层默认进行转置所以打印变成了2 * 5nn.init.constant_(linear.weight,10)print(linear.weight)Parameter containing:tensor([[10.,10.,10.,10.,10.],[10.,10.,10.,10.,10.]],requires_gradTrue)三、秩初始化权重参数初始化为单位矩阵importtorch.nnasnn linearnn.Linear(5,2)# 参数初始化为单位矩阵nn.init.eye_(linear.weight)print(linear.weight)四、正态初始化importtorch.nnasnn linearnn.Linear(5,2)nn.init.normal_(linear.weight,mean0,std0.1)print(linear.weight)五、均匀分布初始化importtorch.nnasnn linearnn.Linear(5,2)nn.init.uniform_(linear.weight,a-3.0,b3.0)print(linear.weight)六、 Xavier 初始化Glorot 初始化Xavier 初始化根据输入和输出的神经元数量调整权重的初始范围确保每一层的输出方差与输入方差相近。适用于 Sigmoid 和 Tanh 等激活函数能有效缓解梯度消失或爆炸问题。Xavier 正态分布初始化均值为 0标准差为2 n i n n o u t \sqrt{\frac{2}{n_{in} n_{out}}}nin​nout​2​​的正态分布。Xavier 均匀分布初始化区间[ − 6 n i n n o u t , 6 n i n n o u t ] \left[ -\sqrt{\frac{6}{n_{in} n_{out}}}, \sqrt{\frac{6}{n_{in} n_{out}}} \right][−nin​nout​6​​,nin​nout​6​​]内均匀分布。其中n i n n_{in}nin​表示输入数n o u t n_{out}nout​表示输出数。importtorch.nnasnn linearnn.Linear(5,2)nn.init.xavier_normal_(linear.weight)print(linear.weight)nn.init.xavier_uniform_(linear.weight)print(linear.weight)七、 He 初始化Kaiming 初始化何凯明He 初始化根据输入的神经元数量调整权重的初始范围。主要适用于 ReLU 及其变体如 Leaky ReLU激活函数。He 正态分布初始化均值为 0标准差为2 n i n \sqrt{\frac{2}{n_{in}}}nin​2​​的正态分布。He 均匀分布初始化区间[ − 6 n i n , 6 n i n ] \left[ -\sqrt{\frac{6}{n_{in}}}, \sqrt{\frac{6}{n_{in}}} \right][−nin​6​​,nin​6​​]内均匀分布。其中n i n n_{in}nin​表示输入数。#He初始化nn.init.kaiming_normal_(linear.weight)print(linear.weight)#He初始化nn.init.kaiming_uniform_(linear.weight)print(linear.weight)八、 正则化: Dropout 随机失活Dropout随机失活暂退法是一种在学习的过程中随机关闭神经元的方法。可以通过 torch.nn.Dropout§来使用 Dropout并通过参数 p 来设置失活概率。importtorch dropouttorch.nn.Dropout(p0.5)xtorch.randint(1,10,(10,)).to(torch.float32)print(fDropout 前:{x})print(fDropout 后:{dropout(x)})关闭一半神经元剩余权重就要扩大2倍核心公式剩余神经元的放大倍数 1 1 − p \frac{1}{1-p}1−p1​详细解释关闭比例假设p 0.3 p 0.3p0.3即关闭 30% 的神经元。剩余比例剩下的神经元比例是1 − 0.3 0.7 1 - 0.3 0.71−0.30.7。放大倍数为了保持整个网络在训练Train和预测Eval阶段输出的总期望值均值不变PyTorch 会在训练时自动将保留下来的神经元的数值乘以1 1 − p \frac{1}{1-p}1−p1​。放大倍数 1 0.7 ≈ 1.428 \frac{1}{0.7} \approx 1.4280.71​≈1.428倍。如果按照你的假设“10个神经元关闭三成” (p 0.3 p 0.3p0.3)关闭数量10 × 0.3 3 10 \times 0.3 310×0.33个。剩余数量7 77个。放大比例这7 77个神经元的数值都会被乘以1 0.7 \frac{1}{0.7}0.71​约等于1.42857 1.428571.42857。举例如果原来保留的神经元值分别是[1, 2, 3, 4, 5, 6, 7]经过 Dropout 后它们会变成[1.428, 2.857, 4.285, 5.714, 7.142, 8.571, 10.0]。为什么要这么做原理补充这叫Inverted Dropout反向随机失活。因为我们在训练时关闭了部分神经元并放大了剩余的这样能保证网络输出的总和期望不变。好处是在推理Eval阶段不需要做任何额外的缩放操作直接使用所有神经元即可大大简化了测试阶段的代码逻辑。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑