豐色 Pine 發自 凹非寺
各位煉丹er們,調參是你們最頭疼的環節嗎?

現在,一份上線不到一天就狂攬1200+星的《深度學習調優手冊》來了。

△數字還在飛速上漲,估計馬上就要登熱榜了
這可能是市面上首個如此全面的煉丹寶典,由5位Google工程師大佬合作總結。

這些大佬們都已在深度學習領域「踩坑」多年、工作成果應用從語音識別到天文學都有涉獵。
為了這份手冊,他們總結了自己在訓練網路、帶新工程師、以及和同事交流時get到的各種經驗和技巧。
連「深度學習之父」Geoffrey Hinton都來盛讚:

來看看具體都有些什麼。
Google煉丹寶典,聚焦超參數調整
本手冊適用範圍為:對系統地最大化深度學習模型性能感興趣的工程師和研究人員,包括個人和團隊。
默認翻開這本手冊的都掌握了機器學習基本知識和深度學習概念。
其中內容主要聚焦超參數調整,因為這是作者們在工作中耗時最多、收穫也最多的環節。
具體一共分為四大部分:
開始新項目
第一部分從訓練一個新的模型開始,教大家如何選擇:
(1)模型架構(2)最佳化器(3)batch size(4)初始配置。
比如,在選擇最佳化器時,由於所有類型的機器學習問題和模型架構中都不存在最好的那一個,那麼我們就堅持選擇時下最流行、最成熟的那一個(尤其對於新項目來說)。
這裡作者們推薦(但不限於):SGDM和更通用的Adam、NAdam,特別提醒:Adam有4個可調超參數 ,它們都很重要。
而在選擇batch size時,需要注意它只是決定訓練速度,不應該直接用於調整驗證集的性能。
因為有研究表明,只要所有超參數都經過良好調整(尤其是學習率和正則化超參數)並且訓練步數足夠,任何batch size值都應該可以獲得相同的性能。
通常來說,理想的batch size是可用硬體支持的最大值。
具體如何選擇,手冊在這裡作出了非常詳細的解釋:

初始配置方面,指導原則是找到一個簡單、相對快速、資源消耗相對較低的配置,好獲得一個「合理」的結果。
所謂簡單,就是切記不要在開始時就添加一些花裡胡哨的東西,現階段沒用不說還浪費時間。
比如在找到一個合適的學習率之前,就不要想著各種花式的decay schedule。
科學提高模型性能
本部分的經驗建立以下兩點前提之上:
我們已經有一個完全運行的訓練pipeline以及能夠獲得合理結果的配置;
有足夠的計算資源用於進行有意義的調整實驗、用於並行運行多個訓練項目。
具體一共分為7個小部分:
第1部分標題為「逐步調整策略」,即從一個簡單的配置開始,逐步進行改進,需要重複以下四個步驟:
為下一輪實驗確定範圍適當的目標;
設計並運行實驗,朝著目標取得進展;
分析結果;
考慮是否推出新的最佳配置。
後續部分就是圍繞上面四個步驟進行詳細的展開,超參數如何選擇和修改也在本節作為重點出現。
比如不管我們的實驗目標是什麼,我們都需要將超參數分為三類:科學超參數、nuisance超參數和固定超參數。
如果我們的目標是「確定具有更多隱藏層(hidden layer)的模型是否會減少驗證錯誤」,那麼隱藏層數就是一個科學超參數,這是我們在設計新實驗時需要首先確定的。
需要修改的主要是第二類。
當我們進行到第三步,也就是分析結果時,需要額外問自己以下幾個問題:
搜尋空間是否足夠大?是否從裡面取樣了足夠多的點?該模型是否存在最佳化問題?我們可以從最佳試驗的訓練曲線中學到什麼?
具體怎麼判斷和解決這些問題,手冊也有非常詳細的解釋。
最後,當我們確定好了應該調整哪些超參數,就可以善用貝葉斯最佳化工具了。
不同工作負載如何設置訓練步數
在這部分,手冊根據工作負載的不同分了兩部分來展開,分別為:
工作負載為計算密集型(CPU密集型)時,訓練步數如何設置?
工作負載為非計算密集型(IO密集型)時,訓練步數如何設置?
通俗來講,計算密集型與非計算密集型就是受不受計算量的限制。而我們要解決的問題,就是無論在哪種情況下,如何讓模型都能達到最佳效果。
也不多說廢話,直接舉個栗子🌰來看寶典中是如何講的?
當工作負載受計算限制時,也就是說計算資源成為主要的限制因素,首先面臨的問題就是:
如果訓練損失在無限期的改善,有沒有必要這樣一直訓練下去?
寶典給出的答案是:沒有!多輪調整最明智,1~3輪最實用。
並且還附有兩輪調整的具體建議:
第1輪:較短的運行時間以找到好的模型和最佳化器超參數
第2輪:不要在良好的超參數點上長時間運行以獲得最終模型
(詳見手冊)

關於當工作負載不受計算限制時,調整的部分主要圍繞max_train_steps,具體這裡就不再贅述。
其他補充
到這裡,寶典差不多就接近尾聲了,Google研究員們還貼心地給出了一份pipeline訓練的補充指南,內容包括:
最佳化輸入pipeline
評估模型性能
保存檢查點並回顧性地選擇最佳檢查點
建立實驗跟蹤
Batch規範化實現細節
multi-host pipelines的注意事項
在「最佳化輸入pipeline」部分,寶典列出了導致輸入pipeline的一些常見原因,並給出了一些小tips。

關於「評估模型性能」,也給出了詳細的操作步驟。

……
寶典全文的連結也已附在文末,感興趣的朋友可以扔進收藏夾了。

mem it~
關於作者
一共4位Google在職大佬,1位哈佛的在讀博士生(以前也在Google工作了5年多)。
Varun Godbole,目前是GoogleAI的一名軟體工程師,主要經驗集中在建模和構建處理大型資料集的基礎設施方面。

之前,他的研究領域是計算機視覺和醫學圖像的交叉點,合著的論文「International evaluation of an AI system for breast cancer screening」曾登上Nature。
George E. Dahl,是Google大腦團隊的研究科學家,他的研究集中在高度靈活的模型上,並且他還對語言、感知資料以及化學、生物和醫學資料的應用感興趣。

George在多倫多大學攻讀博士學位時,主要解決語音識別、計算化學和自然語言文字處理等問題的深度學習方法,其中包括一些首次成功的深度聲學模型。
Justin Gilmer,Google大腦的研究科學家,他在Google Scholar上引用已經破萬,主要研究方向為深度學習、組合型、隨機圖論。

量子位前不久的《幾十年數學難題被Google研究員意外突破!曾因不想搞數學自學程式設計,當年差點被導師趕出門》講的正是這位科學家。
Christopher Shallue,目前正在攻讀哈佛大學的天體物理學博士學位,在此之前,他曾在Google工作了5年10個月。

在Google工作的那段時間,Shallue有3年多的時間在Google大腦擔任機器學習研究工程師,研究的內容包括:
開發識別系外行星的機器學習技術(包括神經網路首次發現行星)
加快超級計算機規模的機器學習培訓
實證研究機器學習中的最佳化演算法和超參數調整
TensorFlow 中的開源參考模型實現(圖像字幕、句子嵌入、系外行星探測)
Zachary Nado,Google大腦的研究工程師,本科就讀期間,曾先後在Google和SpaceX實習,研究領域包括資料探勘與建模、機器智慧、NLP等。

寶典傳送門:
https://github.com/google-research/tuning_playbook