“兵無常勢,水無常形”-參數(shù)的自適應(yīng)更新方法
1.損失無法降低的原因

在“眾里尋他千百度”-深度學(xué)習(xí)的本質(zhì)一文中,討論了使用傳統(tǒng)的梯度下降方法更新機(jī)器學(xué)習(xí)模型的參數(shù).在通常情況下,遇到的情況大多是上圖中右上方所展示的結(jié)果,橫軸表示參數(shù)迭代的次數(shù),縱軸表示損失函數(shù)的數(shù)值,隨著迭代次數(shù)的增加,損失函數(shù)數(shù)值不再下降.理論上來說,遇到這種情況可能表示梯度為0,參數(shù)更新到了駐點(diǎn).但實(shí)際上,遇到的情況可能并不是這樣,如上圖右下方所示,橫軸仍為參數(shù)的更新次數(shù),縱軸為梯度向量的范數(shù).事實(shí)表明,此時梯度向量并非很小.
出現(xiàn)這一現(xiàn)象,最有可能的原因如上圖左方展示的那樣.參數(shù)更新時遇到了一個類似于“峽谷”的地方,在來回震蕩.
2.梯度下降的改進(jìn)方案
?

上圖展示了取不同學(xué)習(xí)速率時,對于同樣的凸面損失函數(shù)參數(shù)更新的效果.其中橫軸代表參數(shù)b的數(shù)值,縱軸表示參數(shù)w的數(shù)值,通過顏色來表示損失函數(shù)的數(shù)值大小,藍(lán)色色系表示較小的損失,紅色色系表示較大的損失,黃色的“叉”符號表示局部極小點(diǎn),黑色的點(diǎn)表示參數(shù)更新的軌跡.
取學(xué)習(xí)速率為10的-2次方時,參數(shù)更新的效果圖如上方左側(cè)所示.此時由于學(xué)習(xí)速率過大,參數(shù)在類似“峽谷”的兩端不斷地來回震蕩.
考慮到上面的情況無法更新到局部極小點(diǎn),將學(xué)習(xí)速率改小,改成10的-7次方,參數(shù)更新的效果如上圖右方所示,參數(shù)更新到“平坦”的地方,由于學(xué)習(xí)速率和梯度都很小,因此參數(shù)的更新非常緩慢.
綜合以上兩種情況,可以總結(jié)出解決這一問題的可行方案:當(dāng)計(jì)算的梯度非常大時,應(yīng)該需要很小的學(xué)習(xí)速率;當(dāng)計(jì)算的梯度非常小時,應(yīng)該需要很大的學(xué)習(xí)速率.這就如同孫子兵法里的“兵無常勢,水無常形,能因敵變化而取勝者,謂之神”,因此,需要根據(jù)梯度的大小來調(diào)整參數(shù)更新的步伐.
3.自適應(yīng)的更新方法
經(jīng)過上述分析可知,在更新參數(shù)時,參數(shù)更新的數(shù)量不僅和當(dāng)前的梯度、學(xué)習(xí)速率有關(guān)系,應(yīng)該也和歷史的梯度大小有關(guān)系.因此,傳統(tǒng)的參數(shù)更新方法應(yīng)該轉(zhuǎn)化為式(1).在式(1)中,表示待更新的參數(shù),i表示深度學(xué)習(xí)模型的第i個參數(shù),t表示參數(shù)更新的次數(shù),g表示更新的梯度分量,
表示學(xué)習(xí)速率,
表示學(xué)習(xí)速率的調(diào)整系數(shù),它本質(zhì)上是關(guān)于更新次數(shù)的函數(shù),更新次數(shù)的變化導(dǎo)致梯度變化,最終導(dǎo)致它的變化.
更新方法的變化本質(zhì)上歸結(jié)于,構(gòu)造
的思路不同就衍生出一系列的梯度更新算法.

3.1 Adagrad梯度下降方法
見公式(2),當(dāng)取歷史梯度的均方根(Root Mean Square)時,從概率論的角度來看即為二階原點(diǎn)矩開根號,梯度的平方求平均再開根號,此時梯度更新方法被稱為Adagrad梯度下降方法.易知,當(dāng)
關(guān)于梯度的表達(dá)式為公式(2)時,梯度較大時,
變大,在更新參數(shù)時取倒數(shù),參數(shù)更新的步伐變小;反之梯度較小時,
變小,在更新參數(shù)時取倒數(shù),參數(shù)更新的步伐變大.可以解決上面出現(xiàn)的問題.

??????
3.2 RMSProp梯度下降方法
?

上圖展示了使用?Adagrad參數(shù)更新方法可能遇到的新問題.其中橫軸表示參數(shù)w1的數(shù)值,縱軸表示w2的數(shù)值,等高線表示損失函數(shù)數(shù)值.如上圖所示,考慮w1參數(shù)更新的情況,一開始“坡度”較為陡峭,參數(shù)更新需要較小的學(xué)習(xí)速率;當(dāng)參數(shù)更新到中間區(qū)域時,“坡度”變得平滑,參數(shù)更新可能需要較大的學(xué)習(xí)速率.但是,使用Adagrad這種更新方法,可能對于當(dāng)前梯度的反應(yīng)并不是很靈敏,當(dāng)前梯度較小時,沒有立刻變小,仍然以之前積累的歷史梯度為主,導(dǎo)致當(dāng)前梯度仍然很大,反而在紅色箭頭部分得到了較小的學(xué)習(xí)速率.由此引出了RMSProp梯度下降方法.
RMSProp梯度下降方法認(rèn)為的數(shù)值取決于兩部分梯度信息,一部分為當(dāng)前梯度的數(shù)值,另一部分為歷史梯度的信息,通過一個參數(shù)
來調(diào)節(jié)兩部分信息的重要程度,見公式(3).
取值在0至1之間,是一個超參數(shù),如果認(rèn)為過去梯度的信息比較重要就將
設(shè)計(jì)得大一些,如果認(rèn)為當(dāng)前梯度的信息比較重要就將
設(shè)計(jì)得小一些.

3.3 學(xué)習(xí)速率的Scheduling技術(shù)
?

利用?Adagrad梯度下降方法對圖2中的實(shí)驗(yàn)做改進(jìn),發(fā)現(xiàn)Adagrad梯度下降方法是起作用的,如上圖所示.參數(shù)經(jīng)過足夠多次數(shù)的迭代和更新,確實(shí)可以找到局部極小點(diǎn).但是上圖仍然暴露出Adagrad梯度下降方法的不足之處.
考慮參數(shù)w的更新情況,在豎直方向上一開始梯度很大,參數(shù)更新的學(xué)習(xí)速率很小,在參數(shù)更新至“山谷”處之后,梯度很小.在積累了很多很小的梯度之后變得很大,參數(shù)就“飛出了視野之外”.之后梯度又變大了,參數(shù)又被修正回來,這個過程反復(fù)經(jīng)歷了多次.由此,可以看出,出Adagrad梯度下降方法的不足之處是參數(shù)更新的后期非常不穩(wěn)定,由此引出了學(xué)習(xí)速率的Scheduling技術(shù).
?

上圖展示了學(xué)習(xí)速率的Scheduling技術(shù)的兩種方案,一種是認(rèn)為學(xué)習(xí)速率隨著更新的次數(shù)不斷減小又被稱為學(xué)習(xí)速率的衰減(Learning Rate Decay),另外一種認(rèn)為學(xué)習(xí)速率應(yīng)該隨著更新次數(shù)先增大后減小(Warm Up).
學(xué)習(xí)速率的衰減很好理解,因?yàn)殡S著迭代次數(shù)的不斷增加,參數(shù)可能越來越接近局部極小點(diǎn),所以越到后期越應(yīng)該減小更新的速度.關(guān)學(xué)習(xí)速率的Warm Up技術(shù)一個很好的解釋是,前期對于損失函數(shù)一無所知,需要試探性地先多收集更多的信息,等收集完足夠多的信息之后,越來越接近局部極小點(diǎn),此時便可以放緩更新參數(shù)的步伐.
4.改進(jìn)后的梯度更新方法
結(jié)合“居高臨下,勢如破竹”-參數(shù)的動量更新方法一文中介紹的梯度更新的改進(jìn)版,融合本文探討的自適應(yīng)的梯度更新方法,事實(shí)上得到了一個最終版本關(guān)于梯度更新方法的改進(jìn)方案見公式(4)
?

在公式(4)中,參數(shù)的更新由學(xué)習(xí)速率
、動量m和均方根
共同決定,學(xué)習(xí)速率
、動量m和均方根
均為更新次數(shù)t的函數(shù),隨著t的變化而變化.其中學(xué)習(xí)速率{\eta}本質(zhì)上決定了參數(shù)更新的趨勢,動量m決定了參數(shù)更新的方向,均方根
參數(shù)變化的數(shù)量級.
?
?
?
?