天天看點

算法工程師應具備的落地能力!

作者:桔了個仔,南洋理工大學,編輯:極市平台

導讀

作者從自身經驗出發,從三個方面:軟實力、技術和業務講述了算法工程師落地的能力具體指向,為想要成為算法工程師或者已經工作中的小夥伴們提供一點小小的建議。

大家好,這裡是桔了個仔,目前是一名Data Scientist(不太想翻譯成資料科學家,畢竟感覺自己就是個工程師),過去幾年在做基于機器學習的風控與合規系統,參與了一些算是成功的項目,和團隊一起,成功在幾個跨國銀行那裡落地了我們開發的系統。

根據我的經曆以及對身邊同僚的觀察,我個人會把落地工程師的「落地能力」分為三個次元:

算法工程師應具備的落地能力!

1.技術層面

很多人以為算法工程師日常工作就是調下參,改個算法再跑跑,直到神經網絡輸出符合預期。在入行前,他們以為算法工程師的日常是這樣的:

算法工程師應具備的落地能力!

圖源《如何創造可信的AI》

事實上,算法工程師可能涉及的技術範圍是很廣的。很可能是這樣的[1]:

算法工程師應具備的落地能力!

圖源:《Hidden Technical Debt in Machine Learning Systems》

中間那個小小的幾乎都快看不見的黑塊,你放大圖檔,會發現裡面寫着ML Code,這就是「算法」的部分。當然,别被這個圖吓到,這不一定全是你的工作,這裡是一個團隊的任務,這個團隊可能是兩人的團隊,也可能是幾十人的團隊,但可以肯定的是,無論你在哪個公司,一個算法工程師都不太可能隻做純「算法」,不要忘了「工程師」三個字。對于要做産品落地的工程師,搞算法的時間很可能不到10%,其他技術部分可能占據你40%。要增強自己落地能力中的技術水準,除了算法要基礎打好,你還需要:

  • 學會資料擷取。原始資料需要經過ETL才能被算法利用。ETL(Extract, Transform, Load)是将業務系統的資料經過抽取、清洗轉換之後加載到資料倉庫的過程,目的是将企業中的分散、零亂、标準不統一的資料整合到一起,為企業的決策提供分析依據。也許你們公司有專職的資料工程師來做ETL,但你如果能稍微參與到ETL的過程中,不僅讓你在大資料技術方面得到提升,而且對你了解上遊業務非常有幫助。ETL工具的典型代表有:Informatica、Datastage、OWB、微軟DTS等。
  • 建構特征。如果沒有機會參加到ETL裡,也沒關系,我也沒,畢竟客戶不想給讓我們接觸原始資料。這時候,你也可以處理ETL之後的資料,從中建構特征。其實特征建構的過程能幫助你了解業務,例如給銀行預測信用卡逾期風險,你了解到,債務負擔率和使用者風險有着一定關聯,于是你會考慮把使用者所有信用卡的欠款加起來除以這個使用者的收入,得到一個新的特征。關于相關技術,我知道很多人肯定馬上想到pandas,但老實講句,我做了幾年資料工作,能用到pandas的機會真的不多。産品都要落地了,幾百萬條的資料馬上進來了,還在玩pandas?spark, hadoop, flink等分布式計算平台趕緊給我研究起來。
  • 可視化資料。我相信問出來這個問題的人都知道哪些python庫可以做可視化,例如matplot, seaborn等等。當然,除了python庫,excel裡的可視化也要做好,這與算法無關,但在你做彙報時能幫助你把一個結果解釋清楚。
  • 會用伺服器。一般資料産品部署,得上雲或者私有伺服器吧,那麼如果你還不熟悉linux,那就趕緊練練吧。你把系統部署到伺服器時,是不太可能用滑鼠拖拽個exe就完事的。如果你還能熟練使用aws等雲服務,那就更好了。
  • 至于UI層面,例如建構網頁等等,開發app這種,這就不再推薦算法工程師學了,畢竟人的精力有限。

前面技術部分花了10%+40%的工作時間,然後其他50%的時間呢?用來和客戶或者産品經理溝通,然後了解業務,做ppt,彙報結果。雜事很多,很難接受吧?沒錯,我剛入行時也是覺得自己一身技術無處施展,後來我上司一句話啟發了我:

技術是邏輯的藝術,業務也是,是以隻搞技術不管業務的,不能算是邏輯能力出衆的。

你現在應該有疑問了,那怎麼才算「懂業務」?嘿嘿,馬上道來。

2.業務層面

其實關于「懂業務」,可以分為宏觀業務和微觀業務兩部分。

宏觀業務指的是行業的「共性」。例如:

  • 你的産品所服務的對象所在的行業都有什麼「痛點」。sorry,句子有點長,而且說法也有點「老土」,但了解客戶痛點永遠都是必須的。例如我做金融風控,客戶的痛點是「舊的專家系統規則更新慢」,而我們提供「基于機器學習的方案」,資料來了就自動更新規則,就能解決他們痛點。
  • 他們這項業務目前的工作流程如何。例如我做反洗錢,那麼我得了解洗錢的三個步驟,反洗錢的警報産生,警報調查等等。這些流程在不同客戶之間都是一樣的,我了解清楚了這些,我才能知道,我的産品是在哪個環節發揮價值。如果你做的項目是對内的,例如為自己公司電商搞推薦算法,那你必須清楚使用者在你們APP上的路徑,例如首頁到搜尋頁再到詳情頁。以及在每條路徑上,怎麼做推薦商品,例如有的商品是推薦搭配,有的商品是推薦近似替代品。

微觀業務是指不同部門/公司在實踐上的不同。微觀業務是最容易被人忽視的而且也是最辛苦的,因為大家都有不同的「知識沉澱」方式,學習起來并沒有那麼立竿見影。但我發現有趣的一點是,當你接觸微觀的業務多了,你還是能從中提取「共性」。例如某個算法工程師,之前在銀行做風控,在銀行擷取資料流程會比較長,每個步驟要做的事情不能跳過;現在去某網際網路金融公司做風控,可能擷取資料流程變得很短,但是你會發現共性是,大家都有準入審查、逾期催收等環節,用到的技術可能也是相近的。

現在你已經掌握了各種技術,準備大幹一場,準備拿最強的深度學習模型,給客戶設計一款準确率非常高的産品。現在你開始學習相關業務,我建議你帶着問題學習。不過,你什麼都不懂時,你應該問自己的第一個問題是什麼?沒錯,那就是:

做這個系統的真實需求是什麼?

這個問題很重要。有個故事是這樣的:

某大型日化公司引入了一條國外肥皂生産線,這條生産線将肥皂從原材料加入直到包裝箱自動完成。不過産品線有瑕疵,個别肥皂盒是空的,這家公司聯系廠商後被告知這是設計上的缺陷,無法避免。于是老闆要求工程師們解決這個問題,以數名博士為核心形成一個技術攻關團隊,耗費大筆資金之後,終于宣告解決。解決的辦法是在生産線上安裝一套 X 光機進行掃描識别。在另一家私人企業,老闆讓新來的小工解決問題,小工所用的辦法是,找來一台電風扇放在生産線旁邊

不知道這是真實故事還是段子,不過我們可以知道的是,如果你隻顧着解決自己拿到的問題,而不想問題背後的真實需求是什麼,埋頭苦幹,用複雜的方法來解決個很簡單的事,那麼會弄出大炮打蚊子的笑話。

第二個該問自己的問題是:

有什麼制約因素?

對于機器學習系統,落地時的制約因素主要包括(但不限于):

  • 開發時間。即使項目剛開始,你還不知道要花多久,你也得計劃開發時間出來,你計劃不出來,上司也會給你設定期限。畢竟做産品不同于做研究,做産品大家都喜歡确定的投入和可預估的彙報。
  • 計算資源。因為機器學習系統使用是需要成本的,你得知道使用者能承受怎麼樣的成本或者自己伺服器能承受怎樣的成本。
  • 算法性能。算法落地不同于打kaggle比賽,并沒有時間能把性能壓榨到極緻。隻要比預期好些,基本就「先用着再說」了
算法工程師應具備的落地能力!

要在這三個限制因素裡面取得微妙的平衡,才能使得産品落地。我剛做資料科學工作時,總喜歡搞算法調優來炫技,但其實壓榨算法的邊際收益很低,你用一個月把算法準确率從70%提升到80%,可能還不如提前一個月把系統上線使用起來的收益高。

第三個該問自己的問題是:

算法、性能評估和業務是否吻合?

還是拿我自己的經曆做例子。

我工作中面對的資料,是非常的不平衡的,我們做二進制分類,100條資料裡,标簽為1的隻有2~3條,其他97~98條資料标簽都是0。這個時候顯然需要選擇一些合理的評估方法,首先就排除了用準确率(Accuracy)作為評判标準了,F1-score, AUC都可以備選。原因?可以看我在另一個問題的舉的例子。

如何評價德國訓練探雷犬和尋屍犬識别新冠患者,稱準确率達94%?嗅探犬接觸患者後會成為病毒傳播媒體嗎?

​​https://www.zhihu.com/question/442962994/answer/1717172385​​

然後是模型選擇。銀行的業務需要強解釋性,是以又否決了所有黑箱模型。剩下的就在tree-based model、logistic regression還有線性kernel的svm之間選擇了。

上線之後要評價模型對正負樣本區分度,于是又要引入KS值。随着時間遷移,資料分布可能會變化,又要引入PSI值來監控資料偏移程度來決定是否重新訓練模型。

你看,模型和評價名額,都是和業務息息相關的。

如果你看到這裡還是感覺到迷茫,不知道怎麼補足相關業務知識,例如産品和營運的知識,可以看我之前寫的一個回答,這裡就不重複叙述了。

算法工程師如何補足産品和營運知識?

​​https://www.zhihu.com/question/436066262/answer/1695872348​​

那怎麼檢驗自己真的「懂業務」了呢?你可以檢查下自己能不能做到下面這些點:

  • 檢查下自己是否能快速複現方案?
  • 如果能快速複現方案,是否能估算每個階段大緻需要多少人多少時間?
  • 面對不同的資料量,能否估算一個大概的伺服器性能需求?

3.軟實力層面

懂技術了,又懂業務了,是不是感覺還不夠差點什麼能力去推動産品落地?這個是抛開技術和業務之外的東西,要描述成一個具體的能力,真的很難,我會把這些能力都歸結于「軟實力」。我認為主要是表現在溝通,思維這兩方面。情商、親和力、共情能力、有眼光,這些算不算軟實力?當然算,但你有沒有發現,這些軟實力都是基于溝通和思維的。

溝通和思維等軟實力包括(但不限于):

  • 和客戶溝通的能力。聽你講的客戶并不一定是算法工程師或者資料科學家,你是否能把自己的方案原理講清楚?設計到技術的概念,是否能讓非技術的聽衆也能大緻了解?
  • 思考能力。例如結構化思維和批判性思維。其實有一定套路,隻要多加練習就能掌握。推薦書籍有《金字塔原理》、《批判性思維工具》等。
  • 推動團隊的能力。和個人魅力息息相關。

這裡說個真實故事,和算法無關,和軟實力有關。我大舅是開工廠的,産品良品率之前一直上不去。我二舅退休後就去我大舅廠裡做品質監督。我二舅就中學學曆,國語也不标準,但我二舅進廠後,産品良品率上去了,工廠也扭虧為盈了。我問他怎麼做到的,他說,很簡單啊,對于那些手工不精湛的小夥子,我就親自做一遍給他看,并告訴他,我一個退休老頭都能按質做好,為啥你不行?就這麼耐心的一個個溝通,一個個教學,盯着他們直到确認他們能做好為止。看起來這很簡單是吧,但這過程需要耐心溝通,需要系統性思維找到關鍵因素。這就是軟實力的表現之一。

如果你觀察銷售團隊的日常,你會發現,他們做的事情看起來簡單,大部分時間就是給客戶發發郵件,和客戶開開會,都是動嘴皮子的事情,但是如果讓你去做這些,你會發現你會缺少自己貌似很難推進,你會問自己,自己嘴皮子咋就不那麼好呢?軟實力就像肌肉,運用軟實力的過程就像搬磚,把磚頭從A點搬到B點看着很容易,但搬起來才發現自己肌肉還不夠強大。

而鍛煉軟實力的方法?無它,隻有幹多了,軟實力才能上去。具體的說,對于算法工程師而言,就是不要逃避那些繁瑣的看似沒收獲的事情。例如在我為某客戶落地風控系統的過程中,我們需要和他們的項目經理保持聯系,有問題也要給他們的資料團隊回報。其實這過程還挺難搞,因為他們作為一個跨國大公司,顯然資料中心是需要同時對接很多vendor的,是以當和他們合作時,需要經常主動推進項目進度,不然他們的項目經理會問責我們。例如我們有個pipeline每天固定時間要跑,他們作為上遊,需要在運作時間前把資料給到我們。當時間到了,資料還沒給到我們,我們要做的第一個事,就立馬需要給資料團隊發送郵件,抄送項目經理,厘清責任;然後積極跟進回複,搞清楚原因,和資料團隊商量個預計解決時間,并且在這個時間點來臨前就問問進度,以預留足夠時間來應變。在這些看似繁瑣的溝通過程中,我掌握了推進工作的方法,養成了積極推動工作進展,并在deadline來臨前檢查進度以預留時間應變的好習慣。

總結

算法工程師的「落地能力」包括技術能力,業務了解,還有軟實力。但對自己要求不要太苛刻,就好像你玩遊戲時很少能用到每個次元的能力都滿分的英雄一樣,人的能力是有個頻譜的,不可能方方面面都能做得滿分,是以不要對自己感到挫敗。

就拿我自己說,大家别看我說的頭頭是道,但是說實話,說了這麼多,其實我自己也并不能每個方面都做得好。這個「落地能力頻譜」就像是一個打分卡,幫助你從更全面的角度來分析自己的能力頻譜。有的人技術不那麼精湛,但很懂業務,很會帶隊,也能使得産品順利落地;有的人技術滿分,但業務和溝通能力欠缺,但配合其他團隊成員的優勢,也能使得産品順利落地。

是以,接受自己的不足,盡可能動态平衡自己的能力頻譜,總有一日,你能成為具有超強「落地能力」甚至能獨當一面的算法工程師。

參考:

Hidden Technical Debt in Machine Learning Systems 

繼續閱讀