##中華萬年歷推薦系統(tǒng)實踐

中華萬年歷推薦系統(tǒng)實踐 - 隨身云技術(shù)團隊 http://tech.ssyun.cn/2017/03/03/recommend-practice/

對于中長期的興趣或偏好,包括周期間隔較長的行為,可以沉淀出用戶、item和標(biāo)簽的圖結(jié)構(gòu)(興趣畫像)。針對這一部分,就需要對item爬取時做標(biāo)簽標(biāo)記。當(dāng)用戶消費item時,用戶也即被關(guān)聯(lián)了相應(yīng)的標(biāo)簽,考慮標(biāo)簽權(quán)重,使用行為計數(shù)和時間間隔做加權(quán)。我們在數(shù)據(jù)倉庫中采用hive拉鏈記歷史的方式存儲。離線天增量更新到redis來用于線上數(shù)據(jù)消費。

使用的組件
我們采用flume,kafka,storm及spark streaming完成用戶數(shù)據(jù)的實時收集、解析、初步清洗和實時統(tǒng)計的工作。redis,hbase,hive完成不同時效響應(yīng)要求的數(shù)據(jù)存儲,使用hive和spark完成數(shù)據(jù)倉庫建模及計算復(fù)雜度較高的模型。azkaban完成離線任務(wù)、準(zhǔn)實時任務(wù)的調(diào)度和任務(wù)執(zhí)行出錯報警功能。


前言
萬年歷的首屏包含日歷、運勢、星座等功能外,也一直提供著大量資訊類內(nèi)容。這部分內(nèi)容早期是由運營同學(xué)人工編輯篩選并干預(yù)展示規(guī)則。但純粹以人工生產(chǎn)內(nèi)容的方式效率較低,并且以人工干預(yù)展示的方式經(jīng)常出現(xiàn)流量分配不合理的情況:大量展示機會往往落在少數(shù)內(nèi)容。而內(nèi)容的好壞直接由人的感覺衡量也極不客觀。
為了解決信息生產(chǎn)效率受限的狀況,后續(xù)逐步引入了外部信息抓取的方案。海納百川,內(nèi)容漸漸豐富了起來,但抓取的信息量極大提高后,仍然通過人工審核就常常使運營同學(xué)們措手不及。每篇內(nèi)容的審核、編排時間被壓縮,純?nèi)斯ずY選和干預(yù)的效果也逐步下降。而這些機械枯燥的工作內(nèi)容也并不能為我們的運營同學(xué)帶來任何快樂和成長。
為了解決上述問題,我們開始了萬年歷推薦系統(tǒng)的設(shè)計和實現(xiàn)。
對于推薦系統(tǒng),必要的是一套大數(shù)據(jù)平臺。同時以我們逐步形成推薦系統(tǒng)的經(jīng)驗來看,如果在功能沒有完全穩(wěn)定成型的情況下,起初可以不要一次做出太復(fù)雜的推薦邏輯:越復(fù)雜的算法適用面越窄,當(dāng)面對功能較大變更時很可能出現(xiàn)問題,而復(fù)雜的算法也較難排查和調(diào)試。
下面基于萬年歷推薦系統(tǒng)逐步形成的過程,分享一些我們的經(jīng)驗。
冷啟動
我們在用戶冷啟動、item冷啟動及系統(tǒng)冷啟動上做了一些嘗試。
用戶冷啟動一般可以結(jié)合一些注冊信息或主動讓用戶描述興趣等。比如參考用戶注冊時填寫的年齡、性別等信息;進入app后請求用戶勾選一些興趣愛好。但在實踐當(dāng)中注意到采用注冊信息作為依據(jù)并不靠譜:在萬年歷中這類信息支持度偏低,置信度比較難直接衡量。
item冷啟動可以采用基于文本的挖掘方式做標(biāo)注,但這種方式開銷比較高。我們曾經(jīng)嘗試使用tensorflow構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)對文本做標(biāo)簽標(biāo)注,并使用搜狗公開的文本分類語料庫進行試驗。在權(quán)衡計算開銷和準(zhǔn)確度的情況下并沒有得到滿意的結(jié)果(三層卷積神經(jīng)網(wǎng)絡(luò)網(wǎng)絡(luò),準(zhǔn)確率89%)。最終采用直接由媒體合作方的自身屬性和內(nèi)容抓取頻道直接做item的相關(guān)標(biāo)記。
對于系統(tǒng)冷啟動可以采取先不做個性化推薦的實現(xiàn)方案。可以制作熱榜數(shù)據(jù):計算最近一段時間(區(qū)分業(yè)務(wù),設(shè)置不同的時間窗口)item熱門分?jǐn)?shù)關(guān)于點擊率c和上線距今時間差t的函數(shù)(公式1):


gs1

其中△uptime為item已上線時間,T為選取的滑動窗口內(nèi)item上線時間戳集合。α、β、θ為調(diào)優(yōu)參數(shù)。
分?jǐn)?shù)隨t增大而衰減,點擊率越高衰減越慢。hacker news和reddit等也有分享過它們使用的熱榜模型可以作為參考。具體模型和參數(shù),各支業(yè)務(wù)不同沒有統(tǒng)一的套用方案,參數(shù)可以通過AB測試來確定。從經(jīng)驗上來看,除非有極其豐富的數(shù)據(jù)源,否則盡量不要使用時間的指數(shù)函數(shù)來做衰減,否則熱榜很容易退化成item上線時間的倒序排序序列。
冷啟動的改進
單單制作幾個熱門榜其實已經(jīng)比隨機選取內(nèi)容展示要好很多了。但是對于用戶個性化的反饋還沒有。此時比較簡單的一個方法就是實時生成用戶個性化過濾信息做”負(fù)反饋“。對每個用戶的瀏覽、點擊等行為做記錄,作為熱門榜返回給到不同用戶的內(nèi)容做過濾依據(jù)。如果是針對純時效性的內(nèi)容,這部分過濾信息可以設(shè)置失效時間。對于用戶量較大的場景,并不嚴(yán)格的要求過濾信息與用戶行為完全一致,可以結(jié)合hyperloglog或bloomfilter的數(shù)據(jù)結(jié)構(gòu)來做存儲的進一步優(yōu)化。比如我們希望item最多展示K次(K值為較小的正整數(shù))或最多被點擊1次后不再展示,則可以通過如下方案實現(xiàn):


glq

對每一個item構(gòu)建K個用戶集合,當(dāng)請求展示時,向該item最低次不含有該用戶的集合中插入該用戶,當(dāng)?shù)贙個集合已經(jīng)包含該用戶時,該用戶的候選資訊集合會將此item過濾。上傳點擊日志會將此item的所有次數(shù)的訪問用戶集合加入該用戶。資訊存在時效性,從app下架時則可以同時釋放item對應(yīng)的訪問用戶集合存儲資源。
策略改進實驗
雖然在比較嚴(yán)格的算法改進和迭代周期中一般希望先完成離線實驗,再做用戶調(diào)查,最后再完成線上實驗和算法的全流量覆蓋。但一般完成所有的流程,對于體量較小的公司周期太長。 下表是幾種試驗方法的優(yōu)缺點比較:
實驗方法
優(yōu)點
缺點

離線實驗
可短期完成多個算法、策略的性能比對
一般無法準(zhǔn)確測算商業(yè)化指標(biāo)

用戶調(diào)查
比較真實地反饋用戶感受,風(fēng)險低
成本高,選取用戶分布要求較高,易偏置

在線實驗
可以比較真實反饋所有待檢驗性能指標(biāo)
周期長,有一定風(fēng)險

我們實際采用流量從小到大逐步覆蓋到所有用戶的方法,如果新策略效果不佳則可以在實驗中途下線。流量劃分可以初期采用各個實驗流量互斥的方式,后續(xù)對互不影響的實驗做流量分層。流量劃分可以采用移動設(shè)備標(biāo)識的MD5值。android可以采用imei+mac,ios可以采用idfa。但要注意,在實踐當(dāng)中,發(fā)現(xiàn)android有部分手機在重啟時mac會發(fā)生變化。而山寨機往往imei為一串0,所以建議提前做用戶日志的統(tǒng)計來確定使用何種標(biāo)識口徑。
推薦系統(tǒng)的進一步改進
最常用的就是協(xié)同過濾??梢詢?yōu)先采取modelbased(比如als)和itembased兩種方法。用戶量極其龐大或用戶行為比較稀疏的情況下盡量不要使用userbased。als我們使用spark構(gòu)建離線推薦集合,itembased我們實現(xiàn)了兩種計算策略:
標(biāo)簽及來源是否相同(公式2):


gs2

基于用戶的行為,計算關(guān)聯(lián)關(guān)系(公式3):


gs3

其中N(j)表示消費了資訊j的用戶集合
如果用戶活躍度差異較大還可以對用戶活躍度較高的用戶做降權(quán)懲罰(公式4):


gs4

其中u為同時消費過j和k的用戶,active表示用戶u的活躍度。

itembased方法可以用于實時個性化推薦。一個場景是詳情頁的“相關(guān)閱讀”。用公式3離線計算關(guān)聯(lián)關(guān)系。如新加入的item取不到離線相關(guān)數(shù)據(jù)則可以降級使用公式2。另一個場景是實時增加用戶偏愛(點擊或停留時間長)的item展示,策略如下:


sstj

實時上傳的用戶日志構(gòu)建最近消費的item集合,資訊爬蟲抓取進來的新item使用公式2構(gòu)建出同tag下的item關(guān)聯(lián)度索引。通過數(shù)據(jù)倉庫完成ALS算法給出的用戶離線推薦數(shù)據(jù)集。通過最近消費的item記錄和關(guān)聯(lián)關(guān)系(優(yōu)先取離線關(guān)聯(lián)關(guān)系,當(dāng)取不到時取實時關(guān)聯(lián)關(guān)系)與前文敘述的item過濾器過濾后得到實時item推薦候選集合。
對于中長期的興趣或偏好,包括周期間隔較長的行為,可以沉淀出用戶、item和標(biāo)簽的圖結(jié)構(gòu)(興趣畫像)。針對這一部分,就需要對item爬取時做標(biāo)簽標(biāo)記。當(dāng)用戶消費item時,用戶也即被關(guān)聯(lián)了相應(yīng)的標(biāo)簽,考慮標(biāo)簽權(quán)重,使用行為計數(shù)和時間間隔做加權(quán)。我們在數(shù)據(jù)倉庫中采用hive拉鏈記歷史的方式存儲。離線天增量更新到redis來用于線上數(shù)據(jù)消費。
算法融合及補充
目前我們采用的方法是針對不同的場景,制定不同的多個獨立子策略的融合方案?;蛟谕ㄓ玫膱鼍跋赂鶕?jù)不同子策略的性能做優(yōu)先級排序,優(yōu)先或多從性能較優(yōu)的子策略拉取數(shù)據(jù)。針對不同的業(yè)務(wù)場景,最后制定一些補丁策略來彌補獨立算法融合的一些缺陷。后續(xù)我們也計劃采用訓(xùn)練模型(如Logistic Regression)的方式對非定投內(nèi)容進行重排序優(yōu)化。
使用的組件
我們采用flume,kafka,storm及spark streaming完成用戶數(shù)據(jù)的實時收集、解析、初步清洗和實時統(tǒng)計的工作。redis,hbase,hive完成不同時效響應(yīng)要求的數(shù)據(jù)存儲,使用hive和spark完成數(shù)據(jù)倉庫建模及計算復(fù)雜度較高的模型。azkaban完成離線任務(wù)、準(zhǔn)實時任務(wù)的調(diào)度和任務(wù)執(zhí)行出錯報警功能。
小結(jié)
本文介紹了中華萬年歷推薦系統(tǒng)從無到有構(gòu)建過程中的一些經(jīng)驗和積累。目前還有很多不完善和需要改進的地方。但在這里希望分享出來一些我們的經(jīng)驗,能夠拋磚引玉,給大家提供到一些參考,也歡迎隨時和我們一同討論!
作者介紹
韓冰,資深數(shù)據(jù)開發(fā)工程師。作為核心人員參與了隨身云大數(shù)據(jù)平臺、推薦系統(tǒng)的設(shè)計與開發(fā)等工作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容