天天看點

機器學習工程師第一年的12點體會機器學習工程師的日常:現在怎麼辦?

機器學習和資料科學都是廣義上的術語,它們涉及超級多的領域以及知識,一位資料科學家所做的事情可能與另一位有很大的不同,機器學習工程師也是如此。通常使用過去(資料)來了解或預測(構模組化型)未來。

為了将上面剛剛提到的要點融入上下文中,我必須要解釋我的角色是什麼。曾經我呆在一個小機器學習咨詢團隊。我們做到了從資料收集到清洗、構模組化型再到你能想到的多個行業的服務部署。因為團隊很小,是以每個人頭上都有很多頭銜。

機器學習工程師的日常:

早上9點,我走進辦公室,向同僚問好,把食物放在冰箱裡,倒一杯咖啡,走到我的辦公桌前。然後我坐下來,看看前一天的筆記,打開Slack,閱讀未讀的消息并打開團隊共享的論文或部落格文章連結,因為這個領域發展很快,是以要多看一些前沿的東西。

我通常都是在讀完未讀消息後,會花一點時間來浏覽論文和部落格文章,并仔細研究那些了解起來困難的内容。不得不說這其中,有一些内容對我正在做的工作有很大的幫助。一般來說,閱讀會花費我大概一個小時甚至更久,這取決于文章本身。有些朋友會問我為什麼這麼久?

在我看來,閱讀是一種終極元技能。因為一旦有更好的方式來完成我目前在做的事情,我會立即通過學習使用它,進而節約更多的時間和精力。但也有特殊情況,如果有一個項目的截止日期臨近,那麼我将把閱讀時間縮短來推進該項目。

完成閱讀之後,我會檢查前一天的工作,檢查我的記事本,看看我需要從什麼地方開始工作,為什麼我可以這樣做?因為我的記事本是流水賬式的日記。

例如:「将資料處理為正确格式,現在需要在模型中訓練這些資料。」如果我在工作過程中遇到了困難,則會寫下類似于:「發生了資料不比對的情況,接下來我将嘗試修複混合比對,并在嘗試新模型之前獲得基線。」

大約在下午4點的時候我會整理一下我的代碼,大概涉及:讓混亂代碼變得清晰,添加注釋,組合。為什麼要這樣做?因為這個問題我經常會問自己:如果其他人看不懂這個怎麼辦?如果是我要讀這段代碼,我最需要什麼?有了這樣的思考後,我覺得花費一段時間來整理代碼變的格外有意義。 大約在下午5點,我的代碼應該會被上傳到GitHub上。

這是理想的一天,但并不是每一天都是如此。有時候你會在下午4點有一個極好的想法,然後跟随它,然後就有可能是通宵。

現在你應該已經大緻了解了機器學習工程師一天的日常了吧,接下來我會将我在其中獲得的心得分享給你。

1.睜眼閉眼全是資料

很多時候,機器學習工程師都會專注于建構更好的模型,而不是改進建構它的資料。盡管可以通過投入足夠的計算能力讓模型提供令人興奮的短期結果,但這始終不會是我們想要的目标。

首次接觸項目時,必須要花費大量時間熟悉資料。因為從長遠來看,熟悉這些資料在未來會将節省你更多的時間。

這并不意味着你不應該從細節着手,對于任何新資料集,你的目标應該是成為這方面的「專家」。檢查分布、找到不同類型的特征、異常值、為什麼它們是異常值等等此類問題。如果你無法講出目前這些資料的故事,那又怎麼讓模型更好的處理這些資料呢?

機器學習工程師第一年的12點體會機器學習工程師的日常:現在怎麼辦?

探索性資料分析生命周期的示例(每次遇到新資料集時都會執行的操作)。更多關于探索性資料分析的詳細介紹。

2.溝通比解決技術問題更難

我遇到的大多數障礙都不是技術性的,而是涉及到溝通問題。當然,這其中也存在技術挑戰,但作為工程師解決技術難題是我們的本職工作。

但永遠不要低估内部和外部溝通的重要性。沒有什麼比技術選型錯誤更糟的了,因為這是要解決錯誤的技術挑戰。到底什麼情況會出現這樣的情況呢?

從外部來看,這是因為客戶所追求的與我們可以提供的東西之間的不比對。而在内部,因為很多人都身兼數職,是以很難確定每個人都可以全身貫注于一件事情。

碰到這些問題時到底如何解決呢?

對于外部問題,我們隻能不斷的與客戶溝通。你的客戶是否了解你可以提供的服務?你了解你的客戶的需求嗎?他們是否了解機器學習可以提供什麼以及它不能提供什麼?怎麼樣才能更有效的傳達你的想法?

對于内部問題,你可以根據我們使用解決問題的軟體工具的數量來判斷内部通信有多難:Asana,Jira,Trello,Slack,Basecamp,Monday,Microsoft Teams。我找到的最有效的方法之一是在一天結束時在相關項目頻道中進行簡單的消息更新。

它完美嗎?不,但似乎有效。它給了我一個機會來反思我做了什麼,并告訴大家我接下來的什麼工作需要誰的支援,甚至可以從大家那裡得到建議。

無論你是多麼優秀的工程師,你維持和獲得新業務的能力都與你溝通的技能能力有關。

3.穩定性>最先進的技術

現在有一個自然語言問題:将文本分類到不同的類别,目标是讓使用者将一段文本發送到服務并将其自動分類為兩個類别之一。如果模型對預測沒有信心,請将文本傳遞給人類分類器,每天的負載約為1000-3000個請求。

BERT雖然在最近一年很火。但是,如果沒有谷歌那樣規模的計算,用BERT訓練模型來解決我們想要解決的問題時還是很複雜的,因為在投入生産之前,我們需要修改很多内容。相反,我們使用了另一種方法ULMFiT,盡管它不是最先進的,但仍然可以得到令人滿意的結果,并且更容易使用。

4.機器學習初學者最常見的兩個坑

将機器學習運用到實際生産中存在兩個坑:一是從課程工作到項目工作的差距,二是從筆記本中的模型到生産模型(模型部署)的差距。

我在網際網路上學習機器學習課程,以此來完成自己的AI碩士學位。但即使在完成了許多最好的課程之後,當我開始擔任機器學習工程師時,我發現我的技能是建立在課程的結構化主幹上,而項目并沒有課程那樣井井有條。

我缺乏很多在課程中無法學到的具體的知識,例如:如何質疑資料,探索什麼資料與利用什麼資料。

如何彌補這個缺陷呢?我很幸運能夠成為澳洲最優秀的人才,但我也願意學習并願意做錯。當然,錯誤不是目标,但為了正确,你必須弄清楚什麼是錯的。

如果你正在通過一門課程學習機器學習,那麼繼續學習這門課程,不過你需要通過自己的項目來學習你正在學習的知識,進而彌補課程中的不足。

至于如何進行部署?在這點上我仍然做的不是很好。還好我注意到了一種趨勢:機器學習工程和軟體工程正在融合。通過像Seldon,Kubeflow和Kubernetes這樣的服務,很快機器學習将成為堆棧的另一部分。在Jupyter中構模組化型是很簡單的,但是如何讓數千甚至數百萬人使用該模型?這才是機器學習工程師應該思考的事情,這也是機器學習創造價值的前提。但是,根據最近在Cloud Native活動上的讨論情況來看,大公司以外的人并不知道如何做到這一點。

5. 20%的時間

20%的時間,這意味着我們20%的時間都花在了學習上。客觀意義上,學習是一個松散的術語,隻要是關于機器學習的都可以納入到學習範疇内,相關業務也要不斷的學習,作為機器學習工程師,懂業務可以極大的提高你的工作效率。

如果你的業務優勢在于你現在所做的最好,那麼未來的業務取決于你繼續做你最擅長的事情,這意味着需要不斷學習。

6.十分之一的論文值得閱讀,但少用

這是一個粗略的名額。但是,探索任何資料集或者模型時,你很快就會發現這個規律是普遍存在的。換句話說,在每年數以千計的送出中,你可能會得到10篇開創性的論文。在這10篇開創性的論文中,有5篇可能來自于同一所研究所或者個人。

你無法跟上每一個新的突破,但可以在基本原則的堅實基礎應用它們,這些基本原則經受住了時間的考驗。

接下來是探索與開發的問題。

7.成為你自己最大的質疑者

探索與開發問題是嘗試新事物和已經發揮作用事物之間的兩難選擇,你可以通過成為自己最大的懷疑者來處理這些問題。不斷的向自己提問,選擇這些取代舊的可以帶來哪些好處?

開發

一般來說,運作你已經使用過的模型并獲得高精度數字很容易,然後可以将其作為新基準報告給團隊。但是如果你得到了一個好的結果,記得檢查你的工作,并再次讓你的團隊也這樣做。因為你是一名工程師,你應該有這樣的意識。

探索

20%的時間花費在探索上是一個不錯的決定,但是如果是70/20/10可能會更好。這意味着你需要在核心産品上花費70%的時間,在核心産品的二次開發上花費20%,在moonshots(未來要用的事情)上花費10%,雖然這些東西可能不會立即起作用。說起來很慚愧,我從來沒有在我的角色中練習這個,但這是我正朝着這個方向發展的。

8.“玩具問題”非常有用

玩具問題可以幫你了解很多問題,特别是幫助解決一個複雜的問題。首先先建立一個簡單的問題,它可能是關于你的資料或不相關資料集的一小部分。找出這個問題的解決方法,然後把他擴充到整個資料集中。在一個小團隊中,處理問題的訣竅是抽象問題,然後理出頭緒解決。

9.橡皮鴨

如果你遇到問題,坐下來盯着代碼可能會解決問題,可能不會。這時,如果同你的同僚探讨一下,假裝他們是你的橡皮鴨,那麼問題可能很容易就被解決了。

“Ron,我正在嘗試周遊這個數組,并在循環通過另一個數組并跟蹤狀态,然後我想将這些狀态組合成一個元組清單。”

“循環中的循環?你為什麼不把它矢量化呢?“

“我能這樣做嗎?”

“讓我們來嘗試下吧。”

10.從0開始建構的模型數量正在下降

這與機器學習工程與軟體工程正在融合有關。

除非你的資料問題非常具體,否則許多問題非常相似,分類、回歸、時間序列預測、建議。

谷歌和微軟的AutoML等服務正在為每個可以上傳資料集并選擇目标變量的人提供世界一流的機器學習。在面向開發人員方面,有像fast.ai這樣的庫,它們可以在幾行代碼中提供最先進的模型,以及各種模型動畫(一組預先建構的模型),如PyTorch hub和TensorFlow集線器提供相同的功能。

這意味着我們不需要了解資料科學和機器學習的更深層次原理,隻需要知道他們的基本原理即可,我們應該更關心如何将它們應用到實際問題中去創造價值。

11.數學還是代碼?

對于我所處理的客戶問題,我們都是代碼優先,而且所有的機器學習和資料科學代碼都是Python。有時我會通過閱讀論文并複現它來涉足數學,但是現有的架構大都包含了數學。這并不是說數學是不必要的,畢竟機器學習和深度學習都是應用數學的形式。

掌握最小矩陣的操作、一些線性代數和微積分,特别是鍊式法則足以成為一個機器學習從業者。

請記住,大多數時候或者大多數從業者的目标不是發明一種新的機器學習算法,而是向客戶展示潛在的機器學習對他們的業務有沒有幫助。

12.你去年所做的工作明年可能會無效

這是大趨勢,因為軟體工程和機器學習工程的融合,這種情況正在變得越來越明顯。

但這也是你進入這個行業的原因,架構将發生變化,各種實用庫将發生變化,但基礎統計資料、機率學、數學、這些事情都是不變的。最大的挑戰仍然是:如何應用它們創造價值。

現在怎麼辦?

機器學習工程師的成長道路上應該還有很多坑需要去探,如果你是一個新手,先掌握這12條就足夠了!

本文由阿裡雲開發者社群組織翻譯。

文章原标題《12-things-i-learned-during-my-first-year-as-a-machine-learning-engineer》

作者:Daniel Bourke

譯者:虎說八道

文章為簡譯,更為詳細的内容,請檢視

原文

繼續閱讀