對 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一樣簡潔。
操作如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 重要的課題。
沒有留言:
張貼留言