是的,你理解得没错。在 PyTorch 中,当你创建一个新的 nn.Linear 层时,如果没有手动指定权重(weight)和偏置(bias),它们会被随机初始化。这意味着每次运行代码时,得到的权重和偏置值通常是不同的,因此对同一输入的输出结果也会不同。
- 打破对称性:如果所有神经元的初始权重都相同,那么在训练过程中,它们会计算出相同的梯度,导致所有神经元以相同的方式更新,最终失去多样性。
- 引入随机性:随机初始化有助于模型学习到不同的特征,避免陷入局部最优解。
以下代码演示了两次运行 nn.Linear(5, 1) 的权重和偏置是否不同:
import torch
import torch.nn as nn
如果你希望每次运行代码时得到相同的随机初始化结果,可以设置随机种子:
import torch
import torch.nn as nn
PyTorch 中 nn.Linear 的默认初始化策略是:
- 权重:使用
torch.nn.init.kaiming_uniform_ 方法初始化(也称为 He 初始化)。
- 偏置:使用
torch.nn.init.uniform_ 方法初始化,范围为 [-bound, bound],其中 bound = 1 / sqrt(in_features)。
- 默认行为:不指定权重和偏置时,每次运行会得到不同的随机初始化结果。
- 可复现性:通过
torch.manual_seed() 设置随机种子,可以确保结果可复现。
- 训练阶段:随机初始化是必要的,但在测试或推理阶段,通常需要加载已训练好的模型参数以保证结果一致性。