本篇是摘抄pytorch-handbook里面的,有興趣可以看看。
損失函數(Loss Function)
損失函數(loss function)是用來估量模型的預測值(我們例子中的output)與真實值(例子中的y_train)的不一致程度,它是一個非負實值函數,損失函數越小,模型的魯棒性就越好。 我們訓練模型的過程,就是通過不斷的迭代計算,使用梯度下降的優化算法,使得損失函數越來越小。損失函數越小就表示算法達到意義上的最優。
nn.CrossEntropyLoss:
多分類用的交叉熵損失函數,LogSoftMax和NLLLoss集成到一個類中,會調用nn.NLLLoss函數,我們可以理解為CrossEntropyLoss()=log_softmax() + NLLLoss()
因為使用了NLLLoss,所以也可以傳入weight參數,這時loss的計算公式變為:
所以一般多分類的情況會使用這個損失函數
梯度下降
在介紹損失函數的時候我們已經說了,梯度下降是一個使損失函數越來越小的優化算法,在無求解機器學習算法的模型參數,即約束優化問題時,梯度下降(Gradient Descent)是最常采用的方法之一。所以梯度下降是我們目前所說的機器學習的核心,了解了它的含義,也就了解了機器學習算法的含義。
梯度¶
在微積分里面,對多元函數的參數求∂偏導數,把求得的各個參數的偏導數以向量的形式寫出來,就是梯度。 例如函數f(x,y), 分別對x,y求偏導數,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,簡稱grad f(x,y)或者▽f(x,y)。
幾何上講,梯度就是函數變化增加最快的地方,沿着梯度向量的方向,更加容易找到函數的最大值。反過來說,沿着梯度向量相反的方向梯度減少最快,也就是更加容易找到函數的最小值。
我們需要最小化損失函數,可以通過梯度下降法來一步步的迭代求解,得到最小化的損失函數,和模型參數值。
torch.optim.SGD
隨機梯度下降算法,帶有動量(momentum)的算法作為一個可選參數可以進行設置,樣例如下:
#lr參數為學習率,對於SGD來說一般選擇0.1 0.01.0.001,如何設置會在后面實戰的章節中詳細說明 ##如果設置了momentum,就是帶有動量的SGD,可以不設置 optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
torch.optim.RMSprop
除了以上的帶有動量Momentum梯度下降法外,RMSprop(root mean square prop)也是一種可以加快梯度下降的算法,利用RMSprop算法,可以減小某些維度梯度更新波動較大的情況,使其梯度下降的速度變得更快
#我們的課程基本不會使用到RMSprop所以這里只給一個實例 optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99)
torch.optim.Adam
Adam 優化算法的基本思想就是將 Momentum 和 RMSprop 結合起來形成的一種適用於不同深度學習結構的優化算法
# 這里的lr,betas,還有eps都是用默認值即可,所以Adam是一個使用起來最簡單的優化方法 optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-08)
方差/偏差
- 偏差度量了學習算法的期望預測與真實結果的偏離程序,即刻畫了學習算法本身的擬合能力
- 方差度量了同樣大小的訓練集的變動所導致的學習性能的變化,即模型的泛化能力