各位煉丹 er 們,調參是你們最頭疼的環節嗎?
現在,一份上線不到一天就狂攬 1200+ 星的《深度學習調優手冊》來了。
△數字還在飛速上漲,估計馬上就要登熱榜了
這可能是市面上首個如此全面的煉丹寶典,由5 位谷歌工程師大佬合作總結。
這些大佬們都已在深度學習領域 " 踩坑 " 多年、工作成果應用從語音識别到天文學都有涉獵。
為了這份手冊,他們總結了自己在訓練網絡、帶新工程師、以及和同事交流時 get 到的各種經驗和技巧。
連 " 深度學習之父 "Geoffrey Hinton 都來盛贊:
來看看具體都有些啥。
谷歌煉丹寶典,聚焦超參數調整
本手冊适用範圍為:對系統地最大化深度學習模型性能感興趣的工程師和研究人員,包括個人和團隊。
默認翻開這本手冊的都掌握了機器學習基本知識和深度學習概念。
其中内容主要聚焦超參數調整,因為這是作者們在工作中耗時最多、收獲也最多的環節。
具體一共分為四大部分:
開始新項目
第一部分從訓練一個新的模型開始,教大家如何選擇:
(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,具體這裡就不再贅述。
其他補充
到這裡,寶典差不多就接近尾聲了,谷歌研究員們還貼心地給出了一份 pipeline 訓練的補充指南,内容包括:
優化輸入 pipeline
評估模型性能
保存檢查點并回顧性地選擇最佳檢查點
建立實驗跟蹤
Batch 規範化實現細節
multi-host pipelines 的注意事項
在 " 優化輸入 pipeline" 部分,寶典列出了導緻輸入 pipeline 的一些常見原因,并給出了一些小 tips。
關于 " 評估模型性能 ",也給出了詳細的操作步驟。
……
寶典全文的鍊接也已附在文末,感興趣的朋友可以扔進收藏夾了。
mem it~
關于作者
一共 4 位谷歌在職大佬,1 位哈佛的在讀博士生(以前也在谷歌工作了 5 年多)。
Varun Godbole,目前是谷歌 AI 的一名軟件工程師,主要經驗集中在建模和構建處理大型數據集的基礎設施方面。
之前,他的研究領域是計算機視覺和醫學圖像的交叉點,合著的論文 "International evaluation of an AI system for breast cancer screening" 曾登上 Nature。
George E. Dahl,是谷歌大腦團隊的研究科學家,他的研究集中在高度靈活的模型上,并且他還對語言、感知數據以及化學、生物和醫學數據的應用感興趣。
George 在多倫多大學攻讀博士學位時,主要解決語音識别、計算化學和自然語言文本處理等問題的深度學習方法,其中包括一些首次成功的深度聲學模型。
Justin Gilmer,谷歌大腦的研究科學家,他在 Google Scholar 上引用已經破萬,主要研究方向為深度學習、組合型、随機圖論。
量子位前不久的《幾十年數學難題被谷歌研究員意外突破!曾因不想搞數學自學編程,當年差點被導師趕出門》講的正是這位科學家。
Christopher Shallue,目前正在攻讀哈佛大學的天體物理學博士學位,在此之前,他曾在谷歌工作了 5 年 10 個月。
在谷歌工作的那段時間,Shallue 有 3 年多的時間在谷歌大腦擔任機器學習研究工程師,研究的内容包括:
開發識别系外行星的機器學習技術(包括神經網絡首次發現行星)
加快超級計算機規模的機器學習培訓
實證研究機器學習中的優化算法和超參數調整
TensorFlow 中的開源參考模型實現(圖像字幕、句子嵌入、系外行星探測)
Zachary Nado,谷歌大腦的研究工程師,本科就讀期間,曾先後在谷歌和 SpaceX 實習,研究領域包括數據挖掘與建模、機器智能、NLP 等。
寶典傳送門:
https://github.com/google-research/tuning_playbook