損失函數和梯度下降解釋


本篇是摘抄pytorch-handbook里面的,有興趣可以看看。

損失函數(Loss Function)

損失函數(loss function)是用來估量模型的預測值(我們例子中的output)與真實值(例子中的y_train)的不一致程度,它是一個非負實值函數,損失函數越小,模型的魯棒性就越好。 我們訓練模型的過程,就是通過不斷的迭代計算,使用梯度下降的優化算法,使得損失函數越來越小。損失函數越小就表示算法達到意義上的最優。

nn.CrossEntropyLoss:

多分類用的交叉熵損失函數,LogSoftMax和NLLLoss集成到一個類中,會調用nn.NLLLoss函數,我們可以理解為CrossEntropyLoss()=log_softmax() + NLLLoss()

$ \begin{aligned} loss(x, class) &= -\text{log}\frac{exp(x[class])}{\sum_j exp(x[j]))}\ &= -x[class] + log(\sum_j exp(x[j])) \end{aligned}  $

因為使用了NLLLoss,所以也可以傳入weight參數,這時loss的計算公式變為:

$ loss(x, class) = weights[class] * (-x[class] + log(\sum_j exp(x[j]))) $

所以一般多分類的情況會使用這個損失函數

梯度下降

在介紹損失函數的時候我們已經說了,梯度下降是一個使損失函數越來越小的優化算法,在無求解機器學習算法的模型參數,即約束優化問題時,梯度下降(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)

 

方差/偏差

  • 偏差度量了學習算法的期望預測與真實結果的偏離程序,即刻畫了學習算法本身的擬合能力
  • 方差度量了同樣大小的訓練集的變動所導致的學習性能的變化,即模型的泛化能力


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM