欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pytorch的backward()的底層實(shí)現(xiàn)邏輯詳解

 更新時(shí)間:2023年11月20日 11:34:16   作者:子燕若水  
自動(dòng)微分是一種計(jì)算張量(tensors)的梯度(gradients)的技術(shù),它在深度學(xué)習(xí)中非常有用,這篇文章主要介紹了pytorch的backward()的底層實(shí)現(xiàn)邏輯,需要的朋友可以參考下

自動(dòng)微分是一種計(jì)算張量(tensors)的梯度(gradients)的技術(shù),它在深度學(xué)習(xí)中非常有用。自動(dòng)微分的基本思想是:

  • 自動(dòng)微分會(huì)記錄數(shù)據(jù)(張量)和所有執(zhí)行的操作(以及產(chǎn)生的新張量)在一個(gè)由函數(shù)(Function)對(duì)象組成的有向無環(huán)圖(DAG)中。在這個(gè)圖中,葉子節(jié)點(diǎn)是輸入張量,根節(jié)點(diǎn)是輸出張量。通過從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)追蹤這個(gè)圖,可以使用鏈?zhǔn)椒▌t(chain rule)自動(dòng)地計(jì)算梯度。
  • 在前向傳播(forward pass)中,自動(dòng)微分同時(shí)做兩件事:
    • 運(yùn)行請(qǐng)求的操作來計(jì)算一個(gè)結(jié)果張量,以及
    • 在 DAG 中保留操作的梯度函數(shù)。
    • 在 DAG 中保留操作的梯度函數(shù),這就是說,當(dāng)你給自動(dòng)微分一個(gè)張量和一個(gè)操作,它不僅會(huì)計(jì)算出結(jié)果張量,還會(huì)記住這個(gè)操作的梯度函數(shù),也就是這個(gè)操作對(duì)輸入張量的導(dǎo)數(shù)。例如,如果你給自動(dòng)微分一個(gè)張量 x = [1, 2, 3] 和一個(gè)操作 y = x + 1,它不僅會(huì)計(jì)算出 y = [2, 3, 4],還會(huì)記住這個(gè)操作的梯度函數(shù)是 dy/dx = 1,也就是說,y 對(duì) x 的導(dǎo)數(shù)是 1。這樣,當(dāng)你需要計(jì)算梯度時(shí),自動(dòng)微分就可以根據(jù)這個(gè)梯度函數(shù)來計(jì)算出結(jié)果張量對(duì)輸入張量的梯度。
  • 在PyTorch中,DAG是動(dòng)態(tài)的。需要注意的一點(diǎn)是,圖是從頭開始重新創(chuàng)建的;在每個(gè) .backward() 調(diào)用之后,autograd開始填充一個(gè)新的圖。
  • 后向傳播開始于當(dāng)在 DAG 的根節(jié)點(diǎn)上調(diào)用 .backward() 方法。這個(gè)方法會(huì)觸發(fā)自動(dòng)微分開始計(jì)算梯度。
  • 自動(dòng)微分會(huì)從每個(gè) .grad_fn 中計(jì)算梯度,這個(gè) .grad_fn 是一個(gè)函數(shù)對(duì)象,它保存了操作的梯度函數(shù)。例如,如果一個(gè)操作是 y = x + 1,那么它的 .grad_fn 就是 dy/dx = 1。
  • 自動(dòng)微分會(huì)將計(jì)算出的梯度累加到相應(yīng)張量的 .grad 屬性中,這個(gè) .grad 屬性是一個(gè)張量,它保存了結(jié)果張量對(duì)輸入張量的梯度。例如,如果一個(gè)結(jié)果張量是 y = [2, 3, 4],那么它的 .grad 屬性就是 [1, 1, 1],表示 y 對(duì) x 的梯度是 1。
  • 使用鏈?zhǔn)椒▌t(chain rule),自動(dòng)微分會(huì)一直向后傳播,直到到達(dá)葉子張量。鏈?zhǔn)椒▌t是一種數(shù)學(xué)公式,它可以將復(fù)合函數(shù)的梯度分解為簡(jiǎn)單函數(shù)的梯度的乘積。例如,如果一個(gè)復(fù)合函數(shù)是 z = f(g(x)),那么它的梯度是 dz/dx = dz/dg * dg/dx。
 
import torch
import torch.nn as nn
M = nn.Linear(2, 2) # neural network module
M.eval() # set M to evaluation mode
with torch.no_grad(): # disable gradient computation
    for param in M.parameters(): # loop over all parameters
        param.fill_(1) # fill the parameter with 1
M.requires_grad_(False)
a = torch.tensor([1., 2.], requires_grad=True) # leaf node
b = torch.tensor([13., 32.], requires_grad=True) # leaf node
c = M(a) # non-leaf node
c2 = M(b) # non-leaf node
d = c * 2  # non-leaf node
d.sum().backward() # compute gradients
print(a.grad)
print(b.grad)
print(c.grad)
print(d.grad)
print(M.weight.grad) # None

構(gòu)建計(jì)算圖:當(dāng)我們調(diào)用backward()方法時(shí),PyTorch會(huì)自動(dòng)構(gòu)建從葉子節(jié)點(diǎn)a到損失值d.sum()的計(jì)算圖,這是一個(gè)有向無環(huán)圖,表示了各個(gè)張量之間的運(yùn)算關(guān)系。計(jì)算圖中還包含了兩個(gè)中間變量c和d,它們是由a經(jīng)過M模型的前向傳播得到的。計(jì)算圖的作用是記錄反向傳播的路徑,以便于計(jì)算梯度。 計(jì)算梯度:在計(jì)算圖中,每個(gè)張量都有一個(gè)屬性grad,用于存儲(chǔ)它的梯度值。當(dāng)我們調(diào)用backward()方法時(shí),PyTorch會(huì)沿著計(jì)算圖按照鏈?zhǔn)椒▌t計(jì)算并填充每個(gè)張量的grad屬性。由于我們只對(duì)葉子節(jié)點(diǎn)a的梯度感興趣,所以只有a的grad屬性會(huì)被計(jì)算出來,而中間變量c和d的grad屬性會(huì)被忽略。a的grad屬性的值是損失值d.sum()對(duì)a的偏導(dǎo)數(shù),表示了a的變化對(duì)損失值的影響。 

到此這篇關(guān)于pytorch的backward()的底層實(shí)現(xiàn)邏輯的文章就介紹到這了,更多相關(guān)pytorch backward()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • numpy.insert()的具體使用方法

    numpy.insert()的具體使用方法

    本文主要介紹了numpy.insert()的具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 使用python如何提取JSON數(shù)據(jù)指定內(nèi)容

    使用python如何提取JSON數(shù)據(jù)指定內(nèi)容

    這篇文章主要介紹了使用python如何提取JSON數(shù)據(jù)指定內(nèi)容,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 關(guān)于Python文本生成的Beam?Search解碼問題

    關(guān)于Python文本生成的Beam?Search解碼問題

    這篇文章主要介紹了Python文本生成的Beam?Search解碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • python實(shí)現(xiàn)掃雷小游戲

    python實(shí)現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Python+Selenium+phantomjs實(shí)現(xiàn)網(wǎng)頁(yè)模擬登錄和截圖功能(windows環(huán)境)

    Python+Selenium+phantomjs實(shí)現(xiàn)網(wǎng)頁(yè)模擬登錄和截圖功能(windows環(huán)境)

    Python是一種跨平臺(tái)的計(jì)算機(jī)程序設(shè)計(jì)語言,它可以運(yùn)行在Windows、Mac和各種Linux/Unix系統(tǒng)上。這篇文章主要介紹了Python+Selenium+phantomjs實(shí)現(xiàn)網(wǎng)頁(yè)模擬登錄和截圖功能,需要的朋友可以參考下
    2019-12-12
  • Python中json.loads和json.dumps方法中英雙語詳解

    Python中json.loads和json.dumps方法中英雙語詳解

    在Python中json.loads和json.dumps是處理JSON數(shù)據(jù)的重要方法,json.loads用于將JSON字符串解析為Python對(duì)象,而json.dumps用于將Python對(duì)象序列化為JSON字符串,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • 解決python的空格和tab混淆而報(bào)錯(cuò)的問題

    解決python的空格和tab混淆而報(bào)錯(cuò)的問題

    這篇文章主要介紹了解決python的空格和tab混淆而報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • python:關(guān)于文件加載及處理方式

    python:關(guān)于文件加載及處理方式

    這篇文章主要介紹了python:關(guān)于文件加載及處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Python OpenCV 調(diào)用攝像頭并截圖保存功能的實(shí)現(xiàn)代碼

    Python OpenCV 調(diào)用攝像頭并截圖保存功能的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Python OpenCV 調(diào)用攝像頭并截圖保存功能,本文通過兩段實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python獲取網(wǎng)頁(yè)數(shù)據(jù)詳解流程

    Python獲取網(wǎng)頁(yè)數(shù)據(jù)詳解流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Python來獲取網(wǎng)頁(yè)的數(shù)據(jù),主要應(yīng)用了Requests庫(kù),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-10-10

最新評(píng)論