2019年4月6日 星期六

PyTorch - 求導 - 計算Gradient

對 ML & DL 有基礎了解之後,在優化loss function 的過程中,計算梯度是一個很重要的方法,求導的作用是對神經網絡的權重參數進行調整。
在 PyTorch 中為求導提供了專門的 function:autograd。如果用 autograd.Variable 來定義參數,則 Variable 自動定義了兩個變量,data 代表原始權重數據;而 grad 代表求導後的數據,也就是梯度。每次迭代過程就用這個 grad 對權重數據進行修正。
import torch from torch.autograd import Variable x = Variable(torch.ones(2, 2), requires_grad=True) print(x)
tensor([[1., 1.],
        [1., 1.]], requires_grad=True)
y=2*x+3 print(y)
tensor([[5., 5.],
        [5., 5.]], grad_fn=<AddBackward0>)
多設個變數z,讓z為y的函數,這樣就可以對z求導。
操作如numpy一樣簡潔。
z = y * y * 3 out = z.mean() print(z, out)
tensor([[75., 75.],
        [75., 75.]], grad_fn=<MulBackward0>) tensor(75., grad_fn=<MeanBackward1>)
接著練習將out反向傳播求導,這邊是out對x求導,所以將out反向傳播。
out.backward() print(x.grad,end="\n")
tensor([[15., 15.],
        [15., 15.]])
15是怎麼算出來的呢,從前面的公式可以看出 z=(2x+3)(2x+3)3,它的導數是 32(2x+3)/2,當 x=1 時導數的值就是 32(21+3)/2=15,和 pytorch 的 grad計算得出的結果是一致的。
weight 權重更新的方法:
weight = weight + learning_rate * gradient learning_rate = 0.01 for var in model.parameters(): var.data.sub_(f.grad.data * learning_rate)
learning_rate 是學習速率,多數時候就叫做 lr,lr *導數就是每次權重修正的 delta 值,lr 越大表示學習的速度越快,在 Gradient descent 方法調整 lr 是 DL 重要的課題。

沒有留言:

張貼留言