1. 程式人生 > 實用技巧 >隨機梯度下降

隨機梯度下降

隨機梯度下降

目錄

影響搜尋全域性最小值的因素

1.區域性最小值

可能在進行梯度下降的時候,初始化的時候離其中一個區域性最小值比較接近,於是最終的結果可能就會收斂在這個區域性最小值。

2.鞍點

就是從一個方向進行梯度下降的話,它會找到一個區域性最小值(圖中的紅點),而從另外一個方向的話會找到一個區域性最大值,而都不是全域性最小值。

3.初始狀態

如圖,如果初始化的點在圖的左邊的話,可能最後收斂的點就是-2.5的區域性極小值,而如果初始化的點在圖右邊的話,可能收斂的點就是2.5 全域性最小值

4.學習率

可能學習率過大的話,你的收斂過程會不斷地在全域性極小值點附近震動而無法得到最優解。 所以就需要進行一個learning rate的衰減,在快收斂的時候減小learning rate。

5.動量(如何逃離區域性極小值)

原理就是當你暫時陷入一個區域性極小值的話,通過這個慣性可以衝出區域性極小值繼續向下進行梯度下降。

求導數的方法

autograd.grad()函式

計算導數

例子:

import torch
import torch.nn.functional as F
x = torch.ones(1)
w = torch.full([1],2,requires_grad=True)#這裡不加requires_grad=True的話會報錯RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
mse = F.mse_loss(x*w,torch.ones(1))#第一個引數是prediction,第二個引數是label
print(mse)#均方差loss輸出為1

print(torch.autograd.grad(mse,[w]))#對loss求關於w的偏導

輸出:

tensor(1., grad_fn=<MseLossBackward>)
(tensor([2.]),)

loss.backward()函式

計算計算圖中的各個引數的導數,並將相應引數的導數資訊自動附加在 引數.grad 屬性中。

例子:

import torch
import torch.nn.functional as F
x = torch.ones(1)
w = torch.full([1],2,requires_grad=True)#這裡不加requires_grad=True的話會報錯RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
mse = F.mse_loss(x*w,torch.ones(1))#第一個引數是prediction,第二個引數是label
mse.backward()
print(w.grad)

#輸出為tensor([2.])