回覆列表
  • 1 # 和小凡

    首先我個人覺得,演算法工程師的目標既不是精通各種框架,會調各種包,也不是會發paper就是成功,而是有能力解決實實在在被提出的演算法問題。

    先說一下本文4個樣本的背景,甲乙丙丁都是一線大廠的正式員工(包括知名外企),工齡從剛入職到3年不等,不過都不是自己團隊的。

    只是各種原因而接觸到的NLP演算法工程師。為了避免對號入座,將以下內容中的部分關鍵詞打碼。

    出現一個奇怪現象後,我讓他把訓練loss畫出來,結果他不知道怎麼畫。然後他不會用xx,我告訴他那就把日誌中的loss點提取出來,用*來畫。結果他問我*從哪裡下載,有沒有學習教程。

    注:*是一個非常常用的python庫

    然後又一次,發給他一個非常簡單的程式碼,他想改一下其中一個預處理邏輯,我告訴他在哪裡改,他直接說看不懂,求幫他改。我問別人,那他拿著工資每天干什麼呢,答曰,可能會寫寫paper?

    結果最後那篇paper也不是他寫的。

    乙比甲好一些,乙想解決一個問題,於是我給他甩了一篇paper,然後他很多地方看不懂,於是這些細節我一點點給他講。講完後他要借鑑其中一個idea用程式碼實現,這個idea寫起來就一二十行。他繞不清矩陣計算,讓我教他寫,我給他5分鐘寫完,他很努力的理解了,恍然大霧,拿去跑了,然後跑完覺得很棒,自己又想了一個可能的實現方案,然後問我另一個方案可行性,這兩個方案在數學上是等價的,於是講了等價後,開始問我另一個方案的每行程式碼應該怎麼實現。

    小哥哥,你是故意來搭訕的吧?

    有一天我把甲的故事分享給了另一家大廠的小夥伴,小夥伴說,還好,他們組剛入職一個新人,第一次做技術分享,給大家講了半小時的word2vec就結束了,據說,該同學非常費力的直譯了論文原文一些內容,專業名詞翻譯錯了他都不清楚,並且表示負取樣沒看懂,而且不重要,所以就不講了。

    問了一下丙後來怎麼樣了,說被調去做java了,小夥伴反饋丙做java開發還出活挺快的。

    丁的故事來源於一個很要好的小夥伴,差點讓小夥伴當場離職。丁是另一家很多人都想去的大廠的。丁的能力則是在甲乙丙之上,各種leetcode題刷的賊溜,textcnn之類的也都很熟,今年年初ta的mentor讓ta用bert跑一下業務上的一個*分類任務,結果其一跑就是X個月,調了X個月後的結論是不如textcnn好用,線下稍微好一些,線上一塌糊塗。後來我一個剛去的小夥伴接手了ta的工作後,發現數據集裡,預處理腳本里,訓練指令碼和評估腳本里全都有bug,從頭到尾完全就是錯的。小夥伴給ta修完bug後上升了近XX個點。

    注:*取值小於5,X取值大於3,XX取值兩位數

    丁至今還是在崗的,因為ta的mentor也不太懂這塊,mentor認為是bert程式碼太過複雜導致的,情有可原。

    那麼問題來了,甲乙丙丁是怎麼透過各大廠面試的?靠刷題?靠學校背景?靠不可描述?這個問題我至今沒想明白……

    下文所說的僅為AI演算法工程師。

    0級演算法工程師——只知道神經網路和幾個名詞,這一級的人一談到演算法和人工智慧,無腦牛逼(或無腦diss)就完事了。

    1級演算法工程師——拜讀過西瓜書/小藍書/花書,看過演算法影片教程,對演算法基礎知識有一定的瞭解;掉過幾個演算法包,跑過幾個模型和典型資料。這一級通常是調包俠,調參怪。口頭禪:xxx演算法模型是真的強!實際上對於演算法原理思想一無所知,看的書也只是囫圇吞棗。

    2級演算法工程師——參加過一兩個演算法競賽/專案,跑過知名的幾個效果好的演算法模型,並且獲得了中規中矩的成績(前10-20%)。此時認為演算法不過如此,資料處理、特徵構建、模型選擇無非那麼幾種套路,僅僅靠著模型融合和毫無想法的資料處理過程來上分。這一級充斥著大量的校招演算法工程師,承擔著大中廠演算法崗炮灰的角色。

    3級演算法工程師——參加一些演算法競賽並獲得比較靠前的名次,對於使用的模型和方法有叫深入的理解,競賽中存在獨立和較深刻的思考。或者有關於演算法專案相關的論文。這一級在基礎演算法能力上來說已經過關,可以找到還不錯的工作。比較容易擔憂的是自身的工程能力。

    4級演算法工程師——除了比較紮實的演算法基礎外,還有比較不錯的工程能力。不僅理論知識過關,同時能將演算法結合到業務場景、實際專案當中去,並對演算法本身進行一定的更改以適應背景。這一級的人已經能成為offer收割機了,往往能拿到心儀的offer。

    (我認為四級已經是絕大多數演算法工程師的上限,對於工程師來說繼續升級需要的是對相關業務的理解、敏銳度和工程能力了,超越了“演算法”本身的範疇)

    …………

    N級演算法工程師

    對於現有的演算法進行創新和改進/開發演算法框架造福AI領域等造成比較大的影響的巨佬。這一級答主根本無法想象那種高度,實屬演算法領域的大牛級人物。

    強答一波,講講在學校或網上見到的現象(AI方面,嚴格來說,這些人放到今天的行業標準下,基本不可能成為一名演算法工程師)。

    (純屬吐槽,請勿對號入座)

    百度百科型選手/PPT選手:常見於各類創新競賽、課程答辯,張口閉口一定是「人工智慧」「神經網路」,上來一定要氣壓群雄,儘管對各類AI問題的進展沒有任何瞭解,但是在他們這裡,各種演算法一定是封裝好了,準確率100%,拿來就可以用(plug-and-play)的。什麼文字情感分析做輿情監控啊,人臉識別智慧面試啊,不在話下,章口就來。

    部落格型選手:大機率嘗試過Andrew Ng的網課,但大機率沒看下去,手裡一定有一本Python深度學習,對原理不求甚解,數學公式大概都不想看,論文不想讀,輾轉各個部落格網站希望找到一個好一點的解讀;跑了一通例項程式碼,很有成就感,可能會在某個部落格網站釋出一篇部落格,標題諸如《自然語言處理入門-XXX》,成功為網路貢獻一篇與其他部落格雷同率90%的文章,雖然文章名字像是一個系列,但是相信我,他大機率不會再發布同系列的文章了。

    Github選手:常常和PPT選手合作,拿到需求,「人臉識別是吧?」,Github一搜,好多倉庫,全克隆了再說;挑挑揀揀,除錯了半天,依賴裝完程式碼跑通了(沒有error),任務完成,功德無量,接下來的任務交給其他隊友!

    AI+型選手(教師):傳統方向出身,沒有學過ML/DL,在AI興起以後,把DL當萬精油用,深度學習預測地震啊,深度學習驗證軟體啊...管它什麼資料驅動不驅動,經費拿到手就行了。這類老師對AI的認知可能和PPT選手差不多,比學生多的本領就是寫本子、打招呼了。帶一個PPT選手加一個Github選手,基本上可以在各類創新競賽/專案中拿到還不錯的成績。

    潮流型選手:走在AI潮流前列,除了最新的演算法,其他的都是垃圾,「不加attention?你這演算法不行!」,「2019年了,還用機率圖模型?!」這類人對演算法應用場景一無所知,對新演算法的狂熱程度堪比娛樂圈流量小生的瘋狂粉絲們。

  • 2 # 瘋狂的小楊

    本世紀,演算法工程師們的境遇也差不多:早些年,信奉糙快猛主義的大佬們覺得他們飽食終日、無所用心,沒工作只好在學校混博士,靠資料上的障眼法裝神弄鬼。可是,隨著去年 AlphaGo 大破李世石,大佬們在心底喊出“我操”的同時,慌不擇路地把各種搞劫持、送外賣的生意包裝成人工智慧,並紛紛請來幾位懂演算法的國師加持。雖然他們對國師們所做的事智商上並不理解,卻虔誠地希望他們快點兒求下雨來。

    於是,演算法工程師的身價也水漲船高了。各門派工程師不論過去練的是 Java、PHP 還是 Excel,都放棄了最好語言的爭論,抄起了深度學習,發誓重新修煉成演算法工程師。前些天,還有人在知乎上問我:20 萬、50 萬、100 萬年薪的演算法工程師,到底有什麼區別?

    這樣充滿銅臭味兒的問題,讓我十分欣慰。雖說在北京,20 萬已經基本不可能招到靠譜兒的演算法工程師了,還是姑且用上面的數字做個參照,談談演算法工程師的三個層次吧。(這裡說的演算法,並不是計算機系本科課程《演算法與資料結構》裡那個演算法。那門課裡講的,是排序、查詢這類“確定性演算法”;而這裡我們說的,是用統計方法對資料進行建模的“機率性演算法”。)下文中會提到一些演算法和模型,但不過是為了舉例說明概念,無需深究,有興趣鑽研的朋友可以自己查閱資料。

    第一層次“Operating”:會使用工具

    這個層次的工程師,對常用的模型比較熟悉,來了資料以後,好歹能挑個合適的跑一下。

    達到這個層次,其實門檻不高。早些年,您只要掌握了什麼叫 LDA、哪叫 SVM,再玩過幾次 libnear、mahout 等開源工具,就可以拿到資料後跑個結果出來。到了深度學習時代,這件事兒似乎就更簡單了:管它什麼問題,不都是拿神經網路往上堆嘛!最近,經常會遇到一些工程師,成功地跑通了 Tensorflow 的 demo 後,興高采烈地歡呼:我學會深度學習了,我明天就統治人類了!

    這事要真這麼簡單,我是茄子。任憑你十八般開源工具用的再熟,也不可能搞出個戰勝柯潔的機器人來。這裡要給大家狠狠澆上一盆冷水:進入這個領域的人,都要先了解一個“沒有免費的午餐定理”,這個定理的數學表達過於晦澀,我們把它翻譯成並不太準確的文藝語言:

    如果有兩個模型搞一次多回合的比武,每個回合用的資料集不同,而且資料集沒什麼偏向性,那麼最後的結果,十有八九是雙方打平。

    管你是普通模型、文藝模型還是 2B 模型,誰也別瞧不起誰。考慮一種極端情況:有一個參賽模型是“隨機猜測”,也就是無根據地胡亂給個答案,結果如何呢?對,還是打平!所以,請再也不要問“聚類用什麼演算法效果好”這樣的傻問題了。

    這就很尷尬了!因為掌握了一堆模型並且會跑,其實並沒有什麼卵用。當然,實際問題的資料分佈,總是有一定特點的,比方說人臉識別,圖中間怎麼說都得有個大圓餅。因此,問“人臉識別用什麼模型好”這樣的問題,就有意義了。而演算法工程師的真正價值,就是洞察問題的資料先驗特點,把他們表達在模型中,而這個,就需要下一個層次的能力了。

    會使用工具,在演算法工程師中僅僅是入門水平,靠這兩把刷子解決問題,就好比殺過兩隻雞就想做腹腔手術一樣,不靠譜兒程度相當高。如果不是在薪酬膨脹嚴重的網際網路界,我覺得 20 萬是個比較合理的價格。

    第二層次“Optimization”:能改造模型

    這個層次的工程師,能夠根據具體問題的資料特點對模型進行改造,並採用相應合適的最最佳化演算法,以追求最好的效果。

    不論前人的模型怎麼美妙,都是基於當時觀察到的資料先驗特點設計的。比如說 LDA,就是在語料質量不高的情況下,在 PLSA 基礎上引入貝葉斯估計,以獲得更加穩健的主題。雖說用 LDA 不會大錯,但是要在你的具體問題上跑出最好的效果,根據資料特點做模型上的精準改造,是不可避免的。

    改造模型的能力,就不是用幾個開源工具那麼簡單了,這需要有兩方面的素養:

    一、深入瞭解機器學習的原理和元件。

    機器學習領域,有很多看似不那麼直接有用的基礎原理和元件。比方說,正則化怎麼做?什麼時候應該選擇什麼樣的基本分佈?(如下表) 貝葉斯先驗該怎麼設?兩個機率分佈的距離怎麼算?當你看到前輩高人把這些材料烹調在一起,變成 LDA、CNN 這些成品菜餚端上來的時候,也要想想如果自己下廚,是否瞭解食材,會不會選擇和搭配。僅僅會吃幾個菜,說出什麼味道,離好廚師差的還遠著呢。

    二、熟練掌握最最佳化方法。

    機器學習從業者不懂最最佳化,相當於武術家只會耍套路。這就跟雷公太極和閆芳大師一樣,實戰起來一定是鼻青臉腫。管你設計了一個多牛逼的模型,如果無法在有限的計算資源下找出最優解,那麼不過是個花瓶罷了。

    最最佳化,是機器學習最、最、最重要的基礎。你要知道,在目標函式及其導數的各種情形下,應該如何選擇最佳化方法;各種方法的時間空間複雜度、收斂性如何;還要知道怎樣構造目標函式,才便於用凸最佳化或其他框架來求解。而這些方面的訓練,要比機器學習的模型還要紮實才行。

    拿大家以為“以不變應萬變”的深度學習舉個例子。用神經網路處理語音識別、自然語言處理這種時間序列資料的建模,RNN(見上圖)是個自然的選擇。不過在實踐中,大家發現由於“梯度消失”現象的存在,RNN 很難對長程的上下文依賴建模。而在自然語言中,例如決定下面的 be 動詞是“is”還是“are”這樣的問題,有可能往前翻好多詞才能找到起決定作用的主語。怎麼辦呢?天才的 J. Schmidhuber 設計了帶有門結構的 LSTM 模型(見下圖),讓資料自行決定哪些資訊要保留,那些要忘掉。如此以來,自然語言的建模效果,就大大提高了。大家初看下面兩張 RNN 與 LSTM 的結構對比,面對憑空多出來的幾個門結構可能一頭霧水,唯有洞徹其中的方法論,並且有紮實的機器學習和最最佳化基礎,才能逐漸理解和學習這種思路。

    當然,LSTM 這個模型是神來之筆,我等對此可望不可及。不過,在這個例子裡展現出來的關鍵能力:根據問題特點調整模型,並解決最佳化上的障礙,是一名合格的演算法工程師應該追求的能力。年薪 50 萬能找到這樣的人,是物有所值的。

    第三層次“Objective”:擅定義問題

    這個層次的工程師(哦,似乎叫工程師不太合適了),扔給他一個新的實際問題,可以給出量化的目標函式。

    當年,福特公司請人檢修電機,斯泰因梅茨(編者注:Steinmetz,Charles Proteus 德國-美國電機工程師,對交流電系統的發展作出巨大貢獻。)在電機外殼畫了一條線,讓工作人員在此處開啟電機迅速排除了故障。結賬時,斯坦門茨要 1 萬美元,還開了個清單:畫一條線,1 美元;知道在哪兒畫線,9999 美元。

    同樣的道理,在演算法領域,最難的也是知道在哪裡畫線,這就是對一個新問題構建目標函式的過程。而有明確的量化目標函式,正是科學方法區別於玄學方法、神學方法的重要標誌。

    目標函式,有時能用一個解析形式(Analytical form)寫出來,有時則不能。比方說網頁搜尋這個問題,有兩種目標函式:一種是 nDCG,這是一個在標註好的資料集上可以明確計算出來的指標;另一種則是人工看 badcase 的比例,顯然這個沒法用公式計算,但是其結果也是定量的,也可以作為目標函式。

    定義目標函式,初聽起來並沒有那麼困難,不就是制定個 KPI 麼?其實不然,要做好這件事,在意識和技術上都有很高的門檻。

    一、要建立“萬般皆下品、唯有目標高”的意識。

    一個團隊也好、一個專案也好,只要確立了正確的、可衡量的目標,那麼達到這個目標就只是時間和成本的問題。假設 nDCG 是搜尋的正確目標函式,那麼微軟也好、Yahoo! 也好,遲早也能追上 Google,遺憾的是,nDCG 這個目標是有點兒問題的,所以後來這兩家被越拉越遠。

    二、能夠構造準確(信)、可解(達)、優雅(雅)的目標函式。

    目標函式要儘可能反應實際業務目標,同時又有可行的最佳化方法。一般來說,最佳化目標與評測目標是有所不同的。比如說在語音識別中,評測目標是“詞錯誤率”,但這個不可導所以沒法直接最佳化;因此,我們還要找一個“代理目標”,比如似然值或者後驗機率,用於求解模型引數。評測目標的定義往往比較直覺,但是要把它轉化成一個高度相關,又便於求解的最佳化目標,是需要相當的經驗與功力的。在語音建模裡,即便是計算似然值,也需要涉及 Baum-Welch 等比較複雜的演算法,要定義清楚不是簡單的事兒。

    優雅,是個更高層次的要求;可是在遇到重大問題時,優雅卻往往是不二法門。因為,往往只有漂亮的框架才更接近問題的本質。 關於這點,必須要提一下近年來最讓人醍醐灌頂的大作——生成對抗網路(GAN)。

    GAN 要解決的,是讓機器根據資料學會畫畫、寫文章等創作性問題。機器畫畫的目標函式怎麼定?聽起來是一頭霧水。我們早年做類似的語音合成問題時,也沒什麼好辦法,只能找人一句句聽來打分。令人拍案叫絕的是,Ian GoodFellow 在定義這個問題時,採取了下圖的巧妙框架:

    既然靠人打分費時費力,又不客觀,那就乾脆讓機器打分把!好在讓機器認一幅特定語義的圖畫,比如說人臉,在深度學習中已經基本解決了。好,假設我們已經有一個能打分的機器 D,現在要訓練一個能畫畫的機器 G,那就讓 G 不斷地畫,D 不斷地打分,什麼時候 G 的作品在 D 那裡得分高了,就算是學成了。同時,D 在此過程中也因為大量接觸仿品而提升了鑑賞能力,可以把 G 訓練得更好。有了這樣定性的思考還不夠,這樣一個巧妙設計的二人零和博弈過程,還可以表示成下面的數學問題:

    這樣一個目標,優雅得象個哲學問題,卻又實實在在可以追尋。當我看到這個式子時,頓時覺得教會機器畫畫是個不遠的時間問題了。如果你也能對這樣的問題描述感到心曠神怡,就能體會為什麼這才是最難的一步。

    一個團隊的定海神針,就是能把問題轉化成目標函式的那個人——哪怕他連開源工具都不會用。100 萬找到這樣的人,可真是撿了個大便宜。

    在機器學習領域,演算法工程師腳下的進階之路是清晰的:當你掌握了工具、會改造模型,進而可以駕馭新問題的建模,就能成長為最優秀的人才。沿著這條路踏踏實實走下去,100 萬並不是什麼問題。什麼?您說還有 300 萬的呢?這個不用眼熱,人家只不過把你寫程式碼的時間都用來跳槽了而已。

  • 中秋節和大豐收的關聯?
  • 本人窮大叔,結婚住老婆家,但老婆把我媽媽趕出去這樣如何解決?