如需轉載,請注明出處!
如有幫助點贊收藏關注!
反向傳播機制與代碼
這里主要介紹反向傳播是如何運作的,代碼中會加注釋,便于大家理解。
在訓練神經網絡時,最常用的算法是反向傳播(back propagation)。在該算法中,根據損失函數計
算給定參數的梯度來調整參數(模型權重)。
微分引擎與代碼
為了計算反向傳播中的梯度,PyTorch有一個內置的微分引擎,叫做torch.autograd。它支持任何計算圖的梯度自動計算。
- 假設一個簡單的一層神經網絡,輸入x,輸出為z,參數是w和b.在這個網絡中,w和b是我們需要
優化的參數。因此,我們需要能夠計算關于這些變量的損失函數的梯度。 - 為了做到這一點,我們設置了這些張量的requires_grad性質。在pytorch中實現如下:
import torch
x = torch.ones(5) # input tensor
y = torch.zeros(3) # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b #z=wx+b
#交叉熵損失函數
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)
#反向傳播函數的引用存儲在一個張量的grad_fn屬性中
print('Gradient function for z =',z.grad_fn)
print('Gradient function for loss =', loss.grad_fn)
#優化器
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
- 梯度計算,為了優化神經網絡中參數的權值,我們需要計算損失函數對參數的導數,可以直接
調用 loss.backward()
loss.backward()
print(w.grad)
print(b.grad)
- 禁用梯度計算:默認情況下,所有requires_grad=True的張量都跟蹤它們的計算歷史并支持
梯度計算。但是,在某些情況下,我們并不需要這樣做,例如,當我們訓練了模型,只是想跑
一下前向測試我們的數據。我們可以通過使用detach()或者torch.no_grad()塊包圍計算代碼來
禁止梯度計算
z = torch.matmul(x, w)+b
print(z.requires_grad)
#方法1 使用no_grad
with torch.no_grad():
z = torch.matmul(x, w)+b
print(z.requires_grad)
#方法2 使用detach()
z_det = z.detach()
print(z_det.requires_grad)
原理闡述
1.前向傳播:輸入樣本經過神經網絡的前向傳播,得到輸出值。
2.計算誤差:將輸出值與期望值進行比較,得到誤差值。
3.反向傳播誤差:將誤差值從輸出層開始反向傳播,計算每個神經元的誤差貢獻。
4.更新權重和偏置:根據誤差貢獻來更新權重和偏置,使得誤差逐漸減小。
5.重復以上步驟,知道神經網絡的性能達到預期。
反向傳播算法的性能主要取決于初始權重和偏置的選擇,學習率的設置以及訓練數據集的多樣性。如果權重和偏置的初始值選的不太好,可能會導致神經網絡無法收斂。如果學習率設置的過高,可能會導致權重和偏置更新過于頻繁。無法收斂,如果學習率設置的過低,可能會導致收斂速度過慢。
在正常的圖像測試模型準確率的情況下,不開啟反向傳播,直接正向傳播計算。