12條經驗,讓你在機器學習的路上避免很多坑
- 2019 年 10 月 7 日
- 筆記
作者 | Daniel Bourke
譯者 | 李潔
編輯 | Lemonbit
譯文出品 | Python數據之道
12條經驗,
讓你在機器學習的路上避免很多坑
成為你自己最大的懷疑者,挖掘那些可能不起作用的事情的價值,以及探索溝通問題比技術問題更困難的原因。 Being your own biggest sceptic, the value in trying things which might not work and why communication problems are harder than technical problems.

工作站,家庭辦公室和藝術工作室。
本文原作者提供的照片
機器學習和數據科學都是廣義的術語。一個數據科學家所做的工作可能與另一個大不相同。機器學習工程師也是如此。常見的是使用過去(的數據)來理解或預測(建模)未來。
為了讓以下觀點擁有清晰的語境,我將先闡述一下我的工作。
我們曾有一個小型的機器學習諮詢團隊。我們在你能想到的每一個行業,做了所有從數據收集到操作,從模型構建到服務部署的工作。所以每個人都有許多頭銜。
過去時態是因為我已經離開了機器學習工程師的職位,開始自己創業。
我的一天是什麼樣的
早上 9 點,我會走進來,說個早上好,把食物放進冰箱,倒杯飲料,走到我的辦公桌前。然後我會坐下來,看看前一天的筆記,放鬆一下。我會閱讀消息,打開團隊分享的論文或部落格文章的鏈接,會有一些有用內容,這個領域發展很快。
一旦把消息打理完畢,我就會快速瀏覽那些論文和部落格文章,並詳細閱讀那些遇到困難的地方。通常會有一些對我所做的工作有所幫助的內容。閱讀時間長達一個小時,有時更長,取決於閱讀的內容。
為什麼需要這麼長時間?
閱讀是終極的元技能,如果有更好的方法來做我正在做的事情,我願意通過學習和實現它來節省時間和精力。
現在是上午 10 點。
如果接近某個最後期限,閱讀時間將被縮短,以推進項目。這是一天中最重要的部分。我會回顧前一天的工作,檢查我的記事本,看看我下一步該怎麼做。
我的記事本是一天內的流水日誌。
「我已經將數據處理成了正確的形狀,現在我需要投入模型訓練,我將在開始時縮短訓練時間,然後如果取得進展,就加快訓練進度。」
如果我陷入困難。
「一旦發生了數據不匹配,下一步將是進行修復,並在嘗試新模型之前獲取基準線情景。」
大部分時間都是在確保數據的形式可以建模。
下午 4 點左右,是時候開始整理了。收尾工作包括清理我為使程式碼清晰易讀而創建的混亂程式碼,添加註釋並重組程式碼。如果別人需要讀這個程式碼呢?這就是我要問的問題。通常是我自己來讀。令人驚訝的是一系列的想法竟然很快就會被遺忘。
到下午 5 點,我會把程式碼提交到 Github 上,將為下一天所做的筆記整理到我的記事本上。
這是理想中的一天,但不是每天都是這樣。有時候你會在下午 4 點 37 分腦袋裡突然出現一個好的想法,然後就開始著手去做。
現在你已經對每天會發生的事情有了大致的了解,我們將具體說明。
1. 總是與數據相關
如果你熟悉一些數據科學的首要原則,那麼這似乎是老生常談。但令人驚訝的是,我經常會忘記。很多時候,你會把注意力集中在建立一個更好的模型上,而不是改進你所建立在的數據上。
構建一個更大的模型並使用更多的計算能力可以提供令人興奮的短期結果。然而,走再多的捷徑,最終也會需要長途跋涉。
當第一次參與一個項目時,你需要花大量的時間熟悉數據。我舉一個不正常例子,通常你需要將你的第一個估計值乘以 3 倍。從長遠來看,這會節省你的時間。
這並不意味著你不應該從小數字起步。後文會講到的。
對於任何新的數據集,你的目標都應該是成為主題專家。檢查分布,找出不同類型的特徵,異常值的位置,和異常值的原因。如果你不能講述出你正在處理的數據的故事,如何能指望你的模型可以呢?

一個探索性數據分析生命周期的例子(每次遇到新數據集時需要做什麼)。
更多相關內容,請參閱 A Gentle Introduction to Exploratory Data Analysis(https://towardsdatascience.com/a-gentle-introduction-to-exploratory-data-analysis-f11d843b8184)。
2. 溝通問題比技術問題更難
我遇到的大多數主要障礙不是技術上的,而是交流上的。當然,總是有技術上的挑戰,但是解決技術難題是工程師的職責。
永遠不要低估溝通的重要性,無論是內部的還是外部的。沒有什麼比解決一個錯誤的技術難題更糟糕的了。
這是怎麼發生的呢?
從外部來看,這是客戶想要的東西和我們不能提供但是機器學習可以提供的東西之間的不匹配。
從內部來看,因為很多人身兼數職,所以很難確保每個人都有相同的目標。
這些難題並不是獨一無二的。機器學習似乎很神奇。在某些情況下確實如此。但在這種情況下並不能,承認這一點很重要。
如何解決?
定期接觸最基礎的部分。你的客戶是否了解你可以提供的服務內容?你了解你的客戶的問題嗎?他們是否了解機器學習可以提供什麼以及不能提供什麼?什麼是可以用來交流你的成果的有用方式?
內部如何協調?
你可以根據預計解決問題的軟體工具的數量來判斷內部溝通的難度。Asana,Jira,Trello,Slack,Basecamp,Monday,微軟團隊都是這麼做的。
我發現最有效的方法之一是在一天結束時在相關的項目頻道中進行簡單的消息更新。
e.g. 更新:
- 3 – 4 個重點
- 所做的事情
- 原因
下一步:
- 基於以上,接下來要做什麼
這是完美的嗎?不。但似乎有效。這個方法給了我一個機會來回顧所做的工作以及預期目標,這意味著如果我的工作看上去不成功,可能會受到批評。
不管你是一名多麼優秀的工程師,你維護和獲得新業務的能力都與你溝通業務的能力以及業務帶來的好處是相關的。
3. 穩定 > 最先進的技術(通常情況)
我們有一個自然語言問題:將文本分類到不同的類別。目標是將用戶發送到服務端的文本自動分類為兩個類別之一。如果模型對預測沒有信心,就將文本傳遞給人工分類器。每天的工作量約為 1000-3000 個,不是太多也不是太少。
BERT 一直都是這一年最受歡迎的模型。但是,如果沒有Google規模的計算,用 BERT 訓練模型來做我們需要的東西在投入生產之前需要太多的處理。
因此,我們使用了另一種方法 ULMFiT(https://arxiv.org/abs/1801.06146) ,這種方法不是最先進的,但仍然產生了足夠的結果,並且更容易使用。
實現出一些有用的東西比停在你想要追求完美的東西上更有價值。
4. 機器學習的兩個大坑
在將機器學習付諸實踐時存在兩個坑。從課程工作到項目工作的差距,以及從筆記型電腦中的模型到生產中的模型(模型部署)的差距。
在網上搜索機器學習課程會返回大量的結果。我用過其中的許多來創建我自己的AI碩士學位(https://bit.ly/AIMastersDegree)。
但即使在我完成了許多最好的課程之後,當我開始成為一名機器學習工程師時,我的技能也是建立在課程結構的主幹之上的。而現實中,項目並不是已經結構化的。
我缺乏具體的知識,而這些是無法在課程中教授的。如何質疑數據,哪些需要被研究和利用。
具體知識無法在課程中教授但可以實際學習到的技能。
解決方法是什麼?
我很幸運能和澳大利亞最優秀的人才在一起。但我也願意學習,願意犯錯。當然,犯錯不是目的,但為了正確,你必須弄清楚哪裡出了問題。
如果你正在通過課程學習機器,那麼繼續學習這門課程(https://towardsdatascience.com/how-to-start-your-own-machine-learning-projects-4872a41e4e9c) 但是需要通過自己的項目把你正在學習的內容付諸實踐,從而掌握具體的知識。
如何部署?
我在這方面還是很弱。但我確實注意到了一種趨勢。機器學習工程和軟體工程正在融合。有了諸如 Seldon(https://www.seldon.io/) , Kubeflow(https://www.kubeflow.org/) 和 Kubernetes(https://kubernetes.io/) 這樣的服務,機器學習很快就會成為另一個組成部分。
在 Jupyter 筆記型電腦上建立一個模型是一回事,但是你如何使這個模型能被成千上萬甚至數百萬人使用呢?從 Cloud Native events 最近的會談(https://www.youtube.com/watch?v=lu5zHvpQeSI) 來看,除了大公司之外,很少有人知道如何做到這一點。
5. 20% 的時間
我們有個規矩:20% 的時間。這意味著我們可以將 20% 的時間花在學習機器學習領域中的事物上,有很多東西可以學。
事實不止一次證明這是無價的。使用 ULMFiT 而不是 BERT 就是由於這 20% 的時間。
20% 的時間意味著 80% 的時間將花在核心項目上。
- 80% 時間用在核心產品(機器學習專業服務)。
- 20% 時間用於核心產品相關的新產品。
我們並不總是像這樣劃分,但這是一個很好的目標。
如果你現在的業務優勢是在所做的領域上做到最好,那麼未來的業務就取決於你在所做的業務上繼續做到最好。這意味著需要不斷學習。
6. 只有 1/10 的論文被閱讀,更少量的論文被使用
這是一個粗略的度量。但是研究任一數據集或現象,你很快就會發現它無處不在。這是齊普夫定律(Zipf』s law,https://en.wikipedia.org/wiki/Zipf%27slaw) 或普萊斯定律 (Price』s law,https://en.wikipedia.org/wiki/Price%27smodel) ,其中之一,它們都和我的數據相似。普萊斯定律指出,一半的出版物來自於其所有作者數量的平方根數量的作者。
換句話說,在每年提交的數千份報告中,可能有 10 份開創性的論文。在這 10 篇開創性的論文中,5 篇可能來自同一個研究所或個人。
重點是什麼呢?
你沒辦法跟上每一個新的突破。所以更好的原則是,掌握基本原則,打好堅實的基礎,並加以應用。這些是經得起時間考驗的。新的突破也是參考了原始的突破。
但接下來是研究還是開發的問題。
7. 做自己最大的懷疑論者
你可以通過成為自己最大的懷疑論者來處理研究還是開發的問題。
研究還是開發的問題是在嘗試新事物和重新應用已經奏效的東西之間的兩難境地。
開發
很容易去運行你已經使用過的模型,並獲得一個高精度的數字,然後將其作為新的基準報告給團隊。但是如果你得到了一個好的結果,記得檢查你的工作,反覆多次,讓你的團隊也做同樣的事情。你是工程師兼科學家是有原因的。
研究
20% 的時間可以幫助解決這個問題。但是 70/20/10 的時間分配可以做得更好。比如把 70% 的時間花在核心產品上, 20% 的時間花在建立核心產品的基礎上, 10% 的時間花在試驗上,試驗可能不會(極有可能不會)奏效的事情。
我從來沒有在我的工作中實踐過這一點,但我正在朝這個方向努力。
8. 簡單問題會先奏效
解決簡單問題,很有助於理解新概念。建立小的東西,它可以是數據的一個小的子集,也可以是不相關的數據集。
在一個小團隊中,訣竅是先建立些有效的東西,然後快速迭代。
9. 橡皮鴨 (The rubber duck)
羅恩教我的這個方法。如果你被問題困住,坐著盯著程式碼可能會解決問題,可能不會。相反,你應該和你的隊友用言語來交流,假裝他們是你的橡皮鴨。
「羅恩,我正在嘗試遍歷這個數組,並在跟蹤狀態的同時循環另一個數組並跟蹤狀態,然後我想將這些狀態組合成一個元組列表。」 「循環中的循環?你為什麼不把它矢量化呢?「 「我能這樣做嗎?」 「讓我們試試看。」
10. 從頭開始構建的模型正在減少(或者至少不需要從頭開始)
這又回到了機器學習工程與軟體工程融合的問題上。
除非你的數據問題非常具體,否則很多主要的問題是非常相似的,比如 分類、回歸、時間序列預測、推薦等。
像Google和微軟的 AutoML 等等這樣的服務,正在使世界級的機器學習對每一個人都可用,都能夠上傳數據集並選擇目標變數。雖然現在還處於早期階段,但他們的勢頭正在迅速增強。
在開發人員方面,你有像 fast.ai(https://github.com/fastai/fastai) 這樣的庫,它們可以在幾行程式碼中提供最先進的模型,以及各種模型動畫(一組預先構建的模型),像 PyTorch hub(https://pytorch.org/hub) 和 TensorFlow hub(https://www.tensorflow.org/hub) 那樣相同的功能。
這意味著什麼?
了解數據科學和機器學習的基本原理仍然是必要的。但是知道如何將它們應用到你的問題中更有價值。
現在如果你的模型不是最先進的,也應該是接近的。
11. 學數學還是寫程式碼?
對於我處理的客戶端問題,我們都是先寫程式碼。所有的機器學習和數據科學程式碼都是 Python 編寫的。我有時會通過閱讀論文並復現它來涉獵數學,但 99.9% 的情況下,現有框架已經涵蓋了數學。
這並不是說數學沒有必要,畢竟機器學習和深度學習都是應用數學的兩種形式。
了解最基本的矩陣操作,一些線性代數和微積分,特別是鏈式法則(https://www.khanacademy.org/math/ap-calculus-ab/ab-differentiation-2-new/ab-3-1a/v/chain-rule-introduction) ,足以成為一個實踐者。
記住,我的目標不是發明一種新的機器學習演算法,而是向客戶展示機器學習對他們的業務有(或沒有)潛在的好處。
附註:在寫這篇文章的過程中,fast.ai 剛剛發布了一門新的課程,《從基礎開始深度學習》(Deep Learning from the Foundations,https://www.fast.ai/2019/06/28/course-p2v3/) ,它將從頭開始學習深度學習的數學和程式碼。它是為像我這樣熟悉應用深度學習和機器學習但缺乏數學背景的人而設計的。為了解決這個問題,我正在研究這本書,並且立即把它添加到我最喜歡的機器學習和數據科學資源的列表(https://bit.ly/AIMLresources) 中。有了堅實的基礎,你就可以構建自己的最先進的技術,而不是在以前的基礎上進行迭代更新。
12. 去年做的工作明年可能會作廢
這是一定的。隨著軟體工程與機器學習工程的融合,其發展趨勢也越來越明顯。
但還是你已經學過的內容。
那麼什麼會保持不變?
框架會改變,庫會改變,但是底層的統計,概率,數學,這些東西沒有過期日期(甚至是一個更好的時機來學習新的 fast.ai 課程)。
最大的挑戰仍然是:如何應用它們。
現在該做什麼?
本可以寫更多,但 12 點就足夠了。
在 Max Kelsen(http://www.maxkelsen.com/) 工作是我做過的最好的工作。工作很有趣,同事更好。我學到了很多。
離開並不是一個容易的選擇,但是我決定用我所學到的來檢驗我自己,我正致力於健康、科技和藝術的交叉領域上。
本文來源: https://towardsdatascience.com/12-things-i-learned-during-my-first-year-as-a-machine-learning-engineer-2991573a9195