李沐動手深度學習(pycharm中運行筆記)——12.權重衰退

12.權重衰退(與課程對應)


目錄

一、權重衰退

1、使用均方范數作為硬性限制

2、使用均方范數作為柔性限制(通常這么做)

3、演示對最優解的影響

4、參數更新法則

5、總結

二、代碼實現+從零實現

三、代碼實現+簡介實現


一、權重衰退

1、使用均方范數作為硬性限制

? ? ? ? (1)通過限制參數值的選擇范圍來控制模型容量

? ? ? ? ????????????????min?L(w, b) subject to?||w||^{2}\leqslant \theta

????????????????通常不限制便宜b(限不限制都差不多)

????????????????小的\theta意味著更強的正則項

2、使用均方范數作為柔性限制(通常這么做)

????????(1)對每個\theta,都可以找到\lambda使得之前的目標函數等價于下面

? ? ? ? ? ? ? ? ? ? ? ? min?L(w, b) + \frac{\lambda }{2} ||w||^{2}

? ? ? ? ? ? ? ? 可以通過拉格朗日乘子來證明

? ? ? ? (2)超參數\lambda控制了正則項的重要程度

????????????????\lambda=0:無作用

????????????????\lambda \rightarrow \infty,?w^{*}\rightarrow 0

3、演示對最優解的影響

4、參數更新法則

(1)計算梯度

????????\frac{\partial }{\partial w}(L(w, b)) + \frac{\lambda }{2}||w||^{2})=\frac{\partial L(w, b) }{\partial w} + \lambda w

(2)時間t更新參數

????????w_{t+1}=(1-\eta \lambda )w_{t} - \eta \frac{\partial L(w_{t}, b_{t}) }{\partial w_{t}}

? ? ? ? 通常\eta \lambda < 1,在深度學習中通常叫做權重衰退

5、總結

(1)權重衰退通過L2正則項使得模型參數不會過大,從而控制模型復雜度

(2)正則項權重是控制模型復雜度的超參數

二、代碼實現+從零實現

1、生成數據集:訓練集越小,越容易過擬合;特征維度200

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)

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、定義訓練代碼實現

def train(lambd):w, b = init_params()  # 初始化權重net, loss = lambda X: d2l.linreg(X, w, b), d2l.squared_loss  # 模型,損失num_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: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、忽略正則化直接訓練

train(lambd=0)
d2l.plt.show()

6、使用權重衰減

train(lambd=3)
d2l.plt.show()

7、完整代碼?

import torch
from torch import nn
from d2l import torch as d2l# 權重衰退:從零實現
# 1、生成數據集:訓練集越小,越容易過擬合;特征維度200
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)# 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、定義訓練代碼實現
def train(lambd):w, b = init_params()  # 初始化權重net, loss = lambda X: d2l.linreg(X, w, b), d2l.squared_loss  # 模型,損失num_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: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)
d2l.plt.show()# 使用權重衰減
train(lambd=3)
d2l.plt.show()

三、代碼實現+簡介實現

1、生成數據集:訓練集越小,越容易過擬合;特征維度200

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)

2、權重衰退+簡潔實現

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

?3、忽略正則化直接訓練

train_concise(0)
d2l.plt.show()

?4、使用權重衰減

train_concise(3)
d2l.plt.show()

5、完整代碼?

import torch
from matplotlib.pyplot import xlabel
from torch import nn
from d2l import torch as d2l# 生成數據集:訓練集越小,越容易過擬合;特征維度200
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 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)
d2l.plt.show()# 使用權重衰減
train_concise(3)
d2l.plt.show()

如果此文章對您有所幫助,那就請點個贊吧,收藏+關注 那就更棒啦,十分感謝!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84784.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84784.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84784.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

React Native【實戰范例】同步跟隨滾動

最終效果 實現原理 主動滾動區觸發滾動事件&#xff0c;原生監聽滾動值的變化&#xff0c;并用動畫的方式實時同步到跟隨滾動區 技術要點 使用 Animated.ScrollView 使用動畫變量 const scrollY useRef(new Animated.Value(0)).current;主動滾動觸發 onScroll&#xff0c;用 …

如何僅用AI開發完整的小程序<3>—創建小程序基礎框架

1、啟動小程序開發者工具-選擇小程序&#xff0c;點擊 2、創建一個項目工程 項目名稱&#xff1a;自己填默認的也行&#xff0c;最好不要中文&#xff0c;拼音也行 目錄&#xff1a;選擇你的項目創建路徑 AppID&#xff1a;可以先點測試號&#xff0c;后面再替換自己的AppID就…

SQL等價改寫優化

or 與 union all的優化 在SQL開發中&#xff0c;我們經常會遇到這樣的情況&#xff1a;需要組合多個相似但略有不同的查詢結果。大多數開發者本能地使用UNION/UNION ALL來解決&#xff0c;這種方式直觀易懂&#xff0c;但在特定場景下卻隱藏著巨大的性能浪費。 本案例將從執行…

【已解決】 數據庫INSERT操作時,Column count doesn’t match value count at row 1

【已解決】數據庫INSERT操作時&#xff0c;ColumnColumn count doesn’t match value count at row 1 在開發過程中&#xff0c;我們經常會遇到數據庫操作錯誤&#xff0c;其中之一就是 MySQL 中的 “Column count doesn’t match value count at row1” 錯誤。這個錯誤通常發…

管件接頭的無序抓取

文章目錄 1&#xff0c;目的2&#xff0c;過程3&#xff0c;易混易錯點4&#xff0c;代碼詳解4.1&#xff0c;初始化窗口4.2&#xff0c;創建多視角立體視覺模型。4.3&#xff0c;創建表面匹配模型4.4&#xff0c;多視角立體視覺重建管件堆表面模型4.5&#xff0c;管道接頭查找…

移遠通信 × 紫光展銳,推動FWA “5G+AI”新體驗

6月19日&#xff0c;在2025 MWC上海期間&#xff0c;移遠通信宣布&#xff0c;攜手紫光展銳&#xff0c;推出面向下一代CPE應用的“5GAI”融合解決方案。目前雙方正聯合多家CPE廠商開展方案深度調優&#xff0c;以加速5GAI CPE終端的產業化落地進程。 該方案以移遠5G模組RG620…

深入理解Grad-CAM:用梯度可視化神經網絡的“注意力“

深入理解Grad-CAM&#xff1a;用梯度可視化神經網絡的"注意力" 引言 在深度學習的發展過程中&#xff0c;模型的可解釋性一直是一個重要的研究方向。盡管現代神經網絡在圖像識別、自然語言處理等任務上取得了令人矚目的成果&#xff0c;但它們往往被稱為"黑盒…

離線環境jenkins構建前端部署鏡像

gitlabjenkins 實現前端項目打包成 docker 鏡像&#xff1b;gitlab部署就不贅述了&#xff1b;因部署的gitlab版本的webhooks有問題&#xff0c;無法進行配置,所以文章的構建是手動觸發的。并且nodejs部署應該也能跟docker一樣直接安裝進jenkins的鏡像(但是多版本可能就有其他問…

案例:塔能科技×某市智能照明——從傳統亮化到智慧光生態的跨越

在城市發展的滾滾浪潮中&#xff0c;市政照明不僅是驅散黑夜的光明使者&#xff0c;更是衡量城市智能化水平的關鍵標尺。貴州某市的城市照明系統正經歷一場意義深遠的革新&#xff0c;塔能科技以創新科技為核心驅動力&#xff0c;為這座城市的夜間照明生態注入全新活力。通過智…

LeapMotion-HandPoseRecorder 腳本詳解

HandPoseRecorder 腳本詳解 這個腳本是一個用于在 Unity 中錄制和保存 Leap Motion 手部姿勢的工具。下面我將詳細解釋腳本的各個部分: 核心功能 該腳本的主要作用是: 從 Leap Motion 設備捕獲當前手部姿勢數據 將姿勢數據序列化為可重用的 ScriptableObject 在 Unity 項目…

【Guava】0.做自己的編程語言

【Guava】0.做自己的編程語言 0.前言1.明確你的目標1.2.設計1.3.寫一個介紹 2.開始吧&#xff01; 0.前言 DO WHAT THE F**K YOU WANT TO DO 我相信&#xff0c;網上有許多各式各樣的做自己的編程語言教程&#xff0c;but 都是這樣 收費 shit 本教程教你真正教你實現一個名叫G…

【軟考高級系統架構論文】論無服務器架構及其應用

論文真題 近年來&#xff0c;隨著信息技術的迅猛發展和 應用需求的快速更迭&#xff0c;傳統的多層企業應用系統架構面臨越來越多的挑戰&#xff0c;已經難以適應這種變化。在這一背景下&#xff0c;無服務器架構(Serverless Architecture) 逐漸流行&#xff0c;它強調業務邏輯…

國產MCU A\B SWAP原理及實操

看到有讀者留言說還是沒理清A\B SWAP的原理。 今天就以某國產MCU為例&#xff0c;實際演示一番&#xff0c;看看大家在芯片設計時思路是什么。 我們首先回顧下SWAP的基本思想。 SWAP的基本思想是將PFLASH分成兩組Bank&#xff0c;Bank A(假設是active)和Bank B(假設是inacti…

目標檢測neck經典算法之FPN的源碼實現

┌────────────────────────────────────────────────────┐│ 初始化構造 (__init__) │└─────────────────────────────────────────────…

extern關鍵字:C/C++跨文件編程利器

在 C 和 C 中&#xff0c;extern 是一個關鍵字&#xff0c;用于聲明變量或函數是在其他文件中定義的。它主要用于實現多個源文件之間的符號共享。 目錄 &#x1f4cc; 一、C語言中的 extern 1. 基本作用 2. 示例說明 定義全局變量&#xff08;只在一個 .c 文件中&#xff…

編程語言的演化與選擇:技術浪潮中的理性決策

&#x1f4dd;個人主頁&#x1f339;&#xff1a;一ge科研小菜雞-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、引言&#xff1a;為什么“選對語言”比“掌握語言”更重要&#xff1f; 在軟件開發的世界里&#xff0c;語言是一切的基礎。…

【StarRocks系列】StarRocks vs Mysql

目錄 StarRocks 簡介 核心特性 典型應用場景 StarRocks vs MySQL&#xff1a;核心區別詳解 關鍵差異總結 如何選擇&#xff1f; StarRocks 簡介 StarRocks 是一款高性能、全場景、分布式、實時分析型的數據庫&#xff08;MPP - 大規模并行處理&#xff09;。它誕生于解決…

Axios 知識點全面總結

文章目錄 Axios 知識點全面總結一、Axios 基礎概念1. 什么是 Axios&#xff1f;2. 核心特性 二、安裝與基本用法1. 安裝2. 基本請求示例 三、請求方法與參數四、請求配置選項&#xff08;config&#xff09;五、攔截器&#xff08;Interceptors&#xff09;六、錯誤處理七、取消…

【軟考高級系統架構論文】論 SOA 在企業集成架構設計中的應用

論文真題 企業應用集成(Enterprise Application Integration, EAI)是每個企業都必須要面對的實際問題。面向服務的企業應用集成是一種基于面向服務體系結構(Service - Oriented Architecture, SOA)的新型企業應用集成技術,強調將企業和組織內部的資源和業務功能暴露為服務,實…

springboot 提供的可擴展接口

一、spring 和 springboot Spring框架提供了全面的基礎架構支持。包含依賴注入和開箱即用等模塊&#xff0c;如&#xff1a;Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring Test Spring Boot 約定大于配置-----消除了設置Spring應用程序所需…