推荐系统里的那些坑
寫在前面的話
大家好鴨,我是時(shí)晴,跟著師傅學(xué)習(xí)推薦算法煉丹有一段時(shí)間了,過程中遇到了很多奇奇怪怪的問題。我想很多和我一樣初入推薦領(lǐng)域的同學(xué),都多多少少有跟我同樣的經(jīng)歷和體會。不管項(xiàng)目大小,也不論推薦什么東西,只要你做過和推薦系統(tǒng)相關(guān)的項(xiàng)目,你就會多多少少的遇見過坑兒,所以,作為自己煉丹道路上的一份筆記,本文幫大家歸納整理了一下推薦系統(tǒng)里的那些坑兒,都是知乎大佬們曾經(jīng)的真實(shí)經(jīng)歷(當(dāng)時(shí)自己記筆記的同時(shí)做了一些調(diào)整和修改,嘻嘻),整理分享給大家,希望對煉丹路上遇到困惑的你能有所幫助。
壹號坑:線上線下不一致問題
1. 特征不一致
這種在離線拼接樣本和特征的Pipeline中比較常見。一般離線特征都是按照天處理的,考慮各種數(shù)據(jù)pipeline的流程,處理時(shí)間一般都會有延遲,離線特征處理完之后導(dǎo)到線上之后,用于線上模型預(yù)估時(shí)請求使用。那這種情況產(chǎn)生的原因是什么呢?在離線,我們使用T-n到T-1的數(shù)據(jù)訓(xùn)練模型,用T天的數(shù)據(jù)進(jìn)行測評,拿到了很好的離線指標(biāo),比如AUC為0.82。但是在線服務(wù)的模型,并不是這樣的理想情況,一個(gè)模型每天重新迭代訓(xùn)練,需要新一天(T-1天)的日志,日志從數(shù)據(jù)隊(duì)列傳輸?shù)酱髷?shù)據(jù)平臺,進(jìn)行日志的處理,新一天各種特征的計(jì)算,組織訓(xùn)練樣本,進(jìn)行模型訓(xùn)練,之后還要把模型從大數(shù)據(jù)平臺更新到在線服務(wù)器,整個(gè)流程走下來幾個(gè)小時(shí)過去了。那么在新模型上線前,在線服務(wù)的是T-2的模型,相當(dāng)于在離線用T-2的模型去測評T天的樣本,效果會大打折扣。因而線上一整天的平均測評指標(biāo),是低于離線測評指標(biāo)的。
舉個(gè)例子,例如12月15日這天,線上預(yù)估請求用的特征是12月14號的特征數(shù)據(jù)。到了12月16日,特征Pipeline開始處理數(shù)據(jù),到了凌晨5點(diǎn)(有時(shí)候ETL作業(yè)集群有問題可能會到中午12點(diǎn)),離線特征處理完了導(dǎo)到線上。那么在12月16日0點(diǎn)-2月16日5點(diǎn),這段時(shí)間線上請求的特征使用的是老的特征數(shù)據(jù),也就是12月14日的特征數(shù)據(jù)。12月16日5點(diǎn)-12月16日24點(diǎn),線上特征使用的是12月15日的數(shù)據(jù)。而在離線樣本生成過程中,到了12月17日0點(diǎn),如果是按天拼接的,那么12月16號這天的所有樣本,都會使用12月15日的特征。
這樣,12月16日0點(diǎn)--2月16日5點(diǎn)的樣本,在離線樣本拼接的階段,使用的是12月15日的特征數(shù)據(jù),而在線上請求特征的時(shí)候使用的還是12月14日的特征。特征Pipeline流程處理越長,這種不一致會越大。
那么問題來了,如果換成實(shí)時(shí)數(shù)據(jù)進(jìn)行實(shí)時(shí)特征加工是不是就解決這個(gè)問題了?
實(shí)時(shí)特征在線使用的時(shí)候,經(jīng)過客戶端埋點(diǎn)的上報(bào)(這些先不考慮埋點(diǎn)系統(tǒng)的各種坑),流式計(jì)算處理日志數(shù)據(jù)進(jìn)入在線數(shù)據(jù)源或特征庫,需要經(jīng)過一段時(shí)間。也就是說,如果你剛剛點(diǎn)擊了某個(gè)“豪車、豪宅”視頻,緊接著下滑翻頁,系統(tǒng)是拿不到“豪車、豪宅”這個(gè)行為的。如果離線模型訓(xùn)練中有用到了帶有“豪車、豪宅”的特征,由于近期行為的影響非常大,那么離在線的不一致會非常嚴(yán)重。
2. 數(shù)據(jù)分布不一致
如果仔細(xì)排查,既不存在數(shù)據(jù)泄漏,也沒有出現(xiàn)不一致的問題,離線auc明明就是漲了很多,線上就是下降,而且是離線漲的越多,線上下降越多,還有一種可能就是數(shù)據(jù)的不一致,也就是數(shù)據(jù)的“冰山效應(yīng)”——離線訓(xùn)練用的是有偏的冰山上的數(shù)據(jù),而在線上預(yù)估的時(shí)候,需要預(yù)測的是整個(gè)冰山的數(shù)據(jù),包括大量冰面以下的數(shù)據(jù)!
這種情況其實(shí)在推薦系統(tǒng)里非常常見,但是往往非常的隱蔽,一時(shí)半會很難發(fā)現(xiàn)。我們看下面這張圖。左邊是我們的Baseline,綠色的表示正樣本,紅色表示負(fù)樣本,灰色部分表示線上由于推薦系統(tǒng)的“偏見”(預(yù)估分?jǐn)?shù)較低),導(dǎo)致根本沒有展現(xiàn)過的數(shù)據(jù)。
關(guān)于推進(jìn)系統(tǒng)的偏差問題,之前的《推薦系統(tǒng)Bias大全》一文已經(jīng)總結(jié)了推薦系統(tǒng)中所有Bias情況,有興趣的可以跳轉(zhuǎn)看一下。
離線階段,我們通過各種優(yōu)化,新模型的離線評估表現(xiàn)更好了,例如圖中第二列,可以發(fā)現(xiàn)第4個(gè)綠色的正樣本和第7個(gè)綠色的正樣本排到了第3和第6的位置,離線的auc指標(biāo)漲了。
到了真正線上的預(yù)估也就是第三列,發(fā)現(xiàn)對于這部分離線見過的樣本,模型的預(yù)估序并未改變。但是新模型給了灰色沒有見過的數(shù)據(jù)更高的預(yù)估分?jǐn)?shù),這部分?jǐn)?shù)據(jù)一旦表現(xiàn)不好,很可能造成我們前面說的情況,離線(第二列)評估指標(biāo)明明漲了不少,在線(第三列)評估指標(biāo)CTR卻下降。
這種情況也不是必現(xiàn)的,在LR以特征工程為主要迭代的時(shí)代很少見。主要的原因是模型的前后迭代差異并不大。新模型對比老模型最主要的特點(diǎn)是新加入了一部分特征,往往模型的打分差異并不大,從圖中第二列到第三列,原來那些冰山下的數(shù)據(jù)也就是舊模型預(yù)估分?jǐn)?shù)偏低的部分,在新模型中能夠脫穎而出拿到很高的預(yù)估分?jǐn)?shù)的概率并不高。
而在模型有較大變化的時(shí)候,例如lr->樹模型,lr->深度模型,不同網(wǎng)絡(luò)結(jié)構(gòu)的深度模型變化,這種情況容易出現(xiàn),原因就是新舊模型的變化較大,預(yù)估分?jǐn)?shù)變化也較大。
舉一個(gè)簡單的例子,假設(shè)我們的baseline是熱門模型,樣本都是老的熱門模型生產(chǎn)出的熱門樣本,這個(gè)時(shí)候我們用簡單的lr模型去擬合,到了真正的線上預(yù)估的時(shí)候,對于大量之前沒見過的非熱門的數(shù)據(jù),模型自然很難預(yù)估好。沒有足夠好的樣本,模型也很難學(xué)到足夠有用的信息。
說另一個(gè)很有意思的現(xiàn)象,之前在某個(gè)組的時(shí)候,兩個(gè)team優(yōu)化同一個(gè)場景,大家用的回流樣本都是一樣的,但是特征和模型都是自己獨(dú)立優(yōu)化和迭代。有意思的是,如果一個(gè)team的優(yōu)化取得了比較明顯的提升之后,另一個(gè)team哪怕什么都不做,過一段時(shí)間效果也會慢慢漲上來。
對于這種情況,最根本的手段就是解決數(shù)據(jù)的有偏問題。尤其是新模型,一開始相當(dāng)于都是在擬合老模型產(chǎn)生的樣本,剛上線效果如果比較差,經(jīng)過一段時(shí)間迭代,影響的樣本分布慢慢趨近于新模型,也能收斂,但效率較低。這里給下兩個(gè)在我們這還比較有效的經(jīng)驗(yàn):
這里的無偏是相對的,可以是隨機(jī)/探索流量產(chǎn)生的樣本,也可以是新模型產(chǎn)生的樣本。大概意思,就是盡可能利用這些對新模型有利的樣本。
比較trick的方法,沒有太多方法論,但是確實(shí)能work。
新模型預(yù)估分?jǐn)?shù)PCTRnew 和老模型預(yù)估分?jǐn)?shù)PCTRold 直接在線上做線性融合,剛上線的時(shí)候a選取比較小,隨著慢慢迭代,a慢慢放大。
貳號坑:評估指標(biāo)里問題
在《推薦系統(tǒng)采樣評估指標(biāo)及線上線下一致性問題》一文中,主要闡述了該部分的觀點(diǎn):
- 在評估推薦算法的效果時(shí),能不采樣就不采樣!
- 除了AUC, Precision@K, Recall@K, Average Precision, NDCG都是不一致的,采樣計(jì)算得到的結(jié)果和真實(shí)結(jié)果可能差很大!
- 現(xiàn)在隨機(jī)采樣計(jì)算得到的評估指標(biāo)的分?jǐn)?shù)具有高偏差,低方差的問題,很多情況和真實(shí)情況不符合,結(jié)論可能也都錯了!
- 如果一定要進(jìn)行采樣計(jì)算評估指標(biāo)的值, 建議采用文中提出的糾正的方案,雖然可能會有較大的方差,但是偏差大大降低,更加接近真實(shí)情況;
舉個(gè)例子,比如在信息流推薦中,低俗內(nèi)容和標(biāo)題黨往往會在短期內(nèi)對CTR指標(biāo)有較好的提升,但是這些內(nèi)容對整個(gè)生態(tài)在長期來看是有害的,如何處理這部分內(nèi)容是值得思考的問題。又比如在電商推薦中,如何處理重復(fù)推薦也是一直都存在的問題。
推薦系統(tǒng)太難了。難到工程師和產(chǎn)品都還沒清楚自己要的是什么。“推薦”這個(gè)問題本身都不是well-defined的。按照道理來講,推薦系統(tǒng)要做的事情其實(shí)是“推薦用戶希望看到的東西”,但是“用戶希望看到的東西”落實(shí)到指標(biāo)上,可就讓人頭大了。
以內(nèi)容推薦為例。你說究竟要得到什么呢?
- 高CTR?那么擦邊球的軟色情以及熱門文章就會被選出來
- 高Staytime?那么視頻+文章feed流就成為為視頻feed流和超長文章feed流
- 高read/U?那么短文章就會被選出來
這些指標(biāo)相互依賴,此消彼長,目前主流是沿用計(jì)算廣告的老路,按照CTR作為最廣泛使用的評價(jià)指標(biāo)來優(yōu)化,這個(gè)指標(biāo)的劣根性是顯而易見的,然而至今并沒有很好地指標(biāo)來指導(dǎo)系統(tǒng)。
今日頭條的做法是,優(yōu)化CTR同時(shí)關(guān)注其他指標(biāo)的變動;也有的從CTR開始,優(yōu)化到瓶頸后進(jìn)行Staytime的優(yōu)化等等...
Medium的做法是,優(yōu)化一個(gè)f(CTR, staytime,...)的多指標(biāo)加權(quán)的綜合指標(biāo),但是據(jù)我所知,這個(gè)加權(quán)的系數(shù),還是一個(gè)magic number,是人拍腦門定的。
大家都在探索, 也并沒有一個(gè)定論,究竟推薦系統(tǒng)該優(yōu)化一些什么。
相信很多人剛?cè)胄械臅r(shí)候?qū)渭儍?yōu)化CTR都是有疑惑的,日子久了,也就都麻木了。
叁號坑:推薦系統(tǒng)健康度問題
推薦系統(tǒng)應(yīng)該是一個(gè)良性循環(huán)的系統(tǒng)。這也就導(dǎo)致了E&E, exploration & exploitation問題的出現(xiàn),簡單說,就是保證精準(zhǔn)推薦的同時(shí),進(jìn)行興趣探索。
一說大家都明白了,這不就是所有推薦系統(tǒng)做的最差的地方嗎?我看了一個(gè)東西,就使勁出一個(gè)東西,App明明很多東西,我卻越用越窄。
這個(gè)問題更加玄學(xué),更加讓人無奈。
EE要不要做?肯定要做,你不能讓用戶只能看到一類新聞,這樣久了他的feed 流只會越來越小,自己也覺得沒勁,所以一定要做興趣探索。
但是做,就勢必犧牲指標(biāo),探索的過程是艱難的,大部分時(shí)間用戶體驗(yàn)上也是負(fù)向的。那么,
- 犧牲多少CTR來保EE才算是合適的?
- EE的ROI什么時(shí)候算是>1的?
- 怎么樣確定EE的效果?
- EE要E到什么程度?
其實(shí)大家也都沒有想清楚,多避而不談。
肆號坑:工程里的一些坑
模型工程
系統(tǒng)工程
群坑亂舞:踩坑合集
看過了推薦系統(tǒng)在各種情況下的那些坑兒,最后,放一下 吳海波@知乎 的總結(jié)。
- i2i/simirank等相似計(jì)算算法中的哈利波特問題,相似性計(jì)算在推薦系統(tǒng)的召回起到非常重要的作用,而熱門物品和用戶天然有優(yōu)勢。因此,處理方法基本上都是憑經(jīng)驗(yàn),會出現(xiàn)各種magic number的參數(shù)。
- svd/svd++等算法,在各種比賽中大放異彩,但是據(jù)我所知,各大互聯(lián)網(wǎng)公司中基本沒有用它的。
- i2i及它的各種變種真是太好用了,大部分公司的業(yè)務(wù)量,從ROI來看,其實(shí)沒有必要再做什么優(yōu)化了。
- 推薦的召回策略多優(yōu)于少,但系統(tǒng)的計(jì)算rt是個(gè)問題,沒有好的系統(tǒng)架構(gòu),也沒有什么優(yōu)化空間。
- i2i等類似計(jì)算算法,實(shí)際業(yè)務(wù)中容易跑掛,比如用spark就容易o(hù)om,很容易發(fā)生傾斜,處理起來又有很多trick和dirty job。
- 推薦系統(tǒng)不只有召回,召回后的ranking起到非常大的作用,這個(gè)和廣告的點(diǎn)擊率預(yù)估有點(diǎn)像。
- 非常多的業(yè)務(wù)沒有辦法向頭條/facebook之類的有穩(wěn)定的用戶留存指標(biāo),而留存是推薦系統(tǒng)非常重要目標(biāo),因此需要找各種折中的指標(biāo)去知道abtest。
- 訓(xùn)練樣本穿越/泄露問題,即在訓(xùn)練的特征中包含了測試集的樣本的信息,這個(gè)是初期非常容易犯的錯誤,在后期有時(shí)也會隱秘的發(fā)生。
- 大部分推薦系統(tǒng)的訓(xùn)練數(shù)據(jù)需要在離線條件下去拼接,其中用戶的行為狀態(tài)和時(shí)間有關(guān),拼接非常容易出問題,因?yàn)橄到y(tǒng)當(dāng)時(shí)的狀態(tài)會有各種狀況(延時(shí)、數(shù)據(jù)不一致)等,導(dǎo)致訓(xùn)練和實(shí)際在線的數(shù)據(jù)不一致,建議把訓(xùn)練需要的日志在實(shí)際請求中直接拼接好打印落盤。
- 最后,算法的作用有點(diǎn)像前輩們講的:短期被人高估,長期被人低估。按目前國內(nèi)業(yè)務(wù)方對算法有了解的特別少,算法對生態(tài)的長短期影響,只能靠算法負(fù)責(zé)人去判斷,因此,就算你只是個(gè)打工的,請有一顆做老板的心。
參考資料
總結(jié)
- 上一篇: 对样本不均衡一顿操作
- 下一篇: KDD Cup 2021:时间序列异常检