1. 損失函數
在深度學習中,損失反映模型最后預測結果與實際真值之間的差距,可以用來分析訓練過程的好壞、模型是否收斂等,例如均方損失、交叉熵損失等。
PyTorch中,損失函數可以看做是網絡的某一層而放到模型定義中,但在實際使用時更偏向於作為功能函數而放到前向傳播過程中。
損失函數舉例:均方誤差(mean squared error)、交叉熵誤差(cross entropy error)等使用時參考手冊torch.nn — PyTorch 1.11.0 documentation
實例:nn.MSELoss 均方誤差
#接上篇神經網絡 out = net(input) net.zero_grad() out.backward(torch.randn(1, 10)) target = torch.randn(10) # a dummy target, for example target = target.view(1, -1) # make it the same shape as output criterion = nn.MSELoss() loss = criterion(out, target) print(loss) #輸出結果 tensor(1.7306, grad_fn=<MseLossBackward0>) “因為input和target的是隨機torch陣,所以loss結果不固定”
2. 反向傳播
在神經網絡的學習中,尋找最優參數(權重和偏置)時,要尋找使損失函數的值盡可能小的參數。
為了找到使損失函數的值盡可能小的地方,需要計算參數的導數(確切地講是梯度),然后以這個導數為指引,逐步更新參數的值。
數值微分可以計算神經網絡的權重參數的梯度(嚴格來說,是損失函數關於權重參數的梯度),但是計算上比較費時間。
誤差反向傳播法則是一個能夠高效計算權重參數的梯度的方法。
- 為了實現反向傳播損失,我們所有需要做的事情僅僅是使用 loss.backward()。你需要清空現存的梯度,要不然梯度將會和現存的梯度累計到一起。
net.zero_grad() # zeroes the gradient buffers of all parameters print('conv1.bias.grad before backward') print(net.conv1.bias.grad) loss.backward() print('conv1.bias.grad after backward') print(net.conv1.bias.grad)
#輸出
conv1.bias.grad before backward None #清空了現存梯度 conv1.bias.grad after backward tensor([ 8.4274e-05, 2.4798e-03, 1.1413e-03, 2.4606e-03, 1.6488e-02, -7.1301e-03])
- 優化器
利用反向傳播,優化器應運而生。優化器可以更新參數即網絡中的權重,進行模型優化、加速收斂。
常用的優化器算法SGD, Nesterov-SGD, Adam,RMSProp等。優化算法的設計可以作為課題深層研究,目前只需要會使用現成算法就可以。
算法在算法包torch.optim。
torch.optim — PyTorch 1.11.0 documentation
optimizer = optim.SGD(net.parameters(), lr=0.01)# create your optimizer optimizer.zero_grad()# zero the gradient buffers output = net(input) loss = criterion(output, target) loss.backward() optimizer.step()# Does the update
優化通常要經過好幾輪的for循環,訓練模型使得模型整體loss減小。
至此,我們在前篇
1.定義一個神經網絡
2.處理輸入以及調用反向傳播
的基礎上繼續補充了:
3.計算損失值
4.更新網絡中的權重
完成了一個典型的神經網絡訓練過程。
參考文獻:
《Pytorch官方教程中文版 》
《 深度學習之Pytorch物體檢測實戰》
《深度學習入門:基於python的理論與實現》