優化器(Optimizer)介紹
Gradient Descent(Batch Gradient Descent,BGD)
梯度下降法是最原始,也是最基礎的演算法。
它將所有的資料集都載入,計算它們所有的梯度,然後執行決策。(即沿著梯度相反的方向更新權重)
優點是在凸函式能收斂到最小值。但顯而易見的是,這方法計算量太大。假如我們的資料集很大的話,普通的GPU是完全執行不來的。還有一點,它逃不出鞍點,也容易收斂到區域性最小值(也就是極小值)。
Stochastic Gradient Descent
隨機梯度下降法相比較BGD,其實就是計算梯度時根據的資料不同。SGD根據的是一整個資料集的隨機一部分(上網有些介紹都是說根據每一個樣本,emmm,但是現在都是採用一個隨機的部分樣本)。
也就是說,它更新的速度比較頻繁。因為我們隨機選取的小批量資料(mini-batch)並不是太多,所以計算的過程也並不是很複雜。相比起BGD,我們在相同的時間裡更新的次數多很多,也自然能更快的收斂。
但還是有缺點的,一個是CS231n提到的:
這裡我不是很明瞭,涉及到了海森矩陣。原話是假設二維的例子中損失函式在某個方向變化很快但在另外個方向變化很慢,SGD就會在變化慢的方向來回,導致變化快的方向不會有很大的跨度。
類比:
我們可以很清楚的聯想起來,在滑板的時候,假如你的起點在兩邊的邊上,你能夠想象,你下降最快的方向不是沿著左右兩邊,而是斜著向下。這樣,我們權重更新的方向也會跟著一樣。
還有一個是噪聲會相對較大。這個很容易理解,因為你應用在整個訓練集的模型,它更新的梯度卻是利用訓練集的一部分。但在網上找資料的時候,https://zhuanlan.zhihu.com/p/36816689,講了噪聲如何幫助SGD逃出鞍點。
但是CS231n是用了另外一種方法來使得SGD克服上面所提到的缺點,例如。那就是加上一個動量(Momentum)。
可以看到,現在SGD更新的梯度不僅是算出來的梯度,更要加上上一步的梯度。但有個引數讓我們調整上一步梯度佔的比重。
現在來看看如何做到克服上面的問題的。前面說到無法逃離鞍點和極小值(哪個方向損失都增大)是因為梯度都為0,因此停滯不前。但由於這個Momentum的出現,導致在哪個地點都還有一定的梯度,所以我們的網路可以繼續更新下去。至於那個之字形,我畫了一個圖。
在標記的藍色那個點,如果不加Momentum,更新的方向就是藍色向量。但是由於我們加了個上一步的梯度,也就是綠色的向量,現在我們更新的向量是黃色的,也就是不再是垂直方向,而是在水平方向。這在一定程度就克服了上面說的缺陷。
Nesterov
其實這個作圖有點讓人混亂,因為這樣看它們好像是更新一樣的梯度。其實不是的。在第二幅圖裡面,C走到D是根據C那個點的梯度,然後作者把BD連起來說這是B點實際梯度下降的方向。所以,我們應該要搞清楚!!!它們不是一樣的。
我們可以讓每個字母代表對應點的引數,代表的梯度,那:
結論:在原始形式中,Nesterov Accelerated Gradient(NAG)演算法相對於Momentum的改進在於,以“向前看”看到的梯度而不是當前位置梯度去更新。經過變換之後的等效形式中,NAG演算法相對於Momentum多了一個本次梯度相對上次梯度的變化量,這個變化量本質上是對目標函式二階導的近似。由於利用了二階導的資訊,NAG演算法才會比Momentum具有更快的收斂速度。
AdaGrad
我們累計每一次梯度的平方,接著讓學習率除以它的開方。這個的作用是為了改變不同引數的學習率。假如一個引數的梯度一直很大,那麼通過這個約束,它改變的就越少。假如一個引數的梯度一直很小,那麼通過這個約束它,它變化的也就越快。這裡的是防止分母為0。
但問題是,因為是一直在累積的,這個grad_squared一定會變得越來越大,最後的結果是,權重更新的步長也會不可避免的變得很小。為了克服這個問題,有了RMSpro。
RMSprop
可以看出來,它只是改變了grad_squared。添加了一個衰減率(一般0.9或者0.99),可以使得grad_squared的變化不會因為時間的累積而變得太大。
但也由於衰減的問題,grad_squard是可能導致我們訓練一直在變慢的。(我理解是後面累積的梯度太少了,但因為前面的梯度太多,沒有辦法加速,當然,我沒有找到資料,但斯坦福課程上面Johnson是這樣說的)
PS:有些人將RMSprop和Nesterov結合起來。
Adam
可以看出來,紅色的部分是類似與Momentum的方法,而藍色的部分則是利用了RMSprop的衰減。因此這個演算法是很好的結合了這兩個的優點。
之所以有綠色方框的Bias Correction是因為想要避免一個情況:一開始的梯度太小,因此學習率除以second_moment的值太大,步長太大容易跑到一個奇怪的地方。導致收斂之後的效果不好。因此我們有了Bias correction,學習率也是除以second_unbias。
Adam一般來說是收斂最快的優化器,所以被用的更為頻繁。當然,它還有變體AdamMax,但知道了Adam再去看其它也不是很難了。