权重衰减(Weight Decay)

2023-12-17 02:04
文章标签 衰减 权重 weight decay

本文主要是介绍权重衰减(Weight Decay),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       在深度学习中,权重衰减(Weight Decay)是一种常用的正则化技术,旨在减少模型的过拟合现象。权重衰减通过向损失函数添加一个正则化项,以惩罚模型中较大的权重值。

一、权重衰减

       在深度学习中,模型的训练过程通常使用梯度下降法(或其变种)来最小化损失函数。梯度下降法的目标是找到损失函数的局部最小值,使得模型的预测能力最好。然而,当模型的参数(即权重)过多或过大时,容易导致过拟合问题,即模型在训练集上表现很好,但在测试集上表现较差。

       权重衰减通过在损失函数中引入正则化项来解决过拟合问题。正则化项通常使用L1范数或L2范数来度量模型的复杂度。L2范数正则化(也称为权重衰减)是指将模型的权重的平方和添加到损失函数中,乘以一个较小的正则化参数$ \lambda $这个额外的项迫使模型学习到较小的权重值,从而减少模型的复杂度。

       具体而言,对于一个深度学习模型的损失函数$L(w, b)$,其中$w,b$表示模型的参数(权重和偏置),权重衰减可以通过以下方式实现:

$ L'\left( w,b \right) =L\left( w,b \right) +\lambda \cdot \lVert w \rVert ^2 $

       其中,$ L'\left( w,b \right) $是添加了权重衰减的损失函数,$ \lVert w \rVert ^2 $表示参数的L2范数的平方和,$ \lambda $是正则化参数,用于控制正则化项的重要性。

       在训练过程中,梯度下降法将同时更新损失函数和权重。当计算梯度时,权重衰衰减的正则化项将被添加到梯度中,从而导致权重更新的幅度减小。这使得模型的权重趋向于减小,避免过拟合现象。

       需要注意的是,正则化参数$ \lambda $的选择对模型的性能有重要影响。较小的$ \lambda $值会导致较强的正则化效果,可能会使模型欠拟合。而较大的$ \lambda $值可能会减少正则化效果,使模型过拟合。因此,选择合适的正则化参数是权衡模型复杂度和泛化能力的关键。

       偏置(biases)在神经网络中起到平移激活函数的作用,通常不会像权重那样导致过度拟合。偏置的主要作用是调整激活函数的位置,使其更好地对应所需的输出。由于偏置的影响较小,因此将权重衰减应用于偏置通常不是常见的做法。

二、权重衰减数学解释

       L2范数正则化在解决过拟合问题方面具有一定的效果,这是因为它在损失函数中引入了权重的平方和作为正则化项。下面我将解释一下L2范数正则化的数学原理。

       在深度学习中,我们的目标是最小化损失函数,该函数包括两部分:经验误差和正则化项。对于L2范数正则化,我们将正则化项定义为权重的平方和的乘以一个正则化参数$ \lambda $

       针对损失函数$ L'\left( w,b \right)$,我们使用梯度下降法来最小化这个损失函数。在梯度下降的每一步中,我们计算损失函数的梯度,然后更新权重。对于L2范数正则化,梯度的计算中包含了正则化项的贡献。

       具体来说,我们计算损失函数对权重w的梯度,记为$ \nabla L\left( w,b \right) $。那么加入L2范数正则化后的梯度可以写为:

$ \nabla L'\left( w,b \right) =\nabla L\left( w,b \right) +2\lambda w $

       这里,$ 2\lambda w $是正则化项的梯度贡献,其中$ 2\lambda $是正则化参数$ \lambda $的倍数,$w$是权重的梯度。

       当我们使用梯度下降法更新权重时,梯度的负方向指示了损失函数下降的方向。由于L2范数正则化项的存在,权重的梯度会受到惩罚,从而导致权重的更新幅度减小。

       这种减小权重更新幅度的效果使得模型倾向于学习到较小的权重值,从而降低了模型的复杂度。通过减小权重的幅度,L2范数正则化可以有效地控制模型的过拟合,提高模型的泛化能力。

       总结起来,L2范数正则化通过引入权重的平方和作为正则化项,在梯度计算和权重更新中对权重进行惩罚,从而减小了模型的复杂度,防止过拟合现象的发生。

也可以参考李沐老师的课件:

三、代码从零开始实现

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

1、生成数据

       首先,我们像以前一样生成一些数据,生成公式如下:

$y = 0.05 + \sum_{i = 1}^d 0.01 x_i + \epsilon \text{ where } \epsilon \sim \mathcal{N}(0, 0.01^2).$

       我们选择标签是关于输入的线性函数。标签同时被均值为0,标准差为0.01高斯噪声破坏。为了使过拟合的效果更加明显,我们可以将问题的维数增加到$d = 200$(w的长度为200),并使用一个只包含20个样本的小训练集。

n_train, n_test, num_inputs, batch_size = 20, 100, 200, 5   # 训练集长度为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)

2、初始化模型参数

       我们将定义一个函数来随机初始化模型参数。

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]

3、定义L2范数惩罚

       实现这一惩罚最方便的方法是对所有项求平方后并将它们求和。

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

4、定义训练代码实现

       下面的代码将模型拟合训练数据集,并在测试数据集上进行评估。和之前线性回归一样,线性网络和平方损失没有变化,所以我们通过`d2l.linreg`和`d2l.squared_loss`导入它们。唯一的变化是损失现在包括了惩罚项。

def train(lambd):w, b = init_params()net, loss = lambda X: d2l.linreg(X, w, b), d2l.squared_lossnum_epochs, lr = 100, 0.003animator = 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)成为一个长度为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())

5、忽略正则化直接训练

       我们现在用`lambd = 0`禁用权重衰减后运行这个代码。注意,这里训练误差有了减少,但测试误差没有减少,这意味着出现了严重的过拟合。

train(lambd=0)
w的L2范数是: 12.963241577148438

 

6、使用权重衰减

       下面,我们使用权重衰减来运行代码。注意,在这里训练误差增大,但测试误差减小。这正是我们期望从正则化中得到的效果。

train(lambd=3)
w的L2范数是: 0.3556520938873291

 

四、简洁实现

       由于权重衰减在神经网络优化中很常用,深度学习框架为了便于我们使用权重衰减,将权重衰减集成到优化算法中,以便与任何损失函数结合使用。此外,这种集成还有计算上的好处,允许在不增加任何额外的计算开销的情况下向算法中添加权重衰减。由于更新的权重衰减部分仅依赖于每个参数的当前值,因此优化器必须至少接触每个参数一次。

1、定义训练代码实现

       在下面的代码中,我们在实例化优化器时直接通过`weight_decay`指定weight decay超参数。默认情况下,PyTorch同时衰减权重和偏移。这里我们只为权重设置了`weight_decay`,所以偏置参数$b$不会衰减。

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())

2、忽略正则化直接训练

train_concise(0)
w的L2范数: 13.727912902832031

3、使用权重衰减

train_concise(3)
w的L2范数: 0.3890590965747833

这篇关于权重衰减(Weight Decay)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/502715

相关文章

如何提升网站权重?

提升网站权重的方法有很多,常规的方法包括内容优化、关键词研究、页面结构调整、提高用户体验等。但这些方法往往需要时间来见效。如果你希望在短时间内看到显著的提升,发外链是一个非常有效的策略。 外链是提升网站权重的有效方法,但需要注意的是,外链的质量和数量都很重要。发外链时,通常选择dofollow链接,因为它们能传递权重给目标网站。但如果所有外链都是dofollow,看起来不自然,搜索引擎可能会怀疑

推荐模型-上下文感知-2015:FFM模型【在FM基础上引入特征域】【每个特征对应的不是唯一一个隐向量权重,而是一系列,与每个特征域都计算出一个隐向量权重】【FM:O(kn);FFM:O(knf)】

Yuchin Juan et al. “Field-aware Factorization Machines for CTR Prediction” in RecSys 2016. https://github.com/rixwew/pytorch-fm 2015年,Criteo基于FM提出的FFM在多项CTR预估大赛中夺魁,并被Criteo、美团等公司深度应用在推荐系统、CTR预估等领域。

AI芯片:Edge TPU(谷歌出品)【在边缘(edge)设备上运行的“专用集成芯片”】【量化操作:Edge TPU使用8 位权重进行计算,而通常使用32位权重。所以我们应该将权重从32位转换为8位】

谷歌Edge TPU的价格不足1000人民币,远低于TPU。实际上,Edge TPU基本上就是机器学习的树莓派,它是一个用TPU在边缘进行推理的设备。 一、云vs边缘 1、边缘运行没有网络延迟 Edge TPU显然是在边缘(edge)运行的,但边缘是什么呢?为什么我们不选择在云上运行所有东西呢? 在云中运行代码意味着使用的CPU、GPU和TPU都是通过浏览器提供的。边缘与云相反,即在

深度学习100问45:什么是权重共享

嘿,来认识一下权重共享吧!   想象一下有一群小机器人在干同一件活儿。要是每个小机器人都有自己独一无二的工具(权重),那可就乱套啦,而且还很浪费资源呢。权重共享呢,就像是让这些小机器人共用一套工具。   在一些模型里,比如卷积神经网络,就像有一群小侦探在检查图片。对于图片的不同地方,都用同样的“小魔法棒”(卷积核,也就是一组权重)。这就意味着,在处理图片不同部分的时候,都有着相同的识别本事。比如说

SEO之网站结构优化(十四-内部链接及权重分配2)

初创企业搭建网站的朋友看1号文章;想学习云计算,怎么入门看2号文章谢谢支持: 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客:阿幸SEO~探索搜索排名之道 4、翻页过多 稍大型的商务或信息类网站都可能会在产品列表,也就是最末一级的分类页面上,存在翻页过多的问题。通常产品列表会显示10个或20个产品,然后列出翻页链接,除了“上一页”和“下一页

带衰减因子的积分磁链观测器

带衰减因子的积分磁链观测器 文章目录 带衰减因子的积分磁链观测器1. 背景问题2. 带衰减因子的积分器3. 理解公式4. 实现带衰减因子的积分器5. C语言代码实现6. 代码解释7. 带衰减因子的积分器的优点8. 实际应用中的考虑9. 总结 带衰减因子的积分器(also known as a Low-pass Filtered Integrator)是在电机控制中对磁链观测器进

优化TextRank文本摘要,自定义关键词增加句子的权重

关于textRank的原理,我这边就不多介绍了,搜一下很多,我也不确定自己是否讲的有那些大佬清楚,我们主要关注在优化点 痛点: 最近在做文章的摘要项目,一天的摘要量估计在300万篇左右,所以直接放弃了seq2seq的生成时摘要方法,主要还是使用深度学习,速度和精度都达不到要求了。采用textrank是一种解决办法 1. 目前使用FastTextRank, 速度上基本达到了要求, githu

tf.train.exponential_decay(学习率衰减)

#!/usr/bin/env python3# -*- coding: utf-8 -*-'''学习率较大容易搜索震荡(在最优值附近徘徊),学习率较小则收敛速度较慢,那么可以通过初始定义一个较大的学习率,通过设置decay_rate来缩小学习率,减少迭代次数。tf.train.exponential_decay就是用来实现这个功能。'''__author__ = 'Zhang Shuai'i

Pytorch实现多层LSTM模型,并增加emdedding、Dropout、权重共享等优化

简述 本文是 Pytorch封装简单RNN模型,进行中文训练及文本预测 一文的延申,主要做以下改动: 1.将nn.RNN替换为nn.LSTM,并设置多层LSTM: 既然使用pytorch了,自然不需要手动实现多层,注意nn.RNN和nn.LSTM 在实例化时均有参数num_layers来指定层数,本文设置num_layers=2; 2.新增emdedding层,替换掉原来的nn.funct

虚幻5|音效设置—环境音效,低血量和恢复血量音效,音效衰减,脚步音效

一,环境音效——学习使用SoundCue 1.打开主界面 拖入一个环境音效 2.选择一个音效,但这个音效围绕整个环境的,设置听听就行了 听完后删掉,我们要设置一个有一定范围的音效 3.找到存放音效的文件,创建一个音频SoundCue 打开后,在这里可以设置随机播放音效 拖入三个音频,右侧拖入你想要的效果 二,学习使用MetaSound 1.还是在刚刚的音频里,选择