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
參考:李航《統計學習方法》、李宏毅《機器學習》