紐約大學(xué)課程: 深度學(xué)習(xí)中的優(yōu)化工具
1梯度下降
我們以所有方法中最基本、最差的(原因后文敘述)的梯度下降法來開始我們對優(yōu)化方法的學(xué)習(xí)。
問題:
迭代式:
其中,
是第 次迭代后的更新值, 是第 次迭代前的初始值, 是步長, 是 的梯度。
這里假設(shè)函數(shù)
迭代更新式中的參數(shù)
標(biāo)準的方式是嘗試一串呈對數(shù)比例的值然后使用最好的值。這里可能會出現(xiàn)一些不同的情況。上面這張圖描繪了一元二次函數(shù)的情況。如果學(xué)習(xí)率太小,那么我們將穩(wěn)定地向最小值前進。但是,這可能會比理想狀態(tài)更費時。
想得到一個步長值可以直接得到最小值是非常困難的(或者不可能的)。一個比較理想的想法是得到一個比理想步長稍大一點的步長。實際中,這樣收斂最快。但是如果我們使用過大的學(xué)習(xí)率,那么將會迭代至離最小值很遠導(dǎo)致不收斂。在實際中,我們想使用稍小于不收斂的學(xué)習(xí)率。

2隨機梯度下降
在隨機梯度下降中,我們用梯度向量的隨機估計替換實際的梯度向量。專門針對神經(jīng)網(wǎng)絡(luò),隨機估計是指單個數(shù)據(jù)點(單個實例)的損耗梯度。
令
最終我們想最小化的函數(shù)是
在SGD中,我們根據(jù)
如果
結(jié)果,SGD 的預(yù)期第
因此,任何 SGD 更新都與預(yù)期的批次更新相同。但是,SGD 不僅具有噪聲的更快的梯度下降。除了更快之外,SGD 還可以比全批次梯度下降獲得更好的結(jié)果。SGD 中的噪聲可以幫助我們避免淺的局部最小值,并找到更好的(較深)最小值。這種現(xiàn)象稱為 退火.

總的來說,隨機梯度下降的優(yōu)點如下:
1、跨實例有很多冗余信息,SGD 可以防止很多此類冗余計算。 2、在初期,與梯度中的信息相比,噪聲較小。因此,SGD 的一步和 GD 的一步實際上一樣好 . 3、退火 - SGD 更新中的噪聲可阻止收斂到壞的(淺)局部最小值。 4、隨機梯度下降計算的成本大大降低(因為您無需遍歷所有數(shù)據(jù)點)。
Ξ小批次處理
在小批次處理中,我們考慮多個隨機選擇的實例上的損失,而不是僅計算一個實例上的損失。這樣可以減少步進更新中的噪聲。
通常,我們可以通過使用小型批處理而不是單個實例來更好地利用我們的硬件。例如,當(dāng)我們使用單實例訓(xùn)練時,GPU使用率很低。分布式網(wǎng)絡(luò)訓(xùn)練技術(shù)將大型微型批處理在群集的機器之間進行分割,然后匯總生成的梯度。Facebook 最近使用分布式訓(xùn)練在一個小時內(nèi)對 ImageNet 數(shù)據(jù)上的網(wǎng)絡(luò)進行了訓(xùn)練。
重要的是要注意,梯度下降絕對不能用于全尺寸批次。如果您想以完整的批次大小進行訓(xùn)練,請使用一種稱為 LBFGS 的優(yōu)化技術(shù)。PyTorch 和 SciPy 都提供了該技術(shù)的實現(xiàn)。
3動量
在動量中, 我們有兩個迭代 (
替代形式: 隨機重球法
該形式在數(shù)學(xué)上與先前的形式等價。在這里,下一步是上一步的方向(
Ξ直觀
SGD 動量類似于物理學(xué)中的動量概念。優(yōu)化過程就像一個沉重的球滾下山坡,動量使球保持與已經(jīng)移動的方向相同的方向,梯度可以認為是沿其他方向推動球的力。

Source:distill.pub[1]
動量并沒有使行進方向發(fā)生巨大變化(如左圖所示),而是產(chǎn)生了適度的變化。動量可減輕僅使用SGD時常見的振蕩。

Ξ實用指南
動量必須總是與隨機梯度下降一起使用。
當(dāng)增加動量參數(shù)以保持收斂時,通常需要減小步長參數(shù)。如果
Ξ為什么動量有用?
加速
以下是涅斯捷羅夫動量的更新規(guī)則。
使用涅斯捷羅夫動量,如果你非常仔細地選擇常數(shù),則可以加快收斂速度。但這僅適用于凸問題,不適用于神經(jīng)網(wǎng)絡(luò)。
許多人說,正常的動量也是一種加速的方法。但實際上,它僅對二次方加速。此外,由于 SGD 帶有噪音,加速不適用于 SGD,因此不適用于 SGD。因此,盡管 Momentum SGD 有一些加速作用,但僅憑它并不能很好地解釋該技術(shù)的高性能。
噪聲平滑
可能一個更實際和更可能動量效果很好的原因是噪聲平滑。動量均衡了梯度。這是我們用于每個步驟更新的漸變的平均值。從理論上講,為了使 SGD 能夠正常工作,我們應(yīng)該對所有步驟進行平均。
SGD 具有動量的優(yōu)點在于,不再需要進行平均。動量為優(yōu)化過程增加了平滑度,從而使每次更新都很好地接近解。使用 SGD,你需要平均所有的更新,然后朝這個方向前進一步。
加速和噪聲平滑都有助于提高動量性能。

使用 SGD,在求解初期取得良好的進展,但是當(dāng)?shù)竭_函數(shù)最低區(qū)域(谷底)時,會在此反彈。如果我們調(diào)整學(xué)習(xí)率,我們的反彈速度將會變慢。有了動量,就會使步伐變得平穩(wěn),以至于沒有反彈發(fā)生。
https://atcold.github.io/pytorch-Deep-Learning/
?參考資料?
distill.pub: https://distill.pub/2017/momentum/
[2]原文: https://atcold.github.io/pytorch-Deep-Learning/zh/week05/05-1/
