經過前面的文章,目前在單一個Step的訓練節點內,能做的優化其實已經做的差不多了。接下來大概就是訓練次數以及一些超參數的調整。讓我們先回到一組很基礎但又很重要的超參數「Learning Rate」&「Optimizer」。
讓我們首先回想一下,所謂的「用資料訓練模型」,具體而言到是作什麼事情?以大多的Deep Learning模型來說,不外乎就是在Backward-Propagation的大框架下,利用資料產生梯度,然後更新模型參數,接著再驗證準確度,直至有滿意(或可接受)的準確為止。
在這樣的框架底下,Learning Rate與Optimizer就有點男女主角的味道在。大致上每一個更新參數的Step可以寫作下面的式子:
根據上面的式子,Learning Rate好比是,每一步(每次迭代)步伐的大小。而Optimizer則是,每一步走路的pattern。
一般大多關於Optimizer的文章及實驗結果都還是根據某一個情況實驗下得到的結果,暫且沒有最佳解,也因此不少人也會花時間在上面進行調整。比較有人用的optimizer,基本上在Pytorch裡頭都有實作,具體可以參考torch.optim。
而Optimizer事實上非常難仔細描述,想視覺化理解的話,可以參考Alec Radford大神當年在reddit文章po的圖:
看能不能感知出些什麼?
在不少探討Optimizer到底是幹了些什麼事的文章中,其中滿經典的是The Marginal Value of Adaptive Gradient Methods in Machine Learning,主要在討論adaptive家族的optimizer(像是 AdaGrad、RMSProp、以及最常見的Adam)比起傳統的SGD,範化性(generalization)的能力差很多,算是值得一看,下圖是裡頭的實驗結果:
現在Adam由於其快速收斂的特性,仍是最受歡迎的演算法。不過也因為上述說的這個性質,曾聽說過有團隊的工作方式是先用Adam做實驗,產品化的模型則利用SGD再產出。
Learning Rate也是一項藝術,太小不動,太大則亂飄甚至爆炸。概念上大概可以參考下圖(來源傳送門):
但大部分的情況,你問我要怎麼挑,老實說我也不知道,很多時候其實都是用1e-3或1e-4這種magic number開始慢慢tune,或是另外一種滿實際的方法是去找類似資料的文獻,參考他們的超參數選擇也是很好的出發點。另外也有一種自動挑選Learning Rate的方式,會在明日的文章做一起實作。
再者,即使挑到了好的初始Learning Rate,其實也很難確保後續是不是真的表現一樣好?由此因應而生的便是Learning Rate Scheduler,藉由在訓練的途中對learning rate進行變化,進而達到比較理想的訓練結果。不同的Scheduler可以參考下面這張圖(來源傳送門):
跟optimizer一樣,比較熱門的Pytorch都有實作,可參考torch.optim.lr_scheduler。