最優化問題——梯度下降法


1、無約束最優化問題

求解此問題的方法方法分為兩大類:最優條件法和迭代法。

2、最優條件法

我們常常就是通過這個必要條件去求取可能的極小值點,再驗證這些點是否真的是極小值點。當上式方程可以求解的時候,無約束最優化問題基本就解決了。實際中,這個方程往往難以求解。這就引出了第二大類方法:迭代法。

最優條件法:最小二乘估計

3、迭代法

(1)梯度下降法(gradient descent),又稱最速下降法(steepest descent)

梯度下降法是求解無約束最優化問題的一種最常用的方法。梯度下降法是迭代算法,每一步需要求解目標函數的梯度向量。

必備條件:函數f(x)必須可微,也就是說函數f(x)的梯度必須存在

優點:實現簡單

缺點:最速下降法是一階收斂的,往往需要多次迭代才能接近問題最優解。

 算法A.1(梯度下降法)

輸入:目標函數f(x),梯度函數g(x)=▽f(x),計算精度ε;

輸出:f(x)的極小點x*

 

 總結:選取適當的初值x(0),不斷迭代,更新x的值,進行目標函數的極小化,直到收斂。由於負梯度方向是使函數值下降最快的方向,在迭代的每一步,以負梯度方向更新x的值,從而達到減少函數值的目的。

λk叫步長或者學習率;梯度方向gk=g(x(k))是x=x(k)時目標函數f(x)的一階微分值。

學習率/步長 λ 的確定:

當f(x)的形式確定,我們可以通過求解這個一元方程來獲得迭代步長λ。當此方程形式復雜,解析解不存在,我們就需要使用“一維搜索”來求解λ了。一維搜索是一些數值方法,有0.618法、Fibonacci法、拋物線法等等,這里不詳細解釋了。

在實際使用中,為了簡便,也可以使用一個預定義的常數而不用一維搜索來確定步長λ。這時步長的選擇往往根據經驗或者通過試算來確定。步長過小則收斂慢,步長過大可能震盪而不收斂。如下圖:

當目標函數是凸函數時,梯度下降法的解是全局最優解。但是,一般情況下,往往不是凸函數,所以其解不保證是全局最優解。梯度下降法的收斂速度也未必是最快的。

 

梯度下降的算法調優

在使用梯度下降時,需要進行調優。哪些地方需要調優呢?

1. 算法的步長選擇。在前面的算法描述中,我提到取步長為1,但是實際上取值取決於數據樣本,可以多取一些值,從大到小,分別運行算法,看看迭代效果,如果損失函數在變小,說明取值有效,否則要增大步長。前面說了。步長太大,會導致迭代過快,甚至有可能錯過最優解。步長太小,迭代速度太慢,很長時間算法都不能結束。所以算法的步長需要多次運行后才能得到一個較為優的值。

2. 算法參數的初始值選擇。 初始值不同,獲得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;當然如果損失函數是凸函數則一定是最優解。由於有局部最優解的風險,需要多次用不同初始值運行算法,關鍵損失函數的最小值,選擇損失函數最小化的初值。

3.歸一化。由於樣本不同特征的取值范圍不一樣,可能導致迭代很慢,為了減少特征取值的影響,可以對特征數據歸一化,也就是對於每個特征x,求出它的期望和標准差std(x),然后轉化為:

這樣特征的新期望為0,新方差為1,迭代次數可以大大加快。

(2)梯度下降法大家族(BGD、SGD、MBGD)

  • 批量梯度下降法(Batch Gradient Descent)

 批量梯度下降法(Batch Gradient Descent, BGD)是梯度下降法的最原始的形式,其特點就是每一次訓練迭代都需要利用所有的訓練樣本,其表達式為:

        可以發現,對於每一個參數的更新都需要利用到所有的m個樣本,這樣會導致訓練速度隨着訓練樣本的增大產生極大地減慢,不適合於大規模訓練樣本的場景,但是,其解是全局最優解,精度高。

  • 隨機梯度下降法(Stochastic Gradient Descent)

隨機梯度下降法,其實和批量梯度下降法原理類似,區別在與求梯度時沒有用所有的m個樣本的數據,而是僅僅選取一個樣本來求梯度。

      隨機梯度下降法 和 批量梯度下降法 是兩個極端,一個用一個樣本來梯度下降,一個采用所有數據來梯度下降。自然各自的優缺點都非常突出。對於訓練速度來說,隨機梯度下降法由於每次僅僅采用一個樣本來迭代,訓練速度很快,而批量梯度下降法在樣本量很大的時候,訓練速度不能讓人滿意。對於准確度來說,隨機梯度下降法用於僅僅用一個樣本決定梯度方向,導致解很有可能不是最優。對於收斂速度來說,由於隨機梯度下降法一次迭代一個樣本,導致迭代方向變化很大,不能很快的收斂到局部最優解。

那么,有沒有一個中庸的辦法能夠結合兩種方法的優點呢?有!這就是小批量梯度下降法。

  • 小批量梯度下降法(Mini-Batch Gradient Descent)

       小批量梯度下降法是批量梯度下降法和隨機梯度下降法的折衷,也就是對於m個樣本,我們采用x個樣本來迭代,1<x<m。一般可以取x=10,當然根據樣本的數據,可以調整這個x的值。其基本特點就是每一次訓練迭代在訓練集中隨機采樣batch_size個樣本。對應的更新公式是:

這個方法在深度學習的網絡訓練中有着廣泛地應用,因為其既有較高的精度,也有較快的訓練速度。

  •  Adagrad(Adaptive Learning Rates)

 Adagrad是解決不同參數應該使用不同的更新速率的問題。Adagrad自適應地為各個參數分配不同學習率的算法。通過每個參數的學習率除以它之前導數的均方根來調節學習率。公式如下:

公式化簡:

但是我們發現一個現象,本來應該是隨着gradient的增大,我們的學習率是希望增大的,也就是圖中的gt;但是與此同時隨着gradient的增大,我們的分母是在逐漸增大,也就對整體學習率是減少的,這是為什么呢?

這是因為隨着我們更新次數的增大,我們是希望我們的學習率越來越慢。因為我們認為在學習率的最初階段,我們是距離損失函數最優解很遠的,隨着更新的次數的增多,我們認為越來越接近最優解,於是學習速率也隨之變慢。

 

轉載:https://blog.csdn.net/hanlin_tan/article/details/47376237 

          http://www.cnblogs.com/pinard/p/5970503.html

參考:李航《統計學習方法》、李宏毅《機器學習》


免責聲明!

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



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