成為一名機器學習工程師并不簡單,你不僅要處理代碼中的各種問題,還需要不斷學習、與其他部門的人員溝通、了解和學會使用各種新型代碼庫或模型…… 成為機器學習工程師的第一年,本文作者 Daniel Bourke 學到了 12 件重要的事,在此與你分享。
機器學習和數據科學都是含義較為寬泛的術語。舉個例子,即便兩人同為數據科學家,他們所做的事也可能大不相同。機器學習工程師也同樣如此。兩者的共同之處在于利用過去的(數據)來理解或預測(構建模型)未來。
我會先介紹一下我當時的角色,然后再展開講述本文的要點。
當時我們有一個小規模機器學習咨詢團隊,從事數據收集、數據處理、模型建立及服務部署等各個環節的工作,凡是你能想到的任何行業,我們都有所涉及,所以每個人都身兼數職。
我使用 “當時” 這兩個字眼是因為我現在已經不是一名機器學習工程師了,目前我專注于自己的事業。
作為機器學習工程師的一天
每天早上九點,我走進工作室,和同事打完招呼,把食物放進冰箱,泡上一杯咖啡,再走向我的辦工桌。接著我坐下來開始看前一天的筆記,打開 Slack,查看新消息和團隊分享的論文或博客鏈接。我總會發現一些可以閱讀的內容,因為這個領域發展很快。
處理完消息,我就開始瀏覽論文和博客,然后閱讀其中吸引我的內容。通常情況下,我都會讀到一些可能對我正在研究的問題有幫助的內容。閱讀時間一般會花費一個小時,有時會更長,視具體內容而定。
為什么用這么長的時間?
閱讀是最基本的元技能,如果還有比這更好的方式,我會去學習和使用,好讓自己節省時間和力氣。
時針轉到上午十點。
如果有一個項目的截止日期快到了,我就會縮短閱讀時間,轉而推進緊急的項目,這部分工作占用的時間最多。我會回顧自己前一天的工作,然后查看我的記事本看下一步要做什么。
我的記事本記的是當天的日志。
“我已經將數據處理成了正確的形狀,現在我需要在模型上運行它。開始階段我會設置一個較短的訓練時間,取得一些進展后再逐漸延長?!?/p>
我也會遇到困難。
“出現了數據不匹配的情況。接下來我需要解決數據不匹配的問題,在嘗試新模型前得到一個基線?!?/p>
大多數時間都用來確保數據形式能夠成為模型。
下午四點,我開始進行收尾工作。我會清理一下自己創建的混亂代碼使其清晰可讀,然后添加一些注釋,最后再進行重構。萬一別的人會讀呢?我一般都會這樣想。當然通常情況下讀的人會是我自己,因為我很快就會忘記當時的一連串想法。
下午五點我的代碼就已經傳到 GitHub 上,第二天要用的筆記也已經記好了。
上面描述的是理想狀態下的一天,并不是每天都是如此。有時到下午 4:37 了,我的腦子里會突然蹦出一個好想法,然后我就得把它實踐下去。
現在你已經大致了解了我作為機器學習工程師的一天是怎樣度過的,接下來我會帶你了解一些更具體的內容。
1. 最重要的是數據
如果你熟悉一些數據科學的第一原理,這點對你而言不過是老生常談。但奇怪的是我經常會忘記它。很多時候我們關注的是構建一個更好的模型,而非改善構建模型的數據。構建更大的模型、使用更多算力可以帶來不錯的短期效果,但是,捷徑走多了,最后就不得不走一些遠路。
第一次接觸一個項目,多花些時間熟悉數據。通常情況下,你首先會估計出一個時長用來熟悉數據,而所謂的 “多花時間” 就是多花兩倍的時間。長遠來看,這樣做會節省你的時間。
這并不是說你不應該從小處著手。后文會談到這一點。
面對新的數據集,你的目標應該是成為一名行業專家。你需要檢查數據集的分布情況,尋找不同種類的特征、異常值的位置,并了解為什么它們是異常值。如果你都不能了解自己正在處理的數據,又怎么能指望你的模型呢?
探索性數據分析生命周期示例(每次遇到新數據集你會做的事)。更多相關內容可參考 《探索性數據分析入門》
2. 溝通問題比技術問題更困難
我遇到的主要問題都不是技術性的,而是溝通層面的。當然,技術難題總是存在的,但解決它們不就是一名工程師的工作嗎?
不要低估溝通的重要性,不管是外部溝通還是內部溝通。沒有什么比解決錯了技術難題更糟糕了。
這種情況是怎么發生的?
從外部層面上看,問題在于客戶的需求與我們團隊能提供的服務以及機器學習可以提供的服務之間不匹配,當然,跟后者的關系更大。
從內部層面上看,由于團隊成員往往身兼數職,因此很難確保每個人都目標一致。這些挑戰并不獨特。機器學習看起來很奇幻,在某些情況下確實如此,但在另外一些情況下就不是了,承認這一點很重要。
外部溝通問題如何解決?
經常聯系。你的客戶了解你能提供什么服務嗎?你理解客戶的問題嗎?客戶理解機器學習能提供什么,不能提供什么嗎?什么樣的方式才能有效傳達自己的發現?
內部溝通問題呢?
你可以根據解決內部溝通問題的軟件工具的數量來判斷內部溝通有多難。這些工具有 Asana、Jira、Trello、Slack、Basecamp、Monday 及 Microsoft Teams。
我找到的最有效的方法之一是在一天結束時在相關項目的交流通道中簡單更新一條消息。
更新內容包括:
三至四項
我做了什么
為什么這么做
下一步:根據以上內容,我接下來打算做什么
這種方式完美嗎?不,但它似乎有效。它讓我有機會反思我做了什么以及想做什么。這樣做還有一個額外的好處是公開化,這意味著如果有人不滿意我的工作,我可能會受到批評。
作為工程師你有多優秀并不重要,影響你能否維護和獲得新業務的是你的溝通能力,也就是你能不能把自己的技能及其帶來的好處傳播出去。
3. 穩定性>先進性
我們碰到過一個將文本進行分類的自然語言問題。我們希望,用戶在將一段文字發送到一項服務后,這段文字能被自動劃分到兩類中的一類。如果這個模型對預測結果不自信,這段文字就會被傳送給人工分類員。每天可以發起 1000~3000 次分類請求,從數量上看不多也不少。
BERT 是今年的熱門,如果沒有谷歌的規模計算,訓練一個 BERT 模型來做我們需要做的事需要大量數據改動。這還只是投入生產之前。
于是我們使用了另一個方法 ULMFiT,從理論上看它不是最先進的,但仍能產生非常多的結果,且使用起來更加容易。
與其執著于在一個東西上追求完美,不如嘗試其它有用的東西,這會帶來更多價值。
4. 機器學習的兩大障礙
將機器學習應用到實踐中存在兩大障礙 ,一是從課程學習到項目落地的障礙,二是從電腦模型到實際生產模型的障礙(模型部署)。
在網上搜索機器學習課程,可以找到非常多的內容。我利用其中的一些內容創建了自己的 人工智能碩士學位項目。
然而,在我學完許多最優質的課程,并開始成為一名機器學習工程師之后,我的技能還是建立在機器學習課程構建的骨架之上。在現實中,項目根本不是結構化的。
我缺少特定知識,這種技能在課程中是學不到的,比如如何質疑數據、要探索什么以及利用什么。
特定知識:課程中沒有但可以學習的技能。
什么是修正?
我很幸運能和澳大利亞最優秀的人才一起工作,我愿意學習,愿意犯錯。當然,犯錯不是目的,但為了正確,你必須明辨什么是錯的。
如果你正在學習機器學習的課程,那就跟著學下去,但同時你也要把所學知識勇于實踐,開展自己的項目,用特定知識來武裝自己。
關于部署
在這方面我仍然很弱,但我確實注意到了一個趨勢 ———— 機器學習工程和軟件工程正在融合。有了 Seldon、Kubeflow 和 Kubernetes 之類的服務,機器學習很快會成為堆棧的另一部分。
你可以在 Jupyter Notebook 上構建一個模型,但是怎樣才能讓幾千人,甚至是幾百萬人都能獲取呢?據我觀察,在大公司以外沒有太多人知道怎么做。
5. 20% 時間原則
我們有一個 20% 時間原則,意思是我們會用 20% 的時間來學習東西(things)?!皷|西” 一詞 的含義較為松散,在這里它指的是機器學習領域的內容,而且相關內容很多。
這一原則不止一次體現了它的價值,比如 我們就是在花 20% 的時間學習時才發現 ULMFiT 優于 BERT。
我們花 20% 的時間來學習就意味著剩下的 80% 的時間會花在核心項目上。
80% 的時間用在核心產品上(機器學習專業服務)
20% 的時間用在與核心產品相關的新事物上
時間不一定總是遵循二八比例進行劃分,但有這樣一個目標還是很不錯的。
如果你的商業優勢在于你是自己所在領域的最優秀的,那么未來你的優勢應該是繼續保持自己作為最優秀人才的地位,而這就意味著不斷學習。
6. 被閱讀的論文只占十分之一,被使用的就更少了
這是比較粗略的說法, 但如果你去探索任何數據集或現象,很快就會發現它確實普遍存在。按照 Price 定律的說法,全部作者總量的平方根貢獻了一半的出版物。
換句話說,在每年提交的成千上萬篇論文中,可能會有 10 篇具有開創性。而在這 10 篇開創性的論文中,有 5 篇可能來自同一所研究所或個人。
所以結論是?
你無法跟進每個新突破(新突破指的是創新性突破),所以最好學會基本原則,打下堅實基礎,再去應用這些原則。它們已經經受住了時間的考驗。
接下來我要說的是探索 - 利用問題(exploration versus exploration problem)。
7. 做你自己最大的質疑者
你可以通過成為你自己最大的質疑者來解決探索 - 利用問題。
這個問題其實是體現了在嘗試新事物與舊技重操之間的兩難困境。
利用
運行一個你已經用過的模型來得到高精度數字是件很容易的事,你可以把它作為新基準匯報給團隊。但是如果你打算得到一個好結果,就要記得多檢查幾次你的工作,同時讓你的團隊也這樣做。
探索
我們可以花 20%的時間來進行探索, 但其實 70%-20%-10% 這樣的時間劃分比例可能更好。你可以在核心產品上花費 70%的時間,在核心產品的上層構建上花 20%的時間,然后在那些可能進展不順利的事上花費 10%的時間。
我做機器學習工程師時沒有親身實踐過這個比例劃分,但現在我正在向這個標準靠近。
8. “玩具問題” 有用
玩具問題(toy problem)是有用的,尤其可以幫助理解一個新概念。先從小處做起,可以先構建一個你自己數據的子集,或者一個不相關的數據集。
在一個小團隊工作的技巧就是先讓一件事運作起來,然后進行重復迭代,最后加快速度。
9. 橡皮鴨
我是從 Ron 那里學到這一點的。如果你在一個問題上卡住了,繼續坐著盯著代碼看可能會幫你解決它,也可能不能。但你還可以和其他的團隊成員討論一下,假裝他們是你的橡皮鴨。
“Ron,我正試著遍歷這個數組,并跟蹤它的狀態,與此同時我還要遍歷另一個數組并跟蹤其狀態,然后我想將這些狀態組合成一個元組列表?!?
“嵌套循環嗎?你為什么不把它向量化?”
“我可以這樣做嗎?”
“試試看。”
10. 從零開始構建的模型正在減少
這點牽涉到了上文我們提到的機器學習工程正在與軟件工程融合這一觀點。
除非你的數據問題十分具體,否則許多主要問題都是十分相似的,涉及到分類、回歸、時間序列預測及推薦。
谷歌和微軟的 AutoML 及其它服務允許那些能上傳數據集并選擇目標變量的人獲取世界一流的機器學習內容,雖然這些服務還處于發展的早期階段,但它們的勢頭越來愈強,發展速度也越來越快。
此外,由于 fast.ai 之類的庫以及各種 model zoo(一組預先構建的模型,如 PyTorch hub 和 TensorFlow hub)的存在,開發人員只需幾行代碼就可以調用最先進的模型。這意味著什么?
了解數據科學和機器學習的基本原則是必須的,但知道如何利用它們來解決問題才更有價值。
現在你的基線可能要么接近先進模型,要么已經稱得上先進了。
11. 數學還是代碼?
處理客戶問題時,我們都是代碼優先。所有的機器學習和數據科學代碼都是用 Python 寫的。有時我在閱讀論文并重現論文實驗結果時會稍稍涉足數學,但 99.9%時間里,現有的框架就已經包含了數學。
這并不是說數學不必要,畢竟機器學習和深度學習都是應用數學的形式。
了解最小矩陣運算、一些線性代數和微積分知識,特別是 鏈式法則,足以讓一個人成為機器學習領域的從業者。
請注意,我的目標不是發明一種新的機器學習算法,而是向客戶展示機器學習可以為他們的業務提供什么以及不能提供什么。
旁注:在這篇文章的過程中,fast.ai 發布了一個新課程 《深度學習基礎》,從零開始介紹深度學習涉及的數學和代碼知識。它面向的是跟我一樣熟悉深度學習和機器學習應用但缺乏數學背景的人。為了解決這個問題,我認真學了這門課程,并立刻將它添加到我最喜歡的機器學習和數據科學資源列表中。如果基礎扎實,你可以構建自己的先進技術,而無需在舊技術的基礎上再去迭代。
12. 你去年做的工作到了明年可能就沒用了
這是必然的。隨著軟件工程和機器學習工程日益融合,這種情況越來越多。
你所處的就是這樣一個多變的領域。
有什么是一成不變的呢?
雖然框架和庫都會發生變化,但底層的統計學、概率論以及數學是沒有什么終止日期的(適逢 fast.ai 推出新課程,它們恰恰迎來了好時機)。
最大的挑戰仍然在于:你如何應用他們。
-
數據處理
+關注
關注
0文章
605瀏覽量
28592 -
機器學習
+關注
關注
66文章
8424瀏覽量
132761
原文標題:成為機器學習工程師第一年,我學到的 12 件事
文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論