Pytorch 微积分
微積分
0. 環境介紹
環境使用 Kaggle 里免費建立的 Notebook
教程使用李沐老師的 動手學深度學習 網站和 視頻講解
小技巧:當遇到函數看不懂的時候可以按 Shift+Tab 查看函數詳解。
0.1 求導結果
0.2 y 為標量,X 為向量
0.3 y 和 X 均為向量
1. 自動求導
假設我們想對函數 y=2x?xy=2x^{\top}xy=2x?x 關于列向量 xxx 求導。
小細節:arange(4) 代表生成 4 個連續整型數,arange(4.0) 代表生成 4 個連續浮點數。
1.1 存儲梯度
第一行代碼設置與 x = torch.arange(4.0, requires_grad=True) 等價。
x.grad 默認為 None。
1.2 計算 yyy
隱式構造計算圖。
1.3 調用反向傳播函數來自動計算 yyy 關于每個分量的梯度
內積是自己相乘,也就是 2x22x^22x2,求導后就是 4x4x4x。
1.4 計算 y=sum(x)y=sum(x)y=sum(x) 關于 xxx 的梯度
默認情況下,Pytorch 會累計梯度,我們需要清除之前的值。
如果注釋掉 x.grad.zero_() 會導致每次 y.backward() 后 x.grad 的結果都是與之前的保留的梯度相加之和。
1.5 計算 y=sum(x?x)y=sum(x*x)y=sum(x?x) 關于 xxx 的梯度
這里的 x * x 為 element-wise 的結果。
y.sum().backward() 等價于 y.backward(torch.ones(len(x)))
1.6 將某些計算移動到記錄的計算圖之外
y.detach() 將 yyy 設置為一個常數,命名為 uuu,zzz 關于 xxx 的導數就是 uuu。這個操作可以用于固定參數。
1.7 即使構建函數的計算圖需要通過 Python 控制流(例如,條件、循環或任意函數調用),我們仍然可以計算得到的變量的梯度。
調用 f(a)f(a)f(a) 函數返回的值,是一個關于 aaa 的線性函數,所以 ddd 關于 aaa 的導數就是這個線性函數中 aaa 的系數
2. 練習
2.1 在運行反向傳播函數之后,立即再次運行它,看看會發生什么。
會報錯
RuntimeError: Trying to backward through the graph a second time (or directly access saved variables after they have already been freed). Saved intermediate values of the graph are freed when you call .backward() or autograd.grad(). Specify retain_graph=True if you need to backward through the graph a second time or if you need to access saved variables after calling backward.
Pytorch構建的計算圖是動態圖,為了節約內存,所以每次一輪迭代完也即是進行了一次 backward 函數計算之后計算圖就被在內存釋放,因此如果你需要多次 backward 只需要在第一次反向傳播時候添加一個 retain_graph=True 標識,讓計算圖不被立即釋放。
2.2 在控制流的例子中,我們計算 ddd 關于 aaa 的導數,如果我們將變量 aaa 更改為隨機向量或矩陣,會發生什么?
會報錯
RuntimeError: grad can be implicitly created only for scalar outputs
因為默認是個標量,所以需要設置參數 torch.ones_like(d)。
2.3 使 f(x)=sin?(x)f(x)=\sin(x)f(x)=sin(x),繪制 f(x)f(x)f(x) 和 df(x)dx\frac{df(x)}{dx}dxdf(x)? 的圖像,其中后者不使用 f′(x)=cos?(x)f'(x)=\cos(x)f′(x)=cos(x) 。
總結
以上是生活随笔為你收集整理的Pytorch 微积分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 您的WebApp真的需要jQuery吗?
- 下一篇: case2