算法工程師為什么成天做數(shù)據(jù),都做哪些數(shù)據(jù)?
為什么很少做模型
在大家想象當(dāng)中,可能算法工程師做的事情是今天看paper,明天把paper實(shí)現(xiàn)了,后天就上線使用,然后公司的收入刷刷漲,我們的工資、級(jí)別也跟著漲。但實(shí)際上,大多數(shù)崗位下的工程師日常并不是這樣。國(guó)外有一個(gè)著名的大佬(我忘記名字了)曾經(jīng)說(shuō)過(guò),算法工程師有70%的時(shí)間是投入在數(shù)據(jù)上的,花在模型和調(diào)參上的只有不到20%。
這句話大家可能或多或少都聽過(guò),但是想必都不是很理解,為什么會(huì)這樣呢?為什么不能多花點(diǎn)時(shí)間做模型呢?原因也很簡(jiǎn)單,并非不想,而是不能。
不能的原因也很有很多,我隨便舉幾個(gè)最常見的。
框架限制
模型不能隨便動(dòng)的原因有很多,一般來(lái)說(shuō)最常見的是框架的限制。這種情況在大公司和小公司里都有,比如之前我在某大公司的時(shí)候,公司的框架非常成熟,以至于很少寫代碼去實(shí)現(xiàn)某一個(gè)模型,而更多的是可視化界面的連線以及設(shè)置操作。問(wèn)題來(lái)了,在這個(gè)場(chǎng)景當(dāng)中,可視化界面當(dāng)中可選的模型是固定的,都是基礎(chǔ)團(tuán)隊(duì)開發(fā)好的,他們開發(fā)好了這么多模型,我們就只能使用這么多模型,除非我們脫離這整個(gè)流程,但顯然這是不可能的。
所以當(dāng)時(shí)在很長(zhǎng)的一段時(shí)間里,我們只能在有限的模型當(dāng)中做選擇。直到后來(lái),公司開發(fā)出了新的框架工具,可以讓我們自己定制神經(jīng)網(wǎng)絡(luò)的代碼實(shí)現(xiàn)深度模型,這才鳥槍換炮迎來(lái)了全面升級(jí)。
小公司雖然不像大公司這樣有一套成熟且不易改動(dòng)的框架,但是一般也會(huì)有自己的一套流程。比如公司前人留下來(lái)鏈路是基于開源xgboost開發(fā)的,你想要使用TensorFlow訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型代替原有的xgboost,一般來(lái)說(shuō)這是肯定有效果的,也一定會(huì)迎來(lái)提升。但問(wèn)題是,你可能需要把訓(xùn)練模型、線上調(diào)用模型的整個(gè)鏈路都重構(gòu)。很多算法工程師的開發(fā)能力不太行,而且也不太愿意做工程重構(gòu)的事情,再加上這塊工作量也不小,所以很容易出現(xiàn)的情況就是,大家都明知道怎么做比較好,但是由于投入比較多,大家也都不愿意做,一直delay。
效果難保證
第二個(gè)原因是paper上的一些模型和做法,效果其實(shí)是很難保證的。如果你讀過(guò)paper會(huì)發(fā)現(xiàn)paper的結(jié)論往往都有很多前提。比如某某特定的數(shù)據(jù)或者是場(chǎng)景,前期強(qiáng)大的recall以及過(guò)濾系統(tǒng),或者是完善的特征準(zhǔn)備等等。paper里不會(huì)把這些都寫出來(lái),它只會(huì)寫上做法以及結(jié)果。所以這就導(dǎo)致了,很多paper里寫得天花亂墜的方法,實(shí)際應(yīng)用起來(lái)效果可能并不好。
這也不是paper吹牛,而是你沒有同樣的條件。舉個(gè)例子,阿里的數(shù)據(jù)埋點(diǎn)非常精準(zhǔn),精準(zhǔn)到用戶從打開app到關(guān)閉app的每一個(gè)動(dòng)作和行為都有記錄,每一個(gè)商品或者是模塊在用戶處展示了多少時(shí)間,甚至是用戶翻頁(yè)的速度都有全面完整的記錄。就這種數(shù)據(jù),一般規(guī)模的小公司根本做不了。你做不了這個(gè)數(shù)據(jù),你就沒有paper里那些精準(zhǔn)的特征。那你如何保證你使用阿里的模型也有同樣的效果呢?
優(yōu)先級(jí)問(wèn)題
我們都知道,事情根據(jù)緊急以及重要可以分成四類,不重要不緊急、緊急不重要、緊急且重要、重要不緊急。很多人也都知道,最重要的事情是把那些重要且不緊急的事情做好。說(shuō)起來(lái)大家都會(huì)說(shuō),但是實(shí)際上未必人人都會(huì)這么選。
當(dāng)你面臨KPI考核壓力的時(shí)候,一線的工程師可能就只能盯著緊急的事情做。因?yàn)樗麄冃枰s緊做出一點(diǎn)成績(jī)來(lái)完成自己的業(yè)績(jī),完成自己業(yè)績(jī)的最好方法絕不是去升級(jí)或者是更新模型,而是找一些特征做一做,或者是使用一些取巧的方法看看能否提升效果?;〞r(shí)間去更新模型,付出的勞動(dòng)很大,也不一定有效果。但是做特征代價(jià)很小,做了一個(gè)沒效果,可以再做一個(gè),迭代也快。
這其實(shí)并不完全是工程師鼠目寸光,也是整個(gè)職場(chǎng)氛圍的影響的結(jié)果。大家都看重業(yè)績(jī)和績(jī)效,以至于大家都陷入了局部最優(yōu)解,但是卻離整體最優(yōu)解越來(lái)越遠(yuǎn)。
要想避免這種情況,需要有高瞻遠(yuǎn)矚、統(tǒng)籌規(guī)劃的架構(gòu)師或者是leader,能夠抗住升級(jí)模型的風(fēng)險(xiǎn)壓力。對(duì)可能出現(xiàn)的情況以及將來(lái)要做的事情有充足、詳細(xì)的規(guī)劃,并且有足夠的經(jīng)驗(yàn)應(yīng)對(duì)各種可能出現(xiàn)的事情。但是大家也都知道,擁有這種能力的leader在職場(chǎng)里鳳毛麟角。大公司里都不多見,小公司里就更加難得了。
做哪些數(shù)據(jù)
說(shuō)完了模型的問(wèn)題,我們來(lái)聊聊數(shù)據(jù),既然不能頻繁地變更模型,工程師們就只能更多地來(lái)做數(shù)據(jù)了,那么工程師們到底又在做哪些數(shù)據(jù),需要花費(fèi)這么多時(shí)間呢?
訓(xùn)練數(shù)據(jù)
大公司里有完整的流程,我們把流程設(shè)計(jì)好了之后,訓(xùn)練數(shù)據(jù)、測(cè)試數(shù)據(jù)、模型訓(xùn)練以及部署可以一條龍流水線作業(yè)。但是在中小型公司里,這往往是做不到的。
原始數(shù)據(jù)是不能直接用來(lái)訓(xùn)練模型的,這中間需要復(fù)雜的處理流程。首先,需要做采樣。就拿CTR預(yù)估的場(chǎng)景來(lái)舉例,一般情況下真實(shí)場(chǎng)景下的點(diǎn)擊率不會(huì)超過(guò)10%。但是模型訓(xùn)練一般正負(fù)樣本的比例是1:3左右,那么這就需要我們對(duì)負(fù)樣本進(jìn)行采樣。
采樣你還不能直接采,因?yàn)榭赡苓@些樣本當(dāng)中還存在很多臟數(shù)據(jù)或者是非法的數(shù)據(jù)。我們需要先把這些有問(wèn)題的數(shù)據(jù)過(guò)濾了之后,再進(jìn)行采樣,這樣才能保證我們的數(shù)據(jù)是干凈的。采樣了之后,我們需要進(jìn)行特征和字段的查找補(bǔ)全。因?yàn)閿?shù)據(jù)往往是分開存儲(chǔ)的,比如用戶的基礎(chǔ)信息是一張表,用戶的行為數(shù)據(jù)又是一張表,商品的信息是一張表,各種各樣的數(shù)據(jù)存放在各種各樣的地方。我們有了樣本之后,還需要去查找很多的數(shù)據(jù),才能把所有需要用到的字段搜集齊。
當(dāng)我們搜集了所有需要的數(shù)據(jù)之后,我們才能開始真正樣本的制作,也就是使用這些我們查找以及搜集到的原始數(shù)據(jù)生成輸入模型的樣本特征。每一個(gè)特征可能都有自己獨(dú)特的生成邏輯,這也是一個(gè)龐大的工程。這一步做完還沒結(jié)束,還會(huì)需要把數(shù)據(jù)轉(zhuǎn)化成模型需要的格式。比如tfdata或者是tensor、json之類的。
這么一系列步驟,大公司一般都有一整套完整的自動(dòng)調(diào)度流程, 工程師們不需要操心,只需要拿來(lái)用就好了。但是在中小型公司,可能就只有一些手動(dòng)工具了,需要數(shù)據(jù)都需要手工去跑一些任務(wù)或者是腳本。跑的過(guò)程當(dāng)中還有可能會(huì)失敗以及遇到各種問(wèn)題,雖然說(shuō)起來(lái)平平無(wú)奇,也沒什么價(jià)值,但這些事情都是需要工作量的。
新的特征
特征怎么做?在kaggle之類比賽當(dāng)中,可能就是使用pandas寫兩個(gè)函數(shù),或者是幾行處理的邏輯就搞定了。但實(shí)際上絕不是這么簡(jiǎn)單。
我舉一個(gè)最簡(jiǎn)單的例子好了,比如我們將年齡進(jìn)行歸一化,做成一個(gè)標(biāo)準(zhǔn)化年齡的特征。這個(gè)簡(jiǎn)單吧,我們就用比較簡(jiǎn)單的最大最小值歸一化方法好了,公式是:
算法工程師為什么成天做數(shù)據(jù),都做哪些數(shù)據(jù)?
歸一化之后,這個(gè)特征值會(huì)被縮放到0-1的區(qū)間里。但是這里面用到了兩個(gè)參數(shù),一個(gè)是最大值,一個(gè)是最小值。這兩個(gè)參數(shù)怎么來(lái)?你可能會(huì)覺得這還不簡(jiǎn)單,我們遍歷下數(shù)據(jù)不就知道了。但問(wèn)題是這個(gè)數(shù)據(jù)你并不是只用一次,以后每次生成訓(xùn)練數(shù)據(jù)都需要生成這個(gè)特征,難道每次跑的時(shí)候都手動(dòng)遍歷一下數(shù)據(jù)找下最大最小值嗎?而且數(shù)據(jù)是在變化的,每一天用戶年齡的最大和最小值可能都不一樣,假如說(shuō)我們要跑好幾天的訓(xùn)練數(shù)據(jù)怎么辦?
設(shè)計(jì)一個(gè)新的特征是簡(jiǎn)單的,但是里面的一些參數(shù)會(huì)讓事情變得復(fù)雜,我們往往需要設(shè)計(jì)復(fù)雜的機(jī)制來(lái)將新完成的特征加入流程。
效果分析
還有一塊數(shù)據(jù)處理的大頭在效果分析,效果分析有兩種,第一種是做一些之前沒有的指標(biāo)以及相關(guān)的分析,或者是應(yīng)老板的要求做一些業(yè)務(wù)指標(biāo)的分析,達(dá)成我們的績(jī)效。
比如像是最基礎(chǔ)的CTR、CVR、收入等數(shù)據(jù),也有像是老板臨時(shí)起意想要看的某些數(shù)據(jù)。比如分析一下某些特征的分布,比如看一下某個(gè)特定族群中樣本的數(shù)量或者是數(shù)據(jù)的情況,等等等等,不一而足。
第二種是我們模型做出來(lái)之后的效果分析,如果說(shuō)模型的效果還,那還好。如果效果不好,問(wèn)題就來(lái)了,我們?cè)趺礃哟_定是哪里出了問(wèn)題?是因?yàn)槟P捅旧淼男阅懿蛔隳兀窟€是我們的特征不夠或者是特征當(dāng)中存在問(wèn)題呢?還是我們的數(shù)據(jù)質(zhì)量不高呢?還是說(shuō)什么地方存在bug呢?
算法不像是工程,工程當(dāng)中絕大多數(shù)事情是確定的,結(jié)果不對(duì)一定是因?yàn)檫壿嬘衎ug,那么只要仔細(xì)測(cè)試,分析原因,總能解決。那種難以復(fù)現(xiàn),找不到原因的問(wèn)題非常罕見。但是算法不一樣,大多數(shù)情況下并沒有絕對(duì)的錯(cuò)誤和正確,甚至沒有絕對(duì)的原因。我們扮演的角色更多地像是偵探,根據(jù)一些蛛絲馬跡推測(cè)導(dǎo)致問(wèn)題的原因,然后用實(shí)驗(yàn)嘗試著解決,在這個(gè)過(guò)程當(dāng)中就涉及到大量的數(shù)據(jù)處理和分析的工作。
比如,如果你懷疑是某些特征分布有問(wèn)題導(dǎo)致了模型效果不好,那么你需要分析特征的分布。如果你懷疑是數(shù)據(jù)存在bug,那么你需要設(shè)計(jì)方案,篩選數(shù)據(jù),仔細(xì)甄別數(shù)據(jù)當(dāng)中的問(wèn)題,驗(yàn)證自己的想法。如果你覺得是訓(xùn)練數(shù)據(jù)量不夠,那么你需要增大訓(xùn)練量,設(shè)計(jì)對(duì)比實(shí)驗(yàn)……總之,想要排查問(wèn)題都需要大量的數(shù)據(jù)分析,絕不僅僅是看看代碼,想一想就能有結(jié)論的。
感想
很多想要從事算法的人真正做了算法之后,往往會(huì)有幻滅感。會(huì)有一種強(qiáng)烈的面試造航母,入職擰螺絲的感覺。原因也很簡(jiǎn)單,我們面試的時(shí)候問(wèn)的是各種各樣的模型,各種先進(jìn)的理念和方法,但是入職之后面臨的工作卻是各種各樣的數(shù)據(jù)分析以及數(shù)據(jù)準(zhǔn)備。比如我當(dāng)年大部分時(shí)間都在寫SQL做數(shù)據(jù),我一度懷疑公司的職位安排。
但當(dāng)我理解了這一切的運(yùn)作機(jī)制之后,我就理解了。實(shí)際的工作場(chǎng)景和線上算法比賽不同,線上比賽我們可以使用各種各樣的trick來(lái)提升成績(jī)。還可以搞各種跨界混搭,比如今年的騰訊算法大賽的冠軍的做法就是把BERT應(yīng)用在了用戶行為分析的場(chǎng)景下。但是在實(shí)際的場(chǎng)景當(dāng)中,由于系統(tǒng)以及各方面的制約,這些想法都是很難實(shí)現(xiàn)的而且效果也難保證,最終還是要落實(shí)到基本的數(shù)據(jù)支撐上來(lái)。
打個(gè)不確切的比方,各種各樣的算法模型就好像是工具箱里的各式工具,我們僅僅了解工具是沒用的。最重要的是要理解使用工具的場(chǎng)景,從而可以根據(jù)需要選擇最合適的工具。但很遺憾的是,我們對(duì)數(shù)據(jù)以及場(chǎng)景的理解是很難量化的,所以面試的時(shí)候只能退而求其次問(wèn)你工具的使用了,長(zhǎng)此以往很多人本末倒置,搞錯(cuò)了核心競(jìng)爭(zhēng)力,出現(xiàn)對(duì)面試的種種非議也就不奇怪了。















 
 
 




 
 
 
 