优化器原理——权重衰减(weight_decay)

优化器原理——权重衰减(weight_decay)


  在深度学习中,优化器的 weight_decay 参数扮演着至关重要的角色。它主要用于实现正则化,以防止模型过拟合。过拟合是指模型在训练数据上表现优异,但在新的、未见过的数据上却表现不佳。这通常是因为模型学习了训练数据中的噪声和细节,而不是数据背后的真实模式。

weight_decay的作用

  防止过拟合weight_decay 通过对模型的大权重施加惩罚,促使模型保持简洁,从而降低了学习训练数据噪声的可能性,提高了模型在新数据上的泛化能力。
  促进稀疏解:此外,正则化倾向于将权重推向零,这有助于在某些场景下获得更为简洁和稀疏的模型。

原理解析

  从数学的角度来看,weight_decay 实际上是 L2 正则化的一种表现形式。L2 正则化在原始损失函数的基础上增加了一个与权重平方成正比的项,修改后的损失函数表示为:

L = L o r i g i n a l + λ 2 ∑ w 2 L = L_{original} + \frac{\lambda}{2} \sum w^2 L=Loriginal+2λw2

  其中:

  · L o r i g i n a l L_{original} Loriginal​ 是原始的损失函数。
  · λ \lambda λ 是正则化参数,对应于 weight_decay
  · ∑ w 2 \sum w^2 w2 表示权重的平方和。

  正则化参数 λ \lambda λ 的大小决定了对大权重的惩罚程度。较高的 weight_decay 值增强了对复杂模型结构的惩罚,有助于防止过拟合。但是,如果设置过高,可能会导致模型欠拟合,失去捕捉数据中重要特征的能力。

  在训练期间,优化器不仅要最小化原始的损失函数,还要考虑权重的惩罚项,这样做有助于在拟合训练数据和保持模型的简单性之间找到一个平衡点。因此,weight_decay 是优化模型在看不见的数据上表现的一个重要手段。

实验观察

  为了直观地理解 weight_decay 的影响,我们可以进行一个简单的实验,比较不同 weight_decay 值对训练过程的影响。例如,我们可以对比 weight_decay = 0.01weight_decay = 0.1 的效果,具体代码如下:

import torch
from tensorboardX import SummaryWriter
from torch import optim, nn
import time


class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linears = nn.Sequential(
            nn.Linear(2, 20),
            nn.LayerNorm(20),

            nn.Linear(20, 20),
            nn.LayerNorm(20),

            nn.Linear(20, 20),
            nn.LayerNorm(20),

            nn.Linear(20, 20),
            nn.LayerNorm(20),

            nn.Linear(20, 1),
        )

    def forward(self, x):
        _ = self.linears(x)
        return _

lr = 0.01
iteration = 1000


x1 = torch.arange(-10, 10).float()
x2 = torch.arange(0, 20).float()
x = torch.cat((x1.unsqueeze(1), x2.unsqueeze(1)), dim=1)
y = 2*x1 - x2**2 + 1

model = Model()
optimizer = optim.Adam(model.parameters(), lr=lr, weight_decay=0.1)
loss_function = torch.nn.MSELoss()

start_time = time.time()
writer = SummaryWriter(comment='_权重衰减')

for iter in range(iteration):
    y_pred = model(x)
    loss = loss_function(y, y_pred.squeeze())
    loss.backward()

    for name, layer in model.named_parameters():
        writer.add_histogram(name + '_grad', layer.grad, iter)
        writer.add_histogram(name + '_data', layer, iter)
    writer.add_scalar('loss', loss, iter)

    optimizer.step()
    optimizer.zero_grad()

    if iter % 50 == 0:
        print("iter: ", iter)

print("Time: ", time.time() - start_time)

这里我们使用 TensorBoardX 进行结果的可视化展示。

  通过观察训练1000轮后线性层的梯度分布,我们可以看出,较大的 weight_decay 设置会导致模型的权重更倾向于靠近 0。这说明 weight_decay 值越大,优化器在限制权重增长上越严格。

在这里插入图片描述

  可以看到,weight_decay设置的较大,会限制模型的权重分布都会趋近于0。可以理解为weight_decay越大,优化器就越限制权重分布变得趋近 0。

### 关于Adam优化器中的Weight Decay 在机器学习模型训练过程中,Adam优化器是一种广泛应用的方法。当配置Adam优化器时,`weight_decay` 参数用于控制权重衰减的程度。权重衰减作为一种正则化技术,在防止过拟合方面发挥着重要作用。 对于 SketchGAN 和 RaLSGAN 的实验设置中,选择了 `weight_decay=0` 这一配置[^1]。这意味着在整个训练期间不应用任何额外的L2正则项来惩罚较大的权重值。这种选择可能是为了保持模型参数更新过程尽可能不受约束,从而允许更自由地探索解空间。 然而,在其他场景下,适当设定非零的 `weight_decay` 值可以有助于提高泛化能力并减少过拟合的风险。具体来说: - **作用机制**:通过向损失函数添加一个小量的平方和项 \(\sum w_i^2\) 来实现对网络权值大小施加限制; - **影响表现**:合理调整此超参能够使得最终学到的特征更加鲁棒和平滑; 下面是一个简单的 PyTorch 实现例子展示如何定义带有 `weight_decay` 的 Adam 优化器实例: ```python import torch.optim as optim # 定义模型和其他必要组件... model = ... optimizer = optim.Adam( model.parameters(), lr=0.002, # 学习率 betas=(0.9, 0.999), eps=1e-08, weight_decay=1e-4 # 设置合适的权重衰减) ``` 在这个代码片段里,除了指定标准的学习率 (`lr`) 及动量系数外(`betas`) ,还特别指定了一个较小但非零的 `weight_decay` 数值作为附加选项传递给 Adam 构造函数。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

征途黯然.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值