权重衰减( L2 正则化)

对于权重衰减自己的一点理解

加入L2正则化后损失函数变得平滑了很多如图所示,蓝色的曲线为未加入L2正则项的曲线,绿色为加入L2正则项的曲线这样对于数据的拟合变得不这么剧烈从而缓解了过拟合。
在这里插入图片描述
如图所示,绿色为损失项,橙色为正则项W权重越大惩罚项也就是橙色曲线的作用就越明显整个图就越靠近原点从而使曲线变平滑不再那么的剧烈从而减小过拟合较小的 λ 值对应较少约束的 w ,而较大的 λ 值对 w 的约束更大
在这里插入图片描述

import torch
from torch import nn
from d2l import torch as d2l

生成训练集和测试集

n_train, n_test, num_inputs, batch_size = 20, 100, 200, 5
true_w, true_b = torch.ones((num_inputs, 1)) * 0.01, 0.05
train_data = d2l.synthetic_data(true_w, true_b, n_train)
train_iter = d2l.load_array(train_data, batch_size)
test_data = d2l.synthetic_data(true_w, true_b, n_test)
test_iter = d2l.load_array(test_data, batch_size, is_train=False)

初始化模型参数

def init_params():
    w = torch.normal(0, 1, size=(num_inputs, 1), requires_grad=True)
    b = torch.zeros(1, requires_grad=True)
    return [w, b]

定义L2范数惩罚

def l2_penalty(w):
    return torch.sum(w.pow(2)) / 2

定义训练代码

def train(lambd):
    w, b = init_params()
    net, loss = lambda X: d2l.linreg(X, w, b), d2l.squared_loss #模型为线性模型,损失函数为平方损失
    num_epochs, lr = 100, 0.003
    animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log',  #这个是动态图展示
                            xlim=[5, num_epochs], legend=['train', 'test'])
    for epoch in range(num_epochs):
        for X, y in train_iter:
            with torch.enable_grad():
                # 增加了L2范数惩罚项,广播机制使l2_penalty(w)成为一个长度为`batch_size`的向量。
                l = loss(net(X), y) + lambd * l2_penalty(w)
            l.sum().backward()
            d2l.sgd([w, b], lr, batch_size)
        if (epoch + 1) % 5 == 0:
            animator.add(epoch + 1, (d2l.evaluate_loss(net, train_iter, loss),
                                     d2l.evaluate_loss(net, test_iter, loss)))
    print('w的L2范数是:', torch.norm(w).item())

忽略正则化直接训练

train(lambd=0)

在这里插入图片描述
设置lambd大小

train(lambd=10)

在这里插入图片描述

总结

正则化是处理过拟合的常用方法。在训练集的损失函数中加入惩罚项,以降低学习到的模型的复度。

保持模型简单的一个特别的选择是使用 L2 惩罚的权重衰减。这会导致学习算法更新步骤中的权重减。

权重衰减功能在深度学习框架的优化器中提供。

在同一训练代码实现中,不同的参数集可以有不同的更新行为。

### 权重衰减的定义及其与L2正则化的关联和作用 权重衰减是一种用于防止模型过拟合的技术,其核心思想是在优化过程中对模型的权重参数进行惩罚,从而鼓励模型学习到较小的权重值[^1]。这种技术通过在损失函数中添加一个额外的惩罚项实现,这个惩罚项通常基于权重参数的平方和,即所谓的L2范数正则化[^2]。 #### 权重衰减的定义 权重衰减的核心是通过调整优化器的行为,在每次更新模型参数时,让权重值缩小一定的比例。这可以通过乘以一个小于1的系数来实现[^5]。例如,在随机梯度下降(SGD)中,权重衰减直接表现为对权重参数的缩减操作。而在更复杂的优化器(如Adam)中,虽然实现方式不同,但目标仍然是控制权重大小以降低模型复杂度。 #### L2正则化的定义 L2正则化是指在原损失函数的基础上,添加一个与模型权重参数的L2范数相关的惩罚项。具体来说,这个惩罚项等于权重参数每个元素的平方和乘以一个正的常数(即`weight_decay`参数)。数学表达式可以写为: \[ \text{Loss}_{\text{regularized}} = \text{Loss}_{\text{original}} + \lambda \sum_{i} w_i^2 \] 其中,\(\lambda\)正则化强度,\(w_i\) 表示模型的权重参数[^2]。 #### 权重衰减与L2正则化的关联 权重衰减和L2正则化实际上是同一种技术的不同表述。在许多深度学习框架中,`weight_decay` 参数被用来控制L2正则化的强度。当`weight_decay` 设置为非零值时,优化器会在更新权重参数时自动加入L2正则化的效果[^1]。换句话说,权重衰减是L2正则化在优化过程中的具体实现形式。 #### L2正则化的作用 L2正则化的主要作用是通过限制模型权重的大小来降低模型的复杂度,从而减少过拟合的风险[^4]。以下是其作用的具体解释: 1. **从模型复杂度的角度**:更小的权重意味着模型的复杂度较低,能够更好地泛化到未见数据。这一原则也被称为“奥卡姆剃刀”,即简单的模型往往更优[^3]。 2. **从数学角度**:过拟合时,模型倾向于对训练数据中的噪声进行过度拟合,导致权重参数变得非常大。而L2正则化通过约束权重参数的范数,使得模型无法轻易适应这些噪声,从而减少过拟合现象[^4]。 ### 示例代码 以下是一个使用PyTorch实现L2正则化的简单示例: ```python import torch import torch.nn as nn import torch.optim as optim # 定义一个简单的线性回归模型 model = nn.Linear(10, 1) # 定义损失函数和优化器,设置 weight_decay 参数 criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr=0.01, weight_decay=5e-4) # 假设输入和目标输出 inputs = torch.randn(100, 10) targets = torch.randn(100, 1) # 训练过程 for epoch in range(100): optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, targets) loss.backward() optimizer.step() ``` 在上述代码中,`weight_decay=5e-4` 即表示应用了L2正则化,优化器会在每次参数更新时自动加入权重衰减的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值