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


硬件工程師看了只會找個角落默默哭泣#硬件工程師 #MDD #MDD辰達(dá)半導(dǎo)體 #產(chǎn)品經(jīng)理 #軟件工程師
機械工程師的九個段位,你現(xiàn)在處于哪一層?



硬件系統(tǒng)工程師寶典—完整版

硬件工程師的終極幻想:焊板子焊上人生巔峰!#半導(dǎo)體器件 #硬件工程師 #MDD辰達(dá)半導(dǎo)體
如何成為嵌入式開發(fā)工程師?

不同時期的硬件工程師,最怕發(fā)生的事 #電子工程師 #硬件工程師 #內(nèi)容過于真實 #YXC晶振 #揚興科技
【面試題】人工智能工程師高頻面試題匯總:機器學(xué)習(xí)深化篇(題目+答案)

人工智能工程師高頻面試題匯總——機器學(xué)習(xí)篇



評論