如何高效的做機器學習項目

2020-02-07   AI公園

作者:Radek Osmulski

編譯:ronghuaiyang

導讀

這篇文章比較早,但是內容很好,從實踐中來到實踐中去。確實是作者的經驗之談。

我剛完成一個項目,其中有80%我覺得自己幾乎沒有完成。我投入了大量的時間,最後完全失敗了。

我知道或不知道的數學,我寫代碼的能力 —— 所有這些都是次要的。我處理這個項目的方式是失敗的。

我現在相信,構建機器學習是一門藝術,或者說是一門手藝,而我常常狂讀的那些數學大部頭的書似乎都沒有提到這一點。

我做了一點心路探索,回到了fast.ai的MOOC課程Jeremy Howard在Practical Deep Learning for Coders提到的內容,然後這篇文章就誕生了。

10s法則

我們坐在電腦前做事情。在宇宙中留下印記。降低預測的損失或減少模型的運行時間。

這裡的關鍵詞是做。這包括移動代碼,重命名變量,可視化(數據),砸鍵盤。

但是,當它執行計算時,兩分鐘盯著電腦螢幕發獃,這樣我們就可以一遍又一遍地運行它們,只是稍微修改一下參數,這是行不通的。

這也讓我們面對了機器學習工作的最大禍根 —— 額外瀏覽器標籤的詛咒。很容易按ctrl+t,很容易忘記我們在做什麼。

這個解決方案可能聽起來很荒謬,但它確實有效。當你處理一個問題時,永遠不要讓計算超過10秒。

但是我如何調整參數呢?關於這個問題,我怎樣才能學到有意義的東西呢?

所需要做的就是以一種能夠創建代表性樣本的方式來取數據的一個子集。這可以用於任何領域,並且在大多數情況下只需要隨機選擇一定比例的樣本即可。

一旦你取了一個數據子集,工作就變得具有交互性了。你進入了一種不受干擾的注意力流動狀態。你不斷地做實驗,找出什麼有效,什麼無效。你的手指從不離開鍵盤。

時間延長了,你做的工作時間並不等於你本來要做的工作時間,如果你讓自己分心的話,甚至連5小時的工作都做不到。

如何構造你的代碼來簡化這個工作流程?讓切換到在完整數據集上運行變得非常簡單。

當你即將寫完代碼,取消單元格注釋並運行全部代碼。

做一個時間垃圾郵件製造者(Be a time spammer)

這是對以上內容的補充。但它也遠不止這些。

根據你如何構造代碼,可以獲得數量級的性能收益。如果你做了這樣或那樣的改變,如果能知道它一個東西運行了多長時間,將運行多長時間,這是很好的。然後你可以試著找出為什麼會有這種不同,它會讓你立刻成為一個更好的程式設計師。

最重要的是,這與「絕不跑超過10秒」的承諾相輔相成。

自測試

一旦你在數據處理pipeline中犯了一個錯誤而未被注意到,就幾乎不可能恢復。在很大程度上,這也適用於模型構建(特別是如果你開發自己的組件,例如層,等等)。

關鍵是在進行過程中檢查數據。在轉換之前和之後查看它。總結一下。如果你知道在合併之後應該沒有NAs,請檢查是否確實沒有。

測試一切。

從長遠來看,保持頭腦清醒的唯一方法就是在短期內變得多疑。

沖向成功

當你處理一個問題時,你應該關注的第二件事是什麼?(我馬上就會說第一件事情)創建一個模型,端到端的數據操作pipeline,這都比隨機要好。

它可以而且應該是你能想到的最簡單的模型。通常這意味著一個線性組合。但是你要開始對這個問題有感覺。你想要開始形成一個可能的基線。

假設你花了3天時間構建了一個超級複雜的模型,但它完全不能工作,或者不能像你想像的那樣遠程工作。你到底乾了什麼?

你現在什麼都不知道。你不知道在處理數據時是否犯了錯誤,也不知道數據是否是垃圾。你不知道你的模型是否有問題。希望你能夠在沒有可以依賴的組件的情況下解決這個問題。

此外,建立一個簡單的模型可以讓你鳥瞰整個情況。可能是數據缺失了?也許類別不平衡?也許數據沒有正確地標註?

在開始處理更複雜的模型之前,最好掌握這些信息。否則,你將冒著構建一些非常複雜的東西的風險,這些東西可能在某些時候上非常好,但同時又完全不適合當前的問題。

不要調參,調結構

"哦,如果我只添加一個線性層,我相信模型會變得更好"

「也許再多增加0.00000001的dropout會有所幫助,看起來我們的訓練集有點過擬合了。」

特別是在早期,調優超參數絕對是適得其反的。然而,這麼做的誘惑力實在太大了。

它幾乎不需要工作,但很有趣。你會看到電腦螢幕上的數字在變化,你會覺得自己在學習,在進步。

這是海市蜃樓。更糟糕的是,你可能會過擬合你的驗證集。每次你運行模型並根據驗證損失進行更改時,你都會對模型的泛化能力造成損失。

你的時間最好投資於探索架構。你會學到更多。突然間,集成成為可能。

解放你的滑鼠

你打算用多長時間?即使我一不小心富裕到了不用再工作一天的地步,我仍然每天使用電腦。

如果你打網球,你要練習每一個動作。你甚至可以花錢請人告訴你如何在一個特定的鏡頭中定位你的手腕!

但實際上,你只能打這麼多小時的網球。為什麼不同樣注意你如何使用電腦呢?

使用滑鼠是不自然的。它是緩慢的。它需要複雜而精確的動作。你只能從任何上下文進行有限的操作。

使用鍵盤讓你自由。說實話,我不知道為什麼會有這麼大的不同。但它確實。

一個不用滑鼠在電腦上工作的人。

最後但並非最不重要

除非你有一個良好的驗證集,否則你所做的一切都沒有任何意義。請允許我向你介紹這方面的最終資源。一篇無懈可擊並以實踐為基礎的文章。(下一篇)

英文原文:https://medium.com/hackernoon/doing-machine-learning-efficiently-8ba9d9bc679d