1. 程式人生 > 實用技巧 >Batch梯度下降基本知識

Batch梯度下降基本知識

梯度下降的定義

當迴歸問題中特徵較多時,預測函式的引數也會跟著變多,此時代價函式的最小化將會非常困難。而梯度下降演算法可以幫助我們在引數很多的情況下找到最優的引數取值。

假設我們站在一座小山上,我們的任務就是一直向下走直到處在最低點。首先環顧四周,找一個當下最陡峭的方向,以固定的步長向該方向走一步,再重複此過程,最終會走到一個區域的最低點,但不一定是整座山的最低點。值得注意的是,當我們一開始站的位置不同時,最後走到的位置也可能不同,即會產生不同的區域性最優解。梯度下降演算法的過程大致與此相同,如下圖所示:

梯度下降演算法同樣會陷入區域性最優解問題,不同的迭代起點可能會得到不同的梯度下降結果,如下圖所示:


梯度下降的數學表示

以兩個引數為例,梯度下降演算法的數學表示如下:

其中符號“ := ” 表示賦值,\alpha表示學習率,它來控制梯度下降的步長,\alpha後面跟著的是代價函式J(\Theta_{0},\Theta_{1})分別對\Theta_{0}\Theta_{1}的偏導數。演算法的實現過程大致如下:

1、初始化\Theta_{0}\Theta_{1},可以都賦予0。

2、不斷更新\Theta_{0}\Theta_{1}的值,使J(\Theta_{0},\Theta_{1})的值更小,直到找到最小值或區域性最優解,而且\Theta_{0}\Theta_{1}一定要同時更新。其計算方法如下:

以一個引數為例,其梯度下降的過程可用下圖表示,其中每條彩色線都表示一次梯度下降,最終到達函式的最低點。

再次貼上代價函式J(\Theta_{0},\Theta_{1})的數學表示:

每次梯度下降時,都要對J(\Theta_{0},\Theta_{1})的偏導數進行一次計算,而J(\Theta_{0},\Theta_{1})本身要遍歷整個資料集,於是每次梯度下降也都會遍歷整個資料集,所以上述介紹的梯度下降方法也稱為:Batch(批,批量)梯度下降法。


特徵縮放

梯度下降存在的一個問題就是,如果各個特徵的取值範圍差別較大,例如第一個特徵取值範圍為1~2000,第二個特徵取值範圍為1~5,此時代價函式的等高線會顯得非常細長,例如下圖:

此時梯度下降的足跡將會呈現左右橫跳,並不直指向橢圓中心,導致梯度下降速度緩慢。此時我們可以將每個特徵值進行縮放,第一個特徵都除以2000,第二個特徵都除以5,這樣兩個引數的取值範圍都是0~1。這樣可以得到更加緩和的等高線圖,在梯度下降過程中每一步都直接指向圓心,例如下圖:

一般來說特徵值的取值範圍在-3~3之間都比較合適,此時代價函式的等高線圖會更加緩和,收斂的速度也會加快。還有一種特徵縮放的辦法為均值歸一化:將每個特徵值減去該特徵的平均取值,再除以該特徵的取值範圍。經過此操作後,特徵值更容易變換到-0.5~0.5這個範圍內。特徵縮放並不需要特別精確,只需將特徵值的取值範圍收束到一個相近似的範圍內即可,目的是加快梯度下降的速度。


如何確定學習率α

學習率決定了梯度下降的步長,代價函式的收斂程度與迭代次數有關,在到達一定迭代次數後代價函式會收斂到最低點,因此要選擇合適的學習率,迭代合適的次數,才能更好的實現梯度下降演算法。通過觀察代價函式與迭代次數的對應關係,才可以發現學習率時候合適。我們想要隨著迭代次數增加,代價函式值不斷減小,如下圖所示,X軸為迭代次數,Y軸為代價函式值:

若學習率過大,可能導致梯度下降在接近最低點時衝破最小值,左右橫跳,導致無法收斂,例如下圖所示,X軸為引數取值,Y軸為代價函式值:

若學習率過小,可能導致梯度下降次數太多,影響程式效率。例如下圖所示,X軸為引數取值,Y軸為代價函式值:

學習率α 太小的話,收斂過程會很緩慢,導致系統效率下降。α 太大的話,可能會導致梯度下降無法收斂。實際上,當梯度下降接近區域性最優解時,公式中的導數項會變得越來越小,梯度下降的步長也會跟著變小,因此不必將α設定的非常小,一般以3倍為步長,從0.001、0.003、0.01、0.03、0.1、0.3、1……中選擇,再結合影象來確定。