58同城智能推薦系統(tǒng)大約誕生于2014年(C++實現(xiàn)),該套系統(tǒng)先后經(jīng)歷了招聘、房產(chǎn)、二手車、黃頁和二手物品等產(chǎn)品線的推薦業(yè)務(wù)迭代,但該系統(tǒng)耦合性高,難以適應(yīng)推薦策略的快速迭代。58同城APP猜你喜歡推薦和推送項目在2016年快速迭代,產(chǎn)出了一套基于微服務(wù)架構(gòu)的推薦系統(tǒng)(Java實現(xiàn)),該系統(tǒng)穩(wěn)定、高性能且耦合性低,支持推薦策略的快速迭代,大大提高了推薦業(yè)務(wù)的迭代效率。此后,我們對舊的推薦系統(tǒng)進(jìn)行了重構(gòu),將所有業(yè)務(wù)接入至新的推薦系統(tǒng),最終成功打造了統(tǒng)一的58同城智能推薦系統(tǒng)。下面我們將對58同城智能推薦系統(tǒng)展開介紹,首先會概覽整體架構(gòu),然后從算法、系統(tǒng)和數(shù)據(jù)三方面做詳細(xì)介紹。 整體架構(gòu)首先看一下58同城推薦系統(tǒng)整體架構(gòu),一共分?jǐn)?shù)據(jù)層、策略層和應(yīng)用層三層,基于58平臺產(chǎn)生的各類業(yè)務(wù)數(shù)據(jù)和用戶積累的豐富的行為數(shù)據(jù),我們采用各類策略對數(shù)據(jù)進(jìn)行挖掘分析,最終將結(jié)果應(yīng)用于各類推薦場景。數(shù)據(jù)層:主要包括業(yè)務(wù)數(shù)據(jù)和用戶行為日志數(shù)據(jù)。業(yè)務(wù)數(shù)據(jù)主要包含用戶數(shù)據(jù)和帖子數(shù)據(jù),用戶數(shù)據(jù)即58平臺上注冊用戶的基礎(chǔ)數(shù)據(jù),這里包括C端用戶和企業(yè)用戶的信息,帖子數(shù)據(jù)即用戶在58平臺上發(fā)布的帖子的基礎(chǔ)屬性數(shù)據(jù)。這里的帖子是指用戶發(fā)布的房源、車源、職位、黃頁等信息,為方便表達(dá),后文將這些信息統(tǒng)稱為帖子。用戶行為日志數(shù)據(jù)來源于在前端和后臺的埋點,例如用戶在APP上的篩選、點擊、收藏、打電話、微聊等各類操作日志。這些數(shù)據(jù)都存在兩種存儲方式,一種是批量存儲在HDFS上以用作離線分析,一種是實時流向Kafka以用作實時計算。 策略層:基于離線和實時數(shù)據(jù),首先會開展各類基礎(chǔ)數(shù)據(jù)計算,例如用戶畫像、帖子畫像和各類數(shù)據(jù)分析,在這些基礎(chǔ)數(shù)據(jù)之上便是推薦系統(tǒng)中最重要的兩個環(huán)節(jié):召回和排序。召回環(huán)節(jié)包括多種召回源的計算,例如熱門召回、用戶興趣召回、關(guān)聯(lián)規(guī)則、協(xié)同過濾、矩陣分解和DNN等。我們采用機(jī)器學(xué)習(xí)模型來做推薦排序,先后迭代了LR、FM、GBDT、融合模型以及DNN,基于這些基礎(chǔ)機(jī)器學(xué)習(xí)模型,我們開展了點擊率、轉(zhuǎn)化率和停留時長多指標(biāo)的排序。這一層的數(shù)據(jù)處理使用了多種計算工具,例如使用MapReduce和Hive做離線計算,使用Kylin做多維數(shù)據(jù)分析,使用Spark、DMLC做大規(guī)模分布式機(jī)器學(xué)習(xí)模型訓(xùn)練,使用theano和tensorflow做深度模型訓(xùn)練。 再往上就是應(yīng)用層,我們通過對外提供rpc和http接口來實現(xiàn)推薦業(yè)務(wù)的接入。58同城的推薦應(yīng)用大多是向用戶展示一個推薦結(jié)果列表,屬于topN推薦模式,這里介紹下58同城的幾個重要的推薦產(chǎn)品:
推薦系統(tǒng)是一個復(fù)雜的工程,涉及算法策略、工程架構(gòu)和效果數(shù)據(jù)評估三方面的技術(shù),后文將分別從這三方面介紹58同城推薦系統(tǒng)。 算法 推薦涉及了前端頁面到后臺算法策略間的各個流程,我們將推薦流程抽象成如下圖所示的召回、排序、規(guī)則和展示四個主要環(huán)節(jié):
在上述的四個環(huán)節(jié)中,召回和排序是推薦系統(tǒng)最重要的兩個環(huán)節(jié)。規(guī)則和展示樣式一般變化周期較長,而召回和排序有很大的挖掘空間,會被不斷的迭代,我們的推薦算法工作也主要是圍繞召回和排序進(jìn)行。下圖是我們推薦算法的整體框架,主要包括基礎(chǔ)數(shù)據(jù)的計算以及上層的召回策略和排序模型的迭代。 基礎(chǔ)數(shù)據(jù)計算主要包括用戶標(biāo)簽和帖子標(biāo)簽的挖掘,這部分工作由用戶畫像、搜索和推薦多個團(tuán)隊共同完成,最終各團(tuán)隊共享數(shù)據(jù)?;谟脩糇詴r填寫的基礎(chǔ)屬性信息和用戶行為日志,可以挖掘出用戶人口屬性和興趣偏好信息,如用戶的年齡、性別、學(xué)歷、收入等基礎(chǔ)屬性,用戶感興趣的地域商圈、二手房均價、廳室、裝修程度等偏好信息。帖子標(biāo)簽挖掘包括提取帖子的固定屬性、挖掘衍生屬性以及計算動態(tài)屬性。固定屬性直接從帖子數(shù)據(jù)庫提取即可,如分類、地域、標(biāo)題、正文、圖片、房源價格、廳室、小區(qū)等。我們還會基于貼子信息是否完備、價格是否合理、圖片質(zhì)量好壞、發(fā)帖人質(zhì)量等多個維度來計算帖子質(zhì)量分?;谟脩粜袨槿罩緮?shù)據(jù)可以計算帖子的PV、UV、點擊率、轉(zhuǎn)化率、停留時長等動態(tài)屬性。這些數(shù)據(jù)最終會在召回環(huán)節(jié)和排序環(huán)節(jié)使用,例如基于用戶標(biāo)簽和帖子標(biāo)簽可以進(jìn)行興趣召回,將用戶標(biāo)簽和帖子標(biāo)簽作為特征迭代機(jī)器學(xué)習(xí)模型。 召回主要負(fù)責(zé)生成推薦的候選集,我們采用多種召回源融合的方式來完成該過程。我們先后迭代了如下各類召回策略:
上述不同的召回算法都產(chǎn)生出了一部分推薦候選數(shù)據(jù),我們需要將不同的召回數(shù)據(jù)融合起來以提高候選集的多樣性和覆蓋率,這里我們主要使用兩種召回融合策略:
召回環(huán)節(jié)新召回源的添加或者新融合策略的上線,例如開發(fā)了一種新召回算法、需要修改調(diào)制融合策略中的配比等,我們都會做線上ABTest,最終通過比較不同策略的效果來指導(dǎo)我們的迭代。值得一提的是,召回環(huán)節(jié)我們還會有一些過濾規(guī)則,例如過濾低質(zhì)量帖子、在某些特定場景下對召回算法產(chǎn)生的結(jié)果加一些條件限制等。 排序環(huán)節(jié)我們主要采用Pointwise方法,為每個帖子打分并進(jìn)行排序,通過使用機(jī)器學(xué)習(xí)模型預(yù)估帖子的點擊率、轉(zhuǎn)化率和停留時長等多指標(biāo)來做排序。早期我們主要優(yōu)化點擊率,目前我們不僅關(guān)注點擊率外還會注重轉(zhuǎn)化率的提高。在58同城的產(chǎn)品場景中,轉(zhuǎn)化主要指用戶在帖子詳情頁上的微聊、打電話操作。 排序離線流程主要包括樣本生成和選擇、特征抽取、模型訓(xùn)練和評價。首先對埋點日志中的曝光、點擊、轉(zhuǎn)化和停留時長等數(shù)據(jù)做抽取解析,如基于曝光序列號關(guān)聯(lián)各類操作、解析埋點參數(shù)(例如日志中記錄的實時特征)、解析上下文特征等,并同時打上label,生成模型樣本。然后對樣本進(jìn)行過濾,例如過濾惡意用戶樣本、過濾無效曝光樣本等。然后對樣本做特征抽取,生成帶特征的樣本,我們主要從用戶、帖子、發(fā)帖人和上下文四個維度做特征工程。之后,按照一定正負(fù)樣本比例做采樣,最終進(jìn)行模型訓(xùn)練和評估,離線評估指標(biāo)主要參考AUC,離線效果有提升后會進(jìn)行ABTest上線,逐步迭代。我們先后迭代上線了如下排序策略:
基于上述基礎(chǔ)機(jī)器學(xué)習(xí)工具,目前我們主要會迭代點擊率、轉(zhuǎn)化率和停留時長預(yù)估模型,線上會ABTest上線單指標(biāo)模型、多指標(biāo)融合模型,以提高推薦效果。 架構(gòu) 對于推薦系統(tǒng)來說,一套支撐算法策略高效迭代的推薦后臺系統(tǒng)至關(guān)重要,我們基于微服務(wù)架構(gòu)設(shè)計了推薦后臺系統(tǒng),它擴(kuò)展性好、性能高,系統(tǒng)架構(gòu)如下圖所示,系統(tǒng)分為數(shù)據(jù)層、邏輯層和接入層,數(shù)據(jù)層提供各類基礎(chǔ)數(shù)據(jù)的讀取,邏輯層實現(xiàn)召回和排序策略并支持不同策略的ABTest,接入層對外提供了通用的訪問接口。 數(shù)據(jù)層提供推薦邏輯所需要的各類數(shù)據(jù),這些數(shù)據(jù)存儲在WRedis、文件、WTable等多種設(shè)備上,我們將所有數(shù)據(jù)的讀取都封裝成RPC服務(wù),屏蔽了底層的存儲細(xì)節(jié)。這里包括檢索服務(wù)、召回源讀取服務(wù)、帖子特征中心和用戶特征中心:
邏輯層實現(xiàn)了詳細(xì)的推薦策略,包括推薦主體服務(wù)、召回服務(wù)、排序服務(wù)和ABTest實驗中心。這些服務(wù)由不同的開發(fā)人員維護(hù),保證了推薦策略的高效迭代,例如召回和排序是我們經(jīng)常迭代的環(huán)節(jié),由不同的算法人員來完成,召回服務(wù)和排序服務(wù)的分離降低了耦合,提高了迭代效率。
接入層直接和客戶端交互,從客戶端接收請求并調(diào)用推薦主體服務(wù)獲得推薦帖子id列表,然后查詢出帖子詳細(xì)屬性返回給客戶端做展示。在大部分推薦場景中,接入層由業(yè)務(wù)方維護(hù),可能是PHP或Java實現(xiàn)的http接口;也有少部分場景的接入層是我們自主維護(hù),我們采用58自研的MVC框架WF實現(xiàn)了相關(guān)http接口。 我們采用58自研的RPC框架SCF實現(xiàn)了上述微服務(wù)架構(gòu)的推薦系統(tǒng),采用58自研的監(jiān)控系統(tǒng)WMonitor實現(xiàn)了推薦系統(tǒng)的立體監(jiān)控,整個技術(shù)棧是Java。我們采用多線程、異步、緩存、JVM調(diào)優(yōu)、降級、限流等措施保證了推薦系統(tǒng)的穩(wěn)定和高可用,目前我們的推薦系統(tǒng)日均處理數(shù)億的推薦請求,平均耗時約30毫秒。 數(shù)據(jù)這里的數(shù)據(jù)主要指推薦埋點數(shù)據(jù)和推薦效果數(shù)據(jù):埋點數(shù)據(jù)是推薦系統(tǒng)的基石,模型訓(xùn)練和效果數(shù)據(jù)統(tǒng)計都基于埋點數(shù)據(jù),需保證埋點數(shù)據(jù)的正確無誤;效果數(shù)據(jù)是對推薦系統(tǒng)的評價,指引推薦策略的迭代,構(gòu)建完備的效果數(shù)據(jù)體系至關(guān)重要。 我們的推薦埋點日志數(shù)據(jù)包括曝光日志、點擊日志、轉(zhuǎn)化日志和頁面停留時長日志等,這些日志數(shù)據(jù)都需要客戶端通過埋點來產(chǎn)生。這里簡單解釋一下這些操作的含義:客戶端請求一次推薦接口得到推薦結(jié)果列表叫做一次曝光;用戶點擊推薦結(jié)果列表上的某條帖子進(jìn)入帖子詳情頁叫做一次點擊;用戶在帖子詳情頁上進(jìn)行微聊、打電話、收藏等操作叫做轉(zhuǎn)化;用戶在帖子詳情頁上的閱讀時間叫做頁面停留時長。這里的曝光、點擊和轉(zhuǎn)化是一個漏斗,操作數(shù)量是逐漸遞減的趨勢。由于58同城上用戶對帖子的訪問可能來源于推薦、搜索和運(yùn)營活動頁等場景,為了標(biāo)識出推薦產(chǎn)生的點擊/轉(zhuǎn)化/停留時長,我們需要在埋點中加入推薦相關(guān)的參數(shù)。我們將埋點參數(shù)設(shè)計成一個固定格式的字符串,它包含了曝光唯一序列號、推薦位標(biāo)識、召回號、排序號、規(guī)則號、展示號、帖子id列表、帖子id等字段,這些字段將會作用于機(jī)器學(xué)習(xí)模型訓(xùn)練樣本生成和推薦效果統(tǒng)計中。埋點參數(shù)主要分為列表參數(shù)和單貼參數(shù)兩類:推薦接口返回一個帖子列表,會對應(yīng)返回一個列表參數(shù),包含了曝光序列號、推薦位標(biāo)識、召回號、排序號、規(guī)則號、展示號、帖子id列表等字段;返回的帖子列表中,每個帖子會對應(yīng)返回一個單貼參數(shù),包含曝光序列號、推薦位標(biāo)識、召回號、排序號、規(guī)則號、展示號、帖子id等字段。客戶端得到推薦接口返回的埋點參數(shù)后,會將列表參數(shù)埋入到曝光日志中,將單貼參數(shù)埋入到點擊日志、轉(zhuǎn)化日志和停留時長日志當(dāng)中,注意這里埋點時需要推薦列表頁向帖子詳情頁傳遞單貼參數(shù),一般需要通過修改跳轉(zhuǎn)協(xié)議來實現(xiàn)。最終埋點日志中有了這些參數(shù)后,我們便可基于曝光唯一序列號將曝光、點擊、轉(zhuǎn)化、時長數(shù)據(jù)join起來,產(chǎn)生模型訓(xùn)練樣本以及漏斗效果數(shù)據(jù)。值得一提的是,我們采取透傳的方式在推薦后臺、接入層、客戶端間傳遞埋點參數(shù)字符串,所有埋點參數(shù)由推薦系統(tǒng)后臺生成,接入層和客戶端均不做任何處理。埋點參數(shù)僅由我們推薦一方負(fù)責(zé),這樣能夠避免多方改動埋點參數(shù),從而減少埋點錯誤的可能性,由于是透傳處理,也便于今后埋點參數(shù)的擴(kuò)展。 埋點數(shù)據(jù)是推薦系統(tǒng)的基石,不能有遺漏或者錯誤,這就要求我們嚴(yán)格把控開發(fā)測試流程,尤其是APP上的埋點,若發(fā)版之后發(fā)現(xiàn)有錯誤,便要等到下一次發(fā)版時解決??蛻舳碎_發(fā)和測試同事不清楚埋點參數(shù)的含義但熟練掌握測試環(huán)境部署及擁有Android和IOS測試機(jī),而推薦后臺同事清楚埋點參數(shù)含義但對測試環(huán)境較生疏并缺乏測試機(jī),因此我們總結(jié)出了測試同事負(fù)責(zé)環(huán)境部署、推薦后臺同事負(fù)責(zé)檢驗埋點參數(shù)的測試流程,詳細(xì)流程如下圖所示。此外,58同城上的APP開發(fā)比較復(fù)雜,不同產(chǎn)品線各自開發(fā)自己的APP業(yè)務(wù)模塊,APP平臺方開發(fā)主模塊,每次發(fā)版前都有一個集成階段,合并所有業(yè)務(wù)方提交的代碼,產(chǎn)生最終的APP包,集成階段很可能會發(fā)生業(yè)務(wù)方埋點未生效的情況。因此,我們的埋點測試包括業(yè)務(wù)方內(nèi)部測試和集成測試兩個階段,以保證埋點萬無一失。 我們的推薦效果數(shù)據(jù)是一個多維數(shù)據(jù)集,我們主要關(guān)注推薦位上的點擊、轉(zhuǎn)化、停留時長等指標(biāo)。日常工作中我們需要從不同業(yè)務(wù)線、不同客戶端、不同推薦位、不同推薦算法等多個維度去分析這些指標(biāo)數(shù)據(jù),例如我們會觀察房產(chǎn)和車在相同推薦位上的數(shù)據(jù)對比、猜你喜歡場景上不同召回或排序算法的數(shù)據(jù)對比、二手房詳情頁在Android和IPhone上數(shù)據(jù)對比等。各種數(shù)據(jù)分析對比能幫助我們優(yōu)化推薦策略,甚至能發(fā)現(xiàn)某些業(yè)務(wù)線功能邏輯上的隱藏BUG,例如在我們推薦項目攻堅階段,我們通過分析比較二手房詳情頁在Android和IPhone兩端的推薦效果,發(fā)現(xiàn)了IPhone上詳情頁瀏覽回退的BUG,最終反饋給業(yè)務(wù)方并解決了該問題,該BUG的解決使得我們在二手房詳情頁推薦位上的推薦點擊量提高了數(shù)十萬。 我們從離線和實時兩方面構(gòu)建推薦效果數(shù)據(jù),數(shù)據(jù)統(tǒng)計流程如下圖所示: 早期,離線效果數(shù)據(jù)統(tǒng)計是通過 MapReduce + Hive + MySQL 來實現(xiàn)的,我們首先會編寫MapReduce程序?qū)υ悸顸c日志進(jìn)行抽取生成Hive表,然后會編寫大量的Hive SQL來統(tǒng)計各類指標(biāo)數(shù)據(jù),并將結(jié)果數(shù)據(jù)寫入MySQL數(shù)據(jù)表,最終做可視化展示和郵件報表。由于我們比較的維度和指標(biāo)多,Hive SQL語句的編寫消耗了我們不少人力。在數(shù)據(jù)平臺部門部署了Kylin多維分析系統(tǒng)后,我們將效果數(shù)據(jù)統(tǒng)計工作遷移到了Kylin上,我們只需要設(shè)計好Hive源數(shù)據(jù)表,并設(shè)置好維度和度量,Kylin便能根據(jù)維度和度量來自動預(yù)計算結(jié)果數(shù)據(jù),這省去了我們編寫Hive SQL的工作,大大提高了效率。關(guān)于如何利用Kylin構(gòu)建多維數(shù)據(jù)集可以參考此文《基于Kylin的推薦系統(tǒng)效果評價系統(tǒng)》。 實時效果數(shù)據(jù)我們采用Storm + HBase 來計算,實時效果數(shù)據(jù)主要用于異常埋點監(jiān)控、新上線推薦算法效果快速反饋、模型異常監(jiān)控等,我們實現(xiàn)了一個包含較少維度的多維數(shù)據(jù)統(tǒng)計,今后我們將嘗試引入Druid等實時多維分析系統(tǒng)來完善推薦實時效果數(shù)據(jù)的建設(shè)。 總結(jié)本文介紹了58同城智能推薦系統(tǒng)在算法、工程和數(shù)據(jù)三方面的技術(shù)演進(jìn)。我們在最近一年加快了推薦業(yè)務(wù)的迭代速度,接入了房產(chǎn)、車等業(yè)務(wù)線在APP、PC、M三端共計近百個推薦位,我們的推薦點擊占比指標(biāo)(推薦位上產(chǎn)生的點擊量在總體點擊量中的占比)相比一年之前提高了2~3倍,達(dá)到了20%~30%,每天能夠產(chǎn)生數(shù)千萬的推薦點擊量,為業(yè)務(wù)線帶來了流量提升。 任何推薦系統(tǒng)的發(fā)展必會經(jīng)歷推薦位擴(kuò)充和推薦算法深入優(yōu)化兩個階段,流量指標(biāo)可以通過擴(kuò)充推薦位來快速提高,當(dāng)推薦位穩(wěn)定之后,就需要依賴更加深入的算法優(yōu)化來繼續(xù)提高指標(biāo),而此時的效果提升也會相對緩慢。目前,我們的流量指標(biāo)已相對穩(wěn)定,我們會更進(jìn)一層去關(guān)注轉(zhuǎn)化指標(biāo),提高用戶進(jìn)入帖子之后與發(fā)帖人進(jìn)行微聊或電話溝通的可能性,幫助用戶找到真正有用的信息。 |
|
|