南京網(wǎng)站建設(shè)公司關(guān)鍵詞優(yōu)化推廣公司哪家好
深度學(xué)習(xí)的優(yōu)化算法
-
優(yōu)化的目標(biāo)
優(yōu)化提供了一種最大程度減少深度學(xué)習(xí)損失函數(shù)的方法,但本質(zhì)上,優(yōu)化和深度學(xué)習(xí)的目標(biāo)不同。
優(yōu)化關(guān)注的是最小化目標(biāo);深度學(xué)習(xí)是在給定有限數(shù)據(jù)量的情況下尋找合適的模型。
-
優(yōu)化算法
-
gradient descent(梯度下降)
考慮一類連續(xù)可微實(shí)值函數(shù)f:R→Rf:\mathbb{R} \rightarrow \mathbb{R}f:R→R,利用泰勒展開,可以得到:
f(x+?)=f(x)+?f′(x)+O(?2)f(x + \epsilon ) = f(x) + \epsilon f'(x) + O(\epsilon ^2) f(x+?)=f(x)+?f′(x)+O(?2)
在一階近似中,f(x+?)f(x + \epsilon )f(x+?) 可通過xxx處的函數(shù)值f(x)f(x)f(x)和一階導(dǎo)數(shù)f′(x)f'(x)f′(x)得出。假設(shè)在負(fù)梯度方向上移動(dòng)的?\epsilon?會(huì)減少fff。為了簡化問題,選擇固定步長η>0\eta > 0η>0,然后取?=?ηf′(x)\epsilon = - \eta f'(x)?=?ηf′(x),將其帶入泰勒展開式后,得到
f(x?ηf′(x))=f(x)?ηf′2(x)+O(η2f′2(x))f(x - \eta f'(x)) = f(x) - \eta f'^2(x) + O(\eta^2f'^2(x)) f(x?ηf′(x))=f(x)?ηf′2(x)+O(η2f′2(x))
若f′(x)≠0f'(x) \ne 0f′(x)=0,則ηf′2(x)>0\eta f'^2(x) > 0ηf′2(x)>0。另外,總是可以找到令η\etaη足夠小使得高階項(xiàng)變的不相關(guān),因此
f(x?ηf′(x))<f(x)f(x - \eta f'(x)) < f(x) f(x?ηf′(x))<f(x)
這意味著,如果使用
x←x?ηf′(x)x \leftarrow x - \eta f'(x) x←x?ηf′(x)
來迭代x,函數(shù)f(x)f(x)f(x)的值可能會(huì)下降。因此,在梯度下降中,首先選用初始值xxx和η>0\eta > 0η>0,然后使用它們連續(xù)迭代xxx,直到停止條件達(dá)成。例如:當(dāng)梯度∣f′(x)∣|f'(x)|∣f′(x)∣的幅度足夠小或迭代次數(shù)達(dá)到某個(gè)值。
其中,步長η\etaη叫做學(xué)習(xí)率,是超參數(shù),其決定目標(biāo)函數(shù)能否收斂到局部最小值,以及何時(shí)收斂到最小值。
-
SGD(隨機(jī)梯度下降)
深度學(xué)習(xí)中,目標(biāo)函數(shù)通常是訓(xùn)練數(shù)據(jù)集中每個(gè)樣本的損失函數(shù)的平均值。
給定nnn個(gè)樣本,假設(shè)fi(x)f_i(x)fi?(x)是關(guān)于索引iii的訓(xùn)練樣本的損失函數(shù),其中XXX是參數(shù)向量,得到目標(biāo)函數(shù):
f(X)=1n∑i=1nfi(X)f(X) = \frac{1}{n} \sum_{i=1}^{n} f_i(X) f(X)=n1?i=1∑n?fi?(X)
XXX的目標(biāo)函數(shù)的梯度為:
?f(X)=1n∑i=1n?fi(X)\nabla f(X) = \frac{1}{n} \sum_{i=1}^{n} \nabla f_i(X) ?f(X)=n1?i=1∑n??fi?(X)
如果采用梯度下降法,每個(gè)自變量迭代的計(jì)算代價(jià)為O(n)O(n)O(n),其隨nnn線性增長,因此,當(dāng)訓(xùn)練數(shù)據(jù)集規(guī)模較大時(shí),每次迭代的梯度下降的計(jì)算代價(jià)將更高。SGD可降低每次迭代時(shí)的計(jì)算代價(jià)。在隨機(jī)梯度下降的每次迭代中,對數(shù)據(jù)樣本隨機(jī)均勻采樣一個(gè)索引iii,其中i∈{1,...,n}i \in \{ 1,...,n \}i∈{1,...,n},并計(jì)算梯度?fi(X)\nabla f_i(X)?fi?(X)來更新XXX:
x←x?η?fi(X)x \leftarrow x - \eta \nabla f_i(X) x←x?η?fi?(X)
其中,η\etaη是學(xué)習(xí)率。可以發(fā)現(xiàn),每次迭代的計(jì)算代價(jià)從梯度下降的O(n)O(n)O(n)下降到了常數(shù)O(1)O(1)O(1)。
此外,隨機(jī)梯度?fi(x)\nabla f_i(x)?fi?(x)是對完整梯度?f(x)\nabla f(x)?f(x)的無偏估計(jì)。
E?fi(X)=1n∑i=1n?fi(X)=?f(X)\mathbb{E} \nabla f_i(X) = \frac{1}{n} \sum_{i=1}^{n} \nabla f_i(X) = \nabla f(X) E?fi?(X)=n1?i=1∑n??fi?(X)=?f(X)
這意味著,平均而言,隨機(jī)梯度是對梯度的良好估計(jì)。 -
minibatch-SGD(小批量隨機(jī)梯度下降)
處理單個(gè)觀測值需要我們執(zhí)行許多單一矩陣-矢量(甚至矢量-矢量)乘法,這耗費(fèi)很大,而且對應(yīng)深度學(xué)習(xí)框架也要巨大的開銷。這既適用于計(jì)算梯度以更新參數(shù)時(shí),也適用于用神經(jīng)網(wǎng)絡(luò)預(yù)測。既,當(dāng)執(zhí)行w←w?ηtgt\mathbf{w} \leftarrow \mathbf{w} - \eta_t \mathbf{g}_tw←w?ηt?gt?時(shí),消耗巨大,其中:
gt=?wf(xt,w).\mathbf{g}_t = \partial_{\mathbf{w}} f(\mathbf{x}_{t}, \mathbf{w}). gt?=?w?f(xt?,w).
可以通過將其應(yīng)用于一個(gè)小批量觀測值來提高次操作的計(jì)算效率。也就是說,將梯度gtg_tgt?替換為一個(gè)小批量而不是單個(gè)觀測值。
gt=?w1∣Bt∣∑i∈Btf(xi,w).\mathbf{g}_t = \partial_{\mathbf{w}} \frac{1}{|\mathcal{B}_t|} \sum_{i \in \mathcal{B}_t} f(\mathbf{x}_{i}, \mathbf{w}). gt?=?w?∣Bt?∣1?i∈Bt?∑?f(xi?,w).
分析gt\mathbf{g}_tgt?的統(tǒng)計(jì)屬性的影響:- 梯度的期望保持不變:xt\mathbf{x}_txt?和小批量Bt\mathcal{B}_tBt?的所有元素都是從訓(xùn)練集中隨機(jī)抽出的。
- 方差顯著降低:小批量梯度由正在被平均計(jì)算的b:=∣Bt∣b := |\mathcal{B}_t|b:=∣Bt?∣個(gè)獨(dú)立梯度組成,其標(biāo)準(zhǔn)差降低了b?12b^{-\frac{1}{2}}b?21?。
實(shí)踐中我們選擇一個(gè)足夠大的小批量,它可以提供良好的計(jì)算效率同時(shí)仍適合GPU的內(nèi)存。
-
momentum(動(dòng)量法)
-
泄露平均值
在小批量隨機(jī)梯度下降中,定義某次時(shí)間ttt的梯度下降計(jì)算公式:
gt,t?1=?w1∣Bt∣∑i∈Btf(xi,wt?1)=1∣Bt∣∑i∈Bthi,t?1.\mathbf{g}_{t, t-1} = \partial_{\mathbf{w}} \frac{1}{|\mathcal{B}_t|} \sum_{i \in \mathcal{B}_t} f(\mathbf{x}_{i}, \mathbf{w}_{t-1}) = \frac{1}{|\mathcal{B}_t|} \sum_{i \in \mathcal{B}_t} \mathbf{h}_{i, t-1}. gt,t?1?=?w?∣Bt?∣1?i∈Bt?∑?f(xi?,wt?1?)=∣Bt?∣1?i∈Bt?∑?hi,t?1?.
小批量隨機(jī)梯度下降可以作為加速計(jì)算的手段,同時(shí)其也有很好的副作用,即平均梯度減小了方差。
vt=βvt?1+gt,t?1\mathbf{v}_t = \beta \mathbf{v}_{t-1} + \mathbf{g}_{t, t-1} vt?=βvt?1?+gt,t?1?
其中,β∈(0,1)\beta \in (0, 1)β∈(0,1)。這將有效的將瞬間梯度替換為“過去“多個(gè)梯度的平均值。v\mathbf{v}v被稱為動(dòng)量,其累加了過去的梯度。其中,可以vt\mathbf{v}_tvt?擴(kuò)展到
vt=β2vt?2+βgt?1,t?2+gt,t?1=…,=∑τ=0t?1βτgt?τ,t?τ?1.\begin{aligned} \mathbf{v}_t = \beta^2 \mathbf{v}_{t-2} + \beta \mathbf{g}_{t-1, t-2} + \mathbf{g}_{t, t-1} = \ldots, = \sum_{\tau = 0}^{t-1} \beta^{\tau} \mathbf{g}_{t-\tau, t-\tau-1}. \end{aligned} vt?=β2vt?2?+βgt?1,t?2?+gt,t?1?=…,=τ=0∑t?1?βτgt?τ,t?τ?1?.?
其中,較大的β\betaβ相當(dāng)于長期平均值,較小的β\betaβ相當(dāng)于梯度只是略有修正。新的梯度替換不在指向模型中下降最陡的方向,而是指向過去梯度的加權(quán)平均值的方向。- 在優(yōu)化問題不佳的情況下(例如函數(shù)某處”很平“,導(dǎo)數(shù)很小),具有動(dòng)量的梯度可以借用之前的梯度來進(jìn)行“加速”。
- 其允許我們對隨后的梯度計(jì)算平均值,以獲得更穩(wěn)定的下降方向。
-
動(dòng)量法
對于minibatch-SGD,使用vt\mathbf{v}_tvt?而不是梯度gt\mathbf{g}_tgt?可以生成以下更新等式:
vt←βvt?1+gt,t?1,xt←xt?1?ηtvt.\begin{aligned} \mathbf{v}_t &\leftarrow \beta \mathbf{v}_{t-1} + \mathbf{g}_{t, t-1}, \\ \mathbf{x}_t &\leftarrow \mathbf{x}_{t-1} - \eta_t \mathbf{v}_t. \end{aligned} vt?xt??←βvt?1?+gt,t?1?,←xt?1??ηt?vt?.?
注意,對于β=0\beta = 0β=0,我們恢復(fù)常規(guī)的梯度下降。 -
有效樣本權(quán)重
vt=∑τ=0t?1βτgt?τ,t?τ?1\mathbf{v}_t = \sum_{\tau = 0}^{t-1} \beta^{\tau} \mathbf{g}_{t-\tau, t-\tau-1}vt?=∑τ=0t?1?βτgt?τ,t?τ?1?。極限條件下,∑τ=0∞βτ=11?β\sum_{\tau=0}^\infty \beta^\tau = \frac{1}{1-\beta}∑τ=0∞?βτ=1?β1?。
即,不同于在梯度下降或者隨機(jī)梯度下降中取步長η\etaη,我們選取步長η1?β\frac{\eta}{1-\beta}1?βη?,同時(shí)處理潛在表現(xiàn)可能會(huì)更好的下降方向。這是集兩種好處于一身的做法。
-
小結(jié):
-
動(dòng)量法用過去梯度的平均值來替換梯度,這大大加快了收斂速度。
-
對于無噪聲梯度下降和嘈雜隨機(jī)梯度下降,動(dòng)量法都是可取的。
-
動(dòng)量法可以防止在隨機(jī)梯度下降的優(yōu)化過程停滯的問題。
-
由于對過去的數(shù)據(jù)進(jìn)行了指數(shù)降權(quán),有效梯度數(shù)為11?β\frac{1}{1-\beta}1?β1?。
-
動(dòng)量法的實(shí)現(xiàn)非常簡單,但它需要我們存儲(chǔ)額外的狀態(tài)向量(動(dòng)量v\mathbf{v}v)。
-
-
AdaGrad
-
稀疏特征和學(xué)習(xí)率
需要明確:為了使訓(xùn)練模型獲得良好的準(zhǔn)確性,我們大多希望在訓(xùn)練的過程中降低學(xué)習(xí)率,速度通常為O(t?12)\mathcal{O}(t^{-\frac{1}{2}})O(t?21?)或更低。 對于稀疏特征(即只在偶爾出現(xiàn)的特征)的模型訓(xùn)練,只有在不常見的特征出現(xiàn)時(shí),與其相關(guān)的參數(shù)才會(huì)得到有意義的更新。 鑒于學(xué)習(xí)率下降,我們可能最終會(huì)面臨這樣的情況:常見特征的參數(shù)相當(dāng)迅速地收斂到最佳值,而對于不常見的特征,我們?nèi)匀狈ψ銐虻挠^測以確定其最佳值。 換句話說,學(xué)習(xí)率要么對于常見特征而言降低太慢,要么對于不常見特征而言降低太快。
解決此問題的一個(gè)方法是記錄我們看到特定特征的次數(shù),然后將其用作調(diào)整學(xué)習(xí)率。 即我們可以使用大小為ηi=η0s(i,t)+c\eta_i = \frac{\eta_0}{\sqrt{s(i, t) + c}}ηi?=s(i,t)+c?η0??的學(xué)習(xí)率,而不是η=η0t+c\eta = \frac{\eta_0}{\sqrt{t + c}}η=t+c?η0??。在這里s(i,t)s(i, t)s(i,t)計(jì)下了我們截至ttt時(shí)觀察到功能iii的次數(shù)。
AdaGrad算法 通過將粗略的計(jì)數(shù)器s(i,t)s(i, t)s(i,t)替換為先前觀察所得梯度的平方之和來解決這個(gè)問題。它使用s(i,t+1)=s(i,t)+(?if(x))2s(i, t+1) = s(i, t) + \left(\partial_i f(\mathbf{x})\right)^2s(i,t+1)=s(i,t)+(?i?f(x))2來調(diào)整學(xué)習(xí)率。
這有兩個(gè)好處:
- 不再需要決定梯度何時(shí)算足夠大。
- 其會(huì)隨梯度的大小自動(dòng)變化。通常對應(yīng)于較大梯度的坐標(biāo)會(huì)顯著縮小,而其他梯度較小的坐標(biāo)則會(huì)得到更平滑的處理。
-
AdaGrad算法:
使用變量st\mathbf{s}_tst?來累加過去的梯度方差:
gt=?wl(yt,f(xt,w)),st=st?1+gt2,wt=wt?1?ηst+??gt.\begin{aligned} \mathbf{g}_t & = \partial_{\mathbf{w}} l(y_t, f(\mathbf{x}_t, \mathbf{w})), \\ \mathbf{s}_t & = \mathbf{s}_{t-1} + \mathbf{g}_t^2, \\ \mathbf{w}_t & = \mathbf{w}_{t-1} - \frac{\eta}{\sqrt{\mathbf{s}_t + \epsilon}} \cdot \mathbf{g}_t. \end{aligned} gt?st?wt??=?w?l(yt?,f(xt?,w)),=st?1?+gt2?,=wt?1??st?+??η??gt?.?
η\etaη是學(xué)習(xí)率,?\epsilon?是一個(gè)為維持?jǐn)?shù)值穩(wěn)定性而添加的常數(shù),用來確保不會(huì)除以000。最后,初始化s0=0\mathbf{s}_0 = \mathbf{0}s0?=0。就像在動(dòng)量法中需要跟蹤一個(gè)輔助變量一樣,在AdaGrad算法中,我們允許每個(gè)坐標(biāo)有單獨(dú)的學(xué)習(xí)率。與SGD算法相比,這并沒有明顯增加AdaGrad的計(jì)算代價(jià),因?yàn)橹饕?jì)算用在l(yt,f(xt,w))l(y_t, f(\mathbf{x}_t, \mathbf{w}))l(yt?,f(xt?,w))及其導(dǎo)數(shù)。
注意,在st\mathbf{s}_tst?中累加平方梯度意味著st\mathbf{s}_tst?基本上以線性速率增長(由于梯度從最初開始衰減,實(shí)際上比線性慢一些)。這產(chǎn)生了一個(gè)學(xué)習(xí)率O(t?12)\mathcal{O}(t^{-\frac{1}{2}})O(t?21?),但是在單個(gè)坐標(biāo)的層面上進(jìn)行了調(diào)整。對于凸問題,這完全足夠了。然而,在深度學(xué)習(xí)中,我們可能希望更慢地降低學(xué)習(xí)率。這引出了許多AdaGrad算法的變體。
-
小結(jié):
-
AdaGrad算法會(huì)在單個(gè)坐標(biāo)層面動(dòng)態(tài)降低學(xué)習(xí)率。
-
AdaGrad算法利用梯度的大小作為調(diào)整進(jìn)度速率的手段:用較小的學(xué)習(xí)率來補(bǔ)償帶有較大梯度的坐標(biāo)。
-
在深度學(xué)習(xí)問題中,由于內(nèi)存和計(jì)算限制,計(jì)算準(zhǔn)確的二階導(dǎo)數(shù)通常是不可行的。梯度可以作為一個(gè)有效的代理。
-
如果優(yōu)化問題的結(jié)構(gòu)相當(dāng)不均勻,AdaGrad算法可以幫助緩解扭曲。
-
AdaGrad算法對于稀疏特征特別有效,在此情況下由于不常出現(xiàn)的問題,學(xué)習(xí)率需要更慢地降低。
-
在深度學(xué)習(xí)問題上,AdaGrad算法有時(shí)在降低學(xué)習(xí)率方面可能過于劇烈。
-
-
-
RMSProp
-
RMSProp算法
Adagrad算法的關(guān)鍵問題之一就是學(xué)習(xí)率按預(yù)定時(shí)間表O(t?12)\mathcal{O}(t^{-\frac{1}{2}})O(t?21?)顯著降低。 而且,Adagrad算法將梯度gt\mathbf{g}_tgt?的平方累加成狀態(tài)矢量st=st?1+gt2\mathbf{s}_t = \mathbf{s}_{t-1} + \mathbf{g}_t^2st?=st?1?+gt2?。因此,由于缺乏規(guī)范化,沒有約束力,st\mathbf{s}_tst?持續(xù)增長,幾乎上是在算法收斂時(shí)呈線性遞增。
解決此問題的一種方法是使用st/t\mathbf{s}_t / tst?/t。對gt\mathbf{g}_tgt?的合理分布來說,它將收斂。遺憾的是,限制行為生效可能需要很長時(shí)間,因?yàn)樵摿鞒逃涀×酥档耐暾壽E。
另一種方法是按動(dòng)量法中的方式使用泄漏平均值,即st←γst?1+(1?γ)gt2\mathbf{s}_t \leftarrow \gamma \mathbf{s}_{t-1} + (1-\gamma) \mathbf{g}_t^2st?←γst?1?+(1?γ)gt2?,其中參數(shù)γ>0\gamma > 0γ>0。保持所有其它部分不變就產(chǎn)生了RMSProp算法。公式:
st←γst?1+(1?γ)gt2,xt←xt?1?ηst+?⊙gt.\begin{aligned} \mathbf{s}_t & \leftarrow \gamma \mathbf{s}_{t-1} + (1 - \gamma) \mathbf{g}_t^2, \\ \mathbf{x}_t & \leftarrow \mathbf{x}_{t-1} - \frac{\eta}{\sqrt{\mathbf{s}_t + \epsilon}} \odot \mathbf{g}_t. \end{aligned} st?xt??←γst?1?+(1?γ)gt2?,←xt?1??st?+??η?⊙gt?.?
常數(shù)?>0\epsilon > 0?>0通常設(shè)置為10?610^{-6}10?6,以確保不會(huì)因除以零或步長過大而受到影響。鑒于這種擴(kuò)展,現(xiàn)在可以自由控制學(xué)習(xí)率η\etaη,而不考慮基于每個(gè)坐標(biāo)應(yīng)用的縮放。就泄漏平均值而言,可以采用與之前在動(dòng)量法中適用的相同推理。擴(kuò)展st\mathbf{s}_tst?定義可獲得:
st=(1?γ)gt2+γst?1=(1?γ)(gt2+γgt?12+γ2gt?2+…,).\begin{aligned} \mathbf{s}_t & = (1 - \gamma) \mathbf{g}_t^2 + \gamma \mathbf{s}_{t-1} \\ & = (1 - \gamma) \left(\mathbf{g}_t^2 + \gamma \mathbf{g}_{t-1}^2 + \gamma^2 \mathbf{g}_{t-2} + \ldots, \right). \end{aligned} st??=(1?γ)gt2?+γst?1?=(1?γ)(gt2?+γgt?12?+γ2gt?2?+…,).?
同之前一樣,使用1+γ+γ2+…,=11?γ1 + \gamma + \gamma^2 + \ldots, = \frac{1}{1-\gamma}1+γ+γ2+…,=1?γ1?。因此,權(quán)重總和標(biāo)準(zhǔn)化為111且觀測值的半衰期為γ?1\gamma^{-1}γ?1。 -
小結(jié)
- RMSProp算法與Adagrad算法非常相似,因?yàn)閮烧叨际褂锰荻鹊钠椒絹砜s放系數(shù)。
- RMSProp算法與動(dòng)量法都使用泄漏平均值。但是,RMSProp算法使用該技術(shù)來調(diào)整按系數(shù)順序的預(yù)處理器。
- 在實(shí)驗(yàn)中,學(xué)習(xí)率需要由實(shí)驗(yàn)者調(diào)度。
- 系數(shù)γ\gammaγ決定了在調(diào)整每坐標(biāo)比例時(shí)歷史記錄的時(shí)長。
-
-
Adadelta
-
Adadelta算法
Adadelta是AdaGrad的另一種變體,主要區(qū)別在于其減少了學(xué)習(xí)率適應(yīng)坐標(biāo)的數(shù)量。
此外,廣義上Adadelta被稱為沒有學(xué)習(xí)率,因?yàn)樗褂米兓勘旧碜鳛槲磥碜兓男?zhǔn)。簡而言之,Adadelta使用兩個(gè)狀態(tài)變量,st\mathbf{s}_tst?用于存儲(chǔ)梯度二階導(dǎo)數(shù)的泄露平均值,Δxt\Delta\mathbf{x}_tΔxt?用于存儲(chǔ)模型本身中參數(shù)變化二階導(dǎo)數(shù)的泄露平均值。
以下是Adadelta的技術(shù)細(xì)節(jié)。
首先獲得泄露更新:
st=ρst?1+(1?ρ)gt2.\begin{aligned} \mathbf{s}_t & = \rho \mathbf{s}_{t-1} + (1 - \rho) \mathbf{g}_t^2. \end{aligned} st??=ρst?1?+(1?ρ)gt2?.?
與 RMSProp的區(qū)別在于,本算法使用重新縮放的梯度gt′\mathbf{g}_t'gt′?執(zhí)行更新,即
xt=xt?1?gt′.\begin{aligned} \mathbf{x}_t & = \mathbf{x}_{t-1} - \mathbf{g}_t'. \\ \end{aligned} xt??=xt?1??gt′?.?
對于調(diào)整后的梯度gt′\mathbf{g}_t'gt′?:
gt′=Δxt?1+?st+?⊙gt,\begin{aligned} \mathbf{g}_t' & = \frac{\sqrt{\Delta\mathbf{x}_{t-1} + \epsilon}}{\sqrt{{\mathbf{s}_t + \epsilon}}} \odot \mathbf{g}_t, \\ \end{aligned} gt′??=st?+??Δxt?1?+???⊙gt?,?
其中Δxt?1\Delta \mathbf{x}_{t-1}Δxt?1?是重新縮放梯度的平方gt′\mathbf{g}_t'gt′?的泄漏平均值。首先將Δx0\Delta \mathbf{x}_{0}Δx0?初始化為000,然后在每個(gè)步驟中使用gt′\mathbf{g}_t'gt′?更新它,即
Δxt=ρΔxt?1+(1?ρ)gt′2,\begin{aligned} \Delta \mathbf{x}_t & = \rho \Delta\mathbf{x}_{t-1} + (1 - \rho) {\mathbf{g}_t'}^2, \end{aligned} Δxt??=ρΔxt?1?+(1?ρ)gt′?2,?
?\epsilon?(例如10?510^{-5}10?5這樣的小值)是為了保持?jǐn)?shù)字穩(wěn)定性而加入的。 -
小結(jié)
-
Adadelta沒有學(xué)習(xí)率參數(shù)。相反,它使用參數(shù)本身的變化率來調(diào)整學(xué)習(xí)率。
-
Adadelta需要兩個(gè)狀態(tài)變量來存儲(chǔ)梯度的二階導(dǎo)數(shù)和參數(shù)的變化。
-
Adadelta使用泄漏的平均值來保持對適當(dāng)統(tǒng)計(jì)數(shù)據(jù)的運(yùn)行估計(jì)。
-
-
-
Adam算法
-
Adam算法:
Adam算法的關(guān)鍵組成部分之一是:使用指數(shù)加權(quán)移動(dòng)平均值來估算梯度的動(dòng)量和二次矩,即它使用狀態(tài)變量:
vt←β1vt?1+(1?β1)gt,st←β2st?1+(1?β2)gt2.\begin{aligned} \mathbf{v}_t & \leftarrow \beta_1 \mathbf{v}_{t-1} + (1 - \beta_1) \mathbf{g}_t, \\ \mathbf{s}_t & \leftarrow \beta_2 \mathbf{s}_{t-1} + (1 - \beta_2) \mathbf{g}_t^2. \end{aligned} vt?st??←β1?vt?1?+(1?β1?)gt?,←β2?st?1?+(1?β2?)gt2?.?
這里β1\beta_1β1?和β2\beta_2β2?是非負(fù)加權(quán)參數(shù)。常將它們設(shè)置為β1=0.9\beta_1 = 0.9β1?=0.9和β2=0.999\beta_2 = 0.999β2?=0.999。也就是說,方差估計(jì)的移動(dòng)遠(yuǎn)遠(yuǎn)慢于動(dòng)量估計(jì)的移動(dòng)。注意,如果我們初始化v0=s0=0\mathbf{v}_0 = \mathbf{s}_0 = 0v0?=s0?=0,就會(huì)獲得一個(gè)相當(dāng)大的初始偏差??梢酝ㄟ^使用∑i=0tβi=1?βt1?β\sum_{i=0}^t \beta^i = \frac{1 - \beta^t}{1 - \beta}∑i=0t?βi=1?β1?βt?來解決這個(gè)問題。相應(yīng)地,標(biāo)準(zhǔn)化狀態(tài)變量由下式獲得
v^t=vt1?β1tand?s^t=st1?β2t.\hat{\mathbf{v}}_t = \frac{\mathbf{v}_t}{1 - \beta_1^t} \text{ and } \hat{\mathbf{s}}_t = \frac{\mathbf{s}_t}{1 - \beta_2^t}. v^t?=1?β1t?vt???and?s^t?=1?β2t?st??.
有了正確的估計(jì),我們現(xiàn)在可以寫出更新方程。首先,我們以非常類似于RMSProp算法的方式重新縮放梯度以獲得
gt′=ηv^ts^t+?.\mathbf{g}_t' = \frac{\eta \hat{\mathbf{v}}_t}{\sqrt{\hat{\mathbf{s}}_t} + \epsilon}. gt′?=s^t??+?ηv^t??.
與RMSProp不同,我們的更新使用動(dòng)量v^t\hat{\mathbf{v}}_tv^t?而不是梯度本身。此外,由于使用1s^t+?\frac{1}{\sqrt{\hat{\mathbf{s}}_t} + \epsilon}s^t??+?1?而不是1s^t+?\frac{1}{\sqrt{\hat{\mathbf{s}}_t + \epsilon}}s^t?+??1?進(jìn)行縮放,兩者會(huì)略有差異。前者在實(shí)踐中效果略好一些,因此與RMSProp算法有所區(qū)分。通常,選擇?=10?6\epsilon = 10^{-6}?=10?6,這是為了在數(shù)值穩(wěn)定性和逼真度之間取得良好的平衡。最后,簡單更新:
xt←xt?1?gt′.\mathbf{x}_t \leftarrow \mathbf{x}_{t-1} - \mathbf{g}_t'. xt?←xt?1??gt′?.
回顧Adam算法,其設(shè)計(jì)靈感很清楚:首先,動(dòng)量和規(guī)模在狀態(tài)變量中清晰可見,其相當(dāng)獨(dú)特的定義使我們移除偏項(xiàng)(這可以通過稍微不同的初始化和更新條件來修正)。其次,RMSProp算法中兩項(xiàng)的組合都非常簡單。最后,明確的學(xué)習(xí)率η\etaη使我們能夠控制步長來解決收斂問題。
-
Yogi
Adam算法也存在一些問題:即使在凸環(huán)境下,當(dāng)st\mathbf{s}_tst?的二次矩估計(jì)值爆炸時(shí),它可能無法收斂。為此,有人為st\mathbf{s}_tst?提出了改進(jìn)的更新和參數(shù)初始化。論文中建議重寫Adam算法更新如下:
st←st?1+(1?β2)(gt2?st?1).\mathbf{s}_t \leftarrow \mathbf{s}_{t-1} + (1 - \beta_2) \left(\mathbf{g}_t^2 - \mathbf{s}_{t-1}\right). st?←st?1?+(1?β2?)(gt2??st?1?).
每當(dāng)gt2\mathbf{g}_t^2gt2?具有值很大的變量或更新很稀疏時(shí),st\mathbf{s}_tst?可能會(huì)太快地“忘記”過去的值。一個(gè)有效的解決方法是將gt2?st?1\mathbf{g}_t^2 - \mathbf{s}_{t-1}gt2??st?1?替換為gt2⊙sgn(gt2?st?1)\mathbf{g}_t^2 \odot \mathop{\mathrm{sgn}}(\mathbf{g}_t^2 - \mathbf{s}_{t-1})gt2?⊙sgn(gt2??st?1?)。這就是Yogi更新,現(xiàn)在更新的規(guī)模不再取決于偏差的量。
st←st?1+(1?β2)gt2⊙sgn(gt2?st?1).\mathbf{s}_t \leftarrow \mathbf{s}_{t-1} + (1 - \beta_2) \mathbf{g}_t^2 \odot \mathop{\mathrm{sgn}}(\mathbf{g}_t^2 - \mathbf{s}_{t-1}). st?←st?1?+(1?β2?)gt2?⊙sgn(gt2??st?1?).
論文中,作者還進(jìn)一步建議用更大的初始批量來初始化動(dòng)量,而不僅僅是初始的逐點(diǎn)估計(jì)。 -
小結(jié)
-
Adam算法將許多優(yōu)化算法的功能結(jié)合到了相當(dāng)強(qiáng)大的更新規(guī)則中。
-
Adam算法在RMSProp算法基礎(chǔ)上創(chuàng)建的,還在小批量的隨機(jī)梯度上使用EWMA。
-
在估計(jì)動(dòng)量和二次矩時(shí),Adam算法使用偏差校正來調(diào)整緩慢的啟動(dòng)速度。
-
對于具有顯著差異的梯度,我們可能會(huì)遇到收斂性問題。我們可以通過使用更大的小批量或者切換到改進(jìn)的估計(jì)值st\mathbf{s}_tst?來修正它們。Yogi提供了這樣的替代方案。
-
-
-
算法小結(jié)
- Gradient Descent: 提供了優(yōu)化模型的一種理論方法。
- SGD: 隨機(jī)梯度下降在解決優(yōu)化問題時(shí)比梯度下降更有有效。
- Minibatch-SGD:在一個(gè)小批量中使用更大的觀測數(shù)據(jù)集,可以通過向量化提供額外的效率。這是高效的多機(jī)、多GPU和并行處理的關(guān)鍵。
- Momentum: 添加一種機(jī)制,用于匯聚過去歷史梯度來加速收斂。
- Adagrad: 用過對每個(gè)坐標(biāo)縮放實(shí)現(xiàn)高效的計(jì)算預(yù)處理器。
- RMSProp: Adagrad算法的一個(gè)變體,通過學(xué)習(xí)率的調(diào)整來分離每個(gè)坐標(biāo)的縮放。
- Adadelta: Adagrad算法的一個(gè)變體,其減少了學(xué)習(xí)率適應(yīng)坐標(biāo)的數(shù)量。廣義上Adadelta被稱為沒有學(xué)習(xí)率。
- Adam: 是2、3、4、5和6的集大成者。
-