計算圖
computational graph
表示方法
計算圖是用來描述運算的有向無環圖
計算圖有兩個主要元素:結點(node)和邊(edge)
結點表示數據,如向量,矩陣,張量
邊表示運算,如加減乘除卷積等
計算圖不僅使計算顯得簡潔,更重要的是其表示梯度求導更為方便
用計算圖表示y=(x+w)*(w+1): 令 a=x+w b=w+1 則y=a*b
梯度求導結合題例的算式和計算圖表示
從上述的計算圖表示中,可以看到,除了x,w外的梯度都是可以用x,w或其xw梯度表示
葉子結點
葉子結點:用戶創建的結點稱為葉子結點,如x,w
torch.tensor.is_leaf:用來查看是否為葉子結點
葉子結點的用處:在反向傳播之后,只有葉子結點的梯度會被保留,其他中間結點的梯度數據會被釋放,以節省內存
若要保存某特定結點的梯度,可以在運行反向傳播函數前,補上一句tensor.retain_grad(),此次反向傳播后,該tensor的梯度會被保留
梯度方向
torch.tensor.grad_fn:記錄創建該張量時所用的方法(函數)及梯度方向
作用:以便計算機知道求導某張量結點的梯度需用到的特定法則
AddBackward代表a張量為相加形成,此時的梯度在反向傳播中
動態圖
dynamic graph
動態圖與靜態圖
根據計算圖的搭建方式,可以將計算圖分為動態圖和靜態圖。
- 動態圖采用搭建和運算同時進行:靈活、易調節(debug)
- 靜態圖為先搭建,后運算:高效但不靈活
pytorch采用動態圖機制,tensorflow采用靜態圖機制
如下左圖,tensorflow的搭建機制為先確立好所有的路線流向,再將tensor數據注入跑通整個過程。這也是tensorflow的名字由來
而下右圖,pytorch中隨着代碼的數據定義與構建,同時也確立部分的計算圖模塊。