更好的優化

2021-09-25 21:11:01 字數 2180 閱讀 1477

這次介紹幾個更好的優化,回憶一下 損失函式 梯度 優化 一節我們所介紹的內容,我們介紹了最簡單的優化演算法:隨機梯度下降(sgd)。然而,這個演算法難以處理一些比較奇怪的情況,讓我們來看看。

引例損失函式的梯度登高表述如下圖等高線,在這類函式上如果執行sgd,由於在豎直方向上梯度比較高,所以步長*梯度帶來的在此方向的移動距離會很大,對應的水平距離移動就很小,結果就會造成像圖中紅線這樣的又是乙個zig-zag的執行軌跡。這並不是乙個好現象。

再考慮乙個問題,sgd是嚴格按照梯度的常數倍在某乙個維度上前進,考慮其在區域性最低點和鞍點的情況,該維度梯度為0,就意味著在這個維度上不動了,然後就認定它是最小值。這顯然也是錯誤的。

因此需要考慮乙個新的優化演算法。

sgd+momentum 帶動量的sgd

乙個思路是:在sgd的基礎上,為速度變化量加乙個動量項,這個動量項的概念是摩擦係數與先前速度的乘積,這樣一來,需要在dx的基礎上加乙個摩擦係數乘以原速度。此外,摩擦係數可以設定為0.9或者0.99,這樣一來,就保證了下降時速度的大小和方向並不僅僅取決於當前位點的屬性。

接下來介紹乙個新的動量——nesterov動量,它與上述規定的動量有乙個先後順序的變化。表述如下:

此外,這兩個動量也有乙個比較簡單的以二維為例子的**對比。如圖可見,左圖中,實際步進是原速度與出發點之間的向量和;右圖中,首先**按原速度前進,到達新位點後的梯度,沿而後向梯度方向與原速度的向量和方向走,得到實際步進。

adagrad的核心思路是:在運算的過程中加入乙個梯度平方項,在計算步進的時候,在學習率乘以dx的基礎上,再除以乙個梯度平方項的方根。

這樣帶來了什麼好處呢?首先,在不同維度上,如果某一方向上的梯度非常大,那麼它對grad_squared的貢獻就會很大,那麼對應的這一步的步進就非常小,同樣的對於梯度小的情況也是會使得步進非常大。其次,隨著時間的增大,它的等效學習率會越來越小。

再返回來,考慮一些前面沒有解決的問題。adagrad能夠很好的解決像這樣的凸問題,但是非凸問題情況下,比如說在區域性最小值,它就又會被卡住。因此,繼續介紹下乙個演算法來解決這一問題。

rmsprop

為什麼它會在區域性最小值處被卡呢?因為感覺上來講,它太受本地點的拘束了。解決它的方法,應該也是利用和動量一樣的思路,在軌跡中離本地點時間越久遠,對當前運動狀態影響越小,因此乘以乙個衰減係數dacay_rate,不過從它的形式來講,叫做衰減權值好像更好一些。一般取值為0.9或者0.99,剩下的權值再分給dx * dx項。

實驗表明,它的效果與sgd+m相似,但是路徑截然不同。**如下:

既然sgd+m與rmsprop都不錯,那麼我們想要試試更好的優化,就結合它們!

解釋一下,回憶sgd+momentum,其動量的計算是vx=vx*rho+dx,我們將其改寫成了權值的形式,這就是第一動量。第二動量的公式與rmsprop相似。在此演算法中,考慮一下第一步,我們將一二動量初始為0,那麼一開始的幾步,它的步長會驚人的長,要規避這個現象,adam演算法加入了偏置校正項。

即隨著時間的推移,校正力度會逐漸減小,從而變回原值,這就很好的規避了起初幾步的步長過長的情況。此外,許多情況下,adam演算法的初始引數設定一般為 beta1=0.9 beta2=0.999 learing_rate=1e-3 / 5e-4。

千萬級的大表!MySQL這樣優化更好

對於乙個千萬級的大表,現在可能更多的是億級資料量,很多人第一反應是各種切分,可結果總是事半功倍,或許正是我們優化順序的不正確。下面我們來談談怎樣的優化順序可以讓效果更好。mysql資料庫一般都是按照下面的步驟去演化,成本也是由低到高 1.避免使用select 2.可確定返回記錄數的,盡量增加limi...

千萬級的大表!MySQL這樣優化更好

對於乙個千萬級的大表,現在可能更多的是億級資料量,很多人第一反應是各種切分,可結果總是事半功倍,或許正是我們優化順序的不正確。下面我們來談談怎樣的優化順序可以讓效果更好。mysql資料庫一般都是按照下面的步驟去演化,成本也是由低到高 1.避免使用select 2.可確定返回記錄數的,盡量增加limi...

更好的規劃人生

1 不說 不可能 2 凡事第一反應 找方法,不找藉口 3 遇到挫折對自己說聲 太好了,機會來了!4 不說消極的話,不落入消極的情緒,一旦發生立即正面處理 5 凡事先訂立目標 6 行動前,預先做計畫 7 工作時間,每一分 每一秒做有利於生產的事情 8 隨時用零碎的時間做零碎的事情 9 守時 10 寫點...