1. 所有的tensor都有.requires_grad
屬性,可以設置這個屬性.
x = tensor.ones(2,4,requires_grad=True)
2.如果想改變這個屬性,就調用tensor.requires_grad_()
方法:
x.requires_grad_(False)
3.自動求導注意點:
(1) 要想使x支持求導,必須讓x為浮點類型;
(2) 求導,只能是【標量】對標量,或者【標量】對向量/矩陣求導;
(3) 不是標量也可以用backward()函數來求導;
(4) 一般來說,我是對標量求導,比如在神經網絡里面,我們的loss
會是一個標量,那么我們讓loss
對神經網絡的參數w
求導,直接通過loss.backward()
即可。
但是,有時候我們可能會有多個輸出值,比如loss=[loss1,loss2,loss3],那么我們可以讓loss的各個分量分別對x求導,這個時候就采用:
loss.backward(torch.tensor([[1.0,1.0,1.0,1.0]]))
如果你想讓不同的分量有不同的權重,那么就賦予gradients不一樣的值即可,比如:
loss.backward(torch.tensor([[0.1,1.0,10.0,0.001]]))
這樣,我們使用起來就更加靈活了,雖然也許多數時候,我們都是直接使用.backward()
就完事兒了。
(5)一個計算圖只能backward一次,改善方法:retain_graph=True
但是這樣會吃內存!,尤其是,你在大量迭代進行參數更新的時候,很快就會內存不足,memory out了。
引自: