梯度下降算法原理 神經網絡(Gradient Descent)


         在求解神經網絡算法的模型參數,梯度下降(Gradient Descent)是最常采用的方法。下面是我個人學習時對梯度下降的理解,如有不對的地方歡迎指出。

1、✌ 梯度定義

         微積分我們學過,對多元函數的各個變量求偏導數,把求得的各個參數的偏導數以向量的形式寫出來,就是梯度。比如函數f(x,y), 分別對x,y求偏導數,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,簡稱grad f(x,y)或者▽f(x,y)。對於在點(x0,y0)的具體梯度向量就是(∂f/∂x0, ∂f/∂y0)T.或者▽f(x0,y0),如果是3個參數的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此類推。
         那么這個梯度向量求出來有什么意義呢?他的意義從幾何意義上講,就是函數變化增加最快的地方。具體來說,對於函數f(x,y),在點(x0,y0),沿着梯度向量的方向就是(∂f/∂x0, ∂f/∂y0)T的方向是f(x,y)增加最快的地方。或者說,沿着梯度向量的方向,更加容易找到函數的最大值。反過來說,沿着梯度向量相反的方向,也就是 -(∂f/∂x0, ∂f/∂y0)T的方向,梯度減少最快,也就是更加容易找到函數的最小值。
在這里插入圖片描述
對於F點來說,F點的梯度為綠色向量的方向,那么它的反方向即為下降最快的地方
對於B點來說,B點的梯度為負,所以梯度的反方向為右下方,也是函數下降最快的地方
可見,他們都朝着使函數到達最小值的方向努力。

2、✌ 梯度下降和梯度上升

         一般我們要求取損失函數最小值時就要利用梯度下降,對應求取最大值就應該用梯度上升,兩種方法都是將參數進行迭代更新。
下面進行介紹梯度下降的原理。

3、✌ 梯度下降的圖示

在這里插入圖片描述

         首先我們看這張圖,z軸為損失函數,x、y軸分別為兩個參數,現在問題就是我們要求取損失函數達到最小對應參數的取值,可能會想,窮舉每個參數,這個方法顯然不行,參數取值不限,不可能取到所有值,或者對損失函數求導,求極值,這種方法按理來說可能沒有問題,但是因為我們每次遇到的損失函數不同,把這種方法封裝成一個函數較難,函數類型不同,求導不同,無法做到通解,那么應該怎么做呢?
         把它看成一個碗,當我們向碗里放一個小球時,按自然現象來說,小球肯定會向下滾,那么小球滾的路徑有什么特別之處呢?當讓是坡度大的地方,越陡的地方越容易下來而且越快,那不就和我們的梯度對應上了嗎,小球每次沿着梯度的反方向滾動總會有一個時刻達到最低點。
         梯度下降就是這個原理,可是又有了新的問題,我們看一張圖。
在這里插入圖片描述
         按照上面的理論,小球肯定會滾到一個最低點,那么這個點一定是最低點嗎?肯定不是,根據上面的圖可以看出,如果小球一旦陷入某一個凹陷的區域,就會終止,並沒有達到最低點,那么就說我們獲得的是局部最優,而不是全局最優,這里有一個補充,如果我們的損失函數為凸函數,那么我們一定會得到全局最優解。
         學過高數可能知道,取得極小值的位置,並不一定是最小值,它只是局部的最小值,那么應該怎么做呢,由此產生了很多優化的算法,利用各種數學的推導衍生新的公式,這里不予說明,本文只為講解梯度下降原理,有興趣可自行查找相關文獻。

4、✌ 梯度下降的相關概念

\[w=w-a*dJ/dw \]

這個就是梯度下降的核心公式,用這個公式來進行更新w的取值,這里問什么用減號呢?話不多說看圖。
在這里插入圖片描述
         當我們的點是b點時,梯度為正(導數值),那么我們想要取到最小值,肯定是要左移,那么就需要減去該值*學習率
如果是a點,梯度為負(導數值為負),那么就需要右移,導數值為負就應該加上它

  1. 損失函數:學過線性回歸可能知道,我們評估它的好壞利用的就是MSE(均方誤差),利用它進行度量模型擬合的程度。

\[J(w1,w2)=1/m\sum_{i=0}^m(y-y')^2 \]

顯然這個函數越小越好,那么我們就是要求取最優的w1和w2取值使我們的損失函數達到最小值,這就用到了梯度下降。
2. 學習率:就是上面公式中的a,有的地方也叫做步長,我感覺很矛盾,這個地方我感覺有些問題,我個人認為就是一個起調節作用的數,因為w和它對應的導數有可能數量級不同,這時就需要將導數乘一個小點的數調節一下

5、✌ 梯度下降的計算過程

         其中涉及到多維矩陣運算以及特別多的符號,對於初學者很難理解,這里我們簡化一下,用一個簡易版的來代替,不過原理是一樣的,就是將低維推廣到多維。
話不多說(因為編輯文檔公式不好寫,所有我在草紙上演示了下過程),來看圖!!!
在這里插入圖片描述

6、✌ 算法過程:

  1. 確定當前參數所在位置的梯度(導數)$$dJ/dw$$

  2. 用學習率乘以梯度,得到參數更新的距離,即a*dJ/dw

  3. 確定迭代次數和閾值,分為兩種情況

    3.1 第一種達到迭代次數,計算結束
    3.2 第二種參數更新值小於閾值,說白了就是a*dJ/dw趨於0,說明近乎達到了最優位置

7、✌ 算法優化:

有沒有什么地方可以優化呢?

  1. 學習率的選擇:
    很容易知道,如果學習率過小的化,會導致參數更新率較小,變化小,導致迭代次數增加,增加模型訓練時間,如果學習率過大的化,會導致參數變化太大,迭代過快,導致跳過最優解的位置
    看張圖就明白了
    在這里插入圖片描述

  2. 參數的初始值:
    初始值的不同也會影響模型的效果,因為梯度下降有時會得到局部最優解,而如果位置選擇得當的化會避免這種狀況

  3. 數據的歸一化,消除量綱影響 :
    歸一化后不同特征的取值范圍會划分到同一范圍,會減少一定的計算量

\[x=x-mean(x)/std(x) \]

樣本減去均值除以標准差,這樣處理后的數據會符合高斯分布


免責聲明!

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



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