優秀的機器學習開發者都是這樣做的!
每年我們都會與一起從事短期機器學習研究專案的學生溝通。到目前為止,我們已經和很多學生交流過並且在他們的專案中發現了很多問題,並根據問題給予了他們諸多的建議。我們發現很多問題是大家都存在的,在這篇文章中,我們將集中的介紹這些問題並且給出解決方法。這篇文章絕不是全面的,而是強調了我們一遍又一遍地看到的那些陷阱。例如,我們不會談論如何選擇一個好專案。我們的一些建議通常適用於機器學習,特別是深度學習或強化學習研究的專案。
1、主要陷阱:
1.1假設你的代碼沒有錯誤
眾所周知,機器學習,特別是深度學習和強化學習模型很難除錯。為了讓你瞭解無數的犯錯方式,請檢視Andrej Karpathy的Twitter主題。我們所有人,甚至是更高階的研究人員,都會一直犯同樣的錯誤。使這些如此難以察覺的原因是即使是有缺陷的模型通常仍然可以學習併產生有意義的輸出。錯誤可能會對你的模型進行細微更改,並且大多數只會在執行時顯示。考慮到這一點,你可以做的最糟糕的事情是假設你的程式碼不包含任何錯誤。機器學習研究者對待程式碼的態度也是將他們分成生產性和非生產性的原意。如果你的預設假設是你的程式碼可能有問題,那麼你將更仔細地搜尋錯誤,逐行完成程式碼,仔細檢查中間輸出。如果可能的話,你還會視覺化它們。你會考慮張量的形狀是否合適?它們是否已正確初始化?克隆還是分離?在訓練期間監控梯度並注意NaN。通過設定隨機數生成器的種子來編寫單元測試並使你的實驗可重現等等。這些措施可以讓你的程式碼更具有實際性用處,有關神經網路除錯的更多提示,請參閱Goodfellow等人的深度學習書。
1.2僅看最終評估指標
雖然你的專案目標可能是實現某些評估指標的改進,但更重要的是,你應該充分了解模型的工作原理和原因。特別是在專案的早期階段,最終評估指標包含的資訊很少,但是這些資訊對迭代和開發演算法或模型很有用。為了獲得更多的資訊,我們必須提出更深入的問題並獲得資訊反饋。例如,如果你引入了門控機制或注意機制,你的模型實際上是否使用了它?你提出的哪些模型創新實際上是有助於整體效能提升?你的模型需要多少個訓練樣例/時期才能達到合理的效能,這與你使用的基線有何不同?你的模型執行良好或非常嚴重的測試例項之間是否存在系統差異?你可以從模型的隱藏狀態預測重要特徵嗎?請記住,你的研究和專案報告並非真正告知研究界對先前技術水平的一些(邊際)改進,而是為我們對該領域的理解作出貢獻。
1.3嘗試隨機變化並沒有明確的期望
使用當前的深度學習庫,通過新增更多元件、層和優化技巧,可以輕鬆地使模型更復雜。但是,當你對程式碼或模型進行更改時,你至少應該對此更改有一個大致的直覺。同樣,當你進行實驗時,你應該對其結果有明確的期望。你期望繪製的結果看起來像什麼,他們會告訴你什麼?當你發現自己的模型沒有按照預期的方式進行時,這一點就更為重要。通過這些措施,你更有可能看到出現錯誤的原因,因為擴充套件你的模型不會幫助你找到該錯誤,甚至可能使得更難以找到問題。在使模型更復雜之前,先了解它可能出錯的底線。此外,請記住,在你的報告中,你必須證明你的所作所為。因為你的報告是別人幫你解決問題的唯一切入口。如果你不能制定一個研究假設,並向自己解釋為什麼你在做這個工作,那麼其他任何人更沒有機會了解你在幹什麼。
1.4過度複雜
我們經常看到積極的學生立即跳出難題並嘗試複雜的解決方案。其實真正的出現問題,一般都會很難分析。相反,問問自己:應該起作用的最小的東西是什麼?模型能學會記住一個小資料集嗎?只使用幾個引數時會學到什麼?在單個訓練例項而不是批處理訓練時,程式碼是否有效?我們期望看到的最簡單的概括形式是什麼?
1.5迭代太慢了
進行訓練實驗可能需要很長時間。特別是深度學習和強化學習在積累統計顯著數量的隨機種子時可能非常耗時。因此,在短期專案過程中不要過早陷入緩慢的迭代週期是至關重要。儘量使用簡單的環境除錯你的模型,並實現你的想法的概念驗證,爭取整個過程可以在你的個人計算機上執行。有時,簡單的矩陣遊戲或網格世界實驗也可以提供有用的想法驗證。類似的你也可以使用MDP的精確值函式來測試演算法思想,而不必亂用梯度估計,演員評論訓練等。當轉向更大規模的實驗時,簡化你啟動實驗和檢查結果的過程。在實驗完成全部過程之前檢查這些結果,看看效能是否平穩。投資訓練模型使用的基礎設施在開始時可能很耗時,但在專案結束時都會有所回報。
2一些建議:
2.1在項目開始之前,開始閱讀背景知識和準備相關工作
我們通常在正式開始日期前就應該分析專案。其中一個原因是瞭解背景和相關工作,接著我們要進行實施和實驗,最後要認真撰寫一份好的報告,在做專案之前一定要有一個大局觀的設定。另一個原因是我們通常會提出研究專案,如果成功,可能會在機器學習論壇或者雜誌上公佈。雖然我們都知道整個專案過程中會有很多事情發生,但大多數時候我們都會鼓勵你至少提前開始閱讀相關文獻。理想情況下,當你開始全職工作時,你應該知道該做什麼,它如何與現有方法相關,並且知道如何做到這一點。
2.2正確用軟體版本及備份
你真的應該為你的專案程式碼和專案報告使用嚴格的版本控制,並且及時做好備份。沒有什麼比在截止日期之前失去所有辛苦工作更糟的了。如果你還沒有,請開啟GitHub帳戶,作為一個學生,你可以獲得免費的私人儲存庫。
2.3使用隨機重複進行評估
在學術界,你不可能在專案期間使用多個GPU進行訓練。然而,另外一個尷尬的事情,特別是在深層強化學習中,不能簡簡單單的就從單個或幾個實驗中得出過早的結論。理想情況下,你希望多次重複實驗,並且如上所述,可以瞭解不同起始條件和超引數的穩健性。
2.4在實施項目中儘早開始寫文件
如果你正在做一個碩士專案,你的工作將根據你的書面報告進行評估,而不是基於你所做的傑出工作,這個時候你需要有足夠的時間來寫清楚你做了那些工作。我個人建議是儘早開始寫作,不要低估傳播研究的價值。明確說明你的目標、假設和貢獻,並讓讀者遵循你的思維過程,認真的讀你的文章。你需要在文件中解釋你的設計選擇並清楚地討論你的發現。理想情況下,你應該在專案過程中始終如一地編寫報告。這樣,你就強迫自己考慮下一步,在截止日期到達時你不太可能忘記任何重要資訊。
2.5在需要時主動尋求幫助
你的上級是忙碌的人,但他們的存在是為了幫助你。一旦出現問題時一定要及時反饋聯絡上級,千萬不要等到下次預定會議時再反饋。積極主動地溝通並準備你想要提前討論的結果。充分利用你的主管!最後,不要驚慌!他們都經歷過這一切,一些問題在你這裡可能是個不能解決的問題,但是在你上級哪裡可能就是順手的事情。
以上為譯文。
本文由阿里云云棲社群組織翻譯。
文章原標題《ADVICE FOR SHORT-TERM MACHINE LEARNING RESEARCH PROJECTS》,
作者:Jakob Foerster and Greg Farquhar 譯者:虎說八道,審校:。
文章為簡譯,更為詳細的內容,請檢視原文。
相關文章
- 做一個優秀的PHP開發者PHP
- 優秀的開發者 vs. 糟糕的開發者
- 優秀的資料分析師是這樣煉成的
- 做一名優秀的開發者可沒有說的那麼簡單
- 優秀Android開發者的部落格Android
- 怎樣才能成為一名優秀的軟體開發者 (轉)
- 不同優秀程度JavaScript開發者的差別JavaScript
- 如何成為優秀的遠端開發者
- 電影中的計算機都是這樣的計算機
- 優秀的程式設計師,原來是這個樣子,還是做python的魅力大(笑S你)程式設計師Python
- 不懂做計劃,團隊全拉垮?聰明的管理者都是這樣做計劃管理
- 一份優秀的資料分析報告應該這樣寫
- 成為優秀Swift開發者的10條建議Swift
- 招聘優秀開發者的7個簡單原則
- 推薦給開發者的20個優秀PHP框架PHP框架
- 優秀遠端開發者具備的7大技巧
- 成為更優秀開發者的10條途徑
- 快速排序的效能和名字一樣優秀排序
- 怎樣寫出優秀的論文摘要
- 做一名優秀的程式設計師程式設計師
- 為 Web 開發者提供的 16 本優秀的 E-BOOKWeb
- 機器學習的七大謠傳,這都是根深蒂固的執念吧機器學習
- 優秀的Java程式測試是什麼樣的?Java
- 如何成為一名優秀的移動開發者?移動開發
- 10個針對Web開發者的優秀Chrome外掛WebChrome
- 做個優秀的市場程式設計師 (轉)程式設計師
- 為什麼遊戲界需要更多像三上真司這樣的優秀導師?遊戲
- topthink 這樣的小組是怎麼做的
- 成為優秀Angular開發者所需要學習的19件事Angular
- 對於開發者來說,有哪些非常優秀的平臺?
- 是什麼造就了優秀的開發者/工程師文化?工程師
- 怎樣成為優秀的後端工程師後端工程師
- 在日本,那些頂尖的遊戲都是怎樣做本地化營銷的?遊戲
- 2020年的IT可以這樣做
- 你的程式語言能這樣做嗎?
- 教你做一個優秀的專案經理(轉)
- 田永強:優秀的JavaScript模組是怎樣煉成的JavaScript
- 網際網路公司都是這樣說話的,學著點!