分析中的一些知識(shí)
映射,對(duì)二蓝,存在誉券,
當(dāng)為線性函數(shù)時(shí),其中侣夷『崤螅可拆解為:
一階梯度為jaccob矩陣
特別的,當(dāng)時(shí)百拓,一階梯度為:
在pytorch的autograd.grad函數(shù)或backward方法中琴锭,grad_outputs/grad_tensors 是一個(gè)與outputs的形狀一致的向量,即:
在給定grad_outputs 之后衙传,真正返回的梯度為:
輸出的梯度與inputs形狀一致的向量决帖,相當(dāng)于是將中每個(gè)維度的梯度進(jìn)行加權(quán)求和。
參考pytorch官網(wǎng)的關(guān)于求導(dǎo)教程蓖捶,我將其重新總結(jié)一下地回,意思是在得到后用于計(jì)算損失:,所以對(duì)的梯度就根據(jù)<u>鏈?zhǔn)椒▌t</u>可以寫(xiě)為:(這里雅可比算子記為俊鱼,對(duì)的導(dǎo)數(shù)記為)
或者根據(jù)<u>維度對(duì)齊</u>刻像,反向推出:
以上可以作為一般的復(fù)合多元函數(shù)的求導(dǎo)公式。
pytorch中求導(dǎo)函數(shù)還有兩個(gè)參數(shù):
- retain_graph如果為T(mén)rue并闲,則每次backward后细睡,梯度會(huì)累加,如線性層中參數(shù)b.grad開(kāi)始時(shí)為0帝火,第一次backward后b.grad=1溜徙,再一次backward候b.grad變?yōu)?。
分兩種情況考慮:一個(gè)節(jié)點(diǎn)衍生出多個(gè)節(jié)點(diǎn):比如這種z生成了x和y犀填。還有就是多個(gè)節(jié)點(diǎn)衍生出一個(gè)節(jié)點(diǎn)比如:要計(jì)算(這里均為標(biāo)量)的導(dǎo)數(shù)蠢壹,有兩個(gè)變量,九巡,图贸,計(jì)算圖如下:
grad與backward的最大區(qū)別就是前者需要指定輸入輸出,并將計(jì)算的梯度結(jié)果以return形式返回;而后者不用指定輸入輸出求妹,計(jì)算的梯度結(jié)果直接存入葉子節(jié)點(diǎn)的grad屬性中乏盐。
- create_graph如果要計(jì)算高階導(dǎo)數(shù)佳窑,則必須選為T(mén)rue制恍。
另外,更高維度的pytorch求導(dǎo)神凑,可以參考:https://blog.csdn.net/waitingwinter/article/details/105774720
因?yàn)楸救藭簳r(shí)用不到多元符合函數(shù)高階求導(dǎo)净神,就沒(méi)有去驗(yàn)證是否正確。