大家好,前幾天群裡有小夥伴說希望看到更多的演算法工程師的日常。其實對於演算法工程師而言,最大的日常就是做資料了,所以給大家分享一下做資料的那些事。
為什麼很少做模型
在大家想象當中,可能演算法工程師做的事情是今天看paper,明天把paper實現了,後天就上線使用,然後公司的收入刷刷漲,我們的工資、級別也跟著漲。但實際上,大多數崗位下的工程師日常並不是這樣。國外有一個著名的大佬(我忘記名字了)曾經說過,演算法工程師有70%的時間是投入在資料上的,花在模型和調參上的只有不到20%。
這句話大家可能或多或少都聽過,但是想必都不是很理解,為什麼會這樣呢?為什麼不能多花點時間做模型呢?原因也很簡單,並非不想,而是不能。
不能的原因也很有很多,我隨便舉幾個最常見的。
框架限制
模型不能隨便動的原因有很多,一般來說最常見的是框架的限制。這種情況在大公司和小公司裡都有,比如之前我在某大公司的時候,公司的框架非常成熟,以至於很少寫程式碼去實現某一個模型,而更多的是視覺化介面的連線以及設定操作。問題來了,在這個場景當中,視覺化介面當中可選的模型是固定的,都是基礎團隊開發好的,他們開發好了這麼多模型,我們就只能使用這麼多模型,除非我們脫離這整個流程,但顯然這是不可能的。
所以當時在很長的一段時間裡,我們只能在有限的模型當中做選擇。直到後來,公司開發出了新的框架工具,可以讓我們自己定製神經網路的程式碼實現深度模型,這才鳥槍換炮迎來了全面升級。
小公司雖然不像大公司這樣有一套成熟且不易改動的框架,但是一般也會有自己的一套流程。比如公司前人留下來鏈路是基於開源xgboost開發的,你想要使用TensorFlow訓練神經網路模型代替原有的xgboost,一般來說這是肯定有效果的,也一定會迎來提升。但問題是,你可能需要把訓練模型、線上呼叫模型的整個鏈路都重構。很多演算法工程師的開發能力不太行,而且也不太願意做工程重構的事情,再加上這塊工作量也不小,所以很容易出現的情況就是,大家都明知道怎麼做比較好,但是由於投入比較多,大家也都不願意做,一直delay。
效果難保證
第二個原因是paper上的一些模型和做法,效果其實是很難保證的。如果你讀過paper會發現paper的結論往往都有很多前提。比如某某特定的資料或者是場景,前期強大的recall以及過濾系統,或者是完善的特徵準備等等。paper裡不會把這些都寫出來,它只會寫上做法以及結果。所以這就導致了,很多paper裡寫得天花亂墜的方法,實際應用起來效果可能並不好。
這也不是paper吹牛,而是你沒有同樣的條件。舉個例子,阿里的資料埋點非常精準,精準到使用者從開啟app到關閉app的每一個動作和行為都有記錄,每一個商品或者是模組在使用者處展示了多少時間,甚至是使用者翻頁的速度都有全面完整的記錄。就這種資料,一般規模的小公司根本做不了。你做不了這個資料,你就沒有paper裡那些精準的特徵。那你如何保證你使用阿里的模型也有同樣的效果呢?
優先順序問題
我們都知道,事情根據緊急以及重要可以分成四類,不重要不緊急、緊急不重要、緊急且重要、重要不緊急。很多人也都知道,最重要的事情是把那些重要且不緊急的事情做好。說起來大家都會說,但是實際上未必人人都會這麼選。
當你面臨KPI考核壓力的時候,一線的工程師可能就只能盯著緊急的事情做。因為他們需要趕緊做出一點成績來完成自己的業績,完成自己業績的最好方法絕不是去升級或者是更新模型,而是找一些特徵做一做,或者是使用一些取巧的方法看看能否提升效果。花時間去更新模型,付出的勞動很大,也不一定有效果。但是做特徵代價很小,做了一個沒效果,可以再做一個,迭代也快。
這其實並不完全是工程師鼠目寸光,也是整個職場氛圍的影響的結果。大家都看重業績和績效,以至於大家都陷入了區域性最優解,但是卻離整體最優解越來越遠。
要想避免這種情況,需要有高瞻遠矚、統籌規劃的架構師或者是leader,能夠抗住升級模型的風險壓力。對可能出現的情況以及將來要做的事情有充足、詳細的規劃,並且有足夠的經驗應對各種可能出現的事情。但是大家也都知道,擁有這種能力的leader在職場裡鳳毛麟角。大公司裡都不多見,小公司裡就更加難得了。
做哪些資料
說完了模型的問題,我們來聊聊資料,既然不能頻繁地變更模型,工程師們就只能更多地來做資料了,那麼工程師們到底又在做哪些資料,需要花費這麼多時間呢?
訓練資料
大公司裡有完整的流程,我們把流程設計好了之後,訓練資料、測試資料、模型訓練以及部署可以一條龍流水線作業。但是在中小型公司裡,這往往是做不到的。
原始資料是不能直接用來訓練模型的,這中間需要複雜的處理流程。首先,需要做取樣。就拿CTR預估的場景來舉例,一般情況下真實場景下的點選率不會超過10%。但是模型訓練一般正負樣本的比例是1:3左右,那麼這就需要我們對負樣本進行取樣。
取樣你還不能直接採,因為可能這些樣本當中還存在很多髒資料或者是非法的資料。我們需要先把這些有問題的資料過濾了之後,再進行取樣,這樣才能保證我們的資料是乾淨的。取樣了之後,我們需要進行特徵和欄位的查詢補全。因為資料往往是分開儲存的,比如使用者的基礎資訊是一張表,使用者的行為資料又是一張表,商品的資訊是一張表,各種各樣的資料存放在各種各樣的地方。我們有了樣本之後,還需要去查詢很多的資料,才能把所有需要用到的欄位蒐集齊。
當我們蒐集了所有需要的資料之後,我們才能開始真正樣本的製作,也就是使用這些我們查詢以及蒐集到的原始資料生成輸入模型的樣本特徵。每一個特徵可能都有自己獨特的生成邏輯,這也是一個龐大的工程。這一步做完還沒結束,還會需要把資料轉化成模型需要的格式。比如tfdata或者是tensor、json之類的。
這麼一系列步驟,大公司一般都有一整套完整的自動排程流程, 工程師們不需要操心,只需要拿來用就好了。但是在中小型公司,可能就只有一些手動工具了,需要資料都需要手工去跑一些任務或者是指令碼。跑的過程當中還有可能會失敗以及遇到各種問題,雖然說起來平平無奇,也沒什麼價值,但這些事情都是需要工作量的。
新的特徵
特徵怎麼做?在kaggle之類比賽當中,可能就是使用pandas寫兩個函式,或者是幾行處理的邏輯就搞定了。但實際上絕不是這麼簡單。
我舉一個最簡單的例子好了,比如我們將年齡進行歸一化,做成一個標準化年齡的特徵。這個簡單吧,我們就用比較簡單的最大最小值歸一化方法好了,公式是:
歸一化之後,這個特徵值會被縮放到0-1的區間裡。但是這裡面用到了兩個引數,一個是最大值,一個是最小值。這兩個引數怎麼來?你可能會覺得這還不簡單,我們遍歷下資料不就知道了。但問題是這個資料你並不是只用一次,以後每次生成訓練資料都需要生成這個特徵,難道每次跑的時候都手動遍歷一下資料找下最大最小值嗎?而且資料是在變化的,每一天使用者年齡的最大和最小值可能都不一樣,假如說我們要跑好幾天的訓練資料怎麼辦?
設計一個新的特徵是簡單的,但是裡面的一些引數會讓事情變得複雜,我們往往需要設計複雜的機制來將新完成的特徵加入流程。
效果分析
還有一塊資料處理的大頭在效果分析,效果分析有兩種,第一種是做一些之前沒有的指標以及相關的分析,或者是應老闆的要求做一些業務指標的分析,達成我們的績效。
比如像是最基礎的CTR、CVR、收入等資料,也有像是老闆臨時起意想要看的某些資料。比如分析一下某些特徵的分佈,比如看一下某個特定族群中樣本的數量或者是資料的情況,等等等等,不一而足。
第二種是我們模型做出來之後的效果分析,如果說模型的效果還,那還好。如果效果不好,問題就來了,我們怎麼樣確定是哪裡出了問題?是因為模型本身的效能不足呢?還是我們的特徵不夠或者是特徵當中存在問題呢?還是我們的資料質量不高呢?還是說什麼地方存在bug呢?
演算法不像是工程,工程當中絕大多數事情是確定的,結果不對一定是因為邏輯有bug,那麼只要仔細測試,分析原因,總能解決。那種難以復現,找不到原因的問題非常罕見。但是演算法不一樣,大多數情況下並沒有絕對的錯誤和正確,甚至沒有絕對的原因。我們扮演的角色更多地像是偵探,根據一些蛛絲馬跡推測導致問題的原因,然後用實驗嘗試著解決,在這個過程當中就涉及到大量的資料處理和分析的工作。
比如,如果你懷疑是某些特徵分佈有問題導致了模型效果不好,那麼你需要分析特徵的分佈。如果你懷疑是資料存在bug,那麼你需要設計方案,篩選資料,仔細甄別資料當中的問題,驗證自己的想法。如果你覺得是訓練資料量不夠,那麼你需要增大訓練量,設計對比實驗……總之,想要排查問題都需要大量的資料分析,絕不僅僅是看看程式碼,想一想就能有結論的。
感想
很多想要從事演算法的人真正做了演算法之後,往往會有幻滅感。會有一種強烈的面試造航母,入職擰螺絲的感覺。原因也很簡單,我們面試的時候問的是各種各樣的模型,各種先進的理念和方法,但是入職之後面臨的工作卻是各種各樣的資料分析以及資料準備。比如我當年大部分時間都在寫SQL做資料,我一度懷疑公司的職位安排。
但當我理解了這一切的運作機制之後,我就理解了。實際的工作場景和線上演算法比賽不同,線上比賽我們可以使用各種各樣的trick來提升成績。還可以搞各種跨界混搭,比如今年的騰訊演算法大賽的冠軍的做法就是把BERT應用在了使用者行為分析的場景下。但是在實際的場景當中,由於系統以及各方面的制約,這些想法都是很難實現的而且效果也難保證,最終還是要落實到基本的資料支撐上來。
打個不確切的比方,各種各樣的演算法模型就好像是工具箱裡的各式工具,我們僅僅瞭解工具是沒用的。最重要的是要理解使用工具的場景,從而可以根據需要選擇最合適的工具。但很遺憾的是,我們對資料以及場景的理解是很難量化的,所以面試的時候只能退而求其次問你工具的使用了,長此以往很多人本末倒置,搞錯了核心競爭力,出現對面試的種種非議也就不奇怪了。
今天的文章就到這裡,衷心祝願大家每天都有所收穫。如果還喜歡今天的內容的話,請來一個三連支援吧~(點贊、關注、轉發)