日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

梯度下降法、随机梯度下降法、批量梯度下降法及牛顿法、拟牛顿法、共轭梯度法

發布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 梯度下降法、随机梯度下降法、批量梯度下降法及牛顿法、拟牛顿法、共轭梯度法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://ihoge.cn/2018/GradientDescent.html
http://ihoge.cn/2018/newton1.html

引言

李航老師在《統計學習方法》中將機器學習的三要素總結為:模型、策略和算法。其大致含義如下:

模型:其實就是機器學習訓練的過程中所要學習的條件概率分布或者決策函數。

策略:就是使用一種什么樣的評價,度量模型訓練過程中的學習好壞的方法,同時根據這個方法去實施的調整模型的參數,以期望訓練的模型將來對未知的數據具有最好的預測準確度。

算法:算法是指模型的具體計算方法。它基于訓練數據集,根據學習策略,從假設空間中選擇最優模型,最后考慮用什么樣的計算方法去求解這個最優模型。

很多時候機器學習工程師又戲稱調參工程師, 由此可見參數調優時作為機器學習工程師必須掌握的一項核心技能。

這篇文章的目的旨在對常用的參數調優算法進行一次梳理便于隨時翻閱。

  • 梯度下降法 (梯度下降、隨機梯度下降、批量梯度下降)
  • 牛頓法 (牛頓法、擬牛頓法)
  • 共軛梯度法(Conjugate Gradient)

1. 梯度下降法(Gradient Descent)

1.1 一般解釋

f(x)f(x)x0x0的梯度:就是f(x)f(x)變化最快的方向。梯度下降法是一個最優化算法,通常也稱為最速下降法。

假設f(x)f(x)是一座山,站在半山腰,往x方向走1米,高度上升0.4米,也就是說x方向上的偏導是 0.4;往y方向走1米,高度上升0.3米,也就是說y方向上的偏導是 0.3;這樣梯度方向就是 (0.4 , 0.3),也就是往這個方向走1米,所上升的高度最高。梯度不僅僅是f(x)f(x)在某一點變化最快的方向,而且是上升最快的方向;如果想下山,下降最快的方向就是逆著梯度的方向,這就是梯度下降法,又叫最速下降法。

1.2 梯度下降算法用途

最速下降法是求解無約束優化問題最簡單和最古老的方法之一,雖然現在已經不具有實用性,但是許多有效算法都是以它為基礎進行改進和修正而得到的。最速下降法是用負梯度方向為搜索方向的,最速下降法越接近目標值,步長越小,前進越慢。

在梯度下降算法中,都是圍繞以下這個式子展開:

其中在上面的式子中hθ(x)hθ(x)代表,輸入為x的時候的其當時θ參數下的輸出值,與y相減則是一個相對誤差,之后再平方乘以1/2,并且其中:

這里我列舉了一個簡單的例子,當然實際的x可以有n多個維度。我們知道曲面上方向導數的最大值的方向就代表了梯度的方向,因此我們在做梯度下降的時候,應該是沿著梯度的反方向進行權重的更新,可以有效的找到全局的最優解。這個θ的更新過程可以描述為:

這里就是根據每一個 x 的分量以及當時的偏差值進行 θ 的更新,其中 α 為步長,這個參數如果設置的太大,那么很容易就在最優值附加徘徊;相反,如果設置的太小,則會導致收斂速度過慢。

關于步長和學習速率的關系,這里提一下其實這兩個是一個概念,叫法不一樣,最優化問題中叫步長,但一般在神經網絡中也叫學習速率。

1.3 梯度下降、隨機梯度下降、批量梯度下降

  • 梯度下降:梯度下降就是上面的推導,要留意,在梯度下降中,對于θ的更新,所有的樣本都有貢獻,也就是參與調整θ.其計算得到的是一個標準梯度。因而理論上來說一次更新的幅度是比較大的。如果樣本不多的情況下,當然是這樣收斂的速度會更快啦~

  • 隨機梯度下降:可以看到多了隨機兩個字,隨機也就是說用樣本中的一個例子來近似所有的樣本,來調整θ,因而隨機梯度下降是會帶來一定的問題,因為計算得到的并不是準確的一個梯度,容易陷入到局部最優解中。隨機梯度下降每次迭代只使用一個樣本,迭代一次計算量為n2,當樣本個數m很大的時候,隨機梯度下降迭代一次的速度要遠高于批量梯度下降方法。

  • 批量梯度下降:其實批量的梯度下降就是一種折中的方法,他用了一些小樣本來近似全部的,其本質就是隨機指定一個例子替代樣本不太準,而且批量的話還是非常可以反映樣本的一個分布情況的。批量梯度下降最小化所有訓練樣本的損失函數,使得最終求解的是全局的最優解,即求解的參數是使得風險函數最小,但是對于大規模樣本問題效率低下。

  • 概括

    隨機梯度下降是通過每個樣本來迭代更新一次,如果樣本量很大的情況(例如幾十萬),那么可能只用其中幾萬條或者幾千條的樣本,就已經將theta迭代到最優解了,對比批量梯度下降,迭代一次需要用到十幾萬訓練樣本,一次迭代不可能最優,如果迭代10次的話就需要遍歷訓練樣本10次。但是,SGD伴隨的一個問題是噪音較BGD要多,使得SGD并不是每次迭代都向著整體最優化方向。

    隨機梯度下降每次迭代只使用一個樣本,迭代一次計算量為n2,當樣本個數m很大的時候,隨機梯度下降迭代一次的速度要遠高于批量梯度下降方法。兩者的關系可以這樣理解:隨機梯度下降方法以損失很小的一部分精確度和增加一定數量的迭代次數為代價,換取了總體的優化效率的提升。增加的迭代次數遠遠小于樣本的數量。

  • 對批量梯度下降法和隨機梯度下降法的總結:

    批量梯度下降—最小化所有訓練樣本的損失函數,使得最終求解的是全局的最優解,即求解的參數是使得風險函數最小,但是對于大規模樣本問題效率低下。

    隨機梯度下降—最小化每條樣本的損失函數,雖然不是每次迭代得到的損失函數都向著全局最優方向, 但是大的整體的方向是向全局最優解的,最終的結果往往是在全局最優解附近,適用于大規模訓練樣本情況。

import random #This is a sample to simulate a function y = theta1*x1 + theta2*x2 input_x = [[1,4], [2,5], [5,1], [4,2]] y = [19,26,19,20] theta = [1,1] loss = 10 step_size = 0.001 eps =0.0001 max_iters = 10000 error =0 iter_count = 0 while( loss > eps and iter_count < max_iters):loss = 0#這里更新權重的時候所有的樣本點都用上了for i in range (3):pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1]theta[0] = theta[0] - step_size * (pred_y - y[i]) * input_x[i][0]theta[1] = theta[1] - step_size * (pred_y - y[i]) * input_x[i][1]for i in range (3):pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1]error = 0.5*(pred_y - y[i])**2loss = loss + erroriter_count += 1print 'iters_count', iter_countprint 'theta: ',theta print 'final loss: ', loss print 'iters: ', iter_count output: iters_count 219 iters_count 220 iters_count 221 iters_count 222 iters_count 223 iters_count 224 iters_count 225 theta: [3.0027765778748003, 3.997918297015663] final loss: 9.68238055213e-05 iters: 225 [Finished in 0.2s] ### 隨機梯度下降代碼: # 每次選取一個值,隨機一個點更新 θ import random #This is a sample to simulate a function y = theta1*x1 + theta2*x2 input_x = [[1,4], [2,5], [5,1], [4,2]] y = [19,26,19,20] theta = [1,1] loss = 10 step_size = 0.001 eps =0.0001 max_iters = 10000 error =0 iter_count = 0 while( loss > eps and iter_count < max_iters):loss = 0#每一次選取隨機的一個點進行權重的更新i = random.randint(0,3)pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1]theta[0] = theta[0] - step_size * (pred_y - y[i]) * input_x[i][0]theta[1] = theta[1] - step_size * (pred_y - y[i]) * input_x[i][1]for i in range (3):pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1]error = 0.5*(pred_y - y[i])**2loss = loss + erroriter_count += 1print 'iters_count', iter_countprint 'theta: ',theta print 'final loss: ', loss print 'iters: ', iter_count iters_count 1226 iters_count 1227 iters_count 1228 iters_count 1229 iters_count 1230 iters_count 1231 iters_count 1232 theta: [3.002441488688225, 3.9975844154600226] final loss: 9.989420302e-05 iters: 1232 [Finished in 0.3s] ### 批量隨機梯度下降代碼: # 這里用2個樣本點 import random #This is a sample to simulate a function y = theta1*x1 + theta2*x2 input_x = [[1,4], [2,5], [5,1], [4,2]] y = [19,26,19,20] theta = [1,1] loss = 10 step_size = 0.001 eps =0.0001 max_iters = 10000 error =0 iter_count = 0 while( loss > eps and iter_count < max_iters):loss = 0i = random.randint(0,3) #注意這里,我這里批量每次選取的是2個樣本點做更新,另一個點是隨機點+1的相鄰點j = (i+1)%4pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1]theta[0] = theta[0] - step_size * (pred_y - y[i]) * input_x[i][0]theta[1] = theta[1] - step_size * (pred_y - y[i]) * input_x[i][1]pred_y = theta[0]*input_x[j][0]+theta[1]*input_x[j][1]theta[0] = theta[0] - step_size * (pred_y - y[j]) * input_x[j][0]theta[1] = theta[1] - step_size * (pred_y - y[j]) * input_x[j][1]for i in range (3):pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1]error = 0.5*(pred_y - y[i])**2loss = loss + erroriter_count += 1print 'iters_count', iter_countprint 'theta: ',theta print 'final loss: ', loss print 'iters: ', iter_count ..... iters_count 543 iters_count 544 iters_count 545 iters_count 546 iters_count 547 iters_count 548 iters_count 549 theta: [3.0023012574840764, 3.997553282857357] final loss: 9.81717138358e-05 iters: 549 -->

2. 牛頓法(Newton’s method)

2.1 牛頓法原理

具體步驟:

首先,選擇一個接近函數 f(x)f(x)零點的 x0x0,計算相應的 f(x0)f(x0) 和切線斜率f(x0)f′(x0)(這里f(x0)f′(x0) 表示函數 f(x0)f(x0)的導數)。然后我們計算穿過點(x0,f(x0))(x0,f(x0)) 并且斜率為f(x0)f′(x0)的直線和 x 軸的交點的x坐標,也就是求如下方程的解:

x?f(x0)+f(x0)?x0?f(x0)=0x?f′(x0)+f(x0)?x0?f′(x0)=0

或:

f(x0)+(x?x0)f(x0)=0f(x0)+(x?x0)f″(x0)=0

我們將新求得的點的 x 坐標命名為x1,通常x1會比x0更接近方程f (x) = 0的解。因此我們現在可以利用x1開始下一輪迭代。迭代公式可化簡為如下所示:

xn+1=xn?f(xn)f(xn)xn+1=xn?f(xn)f′(xn)

已經證明,如果f ’ 是連續的,并且待求的零點x是孤立的,那么在零點x周圍存在一個區域,只要初始值x0位于這個鄰近區域內,那么牛頓法必定收斂。 并且,如果f’(x)不為0, 那么牛頓法將具有平方收斂的性能. 粗略的說,這意味著每迭代一次,牛頓法結果的有效數字將增加一倍。下圖為一個牛頓法執行過程的例子。

由于牛頓法是基于當前位置的切線來確定下一次的位置,所以牛頓法又被很形象地稱為是”切線法”。牛頓法的搜索路徑(二維情況)如下圖所示:

牛頓法搜索動態示例圖:

 

從本質上去看,牛頓法是二階收斂,梯度下降是一階收斂,所以牛頓法更快。比如你想找一條最短的路徑走到一個盆地的最底部,梯度下降法每次只從你當前所處位置選一個坡度最大的方向走一步,牛頓法在選擇方向時,不僅會考慮坡度是否夠大,還會考慮你走了一步之后,坡度是否會變得更大。所以,可以說牛頓法比梯度下降法看得更遠一點,能更快地走到最底部。(牛頓法目光更加長遠,所以少走彎路;相對而言,梯度下降法只考慮了局部的最優,沒有全局思想。

也可以這么理解:梯度下降主要是從一階目標函數的一階導推導而來的,形象點說,就是每次朝著當前梯度最大的方向收斂;二牛頓法是二階收斂,每次考慮收斂方向的時候,還會考慮下一次的收斂的方向是否是最大(也就是梯度的梯度)。

從幾何上說,牛頓法就是用一個二次曲面去擬合你當前所處位置的局部曲面,而梯度下降法是用一個平面去擬合當前的局部曲面,通常情況下,二次曲面的擬合會比平面更好,所以牛頓法選擇的下降路徑會更符合真實的最優下降路徑。如下圖是一個最小化一個目標方程的例子,紅色曲線是利用牛頓法迭代求解,綠色曲線是利用梯度下降法求解。

總結一下,就是牛頓法對目標函數的一階導再求導,即可算出收斂的方向。

梯度法和牛頓法對比

梯度法:又稱最速下降法,是早期的解析法,收斂速度較慢。 牛頓法:收斂速度快,但不穩定,計算也較困難。

牛頓法的優缺點總結:

優點:二階收斂,收斂速度快;缺點:牛頓法是一種迭代算法,每一步都需要求解目標函數的Hessian矩陣的逆矩陣,計算比較復雜。

在上面討論的是2維情況,高維情況的牛頓迭代公式是:

xn+1=xn?[Hf(xn)?1]?f(xn)n0xn+1=xn?[Hf(xn)?1]?f(xn),n≥0
其中H時hessian矩陣,定義為:

高維情況也可以用牛頓迭代求解,但是Hessian矩陣引入的復雜性,使得牛頓迭代求解的難度增加,解決這個問題的辦法是 擬牛頓法(Quasi-Newton methond):

2.2 擬牛頓法(Quasi-Newton Methods)

擬牛頓法是求解非線性優化問題最有效的方法之一,于20世紀50年代由美國Argonne國家實驗室的物理學家W.C.Davidon所提出來。Davidon設計的這種算法在當時看來是非線性優化領域最具創造性的發明之一。不久R. Fletcher和M. J. D. Powell證實了這種新的算法遠比其他方法快速和可靠,使得非線性優化這門學科在一夜之間突飛猛進。

擬牛頓法的本質思想是改善牛頓法每次需要求解復雜的Hessian矩陣的逆矩陣的缺陷,它使用正定矩陣來近似Hessian矩陣的逆,從而簡化了運算的復雜度。擬牛頓法和最速下降法一樣只要求每一步迭代時知道目標函數的梯度。通過測量梯度的變化,構造一個目標函數的模型使之足以產生超線性收斂性。這類方法大大優于最速下降法,尤其對于困難的問題。另外,因為擬牛頓法不需要二階導數的信息,所以有時比牛頓法更為有效。如今,優化軟件中包含了大量的擬牛頓算法用來解決無約束,約束,和大規模的優化問題。

具體步驟:

擬牛頓法的基本思想如下。首先構造目標函數在當前迭代xkxk的二次模型:

這里BkBk是一個對稱正定矩陣,于是我們取這個二次模型的最優解作為搜索方向,并且得到新的迭代點:
xk+1=xk+αkpkxk+1=xk+αkpk
其中我們要求步長αkαk 滿足Wolfe條件。這樣的迭代與牛頓法類似,區別就在于用近似的Hesse矩陣BkBk 代替真實的Hesse矩陣。所以擬牛頓法最關鍵的地方就是每一步迭代中矩陣BkBk 的更新。現在假設得到一個新的迭代xk+1xk+1,并得到一個新的二次模型:

我們盡可能地利用上一步的信息來選取BkBk。具體地,我們要求 :

?f(xk+1)??f(xk)=αkBk+1pk?f(xk+1)??f(xk)=αkBk+1pk

從而得到:

Bk+1(xk+1?xk)=?f(xk+1)??f(xk)Bk+1(xk+1?xk)=?f(xk+1)??f(xk)

這個公式被稱為割線方程。常用的擬牛頓法有DFP算法BFGS算法

3. 共軛梯度法(Conjugate Gradient)

共軛梯度法是介于最速下降法與牛頓法之間的一個方法,它僅需利用一階導數信息,但克服了最速下降法收斂慢的缺點,又避免了牛頓法需要存儲和計算Hesse矩陣并求逆的缺點,共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的算法之一。 在各種優化算法中,共軛梯度法是非常重要的一種。其優點是所需存儲量小,具有步收斂性,穩定性高,而且不需要任何外來參數。

具體的實現步驟請參加wiki百科共軛梯度法。

下圖為共軛梯度法和梯度下降法搜索最優解的路徑對比示意圖:(綠色為梯度下降法,紅色代表共軛梯度法)

4. 其他優化方法

4.1 啟發式優化方法

啟發式方法指人在解決問題時所采取的一種根據經驗規則進行發現的方法。其特點是在解決問題時,利用過去的經驗,選擇已經行之有效的方法,而不是系統地、以確定的步驟去尋求答案。啟發式優化方法種類繁多,包括經典的模擬退火方法、遺傳算法、蟻群算法以及粒子群算法等等。

還有一種特殊的優化算法被稱之多目標優化算法,它主要針對同時優化多個目標(兩個及兩個以上)的優化問題,這方面比較經典的算法有NSGAII算法、MOEA/D算法以及人工免疫算法等。

4.2 解決約束優化問題——拉格朗日乘數法

有關拉格朗日乘數法的介紹請見另一篇博客:《拉格朗日乘數法》

梯度下降法原理
牛頓法、擬牛頓法、共軛梯度法

總結

以上是生活随笔為你收集整理的梯度下降法、随机梯度下降法、批量梯度下降法及牛顿法、拟牛顿法、共轭梯度法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。