編者按:FAIR研究科學家Tim Rockt?schel、牛津大學人工智能研究者Jakob Foerster、Greg Farquhar討論了機器學習研究項目的常見誤區,同時給出了有助于項目成功的中肯建議。
每年都有很多學生聯系我們,表示想要和我們一起進行短期的機器學習研究項目。到目前為止,我們已經指導了不少學生了。我們注意到有一些反復出現的指導意見,因此寫了這篇文章分享。我們相信本文的建議會對機器學習領域的暑期實習研究項目或碩士論文項目有幫助。我們并不打算寫一篇全面指導的文章,而是想要強調我們反復碰到的誤區。例如,我們不會討論如何選擇一個好項目,或者進行機器學習研究項目的一般方法。文中的一些建議適用于所有機器學習研究項目,特別是深度學習和強化學習研究項目。不過,有些建議只適用于短期項目,在3個月的時間限制下,這些建議很重要,但對于3-5年的博士生而言,相對而言不那么重要。
1 主要誤區
1.1 假設你的代碼沒有bug
眾所周知,機器學習,特別是深度學習模型和強化學習模型,很難調試。Andrej Karpathy曾發推列舉一些常見的犯錯情況:
沒有首先嘗試過擬合單個batch。
忘了切換訓練/評估模式。
在.backward()前忘了.zero_grad()。
將softmax輸出傳給期望原始logit的損失函數。
搭配BatchNorm使用線性層/二維卷積層時沒有設置bias=False,或者相反,忘了在輸出層中設置bias。
以為view()和permute()是一回事(然后在該用permute的地方錯誤地使用了view)。
我們所有人,甚至包括非常資深的研究者,都經常犯這類錯誤。由于有bug的模型經常仍然能夠學習并生成有意義的輸出,所以很難檢測到這類錯誤。bug也許會給你的模型帶來微妙的改變,而大多數情況下只有到了運行時才會顯現。意識到這點后,假定你的代碼沒有任何錯誤實在是大錯特錯。對自己代碼的態度常常能夠區分高效的研究者和低效的研究者。如果你的默認假定是你的代碼可能有錯誤,那么你會更仔細地檢查bug。逐行步進代碼,仔細地檢查中間輸出。可能的話,可視化中間輸出。張量的形狀對不對?張量的初始化、克隆、剝離是否恰當?檢測訓練過程中的梯度,留意NaN。編寫單元測試,還有通過設定隨機數生成器的種子使試驗可重現,這些都可能有幫助。關于更多神經網絡調試的竅門,可以看Goodfellow等的Deep Learning(花書)的11.5節。
1.2 只看最終評估測度
盡管你的項目的目標之一也許是提高某項評估測度的分數,但更重要的是發展模型如何起效和為何奏效的良好理解。特別是在項目的初期,最終評估測度幾乎不含有助于迭代和開發算法或模型的信息。相反,問一些深入的問題,開發信息豐富的診斷方法才是有幫助的。如果你引入了門控或注意力機制,那么你的模型是否實際利用了它呢?你提出的哪項模型創新對整體表現提升實際起到了作用?你做了消融測試嗎?為了達到合理的表現,你的模型需要多少訓練樣本,需要跑多少epoch,這些配置和你用的基線一樣嗎?你的模型表現良好和表現糟糕的測試實例之間有沒有什么系統性的差異?結果對超參數變動的魯棒性有多好?基于模型的隱藏狀態,可以預測重要的特征嗎?牢記你的研究和項目報告主要不是告訴研究社區相對之前最先進模型的表現,你取得了一些(微弱的)提升,而是要貢獻你對這一主題的理解。領域中的其他人想要知道什么有效,什么無效,你的發現的哪些部分可以應用到他們的問題上。
1.3 嘗試解釋不清的隨機改動
基于現在這些深度學習庫,讓模型變得復雜很容易,加上更多的組件、網絡層和優化技巧。然而,當你改動代碼或模型時,你至少應該在直覺上理解改動為何有幫助。同理,運行試驗時,你應該對它的輸出有清楚的預期。你期望繪制出的結果圖像看起來是什么樣的?你期望它們將告訴你什么?當你發現模型的表現不對勁的時候,這些理解就更重要了。模型表現不對勁,更可能是bug的癥狀,這種情況下擴展模型無助于找出bug,也許甚至會讓定位問題變得更困難。在復雜化模型之前,深入問題的根源,找到可能出錯的地方。另外,別忘了你的報告需要論證你所做的改動的意義。報告的審閱人員對理解你的思考過程很有興趣。如果你不能形式化研究假說,并向自己解釋為何你做的能夠起效,那么很可能沒人能做到這一點。
1.4 過度復雜化
我們經常看到積極性很高的學生直接上手困難問題,并且馬上嘗試復雜的方案。如果有地方出錯了,很難分析錯誤的原因。相反,你應該問自己:應該可以奏效的最小化的方案是什么?模型能夠學習記憶一個小型數據集嗎?只使用少量參數的情況下模型學到了什么?代碼可以在單個訓練實例而不是一組樣本上訓練嗎?我們期望看到的最簡單的概括性是什么樣的?我們期望會失敗的簡單基線是什么?給這一基線加上什么樣的最小擴展應該能讓它工作?
1.5 迭代過慢
試驗可能需要很多時間。特別是深度學習和強化學習,極耗時間。因此,在短期項目中,不要過早地陷入緩慢的迭代周期很關鍵。基于簡單環境調試你的模型,實現一個可以在你的個人電腦上跑的概念證明實現。有時候簡單的矩陣操作或者網格試驗有助于驗證你的想法。有時你可以直接使用MDP的價值函數測試算法設想,無需擺弄梯度估計、actor-critic訓練等。當開始進行大規模試驗時,流程化運行試驗和查看結果的過程。在試驗完全進行完畢之前,查看結果,看看表現是否失敗。剛開始,基礎設施上的投入可能會花不少時間,但到項目結束的時候,你會發現這很有價值。
2 一些建議
2.1 在開始項目之前閱讀背景內容和相關工作
我們經常在正式開始日期的幾個月前就公布項目。原因之一是三個月完成以下內容實在是很緊張:1) 學習背景內容和相關工作;2) 實現和試驗;3)撰寫一份好報告。另一個原因是,我們一般提出的項目,如果成功的話,是可以在機器學習期刊或會議發表的。雖然我們知道學生有很多事情需要忙的,但我們一般鼓勵學生至少提前開始閱讀相關文獻。理想情況下,當你開始全職從事項目的時候,你應該知道要做什么,它和現有的方法有什么關系,并且對如何做已經有一些想法。另外,在全職從事項目之前,熟悉你選擇的機器學習框架也是一個好主意(我們推薦PyTorch!)。
2.2 使用版本控制
你實在是應該在研究代碼和項目報告上使用版本控制。沒有什么比在截止日期前丟失所有的辛勤工作更糟了。如果你還沒注冊過GitHub,那就去GitHub注冊個賬號。學生有免費私有倉庫。如果你不知道什么是版本控制,現在就學習,以后的你會對此感激不盡的。
2.3 基于隨機重復評估
在學術界,項目期間你一般最多能使用幾個GPU。然而,你不應該從一次試驗或幾次試驗得出不成熟的結論,這一點在深度強化學習上尤其重要。理想情況下,你應該多次重復試驗,并且像前文提到的,對不同初始情況和超參數的魯棒性有所了解。
2.4 及早開寫,持續地寫
如果你做的是碩士論文項目,對你工作的評估將基于你撰寫的報告,而不是基于你所做的缺乏足夠時間清楚報告的杰出工作。及早開始撰寫報告,不要低估傳播研究的作用。清晰地陳述你的目標、假設和貢獻,讓讀者可以領會你的進展。清晰地解釋你的設計決策,清晰地討論你的發現。理想情況下,你應該在進行項目的過程中持續撰寫報告,這可以迫使你仔細思考下一步要做什么,也可以避免你因為在截止日期前趕工而漏寫重要信息。
2.5 需要幫助的時候,主動尋求幫助
你的指導者工作繁忙,但指導者的意義正是幫助你。遇到解決不了的問題,不要拖到下次約定好的碰面才提出來,在你需要的時候,聯系你的指導者。主動地安排碰面,提前準備好你打算討論的結果、代碼、報告文字,避免浪費指導者的時間。最后,別恐慌!我們都經歷過這類困境,知道這會是多么令人氣餒的經歷,特別是你的工作機會和博士申請取決于研究項目的結果的時候。我們真心希望你能成功。
-
機器學習
+關注
關注
66文章
8430瀏覽量
132859 -
深度學習
+關注
關注
73文章
5511瀏覽量
121362
原文標題:短期機器學習研究項目的成功訣竅
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論