pytorch 正则化公式推导+实现+Adam优化器源码以及weight decay的设置

pytorch学习——正则化技术——权重衰减 权重衰减是通过L2正则项使得模型参数不会过大,从而控制复杂度~正则项权重是控制模型复杂度的超参数下面的代码将模型拟合训练数据集,并在测试数据集上进行评估。函数的具体实现如下:首先通过init_params()函数初始化模型参数w和b。定义net函数为线性回归模型,loss为平方损失函数。设置训练的轮数num_epochs和学习率lr,同时创建一个可视化工具animator,用于可视化训练过程中的损失值。 阅读详情
AI摘要

本文详细介绍了在深度学习中正则化的意义,特别是L2正则化(权重衰减)。在PyTorch中,weight_decay参数通常在优化器如Adam中设置,用于控制模型权重的L2范数,防止过拟合。通过修改weight_decay的值,可以调整正则化的强度。此外,还解释了Adam优化器中weight_decay的实现细节,包括其在源代码中的作用。

推荐阅读:pytorch实现L2和L1正则化regularization的方法

预备知识:深度学习的优化器(各类 optimizer 的原理、优缺点及数学推导)

1.为什么要进行正则化?怎么正则化?

pytorch —— 正则化之weight_decay
上文简述:

误差可分解为偏差,方差与噪声之和,即 误差=偏差+方差+噪声 之和;

偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力;

方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响;

噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界;

正则化策略的目的就是降低方差,减小过拟合的发生。

在这里插入图片描述
在这里插入图片描述
对于L2norm:
在这里插入图片描述
因为公式中存在
在这里插入图片描述
因此L2正则化也称为权重衰减

2.在pytorch中怎么实现weight decay?

在Pytorch中,weight_decay是在优化器中实现的。例如:

class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

通过修改weight_decay=0来实现

3.在Adam优化器中,weight_decay的具体指代是?

参考博主系列文章:pytorch优化器详解:Adam
在这里插入图片描述

lr对应α;beta对应β1,β2;eps对应ϵ;

Adam优化器的源代码:

class Adam(Optimizer):
    r"""Implements Adam algorithm.

    It has been proposed in `Adam: A Method for Stochastic Optimization`_.
    The implementation of the L2 penalty follows changes proposed in
    `Decoupled Weight Decay Regularization`_.

    Args:
        params (iterable): iterable of parameters to optimize or dicts defining
            parameter groups
        lr (float, optional): learning rate (default: 1e-3)
        betas (Tuple[float, float], optional): coefficients used for computing
            running averages of gradient and its square (default: (0.9, 0.999))
        eps (float, optional): term added to the denominator to improve
            numerical stability (default: 1e-8)
        weight_decay (float, optional): weight decay (L2 penalty) (default: 0)
        amsgrad (boolean, optional): whether to use the AMSGrad variant of this
            algorithm from the paper `On the Convergence of Adam and Beyond`_
            (default: False)

    .. _Adam\: A Method for Stochastic Optimization:
        https://arxiv.org/abs/1412.6980
    .. _Decoupled Weight Decay Regularization:
        https://arxiv.org/abs/1711.05101
    .. _On the Convergence of Adam and Beyond:
        https://openreview.net/forum?id=ryQu7f-RZ
    """

    def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8,
                 weight_decay=0, amsgrad=False):
        if not 0.0 <= lr:
            raise ValueError("Invalid learning rate: {}".format(lr))
        if not 0.0 <= eps:
            raise ValueError("Invalid epsilon value: {}".format(eps))
        if not 0.0 <= betas[0] < 1.0:
            raise ValueError("Invalid beta parameter at index 0: {}".format(betas[0]))
        if not 0.0 <= betas[1] < 1.0:
            raise ValueError("Invalid beta parameter at index 1: {}".format(betas[1]))
        if not 0.0 <= weight_decay:
            raise ValueError("Invalid weight_decay value: {}".format(weight_decay))
        defaults = dict(lr=lr, betas=betas, eps=eps,
                        weight_decay=weight_decay, amsgrad=amsgrad)
        super(Adam, self).__init__(params, defaults)

    def __setstate__(self, state):
        super(Adam, self).__setstate__(state)
        for group in self.param_groups:
            group.setdefault('amsgrad', False)

    @torch.no_grad()
    def step(self, closure=None):
        """Performs a single optimization step.

        Args:
            closure (callable, optional): A closure that reevaluates the model
                and returns the loss.
        """
        loss = None
        if closure is not None:
            with torch.enable_grad():
                loss = closure()

        for group in self.param_groups:
            params_with_grad = []
            grads = []
            exp_avgs = []
            exp_avg_sqs = []
            max_exp_avg_sqs = []
            state_steps = []
            beta1, beta2 = group['betas']

            for p in group['params']:
                if p.grad is not None:
                    params_with_grad.append(p)
                    if p.grad.is_sparse:
                        raise RuntimeError('Adam does not support sparse gradients, please consider SparseAdam instead')
                    grads.append(p.grad)

                    state = self.state[p]
                    # Lazy state initialization
                    if len(state) == 0:
                        state['step'] = 0
                        # Exponential moving average of gradient values
                        state['exp_avg'] = torch.zeros_like(p, memory_format=torch.preserve_format)
                        # Exponential moving average of squared gradient values
                        state['exp_avg_sq'] = torch.zeros_like(p, memory_format=torch.preserve_format)
                        if group['amsgrad']:
                            # Maintains max of all exp. moving avg. of sq. grad. values
                            state['max_exp_avg_sq'] = torch.zeros_like(p, memory_format=torch.preserve_format)

                    exp_avgs.append(state['exp_avg'])
                    exp_avg_sqs.append(state['exp_avg_sq'])

                    if group['amsgrad']:
                        max_exp_avg_sqs.append(state['max_exp_avg_sq'])

                    # update the steps for each param group update
                    state['step'] += 1
                    # record the step after step update
                    state_steps.append(state['step'])

            F.adam(params_with_grad,
                   grads,
                   exp_avgs,
                   exp_avg_sqs,
                   max_exp_avg_sqs,
                   state_steps,
                   amsgrad=group['amsgrad'],
                   beta1=beta1,
                   beta2=beta2,
                   lr=group['lr'],
                   weight_decay=group['weight_decay'],
                   eps=group['eps'])
        return loss

Adam函数接口

def adam(params: List[Tensor],
         grads: List[Tensor],
         exp_avgs: List[Tensor],
         exp_avg_sqs: List[Tensor],
         max_exp_avg_sqs: List[Tensor],
         state_steps: List[int],
         *,
         amsgrad: bool,
         beta1: float,
         beta2: float,
         lr: float,
         weight_decay: float,
         eps: float):
    r"""Functional API that performs Adam algorithm computation.

    See :class:`~torch.optim.Adam` for details.
    """

    for i, param in enumerate(params):

        grad = grads[i]
        exp_avg = exp_avgs[i]
        exp_avg_sq = exp_avg_sqs[i]
        step = state_steps[i]

        bias_correction1 = 1 - beta1 ** step
        bias_correction2 = 1 - beta2 ** step

        if weight_decay != 0:
            grad = grad.add(param, alpha=weight_decay)

        # Decay the first and second moment running average coefficient
        exp_avg.mul_(beta1).add_(grad, alpha=1 - beta1)
        exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2)
        if amsgrad:
            # Maintains the maximum of all 2nd moment running avg. till now
            torch.maximum(max_exp_avg_sqs[i], exp_avg_sq, out=max_exp_avg_sqs[i])
            # Use the max. for normalizing running avg. of gradient
            denom = (max_exp_avg_sqs[i].sqrt() / math.sqrt(bias_correction2)).add_(eps)
        else:
            denom = (exp_avg_sq.sqrt() / math.sqrt(bias_correction2)).add_(eps)

        step_size = lr / bias_correction1

        param.addcdiv_(exp_avg, denom, value=-step_size)

torch.add (input, value, out=None) 对输入张量input逐元素加上标量值value,并返回结果到一个新的张量out,即 out=tensor+value。

深度学习之weight_decay和L2正则的区别 Adam有很多的优点,但是在很多数据集上的最好效果还是用SGD with Momentum细调出来的。可见Adam的泛化性并不如SGD with Momentum。论文 中提出其中一个重要原因就是Adam中L2正则化项并不像在SGD中那么有效。 L2正则和Weight Decay在Adam这种自适应学习率算法中并不等价,只有在标准SGD的情况下,可以将L2正则和Weight Decay看做一样。特别是,当与自适应梯度相结合时,L2正则化导致具有较大历史参数和/或梯度幅度的权重比使用权重衰减时更小。 阅读详情

相关推荐

深度学习优化器实战拆解:从SGD到AdamW的数值更新原理与工程选型

优化器是深度学习训练中对梯度信号进行降噪、加速与校准的核心工程模块。其本质并非黑盒调参工具,而是基于一阶/二阶矩估计、指数加权平均和自适应学习率缩放的数值更新系统。理解动量(Momentum)、RMSProp、Adam及AdamW等算法的底层计算逻辑,关键在于掌握状态变量初始化、bias correction机制、weight decay物理位置等实操细节。这些知识直接决定模型收敛稳定性、泛化能力与硬件适配性,在图像分类、Transformer微调、RNN时序建模等任务中需差异化选型。本文聚焦27种主流优化

weixin_34189116的博客 460

优化器:Adam

Adam文档介绍(Pytorch): 本文在《Adam:随机优化方法》一书中提出了这一方法。 参数介绍: params (iterable):可迭代对象的参数优化或dict定义参数组; lr (float, optional):学习速率(默认值:1e-3); betas (Tuple[float, float], optional):用于计算的系数(默认值:(0.9,0.999)); eps (float, optional):项加到分母上改进数值稳定性(默认值:1e-8); wei

qq_31244453的博客 1871

PyTorch中AdamW的正确用法:解耦权重衰减与优化过程

权重衰减(Weight Decay)是深度学习中基础且关键的正则化技术,其核心原理是在损失函数中显式添加L2范数项以约束模型复杂度;但在传统Adam优化器中,该操作被错误地施加于梯度而非参数本身,导致正则化失效、泛化能力下降。AdamW通过解耦设计,将权重衰减独立作用于参数更新后阶段,严格还原L2正则的数学本质,显著提升小样本、长尾分布及迁移学习场景下的稳定性与性能。本文聚焦PyTorch工程实践,覆盖参数分组、lr-wd耦合调控、AMP适配、分布式兼容等生产级要点,帮助开发者规避默认陷阱,释放预训练模型微

weixin_30315905的博客 429

17. 权重衰退(weight_decay)

笔记

weixin_47505105的博客 6281

深度学习优化器原理与实战:从梯度本质到跨领域选型

优化器是深度学习中决定模型如何探索损失曲面的核心机制,其本质并非超参调节工具,而是对梯度几何、参数敏感度和正则化耦合的数学建模。理解SGD的最速下降局限、Adam的自适应学习率物理意义、AdamW对weight decay的解耦设计,以及Lion、LAMB等新型优化器的符号驱动或层自适应范式,是提升训练稳定性、收敛速度与泛化能力的关键基础。在CV、NLP和时序建模等任务中,优化器选择需匹配模型结构(如ViT梯度稀疏性)、数据特性(如小批量噪声)及硬件约束(如A100的FP16精度)。本文结合147组实测实验

weixin_30903865的博客 343

PyTorch原生实现GPT-2:从零构建因果语言模型

因果语言模型(Causal LM)是大语言模型的核心范式,其本质是通过自回归建模实现序列概率分解。技术原理上依赖严格的下三角注意力掩码(causal_mask)、残差连接的梯度稳定性设计,以及token与position embedding的联合初始化策略。这类模型具备强泛化能力与硬件适配性,广泛应用于代码生成、对话系统与边缘端推理等场景。在工程实践中,PyTorch原生张量操作(如torch.bmm、torch.tril)提供了对计算图、数值精度和CUDA内核的细粒度控制能力,成为深入理解LLM底层机制不

angel192939的博客 399

PyTorch weight_decay原理与实战:不是L2正则的简单等价

weight_decay是深度学习中基础却常被误用的正则化机制,其本质并非在损失函数中添加L2项,而是在优化器更新阶段对梯度或参数施加衰减操作。理解其数学实现差异(如SGD中的梯度修正、Adam中的伪L2陷阱、AdamW中的物理分离)对控制模型泛化能力至关重要。该机制直接影响权重衰减强度、跨层正则一致性及多任务收敛稳定性,广泛应用于图像分类、Transformer训练与知识蒸馏等场景。本文聚焦PyTorch源码级行为,揭示weight_decay在不同优化器中的真实作用路径及其与学习率的强耦合关系。

weixin_29045585的博客 260

李沐深度学习191集能力构建地图:7大模块实战拆解

深度学习不是视频播放列表,而是涵盖计算图、数据管道、模型架构、优化策略、分布式训练、模型部署与评估调试的系统性工程能力。理解自动微分原理和PyTorch动态图机制,是避免梯度错误与调试失效的前提;掌握DataLoader底层行为与数据契约意识,才能应对医疗影像、遥感等真实场景的数据治理挑战。本文基于李沐《动手学深度学习》191集内容,提炼出可验证、可交付、可映射到高校考题与工业实践的7大能力模块,覆盖从张量内存布局、注意力手写实现,到DDP同步陷阱、ONNX/Triton部署等关键断点,助力学习者跨越‘看懂

weixin_33946020的博客 247

nnU-Net优化策略深度解析:Adam与SGD在医学图像分割中的工程选择

医学图像分割对模型稳定性、收敛确定性与临床部署时效性提出严苛要求。优化策略作为连接网络结构与任务目标的核心枢纽,其本质不是超参调优,而是对影像物理特性(如CT值量纲、噪声水平、器官统计平稳周期)和临床约束(如标注成本高、需断电续训、小病灶敏感)的联合建模。本文围绕Adam与SGD在nnU-Net中的差异化设计展开,揭示betas参数如何响应梯度统计周期、learning_rate=1e-2如何对应CT噪声量级、weight_decay为何仅作用于卷积权重而非BN层——这些并非经验设定,而是从数据分布、数值精

weixin_34413802的博客 502

梯度下降实战指南:从原理陷阱到工业级调参

梯度下降是机器学习模型优化的核心机制,其本质并非理想化的数学推导,而是受限于数据噪声、参数空间非凸性与硬件资源约束的工程实践。理解梯度作为mini-batch上的有偏估计、识别loss landscape中平坦极小值的泛化优势,是突破收敛瓶颈的关键。在真实场景中,学习率预热、batch size与η的耦合缩放(如√B法则)、动量缓冲区管理及梯度裁剪阈值设定,共同构成稳定训练的技术支柱。尤其在Transformer微调、ResNet训练与分布式千卡优化中,SGD+Momentum与Adam并非替代关系,而是面

wgyyh 433

Kolmogorov-Arnold网络:用可解释样条实现高维函数的数学分解

函数逼近是机器学习与科学计算的共同基石,其核心在于如何用有限参数高效、可解释地表示复杂映射。传统多层感知机(MLP)虽具通用逼近能力,却因权重矩阵的高维权重耦合与固定激活函数,导致归纳偏置失配、参数冗余及外推不可靠。Kolmogorov-Arnold定理从数学根本上指出:任意连续高维函数均可精确分解为单变量函数的叠加与复合——这一存在性结论被KAN转化为端到端可微、可训练、可可视化的神经架构。它以B-spline作为可学习的一维函数基元,将‘学习’重构为对ψ和ϕ样条形状的几何调优,天然支持符号提取、物理约束

tomfish 1731

小土堆Pytorch笔记

小土堆Pytorch笔记,有部分改进,并记录遇到的问题

q1111111的博客 4577

权重衰减weight_decay参数从入门到精通

Weight Decay是一个正则化技术,作用是**抑制模型的过拟合**,以此来提高模型的泛化性。 目前网上对于Weight Decay的讲解都比较泛,都是短短的几句话,但对于其原理、实现方式大多就没有讲解清楚,本文将会逐步解释weight decay机制。

iioSnail的博客 4万+

PyTorch从零手搭MNIST神经网络:前向传播与反向传播实操指南

神经网络是深度学习的基石,其核心在于前向传播实现特征变换、反向传播完成梯度更新。理解这一原理不仅关乎数学推导,更决定模型能否稳定收敛、可调试、可迁移。PyTorch原生API通过显式张量操作,让前向传播路径清晰可见,使反向传播过程可监控、可裁剪、可诊断——这正是工业级模型开发的关键能力。本文以MNIST为基线任务,聚焦梯度检查、损失曲线诊断、过拟合识别等高频工程问题,提供200行内可复现的完整训练闭环,帮助开发者从‘能跑通’迈向‘懂为何跑通’。

weixin_30315435的博客 431

Keil调试技巧:3种方法查看Cortex-M4的SCB寄存器(含CPUID内存映射解析)

本文详细介绍了在Keil MDK中查看Cortex-M4内核SCB寄存器的三种实战方法:使用Watch窗口进行符号化观察、通过Memory窗口直接查看物理内存映射,以及利用SFR寄存器浏览器解析位域信息。文章重点解析了CPUID寄存器的内存映射地址(0xE000ED00)及其位域含义,帮助开发者深入理解处理器身份识别与底层调试技巧,提升嵌入式系统调试效率。

h6i7j8的博客 567

告别激活烦恼:Lattice Diamond 3.13 永久免费License申请与配置全攻略(Windows 64位)

本文详细介绍了Lattice Diamond 3.13永久免费License的申请与配置全流程,特别针对Windows 64位系统用户。从官网导航的隐藏路径到Host ID的获取方式,再到License文件的高级处理技巧和环境变量的深度配置,提供了全面的安装教程和疑难问题解决方案,帮助开发者彻底告别激活烦恼。

weixin_28736335的博客 421

DeepSpeed 2020 年关键技术与优化全景:从 ZeRO-2 到 1-bit Adam 与最快 BERT 训练

2020 年是 DeepSpeed 从"分布式训练框架"走向"系统级优化方案"的关键一年:这一年里,DeepSpeed 相继发布了 ZeRO-2、ZeRO-Offload、Progressive Layer Dropping、Sparse Attention、1-bit Adam 与 Pipeline Parallelism 等一系列技术,把单卡可训练的模型规模从 13 亿参数一路推到超万亿参数,

gitblog_00258的博客 393

从报错到成功:手把手教你避坑clusterProfiler安装全流程

本文详细解析了clusterProfiler安装过程中的常见报错及解决方案,从CRAN安装误区到Bioconductor拼写错误,再到依赖包安装失败等问题,提供了五步正确安装法。特别适合生物信息分析新手快速掌握R包安装技巧,避免踩坑。

weixin_30859423的博客 379

深度学习基础术语入门:沿数据流理解张量、梯度与epoch

深度学习入门常见的障碍不是数学难,而是术语密度高。张量、形状、梯度、反向传播、epoch、batch等词,本质上都在描述同一条数据链路:数据如何流入网络、前向计算如何产生预测、损失如何评价结果、梯度如何反传、优化器如何更新参数,以及训练如何按轮次推进。理解这条主线后,零散概念会各归其位,调试形状不匹配、梯度消失、过拟合和显存问题时也更有方向。它可迁移到PyTorch、TensorFlow及图像分类、NLP等场景。沿着数据流重新整理深度学习基础术语,比按字母表背诵更适合工程实践。

weixin_34327761的博客 359

NMOS管和PMOS管做开关控制电路

NMOS管和PMOS管做开关控制电路

while(1) 3万+

Claude Code与Vibe Coding:2026年AI编程实战指南

AI编程助手是基于大语言模型的智能代码生成工具,通过理解编程上下文提供精准的代码补全和重构建议。其核心原理是利用深度学习技术分析代码语义,将自然语言指令转化为可执行代码。这种技术能显著提升开发效率,减少重复性编码工作,特别适用于快速原型开发和复杂问题求解。在实际应用场景中,AI编程助手可与Vibe Coding方法论结合,建立流畅的人机协作工作流。Claude Code作为先进的AI编程工具,支持多语言开发和智能错误检测,而Vibe Coding则强调自然交互和迭代优化,两者协同为开发者提供完整的AI编程解

weixin_29057695的博客 340

从数学函数到神经网络拟合机器:原理、实践与调优指南

在机器学习和人工智能领域,函数逼近是一个核心概念,它研究如何通过数学模型来拟合或近似未知的数据关系。其基本原理是利用参数化的函数族,通过优化算法调整参数,使模型输出尽可能接近真实数据。这一技术价值在于能够从数据中自动学习复杂模式,无需人工显式定义规则,极大地扩展了解决现实问题的能力。应用场景广泛,包括回归预测、分类任务、时间序列分析等。本文以PyTorch框架为例,深入探讨了如何构建和训练一个神经网络作为通用函数逼近器,涵盖了从数据准备、模型定义、训练循环到结果评估的完整实践链路,并针对过拟合问题介绍了正则

weixin_33885676的博客 652

Android 9.0 SystemUI禁用长按recent键的分屏功能

​ 在9.0的系统产品开发中,系统对于多窗口模式默认会有分屏功能的,但是在某些产品中,需要禁用分屏模式,所以需要在导航栏中 禁用长按recent的分屏模式功能,接下来分析下相关分屏模式的实现 ​

安卓兼职framework和app工程师的博客 447

MLP实战指南:从原理到工业部署的全流程调优

多层感知机(MLP)作为最基础的前馈神经网络,其核心价值在于以可控结构建模非线性关系,广泛应用于金融风控、工业预测、推荐系统等场景。它依托全连接+非线性激活的组合,通过函数复合逼近复杂映射,兼具数学可解释性与硬件友好性。在工程实践中,MLP性能高度依赖权重初始化、激活函数选型、批归一化与Dropout等关键设计,稍有偏差即导致梯度消失、过拟合或部署抖动。本文聚焦真实产线问题,覆盖数据预处理、损失函数匹配、量化部署及线上监控等环节,特别结合ReLU初始化适配、Leaky ReLU业务对齐、BatchNorm小

468

linux内核学习(一)---内核社区介绍及补丁提交

本系列开始会对linux内核进行系统性的学习,以源码与内核社区为基础,了解前沿的内核机制,同时也深度了解linux内核中的一些经典机制 本章会先对linux内核社区进行简单的介绍,包括源码下载、内核社区的修改提交

文艺小少年的博客 534

【好玩的游戏项目】使用Docker快速部署属于你的RPG网页小游戏

【好玩的游戏项目】使用Docker快速部署属于你的RPG网页小游戏

jks212454的博客 5571
上一篇: Python 正则表达re模块compile+findall的组合应用实例
下一篇: python import zipfile 压缩、解压文件
study_&
博客等级 码龄8年 128粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值