权重衰减是最广泛使用的的正则化技术之一,通常称为L2正则化
损失函数:

为了惩罚权重w的大小,权重衰减在损失函数中添加了平方范数^[L2范数的平方]作为正则项

其中用于控制正则化强度
小批量随机梯度下降:

在损失函数这里加入正则项,并简化:

权重衰减的简洁实现

# 定义轮数,学习率
num_epochs, lr = 100, 0.003
 
# 创建神经网络
net = nn.Sequential(nn.Linear(num_inputs, 1))
# 正态分布初始化权重|偏置参数
# net.parameters()返回神经网络的所有可训练参数:[权重,偏置]
# param.data返回这些参数的直接数据,不包括计算图,梯度等
for param in net.parameters():
        param.data.normal_()
# 使用均方误差损失函数
loss = nn.MSELoss(reduction='none')
# 使用随机梯度下降优化器
# net[0]为神经网络的第一层,这里只对权重参数设置了衰减
trainer = torch.optim.SGD([
        {"params":net[0].weight,'weight_decay': wd},
        {"params":net[0].bias},
        ], lr=lr)
# 开始训练
for epoch in range(num_epochs):
		# 从迭代器获取数据
        for X, y in train_iter:
	        # 清除梯度
            trainer.zero_grad()
            # 计算损失
            l = loss(net(X), y)
            # 反向传播
            l.mean().backward()
            # 更新参数
            trainer.step()