当前位置: 首页 > article >正文

【动手学深度学习】(六)权重衰退

文章目录

  • 一、理论知识
  • 二、代码实现
    • 2.1从零开始实现
    • 2.2简洁实现
  • 【相关总结】

主要解决过拟合

一、理论知识

1、使用均方范数作为硬性限制(不常用)
通过限制参数值的选择范围来控制模型容量
在这里插入图片描述
通常不限制偏移b
小的在这里插入图片描述意味着更强的正则项
使用均方范数作为柔性限制
对于每个在这里插入图片描述都可以找到在这里插入图片描述使得之前的目标函数等价于下面的:
在这里插入图片描述

可以通过拉格朗日乘子来证明
超参数在这里插入图片描述控制了正则项的重要程度

在这里插入图片描述
在这里插入图片描述
参数更新法则
在这里插入图片描述
总结:

  • 权重衰退通过L2正则项使得模型参数不会过大,从而控制模型复杂度
  • 正则项权重是控制模型复杂度的超参数

二、代码实现

权重衰减是最广泛使用的正则化技术之一
1.首先,人工生成数据
在这里插入图片描述
我们选择标签是关于输入的线性函数。 标签同时被均值为0,标准差为0.01高斯噪声破坏。 为了使过拟合的效果更加明显,我们可以将问题的维数增加到, 并使用一个只包含20个样本的小训练集。

%matplotlib inline
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
# print(torch.ones((num_inputs, 1)))
# print(true_w)
train_data = d2l.synthetic_data(true_w, true_b, n_train)
train_iter = d2l.load_array(train_data, batch_size)
# print(train_iter)
test_data = d2l.synthetic_data(true_w, true_b, n_test)
test_iter = d2l.load_array(test_data, batch_size, is_train=False)

2.1从零开始实现

只需将的平方惩罚添加到原始目标函数中。

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:
#             增加了L2范数惩罚项
# 广播机制使l2_penalty(w)成为一个长度为torch_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())

忽略正则化直接训练
用lambd = 0禁用权重衰减

train(lambd=0)

w的L2范数是: 13.702591896057129
在这里插入图片描述
使用权重衰退

train(lambd=3)

w的L2范数是: 0.36873573064804077
在这里插入图片描述

2.2简洁实现

在实例化优化器时直接通过weight_decay指定weight decay超参数

def train_concise(wd):
    net = nn.Sequential(nn.Linear(num_inputs, 1))
    for param in net.parameters():
        param.data.normal_()
    loss = nn.MSELoss(reduction='none')
    num_epochs, lr = 100, 0.003
    # 偏置参数没有衰减
    trainer = torch.optim.SGD([
        {"params":net[0].weight,'weight_decay': wd},
        {"params":net[0].bias}], lr=lr)
    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:
            trainer.zero_grad()
            l = loss(net(X), y)
            l.mean().backward()
            trainer.step()
        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范数:', net[0].weight.norm().item())
train_concise(0)

w的L2范数: 12.619434356689453
在这里插入图片描述

train_concise(3)

w的L2范数: 0.3909929692745209
在这里插入图片描述

【相关总结】


http://www.kler.cn/a/159970.html

相关文章:

  • acwing算法基础02一高精度,前缀和,差分
  • MySQL系列之如何在Linux只安装客户端
  • 力扣515:在每个树行中找最大值
  • mac终端使用pytest执行iOS UI自动化测试方法
  • win32 / WTL 开发多线程应用,子线程传递大对象给UI线程(主窗口)的方法
  • ️️一篇快速上手 AJAX 异步前后端交互
  • 【Unity入门】声音组件AudioSource简介及实现声音的近大远小
  • 生成对抗网络——研讨会
  • SQL练习
  • QT-在ui界面中给QWidget增加Layout布局的两种方法
  • Tensorflow.js 入门学习指南
  • java内部类详解
  • matlab实践(十):贝塞尔曲线
  • Linux搭建FTP并安装xrdp,实现Windows系统下利用FileZilla传输文件和远程桌面连接
  • Seo优化是什么,怎么进行seo优化
  • 服务器数据恢复—服务器重装系统导致逻辑卷发生改变的数据恢复案例
  • uni-app详解、开发步骤、案例代码
  • 使用Vue写一个日期选择器
  • 使用K-means把人群分类
  • MySql概述及其性能说明
  • 【PUSDN】centos查看日志文件内容,包含某个关键字的前后5行日志内容,centos查看日志的几种方法
  • 9个典型的交通行业AI应用
  • Java面试题(每天10题)-------连载(43)
  • kubeadm快速搭建k8s高可用集群
  • 目标检测常用评价指标
  • MATLAB Simulink +STM32硬件在环 (HIL)实现例程测试