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