在我們沒有辦法得到解析解的時候,我們可以用過梯度下降來進行優(yōu)化,這種方法幾乎可以所有深度學(xué)習(xí)模型。
關(guān)于優(yōu)化的東西,我自己曾經(jīng)研究過智能排班算法和優(yōu)化,所以關(guān)于如何找局部最小值,以及如何跳出局部最小值的一些基本思想是有感觸的,隨機梯度算法和其優(yōu)化學(xué)起來倒也不難。
梯度下降法
梯度下降法是一個一階最優(yōu)化算法,通常稱為最速下降法,是通過函數(shù)當(dāng)前點對應(yīng)梯度的反方向,使用規(guī)定步長距離進行迭代搜索,從而找到函數(shù)的一個局部最小值的算法,最好的情況是找到全局最小值。
隨機梯度下降法
但是直接使用使用梯度下降法的話,每次更新參數(shù)都需要用到所有的樣本,樣本總量太大的話就會對算法速度影響很大,所以有了隨機梯度下降算法。
它是對梯度下降算法的一種改進,且每次只隨機取一部分樣本進行優(yōu)化,樣本數(shù)量一般是2的整數(shù)次冪,取值范圍32~256,以保證計算精度的同時提升計算速度,是優(yōu)化深度學(xué)習(xí)網(wǎng)絡(luò)中最常用的一類算法。
其在訓(xùn)練中,通常會使用一個固定的學(xué)習(xí)率進行訓(xùn)練,即:
g
t
=
▽
θ
t
?
1
f
(
θ
t
?
1
)
▽
θ
t
=
?
η
?
g
t
其中,
g
t
是第
t
步的梯度,
η
是學(xué)習(xí)率
g_t=▽_{θ_{t-1}}f(θ_{t-1})\\ ▽_{θ_t}=-η*g_t\\ 其中,g_t是第t步的梯度,η是學(xué)習(xí)率
gt?=▽θt?1??f(θt?1?)▽θt??=?η?gt?其中,gt?是第t步的梯度,η是學(xué)習(xí)率
隨機梯度下降算法在優(yōu)化時,完全依賴于當(dāng)前batch數(shù)據(jù)得到的梯度,而學(xué)習(xí)率則是調(diào)整梯度影響大小的參數(shù),通過控制學(xué)習(xí)率η的大小,一定程度上可以控制網(wǎng)絡(luò)訓(xùn)練速度。
隨機梯度下降算法的問題
隨機梯度下降對大多數(shù)情況都很有效,但還存在缺陷:
1、很難確定合適的η,且所有的參數(shù)使用同樣的學(xué)習(xí)率可能并不是很有效。這種情況可以采用變化學(xué)習(xí)率的訓(xùn)練方式,如控制網(wǎng)絡(luò)在初期以大的學(xué)習(xí)率進行參數(shù)更新,后期以小的學(xué)習(xí)率進行參數(shù)更新(其實和遺傳算法中的交叉變異概率似的,大家可以去了解自適應(yīng)遺傳算法的思想,道理都是一樣的)
2、更容易收斂到局部最優(yōu)解,而且當(dāng)落入到局部最優(yōu)解的時候,不容易跳出。(其實也和遺傳算法可能遇到的問題類似,當(dāng)時是和模擬退火算法結(jié)合了,解決了過早收斂問題,實質(zhì)思想就是增大變異概率,變異了就很可能跳出局部最優(yōu)了)
標(biāo)準(zhǔn)動量優(yōu)化
動量通過模擬物體運動時的慣性來更新網(wǎng)絡(luò)中的參數(shù),即更新時在一定程度上會考慮之前參數(shù)更新的方向,同時利用當(dāng)前batch計算得到的梯度,將兩者結(jié)合起來計算出最終參數(shù)需要更新的大小和方向。
在優(yōu)化時引入動量思想旨在加速學(xué)習(xí),特別是面對小而連續(xù)且含有很多噪聲的梯度。利用動量不僅增加了學(xué)習(xí)參數(shù)的穩(wěn)定性,還會更快的學(xué)習(xí)到收斂的參數(shù)。
在引入動量后,網(wǎng)絡(luò)的參數(shù)更新方式:
g
t
=
▽
θ
t
?
1
f
(
θ
t
?
1
)
m
t
=
μ
?
m
t
?
1
+
g
t
▽
θ
t
=
?
η
?
m
t
m
t
為當(dāng)前動量的累加
μ
屬于動量因子,用于調(diào)整上一步動量對參數(shù)的重要程度
g_t=▽_{θ_{t-1}}f(θ_{t-1})\\ m_t=μ*m_{t-1}+g_t\\ ▽_{θ_t}=-η*m_t\\ m_t為當(dāng)前動量的累加\\ μ屬于動量因子,用于調(diào)整上一步動量對參數(shù)的重要程度
gt?=▽θt?1??f(θt?1?)mt?=μ?mt?1?+gt?▽θt??=?η?mt?mt?為當(dāng)前動量的累加μ屬于動量因子,用于調(diào)整上一步動量對參數(shù)的重要程度
在網(wǎng)絡(luò)更新初期,可利用上一次參數(shù)更新,此時下降方向一致,乘以較大的μ能夠進行很好的加速;在網(wǎng)絡(luò)更新后期,隨著梯度逐漸趨于0,在局部最小值來回震蕩的時候,利用動量使得更新幅度增大,跳出局部最優(yōu)解的陷阱。文章來源:http://www.zghlxwxcb.cn/news/detail-616562.html
Nesterov動量優(yōu)化
Nesterov項(Nesterov動量)是在梯度更新時做出的校正,以避免參數(shù)更新的太快,同時提高靈敏度。在動量中,之前累積的動量并不會影響當(dāng)前的梯度,所以Nesterov的改進就是讓之前的動量直接影響當(dāng)前的動量,即:
g
t
=
▽
θ
t
?
1
f
(
θ
t
?
1
?
η
?
μ
?
m
t
?
1
)
m
t
=
μ
?
m
t
?
1
+
g
t
▽
θ
t
=
?
η
?
m
t
g_t=▽_{θ_{t-1}}f(θ_{t-1}-η*μ*m_{t-1})\\ m_t=μ*m_{t-1}+g_t\\ ▽_{θ_t}=-η*m_t
gt?=▽θt?1??f(θt?1??η?μ?mt?1?)mt?=μ?mt?1?+gt?▽θt??=?η?mt?
Nesterov動量與標(biāo)準(zhǔn)動量區(qū)別在于,在當(dāng)前batch梯度的計算上,Nesterov動量的梯度計算是在施加當(dāng)前速度之后的梯度。所以可以看成是在標(biāo)準(zhǔn)動量的方法上添加了一個校正因子,從而提高算法更新性能。
在訓(xùn)練開始的時候,參數(shù)可能離最最優(yōu)質(zhì)的較遠,需要較大學(xué)習(xí)率,經(jīng)過幾輪訓(xùn)練后,減小訓(xùn)練學(xué)習(xí)率 (其實就是和自適應(yīng)遺傳算法的思想類似)。因此也提出了很多自適應(yīng)學(xué)習(xí)率的算法Adadelta、RMSProp及adam等。文章來源地址http://www.zghlxwxcb.cn/news/detail-616562.html
到了這里,關(guān)于機器學(xué)習(xí)&&深度學(xué)習(xí)——隨機梯度下降算法(及其優(yōu)化)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!