計算圖,動態圖與靜態圖

計算圖

  計算圖是用來描述運算的有向無環圖。計算圖有兩個主要元素:結點(Node) 和邊(Edge)。結點表示數據,如向量,矩陣,張量;邊表示運算,如加減乘除卷積等。
用計算圖表示 y = ( x + w) * ( w + 1 )
  拆分成 a = x + w ;b = w + 1 ;y = a * b

+1
x
a +
w
b
y *

y對w求導,相當於找到計算圖中所有y到w的路徑,路徑上的導數求積,路徑間求和
yw=yaaw+ybbw=b×1+a×1=b+a=(w+1)+(x+w)=2×w+x+1\frac{\partial y}{\partial w}=\frac{\partial y}{\partial a}\frac{\partial a}{\partial w}+\frac{\partial y}{\partial b}\frac{\partial b}{\partial w}= b \times 1 + a \times 1 = b + a = (w + 1) + (x + w) = 2 \times w + x + 1
葉子結點: 用戶創建的結點,如x與w,梯度反向傳播之後,非葉子節點的梯度會被釋放掉,若想使用非葉子節點的梯度,可以用 retain_grad()
grad_fn: 記錄創建該張量時所用的方法

w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)
a = torch.add(x, w)
a.retain_grad()  # 保留非葉子節點的梯度
b = torch.add(w, 1)
y = torch.mul(a, b)
y.backward()
print(w.is_leaf, x.is_leaf, a.is_leaf, b.is_leaf, y.is_leaf)
print(w.grad, x.grad, a.grad, b.grad, y.grad)
print(w.grad_fn, x.grad_fn, a.grad_fn, b.grad_fn, y.grad_fn)
True True False False False
tensor([5.]) tensor([2.]) tensor([2.]) None None
None None <AddBackward0 object at 0x000001F812793A48> <AddBackward0 object at 0x000001F81278F4C8> <MulBackward0 object at 0x000001F821799148>

動態圖VS靜態圖

  根據計算圖搭建方式,可將計算圖分爲動態圖和靜態圖。
  動態圖:運算與搭建同時進行,靈活,易調節
  靜態圖:先搭建圖,後運算,高效,不靈活
  PyTorch採用的是動態圖機制,每一次訓練,都會銷燬計算圖並重新創建,這樣做花銷很大,但是更加靈活。
  TensorFlow採用的是靜態圖機制,一旦定義,訓練時就不能修改。一開始就要搭建好計算圖,然後才能進行數據的傳輸和計算,這意味着寫代碼過程中,錯誤將更加難以發現,因爲搭建圖的過程中不會報錯,所以不知道錯在哪裏,只有在傳入數據的過程中才能發現哪裏出錯,靈活性低,而且出現bug也不易調試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章