機器之心報道
編輯:陳萍、杜偉
調參的苦與淚,還有那些「迷信的做法」。
每個機器學習領域的研究者都會面臨調參過程的考驗,當往往說來容易做來難。調參的背後往往是通宵達旦的論文研究與 GitHub 查閱,並需要做大量的實驗,不僅耗時也耗費大量算力,更深深地傷害了廣大工程師的頭髮。
有人不禁要問:調參是門玄學嗎?為什麼模型明明調教得很好了,可是效果離我的想象總有些偏差。
近日,reddit 上一則帖子引發了網友熱議,「機器學習調參領域有哪些迷信的看法或做法呢?」
原貼地址:https://www.reddit.com/r/MachineLearning/comments/rkewa3/d_what_are_your_machine_learning_superstitions/?sort=confidence
關於調參的那些「秘訣」
在機器學習中,超引數調整是一項必備技能,透過觀察在訓練過程中的監測指標如損失 loss 和準確率來判斷當前模型處於什麼樣的訓練狀態,及時調整超引數以更科學地訓練模型能夠提高資源利用率。
每個人都會根據自己的實際經驗進行模型調參,最終,絕大多數研究者可能得出的經驗就是:
- Random seed = 0 得到壞的結果
- Random seed = 42 得到好的結果
- Even-valued k in k-Means = insightful segmentation
有人將這一經驗總結奉為所謂的 ML「迷信做法」,但其實不然,幾乎所有學者都這樣做。
不過,也有網友對這一經驗總結持懷疑態度:網友 @SlashSero 遺憾地表示,這種情況甚至會出現在非常有名的科學出版物上,尤其是在交叉驗證不可行或者易受其他引數選擇影響的機器學習應用中,因此超引數最佳化(HPO)不可行。不妨看看 NeurIPS 會議論文有多少擁有真正透明的程式碼庫和易於復現的交叉驗證研究,以證實他們的工作較去年提升了 0.5-1% 的效能。
另外,很多時候出於對研究者的信任,但其實會導致新的深度學習模型在實踐中並沒有表現出明顯優於傳統模型的效能。我們應該看到,社群存在這樣一種現狀:花費大量時間確保模型真正兌現它所表現出的效能,並且可復現和透明,這是一項吃力不討好的工作。消耗計算資源不說,還有可能失去在一個發展極快的領域發表論文和獲得表彰的機會。
為了實現模型最佳效能,各路網友也紛紛曬出自己的煉丹經驗:有網友認為 Random seed 必須是 10 的倍數,最好是 1000(不過該回答遭到了別人的反駁)。
除了 Random seed 設定外,有研究者分享了自己的一些科研小技巧。
模型的訓練過程,近乎黑盒,假如期間發生程式錯誤,很難察覺到,有網友建議隨時隨地進行「print」是一個很好的習慣,在程式第一次執行時,一定要列印所有可能的東西,「print」能讓你知道程式進行到哪一步,有沒有陷入死迴圈...... 其實,絕大多數程式設計師都會這樣做。
除了「print」外,有人表示日誌記錄也非常有必要,在實驗室做科研,有時為了跑一個程式,需要花費好幾天的時間,但總有那麼不順心的地方,要麼好久不斷電的實驗室突然斷電,要麼伺服器崩了…… 所以隨時隨地儲存日誌也是每個程式設計師必備的,檢視日誌記錄,你能發現程式執行到哪了,粗略估計模型效能,還能檢視錯誤:
還有網友曬出了自己的 dropout 經驗,認為超過 20% 的 dropout 將使該模式難以恢復。不過這只是這位網友自己的經驗,也有人表示自己採用 90% 的 dropout,模型效能最好。
除此以外,有網友總結了批大小應該是 2 的冪次方。
以上就是網友總結的一些 ML 煉丹小技巧。
玄學論文難復現
雖然調參有用,但網友 @ostrich-scalp 犀利地批駁道,「大多數論文的結果都是胡說八道,將我的職業生涯都用來實現這些工作並期望建立像模像樣可用於生產的模型,這是一個極大的錯誤。」
上面那位老哥 @SlashSero 接茬說道,「令人難以置信的是,ACM、IEEE、IAAA 和 NeurIPS 上發表的論文有多少完全只是出於對作者的信任。到現在為止,你可能希望所有知名期刊和會議都要求論文作者開源和復現程式碼,但這種情況只是例外。」
顯然,機器學習是一門技術。雖然神經網路黑箱的狀態讓可解釋性受限,但我們可以在較高層面上透過經驗解決面臨的問題。我們需要載入資料,建立框架,讓系統執行起來,設定度量標準,調整引數並分析誤差,進行特徵工程,結果視覺化等等步驟。最終經過數次迭代直至推理的準確率不再提升。
那麼為什麼各種玄學現象仍然不斷出現,拷問著我們的心靈?看來,我們對這門學科的瞭解還不夠多。
不過請記住 NIPS 2017 大會上圖靈獎得主 Judea Pearl 演講的最後一頁 Keynote:
資料科學僅當能促進對資料的合理解讀時才能被稱為科學。
不過也不用怕,深度學習調參總還是有技巧可循的,大致可以總結如下。這些算不得迷信做法,僅供參考。
- 尋找合適的學習率。作為一個非常重要的引數,學習率面對不同規模、不同 batch-size、不同最佳化方式和不同資料集,它的最合適值都是不確定的。我們唯一可以做的,就是在訓練中不斷尋找最合適當前狀態的學習率;
- 權重初始化。相比於其他的 trick 來說使用並不是很頻繁。只有那些沒有預訓練模型的領域會自己初始化權重,或者在模型中去初始化神經網路最後那幾個全連線層的權重。常用權重初始化演算法是「kaiming_normal」或「xavier_normal」;
- 資料集處理,主要有資料篩選和資料增強;
- 多模型融合,這是論文刷結果的終極核武器,深度學習中一般有幾種方式,比如同樣的引數,不同的初始化方式;不同的引數,透過交叉驗證選取最好的幾組;不同的模型,進行線性融合,例如 RNN 和傳統模型;
- 餘弦退火和熱重啟的隨機梯度下降。餘弦退火就是學習率類似餘弦函式慢慢下降,熱重啟就是在學習的過程中,學習率慢慢下降然後突然再回彈 (重啟) 然後繼續慢慢下降;
- 嘗試過擬合一個小資料集。關閉正則化 / 隨機失活 / 資料擴充,使用訓練集的一小部分,讓神經網路訓練幾個週期。確保可以實現零損失,如果沒有,那麼很可能什麼地方出錯了。
- ……
調參路上各有各的「路數」,適合自己就好。
最後問一句,煉丹的你有哪些獨門秘籍呢?
參考連結:
https://www.jiqizhixin.com/articles/2020-10-21-3
https://picture.iczhiku.com/weixin/message1609136710592.html