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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

机器学习-梯度下降算法原理及公式推导

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习-梯度下降算法原理及公式推导 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ?

目錄

1.梯度下降直觀理解解釋

2.算法上的解釋

3.常用的梯度下降法

4.梯度下降算法調優

5.其他優化算法對比


? ? ? ?在求解機器學習算法的模型參數,即無約束優化問題時,梯度下降算法(Gradient Descent Algorithm)是最常采用的方法之一,也是眾多機器學習算法中最常用的優化方法,幾乎當前每一個先進的機器學習庫或者深度學習庫都會包括梯度下降算法的不同變種實現。

梯度就是導數

梯度下降法就是一種通過求目標函數的導數來尋找目標函數最小化的方法。

梯度下降目的是找到目標函數最小化時的取值所對應的自變量的值,目的是為了找自變量X。

?

? ? ? ?最優化問題在機器學習中有非常重要的地位,很多機器學習算法最后都歸結為求解最優化問題。最優化問題是求解函數極值的問題,包括極大值和極小值。在各種最優化算法中,梯度下降法是最簡單、最常見的一種,在深度學習的訓練中被廣為使用。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ?如上圖所示,當目標函數為g(x)時,求目標函數的最小值。一般首先求g(x)的導數,然后使導數等于0,那么目標函數的最小值為0,此時的自變量X取值為0。在這里我們可能會問:直接求函數的導數/梯度,然后令導數/梯度為0,解方程,問題不就解決了嗎?事實上沒這么簡單,因為在機器學習中一般的目標函數方程可能很難解。比如下面的這個目標函數:

? ? ? ? ? ? ? ? ? ? ? ? ?

我們分別對x和y求偏導數,并令它們為0,得到下面的方程組:

? ? ? ? ? ? ? ? ? ? ? ? ?? ?

? ? ? ?這個方程非常難以求解,對于有指數函數,對數函數,三角函數的方程,我們稱為超越方程,求解的難度并不比求極值本身小。精確的求解不太可能,因此只能求近似解,這稱為數值計算。工程上實現時通常采用的是迭代法,它從一個初始點開始,反復使用某種規則從移動到下一個點,構造這樣一個數列,直到收斂到梯度為0的點處,即梯度下降算法。

?

1.梯度下降直觀理解解釋

? ? ? ? 梯度下降法的基本思想可以類比為一個下山的過程,如下圖所示函數看似為一片山林,紅色的是山林的高點,藍色的為山林的低點,藍色的顏色越深,地理位置越低,則圖中有一個低點,一個最低點。

? ? ? ? ? ? ?

? ? ? ?假設這樣一個場景:一個人被困在山上(圖中紅圈的位置),需要從山上下來(找到山的最低點,也就是山谷),但此時山上的濃霧很大,導致可視度很低。因此,下山的路徑就無法確定,他必須利用自己周圍的信息去找到下山的路徑。這個時候,他就可以利用梯度下降算法來幫助自己下山。具體來說就是,以他當前的所處的位置為基準,尋找這個位置最陡峭的地方,然后朝著山的高度下降的方向走,然后每走一段距離,都反復采用同一個方法,最后就能成功的抵達山谷。

? ? ? ? ? ? ? ? ?? ? ? ? ? ? ??

? ? ? ?假設這座山最陡峭的地方是無法通過肉眼立馬觀察出來的,而是需要一個復雜的工具來測量,同時,這個人此時正好擁有測量出最陡峭方向的工具。所以,此人每走一段距離,都需要一段時間來測量所在位置最陡峭的方向,這是比較耗時的。那么為了在太陽下山之前到達山底,就要盡可能的減少測量方向的次數。這是一個兩難的選擇,如果測量的頻繁,可以保證下山的方向是絕對正確的,但又非常耗時,如果測量的過少,又有偏離軌道的風險。所以需要找到一個合適的測量方向的頻率(多久測量一次),來確保下山的方向不錯誤,同時又不至于耗時太多,在算法中我們成為步長

按照梯度下降算法的思想,它將按如下操作達到最低點:

第一步,明確自己現在所處的位置

第二步,找到相對于該位置而言下降最快的方向

第三步, 沿著第二步找到的方向走一小步,到達一個新的位置,此時的位置肯定比原來低

第四部, 回到第一步

第五步,終止于最低點

按照以上5步,最終達到最低點,這就是梯度下降的完整流程。當然你可能會說,上圖不是有不同的路徑嗎?是的,因為上圖并不是標準的凸函數,往往不能找到最小值,只能找到局部極小值。所以你可以用不同的初始位置進行梯度下降,來尋找更小的極小值點。

?

2.算法上的解釋

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ?定義一個公式如上圖所示,J是關于Θ的一個函數,我們在山林里當前所處的位置為Θ0點,要從這個點走到J的最小值點,也就是山底。首先我們先確定前進的方向,也就是梯度的反向,然后走一段距離的步長,也就是α,走完這個段步長,就到達了Θ1這個點。

? ? ? ? ? ?? ? ? ? ? ??

α在梯度下降算法中被稱作為學習率或者步長,意味著我們可以通過α來控制每一步走的距離,以保證不要步子跨的太大,其實就是不要走太快,錯過了最低點。同時也要保證不要走的太慢,導致太陽下山了,還沒有走到山下。所以α的選擇在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的話,可能導致遲遲走不到最低點,太大的話,會導致錯過最低點!

? ? ? ? ? ? ? ? ? ? ? ??

我們假設有一個單變量的目標函數,函數的微分,初始化,起點為,我們通過觀察就能發現最小值其實就是 (0,0)點。但是接下來,我們會從梯度下降算法開始一步步計算到這個最小值。

根據梯度下降的計算公式,我們開始進行梯度下降的迭代計算過程:

? ? ? ? ? ? ? ?? ? ? ??

如圖,經過四次的運算,也就是走了四步,基本就抵達了函數的最低點,也就是山底,

? ? ? ? ? ??? ? ?

?

我們假設有多變量目標函數為,現在要通過梯度下降法計算這個函數的最小值。
我們假設初始的起點為:,初始的學習率為:,函數的梯度為:,進行多次迭代:

? ? ? ? ? ? ? ? ?

我們發現,已經基本靠近函數的最小值點

? ? ? ? ? ? ? ? ? ??

?

我們現在有一個線性回歸的目標函數,為了方便,不帶正則項,目標函數定義為:

? ? ? ? ? ? ? ? ? ? ??

此公示中,各參數如下:

m 表示為數據集中樣本的個數,表示有m個樣本;

?是一個常量,這樣是為了在求梯度的時候,二次方乘下來就和這里的?抵消了,自然就沒有多余的常數系數,方便后續的計算,同時對結果不會有影響;

y 是數據集中每個樣本的實際值值;

h 是我們的預測函數,根據每一個輸入x,根據θ計算得到預測的y值;

其中:

? ? ? ? ? ? ? ? ? ? ??

其更新過程可寫成:

? ? ? ? ? ? ??? ?

? ? ? ? ? ? ? ? ? ?

其中,“:=”為賦值的含義;α為學習速率,又叫步長;α右邊的是J(θ)對θ求的偏導(偏導就是對θ向量中的每個元素分別求導)。

這個公式的含義就是,先初始確定一個θ的值,然后用(1)式計算新的w值,反復迭代。我們不斷更新參數θ的值,直到J(θ)取得最小值時,停止迭代。

具體的梯度下降流程:

第一步:先隨便假設一組θ,可以全部取0

第二步循環迭代:

第一次迭代:

第二次迭代:

第x次迭代:......

第三步,滿足要求,循環結束,得到θ

?

3.常用的梯度下降法

? ? ? ?梯度下降算法又通常稱為批量梯度下降算法。批量梯度下降每次學習都使用整個訓練集,因此這些計算是冗余的,因為每次都使用完全相同的樣本集。但其優點在于每次更新都會朝著正確的方向進行,最后能夠保證收斂于極值點(凸函數收斂于全局極值點,非凸函數可能會收斂于局部極值點),但是其缺點在于每次學習時間過長,如果訓練集很大以至于需要消耗大量的內存,并且全量梯度下降不能進行在線模型參數更新。它的具體思路是在更新每一參數時都使用所有的樣本來進行更新,其數學形式如下:

(1) 對上述的能量函數求偏導:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

(2) 由于是最小化風險函數,所以按照每個參數θθ的梯度負方向來更新每個θ:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

具體的偽代碼形式為:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
從上面公式可以注意到,它得到的是一個全局最優解,但是每迭代一步,都要用到訓練集所有的數據,所以在下圖的梯度下降過程中可以看到,它是一個近乎直線的下降過程,直接前往最低點。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?

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

? ? ? ?為了克服批量梯度下降的缺點,有人提出了隨機梯度下降(Stochastic Gradient Descent)算法,即每次更新系數只隨機抽取一個樣本參與計算,因此既可以減少迭代次數,節省計算時間,又可以防止內存溢出,降低了計算開銷。但是隨機梯度下降也有一個缺點,每次更新可能并不會按照正確的方向進行,因此可以帶來優化波動(擾動),即參數更新頻率太快,有可能出現目標函數值在最優值附近的震蕩現象,并且高頻率的參數更新導致了高方差。不過從另一個方面來看,隨機梯度下降所帶來的波動有個好處就是,對于類似盆地區域(即很多局部極小值點)那么這個波動的特點可能會使得優化的方向從當前的局部極小值點跳到另一個更好的局部極小值點,這樣便可能對于非凸函數,最終收斂于一個較好的局部極值點,甚至全局極值點。

隨機梯度下降雖然提高了計算效率,但是由于每次迭代只隨機選擇一個樣本,因此隨機性比較大,所以下降過程中非常曲折,如下圖所示:

? ? ? ? ? ? ? ? ? ? ? ? ? ??

它的具體思路是在更新參數時都隨機抽泣一個樣本來進行更新,其數學形式如下:

將上面的能量函數寫為如下形式:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

利用每個樣本的損失函數對θθ求偏導得到對應的梯度,來更新θ:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

具體的偽代碼形式為:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

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

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

?

小批量梯度下降(Mini-batch Gradient Descent)

? ? ? ?小批量梯度下降(Mini-batch Gradient Descent)是介于上述兩種方法之間的優化方法,即在更新參數時,只使用一部分樣本(一般256以下)來更新參數,這樣既可以保證訓練過程更穩定,又可以利用批量訓練方法中的矩陣計算的優勢。MBGD在每次更新參數時使用b個樣本(b一般為10),其具體的偽代碼形式為:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

4.梯度下降算法調優

? ? ? ? 盡管梯度下降算法效果非常好,而且廣泛使用,但同一時候其也存在一些挑戰與問題須要解決:選擇一個合理的學習速率非常難,假設學習速率過小,則會導致收斂速度非常慢;假設學習速率過大,那么其會阻礙收斂,即在極值點附近會振蕩。學習速率調整(又稱學習速率調度,Learning rate schedules)試圖在每次更新過程中,改變學習速率,如退火。一般使用某種事先設定的策略或者在每次迭代中衰減一個較小的閾值。不管哪種調整方法,都須要事先進行固定設置。這邊便無法自適應每次學習的數據集特點。

? ? ? ? 模型所有的參數每次更新都是使用同樣的學習速率。假設數據特征是稀疏的或者每一個特征有著不同的取值統計特征與空間,那么便不能在每次更新中每一個參數使用同樣的學習速率。那些非常少出現的特征應該使用一個相對較大的學習速率。對于非凸目標函數。easy陷入那些次優的局部極值點中,如在神經網路中。

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

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

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

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

?

5.其他優化算法對比

? ? ? ? 原始的梯度下降方法有以下問題:在梯度平緩的維度下降非常慢,在梯度險峻的維度容易抖動,容易陷入局部極小值或鞍點。Zero gradient,gradient descent gets stuck (在高維空間中,鞍點比局部極小值更容易出現)選擇一個合適的學習率可能是困難的。學習率太小會導致收斂的速度很慢,學習率太大會妨礙收斂,導致損失函數在最小值附近波動甚至偏離最小值。學習率調整試圖在訓練的過程中通過例如退火的方法調整學習率,即根據預定義的策略或者當相鄰兩代之間的下降值小于某個閾值時減小學習率。然而,策略和閾值需要預先設定好,因此無法適應數據集的特點對所有的參數更新使用同樣的學習率。如果數據是稀疏的,同時,特征的頻率差異很大時,我們也許不想以同樣的學習率更新所有的參數,對于出現次數較少的特征,我們對其執行更大的學習率,下面的其他梯度算法是在梯度算法上進行了優化,具體如下:

沖量梯度下降算法(Momentum optimization)
? ? ? ? 沖量梯度下降算法是BorisPolyak在1964年提出的,其基于這樣一個物理事實:將一個小球從山頂滾下,其初始速率很慢,但在加速度作用下速率很快增加,并最終由于阻力的存在達到一個穩定速率。考慮這樣一種情形,小球從山頂往下滾動,一開始很順利,可是在接近最低點的時候,小球陷入了一段狹長的淺山谷,由于小球一開始并不是直接沿著山谷的方向滾下,因此小球會在這個淺淺的山谷中不斷震蕩——不斷沖上墻壁,接著又從墻壁上滾下來,這種情況并不是我們想看到的,因為這增加了迭代時間,沖量(Momentnum)的引入,使得我們的目標更新的更快了,沖量的更新方式有以下兩種,兩種方式之間并無太大差異。

  • 在每次下降時都加上之前運動方向上的動量
  • 在梯度緩慢的維度下降更快,在梯度險峻的維度減少抖動

? ? ? ? 對于在梯度點處具有相同的方向的維度,其動量項增大,對于在梯度點處改變方向的維度,其動量項減小。因此,我們可以得到更快的收斂速度,同時可以減少搖擺,具體下降過程如下兩個圖對比:

? ? ? ? ? ? ? ?

Nesterov Accelerated Gradient
? ? ? ?NAG算法全稱Nesterov Accelerated Gradient,是YuriiNesterov在1983年提出的對沖量梯度下降算法的改進版本,其速度更快。然而,讓一個小球盲目地沿著斜坡滾下山是不理想的,我們需要一個更聰明的球,它知道下一步要往哪里去,因此在斜坡有上升的時候,它能夠自主調整方向。Nesterov Accelerated Gradient 是基于沖量梯度下降算法進行改進的一種算法,也是梯度下降算法的變種,我們利用動量項算來更新參數,通過計算能夠告訴我們參數未來位置的一個近似值(梯度并不是完全更新),這也就是告訴我們參數大致將變為多少。通過計算關于參數未來的近似位置的梯度,而不是關于當前的參數的梯度,我們可以高效的求解。

? ? ? ? ? ? ? ? ? ?

? ? ? ? ?動量法首先計算當前的梯度值(圖中的小的藍色向量),然后在更新的累積梯度(大的藍色向量)方向上前進一大步,Nesterov加速梯度下降法NAG首先在先前累積梯度(棕色的向量)方向上前進一大步,計算梯度值,然后做一個修正(綠色的向量)。這個具有預見性的更新防止我們前進得太快,同時增強了算法的響應能力,這一點在很多的任務中對于RNN的性能提升有著重要的意義。
?

AdaGrad
? ? ? ? AdaGrad是Duchi在2011年提出的一種學習速率自適應的梯度下降算法。在訓練迭代過程,其學習速率是逐漸衰減的,經常更新的參數其學習速率衰減更快,這是一種自適應算法。盡管我們可以根據損失函數的梯度來加快更新參數,我們也希望能夠根據參數的重要性來決定其更新的幅度。AdaGrad是一種基于梯度算法的優化算法,它只做了一件事:根據參數來自適應調整學習率。對于不常出現的參數進行較大的更新,對于經常出現的參數進行較少的更新,因此,這種方法非常適合處理稀疏數據。在梯度大的維度,減小下降速度;在梯度小的維度,加快下降速度讓學習率適應參數,對于出現次數較少的特征,我們對其采用更大的學習率,對于出現次數較多的特征,我們對其采用較小的學習率。因此,Adagrad非常適合處理稀疏數據。Adagrad算法的一個主要優點是無需手動調整學習率Adagrad的一個主要缺點是它在分母中累加梯度的平方:由于每增加一個正項,在整個訓練過程中,累加的和會持續增長。這會導致學習率變小以至于最終變得無限小,在學習率無限小時,Adagrad算法將無法取得額外的信息。
?

AdaDelta

? ? ? ? AdaDelta是在AdaGrad的基礎上發展而來的,目的是解決AdaGrad算法中學習率的單調減少問題。AdaDelta不再采用累積梯度平方和的方法來調整學習率,而是根據一些固定的w的大小來限制過去累積梯度的窗口

? ?

? ? ??? ?

?

?

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的机器学习-梯度下降算法原理及公式推导的全部內容,希望文章能夠幫你解決所遇到的問題。

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