6. 深度學(xué)習(xí)-優(yōu)化器

  • 有前面的知識,我們知道如何構(gòu)建目標(biāo)函數(shù)了,當(dāng)目標(biāo)函數(shù)構(gòu)建出來后,如何求其參數(shù)使的目標(biāo)函數(shù)最小化呢?這就是這一小節(jié)的針對目標(biāo)函數(shù)的相關(guān)優(yōu)化方法。依據(jù)慣例,優(yōu)化算法通常只考慮最小化目標(biāo)函數(shù)。其實,任何最大化問題都可以很容易地轉(zhuǎn)化為最小化問題,只需令目標(biāo)函數(shù)的相反數(shù)為新的目標(biāo)函數(shù)即可。
  • 深度學(xué)習(xí)中絕大多數(shù)目標(biāo)函數(shù)都很復(fù)雜。因此,很多優(yōu)化問題并不存在解析解,而需要使用基于數(shù)值方法的優(yōu)化算法找到近似解,即數(shù)值解。為了求得最小化目標(biāo)函數(shù)的數(shù)值解,我們將通過優(yōu)化算法有限次迭代模型參數(shù)來盡可能降低損失函數(shù)的值。

1. 相關(guān)術(shù)語

  • 優(yōu)化方法在深度學(xué)習(xí)中有很多挑戰(zhàn)。主要的是即局部最小值和鞍點兩個挑戰(zhàn)。

1.1 局部最小值和全局最小值

  • 對于目標(biāo)函數(shù) f(x) ,如果 f(x)x_{0}上的值比在x_{0}鄰近的其他點的值更小,那么f(x_{0}) 可能是一個局部最小值(local minimum)。深度學(xué)習(xí)模型的目標(biāo)函數(shù)可能有若干局部最優(yōu)值。當(dāng)一個優(yōu)化問題的數(shù)值解在局部最優(yōu)解附近時,由于目標(biāo)函數(shù)有關(guān)解的梯度接近或變成零,最終迭代求得的數(shù)值解可能只令目標(biāo)函數(shù)局部最小化而非全局最小化。
  • 如果 f(x)x_{0}上的值是目標(biāo)函數(shù)在整個定義域上的最小值,那么f(x_{0}) 是全局最小值(global minimum)。
  • 圖像展示局部最小值和全局最小值:
    2019070201.png

1.2 鞍點

  • 梯度接近或變成零可能是由于當(dāng)前解在局部最優(yōu)解附近造成的。事實上,另一種可能性是當(dāng)前解在鞍點(saddle point)附近。
  • 函數(shù)f(x)=x^{3}的鞍點圖像:
    2019070202.png
  • 定義在二維空間的函數(shù)f(x,y)=x^{2}-y^{2}的鞍點圖像:

    2019070203.png

  • 對于f(x,y)=x^{2}-y^{2},我們可以找出該函數(shù)的鞍點位置。該函數(shù)看起來像一個馬鞍,而鞍點恰好是馬鞍上可坐區(qū)域的中心。目標(biāo)函數(shù)在x 軸方向上是局部最小值,但在y軸方向上是局部最大值。

  • 假設(shè)一個函數(shù)的輸入為 k 維向量,輸出為標(biāo)量,那么它的海森矩陣(Hessian matrix)有 k 個特征值。該函數(shù)在梯度為0的位置上可能是局部最小值、局部最大值或者鞍點。

    • 當(dāng)函數(shù)的海森矩陣在梯度為零的位置上的特征值全為正時,該函數(shù)得到局部最小值。
    • 當(dāng)函數(shù)的海森矩陣在梯度為零的位置上的特征值全為負(fù)時,該函數(shù)得到局部最大值。
    • 當(dāng)函數(shù)的海森矩陣在梯度為零的位置上的特征值有正有負(fù)時,該函數(shù)得到鞍點。
  • 對于一個大的高斯隨機矩陣來說,任一特征值是正或者是負(fù)的概率都是0.5 。那么,函數(shù)取得局部最小值或者局部最大值的概率為0.5^{K}。由于深度學(xué)習(xí)模型參數(shù)通常都是高維的( k 很大),所以函數(shù)取得局部最小(大)值的概率很小。但是取得鞍點的概率就很大了(1-2*0.5^{K}),因此目標(biāo)函數(shù)的鞍點通常比局部最小值更常見。

2. 優(yōu)化器

2.1 梯度下降法

  • 梯度下降法(Gradient Descent)是比較常用的優(yōu)化算法,其衍生的相關(guān)算法有隨機梯度下降算法(Stochastic Gradient Descent),批量梯度下降算法(Batch Gradient Descent),小批量梯度下降算法(MIni Batch Gradient Descent)。
  • 什么是梯度下降法呢?舉個例子,假如有一座,你在山的隨機地方,你想要快速下山。如果面向你的前方坡度下降的,你就向前走一步;如果面向你的前方坡度上升的,你就后退走一步;如此重復(fù)下去,你會到達(dá)山腳,這個山腳不一定是山的底部,可能是山的山坳。這里面都可以和梯度下降法中的術(shù)語映射。此處的山就是損失函數(shù)+正則化項(目標(biāo)函數(shù)),我們期望下山,對應(yīng)我們期望求得目標(biāo)函數(shù)的最小值。你在山的隨機地方,相當(dāng)于我們對目標(biāo)函數(shù)的參數(shù)第一次初始化,一般都是隨機的取標(biāo)準(zhǔn)正態(tài)分布的數(shù)。你想要快速下山,就相當(dāng)于把目標(biāo)函數(shù)的參數(shù)花費少量的時間,運行出來。坡度下降和上升相當(dāng)于目標(biāo)函數(shù)在當(dāng)前點的梯度(可以理解為導(dǎo)數(shù)),我們知道凸函數(shù)的最小值點在端點,極小值點。一個函數(shù)有多個極小值點,如果我們?nèi)芜x一個極小值點最為函數(shù)的最小值,這時容易陷入局部最優(yōu),而不是全局最優(yōu)。局部最優(yōu)相當(dāng)于山坳,全局最優(yōu)相當(dāng)于山腳。為了不陷入局部最優(yōu),我們需要在山的不同點,選擇下山,多次后選擇一個最低的點,那么該點一定是山腳。這也就是為什么我們初始化參數(shù)的時候,多次初始化,為了就是求得目標(biāo)函數(shù)的全局最優(yōu)。

2.1.1 一維梯度下降法

  • 為什么梯度下降算法可能降低目標(biāo)函數(shù)值。假設(shè)連續(xù)可導(dǎo)的函數(shù) f:R→R 的輸入和輸出都是標(biāo)量。給定任意小的正數(shù)\epsilon ,根據(jù)泰勒展開公式,有

    • f(x+\epsilon )\approx f(x)+\epsilon {f(x)}'
  • 這里{f(x)}'是函數(shù)f(x)x 處的梯度。一維函數(shù)的梯度是一個標(biāo)量,也稱導(dǎo)數(shù)。我們希望找到一個常數(shù)\eta >0 ,使得\left | \eta {f(x)}' \right |足夠小,那么可以將\epsilon替換為\eta {f(x)}'并得到

    • f(x-\eta {f(x)}')\approx f(x)-\eta ({f(x)}')^{2}
  • 如果導(dǎo)數(shù){f(x)}'\neq 0,那么 \eta ({f(x)}')^{2}>0 ,所以我們通過x-\eta {f(x)}'不斷地迭代,來逼近x。函數(shù) f(x) 的值可能會降低。因此在梯度下降中,我們先選取一個初始值x和常數(shù)\eta ,然后不斷來迭代,直到達(dá)到停止條件,例如({f(x)}')^{2}的值已足夠小或迭代次數(shù)已達(dá)到某個值。

  • 正數(shù) \eta 通常叫作學(xué)習(xí)率。這是一個超參數(shù),需要人工設(shè)定。如果使用過小的學(xué)習(xí)率,會導(dǎo)致更新緩慢從而需要更多的迭代才能得到較好的解。如果使用過大的學(xué)習(xí)率, \left | \eta {f(x)}' \right |可能會過大從而使一階泰勒展開公式不再成立,這時我們無法保證迭代 x會降低 f(x) 的值。

2.2 批量梯度下降法(Batch Gradient Descent)

  • 批量梯度下降法,是梯度下降法最常用的形式,具體做法也就是在更新參數(shù)時使用所有的樣本來進行更新,也就是說梯度下降算法就是指批量梯度下降法。

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

  • 在處理大量的數(shù)據(jù)時,梯度下降法就有些力不從心了。梯度下降法求參數(shù)時,會使用全部的訓(xùn)練數(shù)據(jù),這樣計算的代價很大,計算量大,耗時很長。而隨機梯度法是每次僅僅隨機均勻采樣的一個樣本來求梯度。

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

  • 批量梯度下降法和隨機梯度下降法是兩個極端,一個采用所有數(shù)據(jù)來梯度下降,一個用一個樣本來梯度下降。自然各自的優(yōu)缺點都非常突出。對于訓(xùn)練速度來說,隨機梯度下降法由于每次僅僅采用一個樣本來迭代,訓(xùn)練速度很快,而批量梯度下降法在樣本量很大的時候,訓(xùn)練速度不能讓人滿意。對于準(zhǔn)確度來說,隨機梯度下降法用于僅僅用一個樣本決定梯度方向,導(dǎo)致解很有可能不是最優(yōu)。對于收斂速度來說,由于隨機梯度下降法一次迭代一個樣本,導(dǎo)致迭代方向變化很大,不能很快的收斂到局部最優(yōu)解。小批量梯度下降法是批量梯度下降法和隨機梯度下降法的折衷,也就是對于n個樣本,我們采用m個樣本來迭代,1< m< n。

  • 在每一次迭代中,梯度下降使用整個訓(xùn)練數(shù)據(jù)集來計算梯度,因此它有時也被稱為批量梯度下降(batch gradient descent)。而隨機梯度下降在每次迭代中只隨機采樣一個樣本來計算梯度。我們還可以在每輪迭代中隨機均勻采樣多個樣本來組成一個小批量,然后使用這個小批量來計算梯度。

  • 設(shè)目標(biāo)函數(shù)f(\boldsymbol{x}): \mathbb{R}^d \rightarrow \mathbb{R}。在迭代開始前的時間步設(shè)為0。該時間步的自變量記為\boldsymbol{x}_0\in \mathbb{R}^d,通常由隨機初始化得到。在接下來的每一個時間步t>0中,小批量隨機梯度下降隨機均勻采樣一個由訓(xùn)練數(shù)據(jù)樣本索引組成的小批量\mathcal{B}_t。我們可以通過重復(fù)采樣(sampling with replacement)或者不重復(fù)采樣(sampling without replacement)得到一個小批量中的各個樣本。前者允許同一個小批量中出現(xiàn)重復(fù)的樣本,后者則不允許如此,且更常見。對于這兩者間的任一種方式,都可以使用
    \boldsymbol{g}_{t}\leftarrow \nabla f{\mathcal{B}_{t}}(\boldsymbol{x}_{t-1}) = \frac{1}{|\mathcal{B}|} \sum_{i \in \mathcal{B}_t}\nabla f_i(\boldsymbol{x}_{t-1})
    來計算時間步t的小批量\mathcal{B}t上目標(biāo)函數(shù)位于\boldsymbol{x}{t-1}處的梯度\boldsymbol{g}_t。這里|\mathcal{B}|代表批量大小,即小批量中樣本的個數(shù),是一個超參數(shù)。同隨機梯度一樣,重復(fù)采樣所得的小批量隨機梯度\boldsymbol{g}t也是對梯度\nabla f(\boldsymbol{x}{t-1})的無偏估計。給定學(xué)習(xí)率\eta_t(取正數(shù)),小批量隨機梯度下降對自變量的迭代如下:
    \boldsymbol{x}_t \leftarrow \boldsymbol{x}_{t-1} - \eta_t \boldsymbol{g}_t

  • 基于隨機采樣得到的梯度的方差在迭代過程中無法減小,因此在實際中,(小批量)隨機梯度下降的學(xué)習(xí)率可以在迭代過程中自我衰減,例如\eta_t=\eta t^\alpha(通常\alpha=-1或者-0.5)、\eta_t = \eta \alpha^t(如\alpha=0.95)或者每迭代若干次后將學(xué)習(xí)率衰減一次。如此一來,學(xué)習(xí)率和(小批量)隨機梯度乘積的方差會減小。而梯度下降在迭代過程中一直使用目標(biāo)函數(shù)的真實梯度,無須自我衰減學(xué)習(xí)率。

  • 小批量隨機梯度下降中每次迭代的計算開銷為\mathcal{O}(|\mathcal{B}|)。當(dāng)批量大小為1時,該算法即為隨機梯度下降;當(dāng)批量大小等于訓(xùn)練數(shù)據(jù)樣本數(shù)時,該算法即為梯度下降。當(dāng)批量較小時,每次迭代中使用的樣本少,這會導(dǎo)致并行處理和內(nèi)存使用效率變低。這使得在計算同樣數(shù)目樣本的情況下比使用更大批量時所花時間更多。當(dāng)批量較大時,每個小批量梯度里可能含有更多的冗余信息。為了得到較好的解,批量較大時比批量較小時需要計算的樣本數(shù)目可能更多,例如增大迭代周期數(shù)。

  • 小批量隨機梯度每次隨機均勻采樣一個小批量的訓(xùn)練樣本來計算梯度。

  • 在實際中,(小批量)隨機梯度下降的學(xué)習(xí)率可以在迭代過程中自我衰減。

  • 通常,小批量隨機梯度在每個迭代周期的耗時介于梯度下降和隨機梯度下降的耗時之間。

2.5 Momentum 算法

2.5.1 指數(shù)加權(quán)移動平均

  • 指數(shù)加權(quán)移動平均(exponentially weighted moving average)。給定超參數(shù) 0 \leq \gamma < 1,當(dāng)前時間t的變量 y_t 是上一時間 t-1 的變量y_{t-1}和當(dāng)前時間步另一變量 x_t 的線性組合:y_t = \gamma y_{t-1} + (1-\gamma) x_t。
  • 我們可以對上面的 y_t 展開:
    • y_t= (1-\gamma) x_t + \gamma y_{t-1}
      = (1-\gamma)x_t + (1-\gamma) \cdot \gamma x_{t-1} + \gamma^2y_{t-2}
      =(1-\gamma)x_t + (1-\gamma) \cdot \gamma x_{t-1} + (1-\gamma) \cdot \gamma^2x_{t-2} + \gamma^3y_{t-3}+\ldots

    • n = 1/(1-\gamma),那么 \left(1-1/n\right)^n = \gamma^{1/(1-\gamma)}

    • 因為\lim_{n \rightarrow \infty} \left(1-\frac{1}{n}\right)^n = \exp(-1) \approx 0.3679,

    • 所以當(dāng) \gamma \rightarrow 1 時,\gamma^{1/(1-\gamma)}=\exp(-1),如 0.95^{20} \approx \exp(-1)。如果把 \exp(-1) 當(dāng)作一個比較小的數(shù),我們可以在近似中忽略所有含 \gamma^{1/(1-\gamma)} 和比 \gamma^{1/(1-\gamma)} 更高階的系數(shù)的項。例如,當(dāng) \gamma=0.95 時,y_t \approx 0.05 \sum_{i=0}^{19} 0.95^i x_{t-i}.

    • 因此,在實際中,我們常常將 y_t 看作是對最近 1/(1-\gamma) 個時間步的 x_t 值的加權(quán)平均。例如,當(dāng) \gamma = 0.95 時,y_t可以被看作對最近20個時間步的 x_t 值的加權(quán)平均;當(dāng) \gamma = 0.9 時,y_t可以看作是對最近10個時間步的 x_t 值的加權(quán)平均。而且,離當(dāng)前時間步t 越近的 x_t 值獲得的權(quán)重越大(越接近1)。

2.5.2 動量法

  • 在小批量梯度下降法時,我們在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的時候把數(shù)據(jù)拆解成一小批一小批地進行訓(xùn)練,然而雖然這種算法能夠帶來很好的訓(xùn)練速度,但是在到達(dá)最優(yōu)點的時候并不能夠總是真正到達(dá)最優(yōu)點,而是在最優(yōu)點附近徘徊。另一個缺點就是這種算法需要我們挑選一個合適的學(xué)習(xí)率,當(dāng)我們采用小的學(xué)習(xí)率的時候,會導(dǎo)致網(wǎng)絡(luò)在訓(xùn)練的時候收斂太慢;當(dāng)我們采用大的學(xué)習(xí)率的時候,會導(dǎo)致在訓(xùn)練過程中優(yōu)化的幅度跳過函數(shù)的范圍,也就是可能跳過最優(yōu)點。我們所希望求解目標(biāo)函數(shù)時,有一個很好的收斂速度同時又不至于擺動幅度太大。

  • 在下圖,我們可以看出隨機梯度下降法會使得函數(shù)發(fā)生震蕩,同一位置上,目標(biāo)函數(shù)在豎直方向( x2 軸方向)比在水平方向( x1 軸方向)的斜率的絕對值更大。因此,給定學(xué)習(xí)率,梯度下降迭代自變量時會使自變量在豎直方向比在水平方向移動幅度更大。那么,我們需要一個較小的學(xué)習(xí)率從而避免自變量在豎直方向上越過目標(biāo)函數(shù)最優(yōu)解。然而,這會造成自變量在水平方向上朝最優(yōu)解移動變慢。
    2019070204.png
  • 我們試著將學(xué)習(xí)率調(diào)得稍大一點,此時自變量在豎直方向不斷越過最優(yōu)解并逐漸發(fā)散。見下圖。
    2019070205.png
  • 設(shè)時間步t的自變量為 \boldsymbol{x}_t,學(xué)習(xí)率為 \eta_t,梯度為 \boldsymbol{g}_t。 在時間步0,動量法創(chuàng)建速度變量 \boldsymbol{v}_0,并將其元素初始化成0。在時間步 t>0,動量法對每次迭代的步驟做如下修改:
    \begin{split}\begin{aligned} \boldsymbol{v}_t &\leftarrow \gamma \boldsymbol{v}_{t-1} + \eta_t \boldsymbol{g}_t, \\ \boldsymbol{x}_t &\leftarrow \boldsymbol{x}_{t-1} - \boldsymbol{v}_t, \end{aligned}\end{split}
    其中,動量超參數(shù)\gamma滿足0 \leq \gamma < 1。當(dāng)\gamma=0時,動量法等價于小批量隨機梯度下降。

  • 在使用動量法后的迭代軌跡如下圖,我們能夠觀察到,動量法在豎直方向上的移動更加平滑,且在水平方向上更快逼近最優(yōu)解。使用較大的學(xué)習(xí)率,此時自變量也不再發(fā)散。
    2019070206.png

2.5.3由指數(shù)加權(quán)移動平均理解動量法

  • 現(xiàn)在,我們對動量法的速度變量做變形:
    \boldsymbol{v}_t \leftarrow \gamma \boldsymbol{v}_{t-1} + (1 - \gamma) \left(\frac{\eta_t}{1 - \gamma} \boldsymbol{g}_t\right)
    由指數(shù)加權(quán)移動平均的形式可得,速度變量 \boldsymbol{v}_t 實際上對序列 {\eta_{t-i}\boldsymbol{g}_{t-i} /(1-\gamma):i=0,\ldots,1/(1-\gamma)-1} 做了指數(shù)加權(quán)移動平均。換句話說,相比于小批量隨機梯度下降,動量法在每個時間步的自變量更新量近似于將前者對應(yīng)的最近 1/(1-\gamma)個時間步的更新量做了指數(shù)加權(quán)移動平均后再除以 1-\gamma。所以,在動量法中,自變量在各個方向上的移動幅度不僅取決當(dāng)前梯度,還取決于過去的各個梯度在各個方向上是否一致。在本節(jié)之前示例的優(yōu)化問題中,所有梯度在水平方向上為正(向右),而在豎直方向上時正(向上)時負(fù)(向下)。這樣,我們就可以使用較大的學(xué)習(xí)率,從而使自變量向最優(yōu)解更快移動。

  • 動量法使用了指數(shù)加權(quán)移動平均的思想剛好可以解決我們所面臨的問題,。它將過去時間步的梯度做了加權(quán)平均,且權(quán)重按時間步指數(shù)衰減。

  • 動量法使得相鄰時間步的自變量更新在方向上更加一致。

  • 動量法主要是提高收斂速度。

2.6 AdaGrad算法

2.6.1 動量法的缺陷

  • 通過動量法我們知道目標(biāo)函數(shù)自變量的每一個元素在相同時間步都使用同一個學(xué)習(xí)率來自我迭代。舉個例子,假設(shè)目標(biāo)函數(shù)為 f,自變量為一個二維向量[x_1, x_2]^\top,該向量中每一個元素在迭代時都使用相同的學(xué)習(xí)率。例如,在學(xué)習(xí)率為 \eta 的梯度下降中,元素 x_1x_2 都使用相同的學(xué)習(xí)率\eta來自我迭代:
    x_1 \leftarrow x_1 - \eta \frac{\partial{f}}{\partial{x_1}}, \quad x_2 \leftarrow x_2 - \eta \frac{\partial{f}}{\partial{x_2}}.
    當(dāng) x_1x_2 的梯度值有較大差別時,需要選擇足夠小的學(xué)習(xí)率使得自變量在梯度值較大的維度上不發(fā)散。但這樣會導(dǎo)致自變量在梯度值較小的維度上迭代過慢。這時我們該如何確定學(xué)習(xí)率呢?而AdaGrad算法,它根據(jù)自變量在每個維度的梯度值的大小來調(diào)整各個維度上的學(xué)習(xí)率,從而避免統(tǒng)一的學(xué)習(xí)率難以適應(yīng)所有維度的問題。

2.6.2 AdaGrad算法

  • AdaGrad算法會使用一個小批量隨機梯度 \boldsymbol{g}_t 按元素平方的累加變量 \boldsymbol{s}_t。在時間步0,AdaGrad將 \boldsymbol{s}_0 中每個元素初始化為0。在時間步 t,首先將小批量隨機梯度 \boldsymbol{g}_t 按元素平方后累加到變量 \boldsymbol{s}_t
    \boldsymbol{s}_t \leftarrow \boldsymbol{s}_{t-1} + \boldsymbol{g}_t \odot \boldsymbol{g}_t,
    其中 \odot 是按元素相乘。接著,我們將目標(biāo)函數(shù)自變量中每個元素的學(xué)習(xí)率通過按元素運算重新調(diào)整一下:
    \boldsymbol{x}_t \leftarrow \boldsymbol{x}_{t-1} - \frac{\eta}{\sqrt{\boldsymbol{s}_t + \epsilon}} \odot \boldsymbol{g}_t,
    其中 \eta 是學(xué)習(xí)率,\epsilon 是為了維持?jǐn)?shù)值穩(wěn)定性而添加的常數(shù),如 10^{-6}。這里開方、除法和乘法的運算都是按元素運算的。這些按元素運算使得目標(biāo)函數(shù)自變量中每個元素都分別擁有自己的學(xué)習(xí)率。

  • 在小批量隨機梯度按元素平方的累加變量 \boldsymbol{s}_t 出現(xiàn)在學(xué)習(xí)率的分母項中。因此,如果目標(biāo)函數(shù)有關(guān)自變量中某個元素的偏導(dǎo)數(shù)一直都較大,那么該元素的學(xué)習(xí)率將下降較快;反之,如果目標(biāo)函數(shù)有關(guān)自變量中某個元素的偏導(dǎo)數(shù)一直都較小,那么該元素的學(xué)習(xí)率將下降較慢。然而,由于\boldsymbol{s}_t 一直在累加按元素平方的梯度,自變量中每個元素的學(xué)習(xí)率在迭代過程中一直在降低(或不變)。所以,當(dāng)學(xué)習(xí)率在迭代早期降得較快且當(dāng)前解依然不佳時,AdaGrad算法在迭代后期由于學(xué)習(xí)率過小,可能較難找到一個有用的解。

  • 觀察下圖AdaGrad算法對自變量的迭代軌跡??梢钥吹?,自變量的迭代軌跡較平滑。但由于 s_t 的累加效果使學(xué)習(xí)率不斷衰減,自變量在迭代后期的移動幅度較小。

    2019070207.png

  • 我們使用更大的學(xué)習(xí)率,下圖可以看到自變量更為迅速地逼近了最優(yōu)解。
    2019070208.png

2.7 RMSProp 算法

2.7.1 AdaGrad算法的缺陷

  • AdaGrad算法最明顯的缺陷是收斂速度慢。因為調(diào)整學(xué)習(xí)率時,分母上的變量 \boldsymbol{s}_t 一直在累加按元素平方的小批量隨機梯度,所以目標(biāo)函數(shù)自變量每個元素的學(xué)習(xí)率在迭代過程中一直在降低(或不變)。因此,當(dāng)學(xué)習(xí)率在迭代早期降得較快且當(dāng)前解依然不佳時,AdaGrad算法在迭代后期由于學(xué)習(xí)率過小,可能較難找到一個有用的解。為了解決這一問題,RMSProp算法對AdaGrad算法做了一點小小的修改。

2.7.2 RMSProp

  • RMSProp(Root Mean Square Prop) 算法是一種自適應(yīng)學(xué)習(xí)率的優(yōu)化算法,其核心思想是通過統(tǒng)計相似梯度的平均值的方式來自動的調(diào)整學(xué)習(xí)率。

  • 我們知道“動量法”依據(jù)指數(shù)加權(quán)移動平均。不同于AdaGrad算法里狀態(tài)變量 \boldsymbol{s}_t 是截至?xí)r間步 t 所有小批量隨機梯度\boldsymbol{g}_t按元素平方和,RMSProp算法將這些梯度按元素平方做指數(shù)加權(quán)移動平均。具體來說,給定超參數(shù) 0 \leq \gamma < 1,RMSProp算法在時間步t>0計算
    \boldsymbol{s}_t \leftarrow \gamma \boldsymbol{s}_{t-1} + (1 - \gamma) \boldsymbol{g}_t \odot \boldsymbol{g}_t.
    和AdaGrad算法一樣,RMSProp算法將目標(biāo)函數(shù)自變量中每個元素的學(xué)習(xí)率通過按元素運算重新調(diào)整,然后更新自變量
    \boldsymbol{x}_t \leftarrow \boldsymbol{x}_{t-1} - \frac{\eta}{\sqrt{\boldsymbol{s}_t + \epsilon}} \odot \boldsymbol{g}_t,

    其中 \eta 是學(xué)習(xí)率,\epsilon是為了維持?jǐn)?shù)值穩(wěn)定性而添加的常數(shù),如 10^{-6}。因為RMSProp算法的狀態(tài)變量 \boldsymbol{s}_t 是對平方項\boldsymbol{g}_t \odot \boldsymbol{g}_t的指數(shù)加權(quán)移動平均,所以可以看作是最近 1/(1-\gamma) 個時間步的小批量隨機梯度平方項的加權(quán)平均。如此一來,自變量每個元素的學(xué)習(xí)率在迭代過程中就不再一直降低(或不變)。

  • 我們知道AdaGrad算法,自變量在迭代后期的移動幅度較小。但在同樣的學(xué)習(xí)率下,RMSProp算法可以更快逼近最優(yōu)解。見下圖
    2019070209.png
  • RMSProp算法和AdaGrad算法的不同在于,RMSProp算法使用了小批量隨機梯度按元素平方的指數(shù)加權(quán)移動平均來調(diào)整學(xué)習(xí)率。一般會在RNN中使用RMSProp算法。

2.8 AdaDelta算法

  • 除了RMSProp算法以外,另一個常用優(yōu)化算法AdaDelta算法也針對AdaGrad算法在迭代后期可能較難找到有用解的問題做了改進。有意思的是,AdaDelta算法沒有學(xué)習(xí)率這一超參數(shù)。

  • AdaDelta算法也像RMSProp算法一樣,使用了小批量隨機梯度 \boldsymbol{g}_t 按元素平方的指數(shù)加權(quán)移動平均變量 \boldsymbol{s}_t。在時間步0,它的所有元素被初始化為0。給定超參數(shù) 0 \leq \rho < 1(對應(yīng)RMSProp算法中的\gamma),在時間步t>0,同RMSProp算法一樣計算
    \boldsymbol{s}_t \leftarrow \rho \boldsymbol{s}_{t-1} + (1 - \rho) \boldsymbol{g}_t \odot \boldsymbol{g}_t.
    與RMSProp算法不同的是,AdaDelta算法還維護一個額外的狀態(tài)變量 \Delta\boldsymbol{x}_t,其元素同樣在時間步0時被初始化為0。我們使用\Delta\boldsymbol{x}_{t-1}來計算自變量的變化量:
    \boldsymbol{g}_t' \leftarrow \sqrt{\frac{\Delta\boldsymbol{x}_{t-1} + \epsilon}{\boldsymbol{s}_t + \epsilon}} \odot \boldsymbol{g}_t,
    其中\epsilon是為了維持?jǐn)?shù)值穩(wěn)定性而添加的常數(shù),如10^{-5}。接著更新自變量:
    \boldsymbol{x}_t \leftarrow \boldsymbol{x}_{t-1} - \boldsymbol{g}'_t.
    最后,我們使用\Delta\boldsymbol{x}_t來記錄自變量變化量\boldsymbol{g}'_t按元素平方的指數(shù)加權(quán)移動平均:
    \Delta\boldsymbol{x}_t \leftarrow \rho \Delta\boldsymbol{x}_{t-1} + (1 - \rho) \boldsymbol{g}'_t \odot \boldsymbol{g}'_t.
    可以看到,如不考慮\epsilon的影響,AdaDelta算法與RMSProp算法的不同之處在于使用\sqrt{\Delta\boldsymbol{x}_{t-1}}來替代超參數(shù)\eta。

  • AdaDelta算法沒有學(xué)習(xí)率超參數(shù),它通過使用有關(guān)自變量更新量平方的指數(shù)加權(quán)移動平均的項來替代RMSProp算法中的學(xué)習(xí)率。

2.9 Adam算法

  • Adam(adaptive moment estimation)算法在RMSProp算法基礎(chǔ)上對小批量隨機梯度也做了指數(shù)加權(quán)移動平均 。

  • Adam算法使用了動量變量 \boldsymbol{v}_t 和RMSProp算法中小批量隨機梯度按元素平方的指數(shù)加權(quán)移動平均變量 \boldsymbol{s}_t,并在時間步0將它們中每個元素初始化為0。給定超參數(shù) 0 \leq \beta_1 < 1(算法作者建議設(shè)為0.9),時間步 t 的動量變量 \boldsymbol{v}_t 即小批量隨機梯度\boldsymbol{g}_t 的指數(shù)加權(quán)移動平均:
    \boldsymbol{v}_t \leftarrow \beta_1 \boldsymbol{v}_{t-1} + (1 - \beta_1) \boldsymbol{g}_t.
    和RMSProp算法中一樣,給定超參數(shù) 0 \leq \beta_2 < 1(算法作者建議設(shè)為0.999), 將小批量隨機梯度按元素平方后的項 \boldsymbol{g}_t \odot \boldsymbol{g}_t 做指數(shù)加權(quán)移動平均得到 \boldsymbol{s}_t
    \boldsymbol{s}_t \leftarrow \beta_2 \boldsymbol{s}_{t-1} + (1 - \beta_2) \boldsymbol{g}_t \odot \boldsymbol{g}_t.
    由于我們將 \boldsymbol{v}_0\boldsymbol{s}_0 中的元素都初始化為0, 在時間步 t 我們得到 \boldsymbol{v}_t = (1-\beta_1) \sum{i=1}^t \beta_1^{t-i} \boldsymbol{g}_i。將過去各時間步小批量隨機梯度的權(quán)值相加,得到 (1-\beta_1) \sum{i=1}^t \beta_1^{t-i} = 1 - \beta_1^t。需要注意的是,當(dāng) t 較小時,過去各時間步小批量隨機梯度權(quán)值之和會較小。例如,當(dāng) \beta_1 = 0.9 時,\boldsymbol{v}_1 = 0.1\boldsymbol{g}_1。為了消除這樣的影響,對于任意時間步 t,我們可以將 \boldsymbol{v}_t 再除以 1 - \beta_1^t,從而使過去各時間步小批量隨機梯度權(quán)值之和為1。這也叫作偏差修正。在Adam算法中,我們對變量 \boldsymbol{v}_t\boldsymbol{s}_t 均作偏差修正:
    \hat{\boldsymbol{v}}_t \leftarrow \frac{\boldsymbol{v}_t}{1 - \beta_1^t},
    \hat{\boldsymbol{s}}_t \leftarrow \frac{\boldsymbol{s}_t}{1 - \beta_2^t}.

    接下來,Adam算法使用以上偏差修正后的變量 \hat{\boldsymbol{v}}_t\hat{\boldsymbol{s}}_t,將模型參數(shù)中每個元素的學(xué)習(xí)率通過按元素運算重新調(diào)整:
    \boldsymbol{g}_t' \leftarrow \frac{\eta \hat{\boldsymbol{v}}_t}{\sqrt{\hat{\boldsymbol{s}}_t} + \epsilon},
    其中 \eta 是學(xué)習(xí)率,\epsilon 是為了維持?jǐn)?shù)值穩(wěn)定性而添加的常數(shù),如 10^{-8}。和AdaGrad算法、RMSProp算法以及AdaDelta算法一樣,目標(biāo)函數(shù)自變量中每個元素都分別擁有自己的學(xué)習(xí)率。最后,使用 \boldsymbol{g}_t' 迭代自變量:
    \boldsymbol{x}_t \leftarrow \boldsymbol{x}_{t-1} - \boldsymbol{g}_t'.

  • Adam算法在RMSProp算法的基礎(chǔ)上對小批量隨機梯度也做了指數(shù)加權(quán)移動平均。

  • Adam算法使用了偏差修正。

  • Adam算法是RMSProp算法與動量法的結(jié)合。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容