文章來自:微信公衆號【機器學習煉丹術】算法
最經常使用的Adam優化器,有着收斂速度快、調參容易等優勢,可是也存在常常被人吐槽的泛化性問題和收斂問題。微信
所以,在不少大佬的代碼中,依然會使用傳統的SGD+momentum的優化器。機器學習
關於兩個優化器的比較,仁者見仁智者見智,能夠看一下這篇文章,有簡單的關於這兩個優化器的代碼實現和效果比較:
Pytorch的SGD,SGDM,Adam,RAdam的代碼實現學習
這篇文章就隨便的談一談下面的問題,來讓你們擴展一下知識:測試
對機器學習有了解的朋友,應該對Adam優化器不陌生了。大致來講就是Momentum + Adagrad + RMSProp的結合。優化
【若是須要的話,以後能夠簡單易懂的通俗講講各類類型的優化器的算法】spa
從Adam和SGDM中就能夠得知,Momentum是一個很好的設計。.net
在討論模型泛化問題的時候,咱們會但願模型找到的極小值(收斂位置),是一個比較平緩、不陡峭的位置!,緣由看下圖:
![](http://helloworld2020.net/wp-...設計
左邊的那個收斂點是一個比較平緩的點,而右邊的是一個很是陡峭很是sharp的收斂點。而訓練集和測試集雖然要求同分佈,可是其實仍是會有微小的差異。blog
對於陡峭的收斂點,訓練集的損失可能會很小,可是測試集的損失極可能就很大。而平坦的收斂點就不會這樣。這就是泛化問題,有的時候也被當作過擬合現象。
可是咱們是也沒法直接證實Adam老是找到sharp的極小值。不過不少很論或多或少都只指出了Adam在測試的時候error會較大。
這裏有一張圖,能夠看到,雖然Adam在訓練集中收斂速度最快,可是測試集的效果並非很是的好。
Adam在某些狀況下會出現沒法收斂的狀況,最著名的關於這個問題的Adam的吐槽就是這個論文:
2018 ICLR的best paper:On the Convergence of Adam and Beyond
可是這個問題其實並非咱們這種人常常會遇到的,反而泛化問題是一個真正的困擾。
大佬們常常用的一個learning rate scheduling方案就是warn-up+decay。
【warn-up】
是指不要一開始用高的learning-rate,應該要從低的慢慢增大到base-learning rate。學習率從小到大。
【decay】
隨着optimization的步數的增加,逐漸下降learning rate。
Decay的部分其實很常見,全部的人都會用,可是warn-up其實就有點詭異了,在ResNet的論文中其實能夠看到這個。
Radam 是在warm up的時候提出了一些有效的策略。