在 PyTorch 中,模型参数的初始化方式决定了state_dict()中参数的初始值。对于你提供的TorchModel类,其参数的随机生成机制可通过以下分析明确:
当执行print(TorchModel(5).state_dict())时,会输出类似以下内容:
{
'linear.weight': tensor([[ 0.1234, -0.5678, 0.9101, -0.2345, 0.6789]]),
'linear.bias': tensor([0.1111])
}
这些数值看似随机,但实际遵循特定的初始化策略。
PyTorch 中nn.Linear的权重默认使用Kaiming 均匀初始化(He 初始化),适用于 ReLU 激活函数的场景。对于 Sigmoid 激活函数,早期可能使用 Xavier 初始化,但当前版本(如 PyTorch 1.10+)对nn.Linear的默认初始化如下:
- 均匀分布:权重从区间
[-limit, limit]中随机采样,其中:
limit = sqrt(3 / fan_in)
fan_in = 输入特征数(本例中为5)
因此本例中limit = sqrt(3/5) ≈ 0.7746,权重值在[-0.7746, 0.7746]之间随机生成。
偏置默认使用常数 0 初始化,但在部分场景下可能使用小的随机值(如均匀分布[-0.01, 0.01])。在 PyTorch 的nn.Linear中,偏置的默认初始化方式为:
- 均匀分布:从区间
[-0.01, 0.01]中随机采样,因此你看到的偏置值通常是接近 0 的小数(如0.0234)。
可通过以下代码查看初始化细节:
import torch
import torch.nn as nn
model = TorchModel(5)
print("权重矩阵初始化范围:")
weight = model.linear.weight
print(f"最小值: {weight.min().item()}, 最大值: {weight.max().item()}")
print(f"是否在[-sqrt(3/5), sqrt(3/5)]范围内: {weight.min().item() >= -0.7746 and weight.max().item() <= 0.7746}")
print("\n偏置向量初始化范围:")
bias = model.linear.bias
print(f"最小值: {bias.min().item()}, 最大值: {bias.max().item()}")
print(f"是否在[-0.01, 0.01]范围内: {bias.min().item() >= -0.01 and bias.max().item() <= 0.01}")
若需修改初始化方式,可在模型中重写reset_parameters方法:
class CustomInitModel(nn.Module):
def __init__(self, input_size):
super(CustomInitModel, self).__init__()
self.linear = nn.Linear(input_size, 1)
self.activation = torch.sigmoid
self.loss = nn.functional.mse_loss
self.reset_parameters()
- 合理的初始化:如 Kaiming 初始化可避免梯度消失 / 爆炸,加速收敛。
- 不当的初始化:
- 若权重过大,Sigmoid 函数可能陷入饱和区(梯度接近 0)。
- 若权重过小,信号传播可能变弱,导致训练缓慢。
state_dict()中的随机值由 PyTorch 的默认初始化策略决定:
- 线性层权重:基于输入特征数的均匀分布初始化。
- 线性层偏置:接近 0 的小随机值(均匀分布)。
如需精确控制初始化行为,可通过nn.init模块自定义初始化方法,这对模型的训练稳定性和收敛速度至关重要。