【小知識】神經網絡中的SGD優化器和MSE損失函數


今天來講下之前發的一篇極其簡單的搭建網絡的博客里的一些細節

(前文傳送門)


之前的那個文章中,用Pytorch搭建優化器的代碼如下:

# 設置優化器
optimzer = torch.optim.SGD(myNet.parameters(), lr=0.05)
loss_func = nn.MSELoss()

一、SGD方法

  我們要想訓練我們的神經網絡,就必須要有一種訓練方法。就像你要訓練你的肌肉,你的健身教練就會給你指定一套訓練的計划也可以叫方法,那么SGD就是這樣一種訓練方法,而訓練方法並不只有這一個,因為給你的訓練計划可以使很多種,但是我們今天就介紹這一種方法。SGD方法是怎樣的一種方法呢?從全稱來看:隨機梯度下降方法(Stochastic gradient descent),我們可以直觀地感受到一個關鍵的動作——隨機
  沒錯,SGD方法就是讓我們的神經網絡在進行梯度下降的時候,不再死板的選擇所有的樣本進行梯度計算,而是在樣本集中隨機選擇一個樣本進行梯度計算,這一次的梯度下降可以用這樣的公式來表示:其中iii反向傳播傳播到了第幾層,然后▽f(xi)就是代表對誤差求梯度。那么通過這個梯度在乘以學習率η,就可以用來更新我們網絡的權值了。

  由於每次做的梯度計算只是選取一個樣本進行的,所以采用SGD方法的神經網絡的學習速度將會特別快,意思也就是能夠將損失函數很快的收斂到最小(或者近似最小)。而這里的快並不是說直接沿着最短的路徑收斂,因為它並不是對整個樣本進行梯度計算,所以SGD並不能直接找到一條最快的路徑。就像下面這樣:

  圖中那個歪歪扭扭的線就是采用SGD方法的損失函數收斂的路徑,可以說是一段冒險的曲折的探索。而紅線就是對所有的樣本進行梯度計算的收斂路徑。
  看到這里你可能會問,那為什么采用SGD的方法訓練的神經網絡會比直接對所有樣本進行梯度下降的速度快呢?圖中明顯是曲折的探索路徑更長。但是事實確實是如此的,因為SGD求梯度的速度很快,每次只需要對一個樣本求梯度即可,當你的樣本集特別特別大的時候,SGD的優勢將會非常的明顯。
  但是也存在着一定弊端,當然也很好理解,因為選取的樣本少,所以可能一不小心我們訓練的神經網絡的損失函數就陷入了局部的最優解,就像下面的這個圖:

  你可以把這張圖當做那個曲折探索的一個小的部分,Local minimum就是局部的最小值,其實並不是真正的最小值,所以如果陷入其中,這段曲折的探索可能就會提前宣告失敗,我們網絡的性能也有可能會因此變得很差。當然,如果你把這個看成曲折探索的一小部分,那么Global minimum也可能只是這一小部分的局部最小值,而我們想得到的是整段曲折探索的最小值,也就是曲折探索的終點。
  如何解決這樣的問題呢?其實,你完全可以采用一種其他的學習方法,你的方法可能會對於你所解決的具體問題來說性能更好,在之后的文章里我們再來學習一些其他的方法。不過需要注意的是,SGD方法現在並沒有被許多人拋棄,因為大量的實驗研究已經證明,它在解決某些問題上的“性價比”還是挺高的。

二、MSE損失函數  

  用了挺大的篇幅講完了SGD方法,接着我們來放松下,了解一下什么是MSE。  在上面講到的SGD方法的內容中,我們已經提到了損失函數這一概念,你可以簡單的把損失函數理解成誤差,就是你網絡的實際輸出和你期望的輸出之間的誤差。你給你的網絡一個貓的照片,他輸出了個狗,那么這個誤差就是:狗-貓,當然這么簡單地計算誤差,是不會達到好的學習效果的,所以一般我們都會有一個函數來計算誤差,比如:f(狗-貓)。
  MSE就是這樣一個函數,他的表達式為:
  其中n代表樣本的數量,y代表你期望的輸出,而y′是指網絡實際的輸出,這樣我們通過MSE損失函數求梯度(求導)就可以進行梯度下降對網絡進行訓練了。
  它是如何進行反向傳播的呢?這就超出了本文敘述的范圍,我將會在后面的文章里進行詳細的陳述。
  當然和學習方法一樣,損失函數也不只這一個,通常來講,在解決回歸問題時,我們大多采用MSE,而在解決分類問題時,交叉熵函數就閃亮登場了。所以損失函數的選擇,也是決定你網絡性能好壞的一個重要因素。


免責聲明!

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



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