李沐動手學深度學習Pytorch-v2筆記【07自動求導代碼實現】

文章目錄

    • 前言
    • 自動求導實現
    • 非標量變量的反向傳播
    • 分離計算
    • Python控制流的梯度計算

前言

關于走動求導的理論知識個人有點難以理解,推薦大家去看https://blog.csdn.net/weixin_42831564/article/details/135658138這篇文章,講的很好。

自動求導實現

import torchx = torch.arange(4.0)
print(x)

在這里插入圖片描述

x.requires_grad_(True)

在這里插入圖片描述

print(x.grad)

在這里插入圖片描述

#計算y標量
y = 2 * torch.dot(x, x)
print(y)

在這里插入圖片描述

y.backward()
print(x.grad)

在這里插入圖片描述

print(x.grad == 4 * x)

在這里插入圖片描述

x.grad.zero_(),x

在這里插入圖片描述

y = x.sum()
y

在這里插入圖片描述

y.backward(),y

在這里插入圖片描述

print(x.grad)

在這里插入圖片描述
為什么 y = x.sum() 的梯度是全 1?

在這里插入圖片描述

非標量變量的反向傳播

x.grad.zero_()
y = x * x
y.sum().backward()
print(x.grad)
x.grad == 2 * x

在這里插入圖片描述
在這里插入圖片描述

為什么 y = x * x 后需要 y.sum().backward()

在 PyTorch 中,backward() 只能對標量(scalar,即 0 維張量)進行反向傳播,而不能直接對向量/矩陣進行反向傳播。因此:

y = x * x 是一個逐元素乘法,得到的 y 仍然是和 x 形狀相同的張量(如 [x?2, x?2, x?2, x?2])。

如果直接調用 y.backward(),PyTorch 會報錯,因為 y 不是標量。

解決方法:y.sum().backward()
為了計算 yx 的梯度,我們需要:

y 變成一個標量(通過 sum()mean() 或其他聚合操作)。

y.sum() 計算 x?2 + x?2 + x?2 + x?2,得到一個標量。

調用 backward(),PyTorch 會自動計算梯度并存儲到 x.grad

分離計算

在某層網絡需要把參數固定的時候,會用到這個功能

在PyTorch中,y.detach()是一個用于從計算圖中分離張量的方法。計算圖是PyTorch用于自動微分的關鍵概念,用于構建和跟蹤張量之間的操作。在計算圖中,張量的計算歷史被記錄下來,以便在反向傳播時計算梯度。但有時我們希望從計算圖中分離出某個張量,使其不再與原始的計算歷史關聯。這在某些情況下是很有用的,例如當我們只關心使用該張量進行正向傳播的結果,并且不需要計算梯度時。

當調用y.detach()時,將返回一個與y相同數據但不再與計算圖關聯的新張量。這意味著對返回的張量進行操作不會對原始計算圖產生任何影響,也不會計算任何梯度。該方法可用于將張量作為輸入傳遞給不允許梯度傳播的函數或模型。

在這里插入圖片描述

x.grad.zero_()
y = x * x
u = y.detach()  # 把y看成一個常數賦給u u與x無關,是一個常數
print(u)
z = u * x  # z對x的導數 
z.sum().backward()
print(x.grad)
print(u == x.grad)

在這里插入圖片描述

# u是常數不是x的函數,y還是x的函數,還是可以對y求x的導數
x.grad.zero_()
y.sum().backward()
print(x.grad)
print(x.grad == 2*x)

在這里插入圖片描述

Python控制流的梯度計算

在這里插入圖片描述

def f(a):b = a * 2          # (1) b = 2awhile b.norm() < 1000:b = b * 2      # (2) 循環翻倍,直到 ||b|| ≥ 1000if b.sum() > 0:    # (3) 如果 b 的和 > 0,c = b;否則 c = 100*bc = belse:c = 100 * breturn c           # (4) 返回 ca = torch.randn(size=(), requires_grad=True)  # 隨機初始化一個標量 a
d = f(a)                                     # 計算 d = f(a)
d.backward()                                 # 反向傳播計算梯度
print(a)        # 打印 a 的值
print(d)        # 打印 d 的值
print(a.grad)   # 打印 a 的梯度
print(d / a)    # 計算 d / a
print(a.grad == d / a)  # 判斷梯度是否等于 d / a

torch.randn()是一個用于生成服從標準正態分布(均值為0,標準差為1)的隨機數的函數

為什么 a.grad == d / a?
關鍵在于 da 的關系:

da 的線性函數

無論 while 循環執行多少次,b 都是 a 的倍數(b = a * 2 * 2 * ... * 2)。

if-else 分支只是決定 c = bc = 100 * b,所以 c(即 d)仍然是 a 的倍數。

因此,d 可以表示為:d = k?a,其中 k 是一個常數(由 while 循環和 if-else 分支決定)。

梯度計算:

d = k * a 求導:在這里插入圖片描述
由于 d = k * a,所以 k = d / a

因此:在這里插入圖片描述
PyTorch 的 a.grad 存儲的就是這個梯度值,所以 a.grad == d / a

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

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

相關文章

strchr 與 strstr 函數詳解

一.strchr - 字符查找函數1.函數原型char *strchr(const char *str, int c);2.核心功能在字符串中查找特定字符的第一次出現位置3.參數說明參數 類型 說明str const char* 要搜索的字符串c int 要查找的字符&#xff08;自動轉換為char&#xff09;4.返回值…

jakes信道模型

Jakes 模型 前面我們介紹了多徑信道合成信號可表示為&#xff1a; r(t)Re{∑i0N(t)?1ai(t)u(t?τi(t))ej2πfc(t?τi(t))?Di(t)} r(t)Re \left\{\sum_{i0}^{N(t)-1}a_{i}(t)u(t-\tau_{i}(t))e^{j2\pi f_{c}(t-\tau_{i}(t))\phi_{D_{i}}(t)} \right\} r(t)…

JVM類加載機制解析

什么是類加載器&#xff1f; 類加載器是JVM的核心組件之一&#xff0c;負責將Java字節碼文件&#xff08;.class文件&#xff09;加載到JVM內存中。由于JVM只能執行二進制字節碼&#xff0c;類加載器的作用就是將編譯后的.class文件轉換為JVM可以理解和執行的格式&#xff0c;使…

用Python和OpenCV從零搭建一個完整的雙目視覺系統(二)

本系列文章旨在系統性地闡述如何利用 Python 與 OpenCV 庫&#xff0c;從零開始構建一個完整的雙目立體視覺系統。 本項目github地址&#xff1a;https://github.com/present-cjn/stereo-vision-python.git 項目架構設計&#xff1a;藍圖、分工與工作流 在上一篇文章中&#…

億級流量下的緩存架構設計:Redis+Caffeine多級緩存實戰

億級流量下的緩存架構設計&#xff1a;RedisCaffeine多級緩存實戰 一、為什么需要多級緩存&#xff1f; 在億級流量場景下&#xff0c;單純依賴Redis會遇到三大瓶頸&#xff1a;網絡延遲&#xff1a;Redis遠程訪問通常需要1-5ms&#xff0c;QPS超過10萬時成為瓶頸資源成本&…

AI基建還能投多久?高盛:2-3年不是問題,回報窗口才剛開啟

高盛表示&#xff0c;盡管AI商業化變現仍處早期階段&#xff0c;但基于成本削減的第一階段回報已經顯現。預測到2030年AI自動化可為財富500強企業節省約9350億美元成本。分析師認為&#xff0c;這一早期收益足以支撐當前AI基礎設施投資水平&#xff0c;盡管增長率可能放緩。雖然…

【mac】快捷鍵使用指南

在Mac上&#xff0c;根據選擇對象的不同&#xff0c;在選擇時移動的方法也有所不同&#xff0c;以下是具體介紹&#xff1a; 移動文件或文件夾&#xff1a;可通過拖放操作移動。打開“訪達”&#xff08;Finder&#xff09;&#xff0c;找到要移動的文件或文件夾&#xff0c;按…

CS144 lab2 tcp_receiver

1. 實驗目的 lab2 的目的是實現tcp的接收端。 主要包括兩方面 &#xff08;1&#xff09; 從發送端接收消息&#xff0c;使用Reassembler聚合字節流&#xff08;Bytestream&#xff09; &#xff08;2&#xff09;將確認號&#xff08;ackno&#xff09;和window size發回對端 …

【論文筆記】A Deep Reinforcement Learning Based Real-Time Solution Policy for the TSP

《基于 DRL 和 DCNN 的實時 TSP 求解策略》IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS, VOL. 24, NO. 6, JUNE 2023一段話總結本文提出了一種基于深度強化學習&#xff08;DRL&#xff09; 和深度卷積神經網絡&#xff08;DCNN&#xff09; 的實時旅行商問題&am…

MMaDA:多模態大型擴散語言模型

集眾家之所長&#xff0c;成大一統。普林斯頓大學、北京大學、清華大學、字節跳動的研究者將“文本推理、多模態分析、圖像生成”三大方向融合在一個單一擴散模型里&#xff0c;并用恰當的優化策略來提升模型在各個方向的性能。 研究動機 研究人員致力于開發一個能夠處理多種模…

容器技術入門與Docker環境部署

容器技術入門與Docker環境部署Docker概述什么是 DockerDocker 的優勢Docker 的應用場景Docker 核心概念(1)鏡像(2)容器(3)倉庫Docker 安裝1.關閉系統防火墻和內核2.下載Docker的repo文件3.替換倉庫地址4.更新索引文件并安裝Docker5.添加國內鏡像站6.開啟Docker服務7.優化內核參…

【01】MFC入門到精通—— MFC新建基于對話框的項目 介紹(工作界面、資源視圖 、類視圖)

文章目錄1 創建工程2 運行3 工作界面介紹3. 1 類視圖 Class View3.2 如何打開 類視圖3.3 資源視圖1 創建工程 選擇菜單項 文件->新建->項目&#xff0c;彈出 “新項目” 對話框。 選擇 MFC&#xff0c;點擊下一步&#xff0c;然后鍵入工程名稱&#xff0c;本例取名“Add…

2025!在Windows的Python中安裝GDAL包(小白能成!)

最近更新 在2025.06.05日&#xff0c;GDAL發布預告&#xff1a;新版本將適配pipeline和向量讀寫功能。 直到2025.06.25日&#xff0c;最新的版本才算發行出來。 有朋友催我趕緊更新教程&#xff0c;我上次更新是3月份的時候了&#xff0c;恰好是GDAL上一個版本出來的時間。 前…

Python第一次作業

# 1.技術面試題**&#xff08;1&#xff09;TCP與UDP的區別是什么&#xff1f;****答&#xff1a;TCP 是 “可靠但較慢” 的協議&#xff0c;適合對數據完整性要求高的場景&#xff1b;UDP 是 “快速但不可靠” 的協議&#xff0c;適合對實時性要求高的場景。兩者互補&#xff…

Linux【大數據運維】下制作Redis綠色免安裝包(一)

linux下安裝Redis比較繁瑣&#xff0c;遇到內網部署環境更是麻煩。根據經驗將Redis打包一個綠色版進行使用。 大體思路&#xff0c;在一臺正常的機器上面制造好安裝包&#xff0c;然后上傳到內網服務器&#xff0c;解壓使用。 下載&#xff1a; wget https://download.redis…

89104 PCIe Switch芯片國產替代 - PCIE5.0國產AI服務器高性能擴展,支持海光/龍芯/飛騰等

以下是針對89104 PCIe Switch芯片國產替代的高性能PCIe 5.0 AI服務器擴展方案的詳細分析&#xff1a;一、核心國產替代芯片&#xff1a;TL63104控制器?技術規格?支持PCIe 5.0全速率&#xff08;32 GT/s&#xff09;&#xff0c;提供968 Lanes配置&#xff0c;聚合雙向帶寬達1…

Docker跨架構部署實操

需求場景 python項目&#xff0c;開發環境以及可供測試的環境為X86架構下的LINUX服務器&#xff0c;但正式環境需要部署在ARM架構下的麒麟服務器&#xff0c;且正式環境后續可能會長時間處于斷網狀態&#xff0c;需要一份跨架構的部署方案。 解決思路 在 X86 上打包、在 ARM&am…

JavaScript 樹形菜單總結

樹形菜單是前端開發中常見的交互組件,用于展示具有層級關系的數據(如文件目錄、分類列表、組織架構等)。以下從核心概念、實現方式、常見功能及優化方向等方面進行總結。 一、核心概念 層級結構:數據以父子嵌套形式存在,如{ id: 1, children: [{ id: 2 }] }。節點:樹形結…

【python實用小腳本-131】Python 實現 HTML 到 PDF 轉換:解決文檔處理痛點的高效工具

引言 在當今數字化辦公環境中&#xff0c;文檔格式的轉換需求日益頻繁。假設你是一位市場營銷人員&#xff0c;需要將公司網站的產品介紹頁面&#xff08;HTML 格式&#xff09;轉換為 PDF 文檔&#xff0c;以便用于線下宣傳。然而&#xff0c;手動復制粘貼內容并調整格式不僅…

【Linux操作系統】簡學深悟啟示錄:Linux基本指令

文章目錄1.什么是操作系統&#xff1f;2.Xshell的使用3.常用指令3.1 ls指令3.2 pwd指令3.3 cd指令3.4 touch指令3.5 mkdir指令3.6 rmdir指令 && rm指令3.7 man指令3.8 cp指令3.9 mv指令3.10 cat指令3.11 echo指令&#xff08;重定向&#xff09;3.12 more指令3.13 less…