当你创建一个新的 nn.Linear 层时,如果没有手动指定权重(weight)和偏置(bias),它们会被随机初始化

是的,你理解得没错。在 PyTorch 中,当你创建一个新的 nn.Linear 层时,如果没有手动指定权重(weight)和偏置(bias),它们会被随机初始化。这意味着每次运行代码时,得到的权重和偏置值通常是不同的,因此对同一输入的输出结果也会不同。

随机初始化的原因

  1. 打破对称性:如果所有神经元的初始权重都相同,那么在训练过程中,它们会计算出相同的梯度,导致所有神经元以相同的方式更新,最终失去多样性。
  2. 引入随机性:随机初始化有助于模型学习到不同的特征,避免陷入局部最优解。

验证随机性

以下代码演示了两次运行 nn.Linear(5, 1) 的权重和偏置是否不同:

python
 
运行
 
 
 
 
import torch
import torch.nn as nn

# 第一次运行
linear1 = nn.Linear(5, 1)
print("第一次初始化的权重:", linear1.weight.detach().numpy())
print("第一次初始化的偏置:", linear1.bias.detach().numpy())

# 第二次运行
linear2 = nn.Linear(5, 1)
print("\n第二次初始化的权重:", linear2.weight.detach().numpy())
print("第二次初始化的偏置:", linear2.bias.detach().numpy())
 

固定随机种子以复现结果

如果你希望每次运行代码时得到相同的随机初始化结果,可以设置随机种子:

python
 
运行
 
 
 
 
import torch
import torch.nn as nn

# 设置随机种子
torch.manual_seed(42)  # 可以是任意整数

# 创建线性层
linear = nn.Linear(5, 1)
print("权重:", linear.weight.detach().numpy())
print("偏置:", linear.bias.detach().numpy())
 
 
 
 
 
 
 
 

随机初始化的默认策略

PyTorch 中 nn.Linear 的默认初始化策略是:

  • 权重:使用 torch.nn.init.kaiming_uniform_ 方法初始化(也称为 He 初始化)。
  • 偏置:使用 torch.nn.init.uniform_ 方法初始化,范围为 [-bound, bound],其中 bound = 1 / sqrt(in_features)

总结

  • 默认行为:不指定权重和偏置时,每次运行会得到不同的随机初始化结果。
  • 可复现性:通过 torch.manual_seed() 设置随机种子,可以确保结果可复现。
  • 训练阶段:随机初始化是必要的,但在测试或推理阶段,通常需要加载已训练好的模型参数以保证结果一致性。
posted @ 2025-06-23 01:25  m516606428  阅读(116)  评论(0)    收藏  举报