模型优化算法
一、 模型的優化算法
1.1 基于梯度下降的方法
1.1.1樣本量
- 批量梯度下降BGD(Batch Gradient Dencent)
- 隨機梯度下降SGD(Stochastic Gradient Descent)
- mini-batch GD
1.1.2. 學習率的更新方法
- 動量法momentum(引入了動量項)
- Nesterov accelerated gradient(NAG,預測下一時刻的位置)
二階方法,調整學習率
- Adagrad(每個參數單獨調節)
- Adelta(防止Adagrad中的學習率一直減小)
- RMSprop(Adelta實例化)
- Adam(梯度、梯度方的歷史加權平均值)
- Adamax(Adam的二范數變為無窮范數,更穩定)
1.2. 牛頓法系列
1.2.1. 牛頓法
1.2.2. 擬牛頓法
- DFP
- BGFS
- L-BGFS(待完成)
- Broyden
二. 具體算法
2.1.1批量梯度下降
根據所有樣本的損失,更新模型參數。
以邏輯斯蒂回歸模型為例,訓練集有m個樣本X(x1,x2,...,xm)X({x_{1}},{x_{2}},...,{x_{m}})X(x1?,x2?,...,xm?),誤差函數是交叉熵誤差函數,批量梯度下降法的計算過程如下:
J(w,b)=1m∑i=1m(L(y^i),yi)=?1m∑i=1m(yilogy^i+(1?yi)log(1?y^i))J(w,b) = \frac{1}{m} \sum_{i=1}^{m}(L(\hat{y}_{i}),y_{i}) = -\frac{1}{m}\sum_{i=1}^{m}(y_{i}log\hat{y}_{i}+(1-y_{i})log(1-\hat{y}_{i}))J(w,b)=m1?i=1∑m?(L(y^?i?),yi?)=?m1?i=1∑m?(yi?logy^?i?+(1?yi?)log(1?y^?i?))
2.1.2 隨機梯度下降
單個樣本輸入后,計算得到損失后,更新模型參數。
以邏輯斯蒂回歸模型為例,訓練集有m個樣本X(x1,x2,...,xm)X({x_{1}},{x_{2}},...,{x_{m}})X(x1?,x2?,...,xm?),誤差函數是交叉熵誤差函數,隨機梯度下降法的計算過程如下:
2.1.3 mini-Batch梯度下降
根據小批量n個樣本的損失,更新模型參數。
以邏輯斯蒂回歸模型為例,訓練集有m個樣本X(x1,x2,...,xm)X({x_{1}},{x_{2}},...,{x_{m}})X(x1?,x2?,...,xm?),誤差函數是交叉熵誤差函數,批量梯度下降法的計算過程如下:
J(w,b)=1n∑i=1n(L(y^i),yi)=?1n∑i=1nyilogy^i+(1?yi)log(1?y^i)J(w,b) = \frac{1}{n} \sum_{i=1}^{n}(L(\hat{y}_{i}),y_{i})\\ = -\frac{1}{n}\sum_{i=1}^{n}y_{i}log\hat{y}_{i}+(1-y_{i})log(1-\hat{y}_{i})J(w,b)=n1?i=1∑n?(L(y^?i?),yi?)=?n1?i=1∑n?yi?logy^?i?+(1?yi?)log(1?y^?i?)
2.2 梯度更新算法1
2.2.1 動量法
問題背景
下圖所示,紅點是最小值點。為了到達紅點,如果使用較大的學習率,則會出現紫線畫出的發散現象,如果使用較小的學習率,如藍線所示,收斂的速度比較慢。因此,希望有種學習方法,能在縱軸上減小擺動,在橫軸上,希望加快學習。這里就需要每次橫軸和縱軸的更新量不同,如果使用w=w?lr?dww = w - lr * dww=w?lr?dw,則達不到這種效果。
方法引入
動量法在原始權值梯度dwdwdw的基礎上,增加了上一時刻的更新量υt?1\upsilon _{t-1}υt?1?。
υt=γυt?1+η▽θJ(θ)\upsilon _{t} = \gamma \upsilon _{t-1} + \eta \bigtriangledown _{\theta }J(\theta )υt?=γυt?1?+η▽θ?J(θ)
θ=θ?υt\theta =\theta - \upsilon _{t}θ=θ?υt?
2.2.2 Nesterov 梯度加速法(Nesterov Accelerated Gradient)
問題背景
尋找最小值的過程,就像小球下山,小球在下山的過程中,速度會一直增加,這樣會沖過最低點,然后又沖下來。我們希望小球到山底附近時,會自動減速,停在最小值處。
方法引入
θ?υt\theta - \upsilon _{t}θ?υt?是下一時刻小球所在位置的近似估計。通過計算函數關于下一時刻的梯度表示參數的梯度方向。
υt=γυt?1+η▽θJ(θ?υt)\upsilon _{t} = \gamma \upsilon _{t-1} + \eta \bigtriangledown _{\theta }J(\theta -\upsilon _{t} )υt?=γυt?1?+η▽θ?J(θ?υt?)
θ=θ?υt\theta =\theta - \upsilon _{t}θ=θ?υt?
短的藍色 當前梯度 棕色和長的藍色 更新的累積梯度 綠色 最終的更新值
這種更新方法可以阻止更新過快而越過最小值點而使響應速度提高。
2.2.3 Adagrad
問題背景
我們能夠根據誤差函數的斜率調整更新量并加速SGD,我們還希望根據每個參數的重要性來調整每個參數的更新量
Adagrad 是一種基于梯度的優化算法。它調整參數的學習率的規則: larger updates for infrequent and smaller updates for frequent parameters(怎么翻呢?)
SGD的更新規則如下:
gt,i=▽θtJ(θt,i)g_{t,i} = \bigtriangledown _{\theta _{t}}J(\theta _{t,i})gt,i?=▽θt??J(θt,i?)
θt+1,i=θt,i?η?gt,i\theta_{t+1,i} = \theta _{t,i} - \eta \cdot g_{t,i}θt+1,i?=θt,i??η?gt,i?
Gt∈Rd×dG_{t}\in R^{d\times d}Gt?∈Rd×d是對角陣,對角上的元素(i,i)(i,i)(i,i)是累積到ttt時刻的梯度的平方。
其中gt,ig_{t,i}gt,i?表示參數θi\theta _{i}θi?在時間ttt時的梯度。
Adagrad算法每次單獨更新每個參數:
θt+1,i=θt,i?ηGt,ii+ε?gt,i\theta_{t+1,i} = \theta _{t,i} - \frac{\eta}{\sqrt {G_{t,ii}+\varepsilon} } \cdot g_{t,i}θt+1,i?=θt,i??Gt,ii?+ε?η??gt,i?
其中ε\varepsilonε是平滑項,防止除數為0.
向量化后:
Adagrad的主要缺點是,訓練過程中,分母中的梯度平方項一直在增加,這會使學習率越來越小,從而導致模型無法繼續學習。
2.2.4 Adadelta
當前時刻參數梯度平方的均值
E[g2]t=γE[g2]t?1+(1?γ)gt2E[g^{2}]_{t} = \gamma E[g^{2}]_{t-1} +(1-\gamma)g_{t}^{2}E[g2]t?=γE[g2]t?1?+(1?γ)gt2?
Adagrad參數的更新量
用E[g2]tE[g^{2}]_{t}E[g2]t?代替GtG_{t}Gt?,得
Δθt=?ηE[g2]t+εgt\Delta \theta_{t} = - \frac{\eta }{\sqrt{E[g^{2}]_{t}+\varepsilon }} g_{t}Δθt?=?E[g2]t?+ε?η?gt?
分母是梯度RMSE的校正,用RMSE代替后:
Δθt=?ηRMSE([g]t)gt\Delta \theta_{t} = - \frac{\eta }{RMSE([g]_{t})} g_{t}Δθt?=?RMSE([g]t?)η?gt?
完整的Adadelta算法:
E[g2]t=γE[g2]t?1+(1?γ)gt2(1)E[g^{2}]_{t} = \gamma E[g^{2}]_{t-1} +(1-\gamma)g_{t}^{2} \text(1)E[g2]t?=γE[g2]t?1?+(1?γ)gt2?(1)
Δθt=?ηRMSE([g]t)gt(2)\Delta \theta_{t} = - \frac{\eta }{RMSE([g]_{t})} g_{t} \text(2)Δθt?=?RMSE([g]t?)η?gt?(2)
- Adadelta 與 Adagrad相比,在分母上做了處理,避免學習率一直減小。
2.2.5 RMSprop
RMSprop是Adadelta的實例化,γ=0.9\gamma =0.9γ=0.9.
E[g2]t=0.9E[g2]t?1+0.1gt2(1)E[g^{2}]_{t} = 0.9 E[g^{2}]_{t-1} +0.1g_{t}^{2} \text(1)E[g2]t?=0.9E[g2]t?1?+0.1gt2?(1)
Δθt=?ηE[g2]t+εgt\Delta \theta_{t} = - \frac{\eta }{\sqrt{E[g^{2}]_{t}+\varepsilon }} g_{t}Δθt?=?E[g2]t?+ε?η?gt?
2.2.6 Adam( Adaptive Moment Estimation)
Adam,Adaptive Moment Estimation,自適應動量評估。Adam除了像Adadelta和RMSprop那樣保存歷史指數衰梯度方的均值,還保存了歷史指數衰減動量的均值
mt=β1mt?1+(1?β1)gtm_{t}=\beta _{1}m_{t-1} + (1-\beta _{1})g_{t}mt?=β1?mt?1?+(1?β1?)gt?
νt=β1νt?1+(1?β2)gt2\nu _{t}=\beta _{1}\nu_{t-1} + (1-\beta _{2})g^{2}_{t}νt?=β1?νt?1?+(1?β2?)gt2?
mt,νtm_{t},\nu _{t}mt?,νt?初始化為0,在初始階段這二者趨于0,為了解決這個問題,引入了偏差修正:m^t=mt1?β1\hat m_{t} = \frac{m_{t}}{1-\beta _{1}}m^t?=1?β1?mt??,νt=νt1?β2\nu _{t} = \frac{\nu_{t}}{1-\beta _{2}}νt?=1?β2?νt??
Adam的參數更新規則:
Δθt=?ην^t+εm^t\Delta \theta_{t} = - \frac{\eta }{\sqrt{\hat \nu_{t}+\varepsilon }} \hat m_{t}Δθt?=?ν^t?+ε?η?m^t?
2.2.7 AdaMax
AdaMax將Adam中的分母的計算推廣到了∞\infty∞范數
Adamax更新規則
2.3.1 牛頓法
為了便于理解用牛頓法優化目標函數,首先介紹單個變量牛頓法,用于數值分析中求近似解。具體參考,得到的近似解的推導公式為:
xn+1=xn?f(xn)f′(xn)x_{n+1} = x_{n} - \frac{f(x^{n})} {f^{'}(x^{n})}xn+1?=xn??f′(xn)f(xn)?
引入 :對于多元變量,在某點處的導數變成了海塞矩陣(Hesse matrix).海塞矩陣是一個多元函數二階偏導構成的矩陣。f(x)f(x)f(x)具有二階連續偏導,f(x)f(x)f(x)的海塞矩陣H(x)H(x)H(x)為
H(x)=[?2f?xi?xj]n×nH(x) = [\frac{\partial ^{2}f}{\partial x_{i}\partial x_{j}}]_{n\times n}H(x)=[?xi??xj??2f?]n×n?
考慮無約束的最優化問題
minx∈Rnf(x)\underset{x\in R^{n}}{min}f(x)x∈Rnmin?f(x)
- 思考
1. 寫出f(x)f(x)f(x)在xkx_{k}xk?處的泰勒展式f(x)=f(xk)+gkT(x?xk)+12(x?xk)H(xk)(x?xk)T+...f(x)=f(x_{k})+g_{k}^{T}(x-x_{k})+\frac{1}{2}(x-x_{k})H(x_{k})(x-x_{k})^{T}+...f(x)=f(xk?)+gkT?(x?xk?)+21?(x?xk?)H(xk?)(x?xk?)T+...
2. 求f(x)f(x)f(x)的極值的必要條件是f′(x)=0f'(x)=0f′(x)=0,gkT+H(xk)(x?xk)=0g_{k}^{T}+ H(x_{k})(x-x_{k})=0gkT?+H(xk?)(x?xk?)=0,
3. 牛頓法求解g(x)=0
以下源自2
2.3.2 擬牛頓法
計算Hk?1H^{-1}_{k}Hk?1?比較麻煩,
(B.12)或(B.13)是擬牛頓的條件
2.3.2.1 擬牛頓法-DFP(Davidon-Fletcher-Powell)算法
DFP算法用GkG_{k}Gk?來近似Hk?1H^{-1}_{k}Hk?1?
2.3.2.2 擬牛頓法-BFGS(Broyden-Fletcher-Goldfarb-Shanno)算法
BFGS算法用BkB_{k}Bk?來近似HkH_{k}Hk?
2.3.2.3?*? 擬牛頓法-Broyden類算法
三、Pytorch中的優化器
Pytorch中的優化器有以下一些:
一些解釋參考
關于Adagrad算法,連個新詞:激勵收斂和懲罰收斂
安利編輯公式的鏈接:
在線公式編輯
數學公式輸入方法
Ruder S . An overview of gradient descent optimization algorithms[J]. 2016. ??
李航. 統計學習方法[M]. 清華大學出版社, 2012. ??
總結
- 上一篇: 防止过拟合,采用的手段有哪些?
- 下一篇: 偏差、方差、贝叶斯误差