L2权重衰减就是L2正则化 的 代码实现

news/2025/7/8 16:43:22

本文以Paddle为例,torch操作也差不多

我在5年前管这个限制参数过大的东西叫正则化,结果现在叫权重衰减了hhh

有点儿跟不上潮流了,我还以以为这个权重衰减是每次迭代给权重乘以一个0.99999,让他进行衰减呢(这样操作也衰减的太快了吧,显然不是)

然而实际上和正则化是一个东西

都在loss后边加一个参数的 L1/L2 范数,当成损失函数进行优化

loss+=0.5∗coeff∗reduce_sum(square(x))loss \mathrel{+}= 0.5 * coeff * reduce\_sum(square(x)) loss+=0.5coeffreduce_sum(square(x))

coeffcoeffcoeff就是权重衰减系数 或者叫 正则化系数

下面用 L2Decay API来进行一个小实验:

import paddle
from paddle.regularizer import L2Decaypaddle.seed(1107)linear = paddle.nn.Linear(3, 4, bias_attr=False)
old_linear_weight = linear.weight.detach().clone()
# print(old_linear_weight.mean())inp = paddle.rand(shape=[2, 3], dtype="float32")
out = linear(inp)coeff = 0.1
loss = paddle.mean(out)
# loss += 0.5 * coeff  * (linear.weight ** 2).sum()momentum = paddle.optimizer.Momentum(learning_rate=0.1,parameters=linear.parameters(),weight_decay=L2Decay(coeff))loss.backward()
momentum.step()delta_weight = linear.weight - old_linear_weight# print(linear.weight.mean())# print( - delta_weight / linear.weight.grad ) # 学习率
print( delta_weight )momentum.clear_grad()

打印结果:
在这里插入图片描述
接下来,不用API L2Decay ,手动用权重的范数来做一下

import paddle
from paddle.regularizer import L2Decaypaddle.seed(1107)linear = paddle.nn.Linear(3, 4, bias_attr=False)
old_linear_weight = linear.weight.detach().clone()
# print(old_linear_weight.mean())inp = paddle.rand(shape=[2, 3], dtype="float32")
out = linear(inp)coeff = 0.1
loss = paddle.mean(out)
loss += 0.5 * coeff  * (linear.weight ** 2).sum()momentum = paddle.optimizer.Momentum(learning_rate=0.1,parameters=linear.parameters(),# weight_decay=L2Decay(coeff))loss.backward()
momentum.step()delta_weight = linear.weight - old_linear_weight# print(linear.weight.mean())# print( - delta_weight / linear.weight.grad ) # 学习率
print( delta_weight )momentum.clear_grad()

在这里插入图片描述

API参考地址:

https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/regularizer/L2Decay_cn.html#paddle.regularizer.L2Decay

Paddle中:
对于一个可训练的参数,如果在 ParamAttr 中定义了正则化,那么会忽略 optimizer 中的正则化

my_conv2d = Conv2D(in_channels=10,out_channels=10,kernel_size=1,stride=1,padding=0,weight_attr=ParamAttr(regularizer=L2Decay(coeff=0.01)),  # <----- 此处优先级高bias_attr=False)

https://dhexx.cn/news/show-591696.html

相关文章

【转载】 HDU 动态规划46题【只提供思路与状态转移方程】

1.Robberies 连接 &#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱 最脑残的是把总的概率以为是抢N家银行的概率之和… 把状态转移方程写成了f[j]max{f[j],f[j-q[i].v]q…

JavaFX: HTML编辑器和加载

JavaFX: HTML编辑器和加载 Module javafx.web HTMLEditor javafx.scene.web.HTMLEditor <VBox alignment"CENTER" spacing"20.0" xmlns:fx"http://javafx.com/fxml"fx:controller"org.xhbruce.xhnote.HtmlController"><…

Jmeter+Ant+Jenkins搭建持续集成的接口测试

2019独角兽企业重金招聘Python工程师标准>>> 目录[-] 一、Jmeterant二、JmeterantJenkins三、Tomcat配置虚拟目录一、Jmeterant 1、首先我们默认Jmeter脚本已经录制好了&#xff0c;并测试通过&#xff0c;存在&#xff08;查询模块.jmx&#xff09;脚本 2、将JMet…

MarkDown语法备忘

MarkDown语法备忘 markdown - 百度百科&#xff0c;Markdown是一种轻量级标记语言&#xff0c;创始人为约翰格鲁伯&#xff08;英语&#xff1a;John Gruber&#xff09;。也就是Markdown是一个标准&#xff0c;按照标准有.md或.markdown扩展名文本文件。 Markdown备忘表-Mar…

JavaFX:集成MarkDown

JavaFX:集成MarkDown 相关软件&#xff1a;Typora、Atom文本编辑器、MWeb、Quiver 相关网址&#xff1a;Markdown 中文网、Markdown 教程 相关开源项目&#xff1a;Editor.md&#xff1a;开源在线 Markdown 编辑器、yanxingang / MarkDown笔记本、lcpsky / note、MarkDown工具…

0524删除文件夹的方法

<?phpfunction deldir($dirname) {if(!file_exists($dirname)) {die("文件夹不存在!");}//如果是文件&#xff0c;就可以直接删除if(is_file($dirname)) {unlink($dirname);exit();}//打开目录资源$dir opendir($dirname);while($filename readdir($dir)) …

LeetCode 二分法查找

704. 二分法查找 整数除法&#xff0c;小数部分强制转换为整数&#xff1b;需要注意最后结束和最后前后坐标比较 class Solution {public int search(int[] nums, int target) {int max nums.length - 1;int min 0;int mid max / 2;while (max > min) {//System.out.pri…

Servlet再度学习

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载注明出处http://blog.csdn.net/u013142781 目录(?)[] 虽然Servlet已经使用很多了&#xff0c;但是一直都仅局限在其使用操作上。 最近有空想对它进行一个相对全面的了解。 下面是博主整理的一篇博文。 一、Servlet简介…

LeetCode 第一个错误的版本

278. 第一个错误的版本 可以利用二分法 LeetCode 二分法查找 /* The isBadVersion API is defined in the parent class VersionControl.boolean isBadVersion(int version); */public class Solution extends VersionControl {public int firstBadVersion(int n) {int left 1…

php-fpm中启用慢日志配置(用于检测执行较慢的PHP脚本)

虽然通过nginx accesslog可以记录用户访问某个接口或者网页所消耗的时间&#xff0c;但是不能清晰地追踪到具体哪个位置或者说函数慢&#xff0c;所以通过php-fpm慢日志&#xff0c;slowlog设置可以让我们很好的看见哪些php进程速度太慢而导致的网站问题 php-fpm.conf的配置文件…