深度學習如煉丹,你有哪些迷信做法?網友:Random seed=42結果好
每個機器學習領域的研究者都會面臨調參過程的考驗,當往往說來容易做來難。調參的背后往往是通宵達旦的論文研究與 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 犀利地批駁道,「大多數論文的結果都是胡說八道,將我的職業生涯都用來實現這些工作并期望創建像模像樣可用于生產的模型,這是一個極大的錯誤?!?/p>
上面那位老哥 @SlashSero 接茬說道,「令人難以置信的是,ACM、IEEE、IAAA 和 NeurIPS 上發表的論文有多少完全只是出于對作者的信任。到現在為止,你可能希望所有知名期刊和會議都要求論文作者開源和復現代碼,但這種情況只是例外?!?/p>
顯然,機器學習是一門技術。雖然神經網絡黑箱的狀態讓可解釋性受限,但我們可以在較高層面上通過經驗解決面臨的問題。我們需要加載數據,建立框架,讓系統運行起來,設定度量標準,調整參數并分析誤差,進行特征工程,結果可視化等等步驟。最終經過數次迭代直至推理的準確率不再提升。
那么為什么各種玄學現象仍然不斷出現,拷問著我們的心靈?看來,我們對這門學科的了解還不夠多。
不過請記住 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
【本文是51CTO專欄機構“機器之心”的原創譯文,微信公眾號“機器之心( id: almosthuman2014)”】