歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~
一、推薦系統概述
1.1 概述
推薦系統目前幾乎無處不在,主流的app都基本應用到了推薦系統。例如,旅遊出行,攜程、去哪兒等都會給你推薦機票、酒店等等;點外賣,餓了麼、美團等會給你推薦飯店;購物的時候,京東、淘寶、亞馬遜等會給你推薦“可能喜歡”的物品;看新聞,今日頭條、騰訊新聞等都會給你推送你感興趣的新聞....幾乎所有的app應用或網站都存在推薦系統。
究其根本的原因,推薦系統的流行是因為要去解決一個問題:物品越來越多,資訊越來越多,而人的精力和時間是有限的,需要一個方式去更有效率地獲取資訊,連結人與資訊。
推薦系統就是為了解決這一問題而誕生的,在海量的物品和人之間,架起來一條橋樑。它就像一個私人的專屬導購,根據你的歷史行為、個人資訊等等,為每個人diy進行推薦,千人前面,幫助人們更好、更快地選擇自己感興趣的、自己需要的東西。今日頭條系的feed流在推薦演算法的加持下,短短几年的使用者增長速度和使用時長資料令人咂舌,受到了市場的追捧和高估值。一夜之間,幾乎所有的app都開始上feed流、上各種推薦,重要性可見一斑。
1.2 基本架構
我們先把推薦系統簡單來看,那麼它可以簡化為如下的架構。
圖1 推薦系統一般流程不管是複雜還是簡單的推薦系統,基本都包含流程:
- 1)結果展示部分。不管是app還是網頁上,會有ui介面用於展示推薦列表。
- 2)行為日誌部分。使用者的各種行為會被時刻記錄並被上傳到後臺的日誌系統,例如點選行為、購買行為、地理位置等等。這些資料後續一般會被進行ETL(extract抽取、transform轉換、load載入),供迭代生成新模型進行預測。
- 3)特徵工程部分。得到使用者的行為資料、物品的特徵、場景資料等等,需要人工或自動地去從原始資料中抽取出特徵。這些特徵作為輸入,為後面各類推薦演算法提供資料。特徵選取很重要,錯的特徵必定帶來錯誤的結果。
- 4)召回部分。 有了使用者的畫像,然後利用資料工程和演算法的方式,從千萬級的產品中鎖定特定的候選集合,完成對推薦列表的初步篩選,其在一定程度上決定了排序階段的效率和推薦結果的優劣。
- 5)排序部分。針對上一步的候選集合,會進行更精細化地打分、排序,同時考慮新穎性、驚喜度、商業利益等的一系列指標,獲得一份最終的推薦列表並進行展示。
完整的推薦系統還會包括很多輔助模組,例如線下訓練模組,讓演算法研究人員利用真實的歷史資料,測試各類不同演算法,初步驗證演算法優劣。線下測試效果不錯的演算法就會被放到線上測試,即常用的A/B test系統。它利用流量分發系統篩選特定的使用者展示待測試演算法生成的推薦列表,然後收集這批特定使用者行為資料進行線上評測。
圖2 蘑菇街推薦系統架構推薦系統每個部分可大可小,從圖2可知,各部分涉及的技術棧也較多。終端app每時每刻都在不斷上報各類日誌,點選、展示、時間、地理位置等等資訊,這些海量資訊需要依賴大資料相關軟體棧支援,例如Kafka、spark、HDFS、Hive等,其中Kafka常被用於處理海量日誌上報的消費問題。將資料進行ETL後存入Hive資料倉儲,就可進行各類線上、線下測試使用。線下的演算法會上線到線上環境進行ABtest,ABtest涉及完整的測試迴路打通,不然拿不到結果,也無法快速開發迭代演算法。線上推薦系統還要關注實時特徵、離線特徵,在效能和各類指標、商業目標間取均衡。
1.3 評測指標
一個東西做得好還是不好,能不能優化,首要前提是確定評測指標。只有確定了評測指標,才能有優化的方向。評測推薦系統的指標可以考慮以下幾個方面:
1.3.1 使用者滿意度
使用者作為推進系統的主要參與者,其滿意度是評測系統的最重要指標。滿意度可以通過做使用者調查或線上實驗獲得。在線上系統中,一般通過對使用者行為的統計得到,例如點選率、使用者停留時間和轉化率等指標度量使用者的滿意度。
1.3.2 預測精確度precision
預測準確度度量一個推薦系統或者推薦演算法預測使用者行為的能力。這個指標是最重要的離線評測指標。由於離線資料可計算,絕大部分科研人員都在討論這個指標。
評分預測問題一般使用RMSE、MAE等,TopN預測問題一般使用Recall、Precision等。
圖3 常見的指標準確率(Precision)、召回率(Recall)、誤檢率其實目前國內很多地方和資料混淆了兩個指標的叫法,把準確度對應英文precision指標。不過儘量還是用英文比較好。
準確度Accuracy = (TP + TN) / (TP + FP + TN + FN)
精確度Precision=TP/(TP+FP)
1.3.3 覆蓋率coverage
覆蓋率描述一個推薦系統對物品長尾的發掘能力。覆蓋率有很多定義方法,最簡單的計算就是推薦列表中的物品數量,除以所有的物品數量。
在資訊理論和經濟學中有兩個著名的指標用來定義覆蓋率,一個是資訊熵,一個是基尼係數。具體公式和介紹可以google。
ps:長尾在推薦系統中是個常見的名詞。舉個例子幫助大家理解,在商店裡,由於貨架和場地有限,擺在最顯眼的地方的物品通常是出名的、熱門的,從而銷量也是最好的。很多不出名或者小知名度的商品由於在貨架角落或者根本上不了貨架,這些商品銷量很差。在網際網路時代,這一現象會被打破。電子商城擁有幾乎無限長的“貨架”,它可以為使用者展現很多滿足他小眾需求的商品,這樣總的銷量加起來將遠遠超過之前的模式。
Google是一個最典型的“長尾”公司,其成長曆程就是把廣告商和出版商的“長尾”商業化的過程。數以百萬計的小企業和個人,此前他們從未打過廣告,或從沒大規模地打過廣告。他們小得讓廣告商不屑一顧,甚至連他們自己都不曾想過可以打廣告。但Google的AdSense把廣告這一門檻降下來了:廣告不再高不可攀,它是自助的,價廉的,誰都可以做的;另一方面,對成千上萬的Blog站點和小規模的商業網站來說,在自己的站點放上廣告已成舉手之勞。Google目前有一半的生意來自這些小網站而不是搜尋結果中放置的廣告。數以百萬計的中小企業代表了一個巨大的長尾廣告市場。這條長尾能有多長,恐怕誰也無法預知。無數的小數積累在一起就是一個不可估量的大數,無數的小生意集合在一起就是一個不可限量的大市場。
圖4 長尾曲線1.3.4多樣性
使用者的興趣是多樣的,推薦系統需要能覆蓋使用者各種方面的喜好。這裡有個假設,如果推薦列表比較多樣,覆蓋了使用者各種各樣的興趣,那麼真實命中使用者的興趣概率也會越大,那麼就會增加使用者找到自己感興趣的物品的概率。
1.3.5 新穎性
新穎的推薦是指給使用者推薦那些他們以前沒有聽說過的物品。要準確地統計新穎性需要做使用者調查。
1.3.6 驚喜度
如果推薦結果和使用者的歷史興趣不相似,但卻讓使用者覺得滿意,那麼就可以說推薦結果的驚喜度很高,而推薦的新穎性僅僅取決於使用者是否聽說過這個推薦結果。
1.3.7 信任度
使用者對推薦系統的信任程度。如果使用者信任推薦系統,那就會增加使用者和推薦系統的互動。特別是在電子商務推薦系統中,讓使用者對推薦結果產生信任是非常重要的。同樣的推薦結果,以讓使用者信任的方式推薦給使用者就更能讓使用者產生購買慾,而以類似廣告形式的方法推薦給使用者就可能很難讓使用者產生購買的意願。提高推薦系統的信任度主要有兩種方法。首先需要增加推薦系統的透明度(transparency),而增加推薦系統透明度的主要辦法是提供推薦解釋。其次是考慮使用者的社交網路資訊,利用使用者的好友資訊給使用者做推薦,並且用好友進行推薦解釋。
1.3.8 實時性
在很多網站中,因為物品(新聞、微博等)具有很強的時效性,所以需要在物品還具有時效性時就將它們推薦給使用者。因此,在這些網站中,推薦系統的實時性就顯得至關重要。
推薦系統的實時性包括兩個方面。首先,推薦系統需要實時地更新推薦列表來滿足使用者新的行為變化。實時性的第二個方面是推薦系統需要能夠將新加入系統的物品推薦給使用者。這主要考驗了推薦系統處理物品冷啟動的能力。
1.3.9 健壯性
衡量了一個推薦系統抗擊作弊的能力。演算法健壯性的評測主要利用模擬攻擊。首先,給定一個資料集和一個演算法,可以用這個演算法給這個資料集中的使用者生成推薦列表。然後,用常用的攻擊方法向資料集中注入噪聲資料,然後利用演算法在注入噪聲後的資料集上再次給使用者生成推薦列表。最後,通過比較攻擊前後推薦列表的相似度評測演算法的健壯性。如果攻擊後的推薦列表相對於攻擊前沒有發生大的變化,就說明演算法比較健壯。
1.3.10 商業目標
很多時候,評測推薦系統更加註重商業目標是否達成,而商業目標和盈利模式是息息相關的。一般來說,最本質的商業目標就是平均一個使用者給公司帶來的盈利。不過這種指標不是很難計算,只是計算一次需要比較大的代價。因此,很多公司會根據自己的盈利模式設計不同的商業目標。
1.3.11 參考資料
推薦系統的評測問題有很多的相關研究和資料,預詳細研究可閱讀參考:
- 《推薦系統實戰》
- 《Evaluating Recommendation Systems》
- What metrics are used for evaluating recommender systems?
二、常用演算法
推薦演算法的演化可以簡單分為3個階段,也是推薦系統由簡單到複雜的迭代。
2.1 推薦演算法演化
2.1.1 人工運營
這個階段是隨機的,人工根據運營目的,手工給特定類別的使用者推送特定的內容。
優點是:
- 方便推廣特定的內容;
- 推薦的內容易解釋;
缺點是:
- 千人一面,推送的內容一樣;
- 人工篩選,推送,耗費人力巨大;
- 運營根據自己的知識,主觀性比較大;
2.1.2 基於統計的推薦
會基於一些簡單的統計學知識做推薦,例如某個內別賣得最好的熱門榜;再細緻一些,將使用者按個人特質劃分,再求各種熱度榜等。
優點是:
- 熱門就是大部分使用者喜好的擬合,效果好;
- 推薦的內容易解釋;
缺點是:
- 千人一面,推送的內容一樣;
- 馬太效應,熱門的會越來越熱門,冷門的越來越冷門;
- 效果很容易達到天花板;
2.1.3 個性化推薦
當前階段的推薦,會基於協同過濾演算法、基於模型的演算法、基於社交關係等,機器學習、深度學習逐漸引入,提高了推薦效果。
優點是:
- 效果要相對於之前,要好很多;
- 千人前面,每個人都有自己獨特的推薦列表;
缺點是:
- 門檻較高,推薦系統搭建、演算法設計、調優等等,都對開發者有較高的要求;
- 成本較高,而且是個長期迭代優化的過程,人力物力投入很高;
2.2 推薦演算法彙總
內部一個分享這樣分類常用的推薦演算法:
圖5 推薦演算法分類這裡提到的Memory-based演算法和Model-based演算法的差別是什麼?這也是我之前關注的問題,找到個資料,講解得比較透徹。
Memory-based techniques use the data (likes, votes, clicks, etc) that you have to establish correlations (similarities?) between either users (Collaborative Filtering) or items (Content-Based Recommendation) to recommend an item i to a user u who’s never seen it before. In the case of collaborative filtering, we get the recommendations from items seen by the user’s who are closest to u, hence the term collaborative. In contrast, content-based recommendation tries to compare items using their characteristics (movie genre, actors, book’s publisher or author… etc) to recommend similar new items.
In a nutshell, memory-based techniques rely heavily on simple similarity measures (Cosine similarity, Pearson correlation, Jaccard coefficient… etc) to match similar people or items together. If we have a huge matrix with users on one dimension and items on the other, with the cells containing votes or likes, then memory-based techniques use similarity measures on two vectors (rows or columns) of such a matrix to generate a number representing similarity.
Model-based techniques on the other hand try to further fill out this matrix. They tackle the task of “guessing” how much a user will like an item that they did not encounter before. For that they utilize several machine learning algorithms to train on the vector of items for a specific user, then they can build a model that can predict the user’s rating for a new item that has just been added to the system.
Since I’ll be working on news recommendations, the latter technique sounds much more interesting. Particularly since news items emerge very quickly (and disappear also very quickly), it makes sense that the system develops some smart way of detecting when a new piece of news will be interesting to the user even before other users see/rate it.
Popular model-based techniques are Bayesian Networks, Singular Value Decomposition, and Probabilistic Latent Semantic Analysis (or Probabilistic Latent Semantic Indexing). For some reason, all model-based techniques do not enjoy particularly happy-sounding names.
《攜程個性化推薦演算法實踐》一文中梳理了工業界應用的排序模型,大致經歷三個階段:
圖6 排序模型演進本文不對上面的這些演算法進行詳細的原理探討,會比較複雜,有興趣可以再自行學習。
2.3 CF演算法示例
為了學習這塊的技術知識,跟著參加了下內部舉辦的srtc推薦比賽。重在參與,主要是學習整個基本流程,體會下推薦場景,瞭解騰訊內部做得好的團隊和產品是什麼樣子。
2.3.1(內部敏感資料,刪除)
2.3.2 CF演算法
在web平臺上點一點,可能失去了學習的意義。所以本著學習的態度,我線上下自己的機器上實現了一些常用的演算法,例如CF等。
推薦演算法裡CF算是比較常見的,核心還是很簡單的。
- user-cf基本原理
A.找到和目標使用者興趣相似的的使用者集合; B.找到這個集合中的使用者喜歡的,且目標使用者沒聽過的物品推薦給目標使用者。
- item-cf基本原理
A.計算物品之間的相似度; B.根據物品的相似度和使用者的歷史行為給使用者生成推薦列表。
結合前面總結的,cf屬於memory-base的演算法,很大一個特徵就是會用到相似度的函式。這個user-cf需要計算使用者興趣的相似度,item-cf需要計算物品間的相似度。基於相似度函式的選擇、程式語言的選擇、實現方式的選擇、優化的不同,結果和整個執行時間會很大不同。當時就簡單用python實現的,8個process跑滿cpu同時處理,需要近10個小時跑完。後面瞭解到有底層進行過優化的pandas、numpy等,基於這些工具來實現速度會快很多。
2.3.3 收穫
哈哈,第一次參加這種比賽,雖然成績很差,但自己覺得很是學到很多東西,基本達到了參賽的目的。在真實的場景和資料下去思考各種影響因素,體會各種演算法從設計、實現、訓練、評價等各階段,很多東西確實比看資料和書來得更深入。果然實踐才是學習的最好手段。如果想更深入去搞推薦演算法這塊,感覺需要繼續學習目前各種熱門演算法的原理、潛規則,kaggle上多練手,以及鍛鍊相關的平臺及工程化能力。
三、業界推薦系統調研
收集、研究了下網上一些推薦系統落地總結的文章,可以開拓視野,加深整體理解。
以下只是一些重要內容,有興趣可以閱讀原文:
- 《今日頭條演算法原理》,原文連結
- 《推薦演算法在閒魚小商品池的探索與實踐》,原文連結
- 《餓了麼推薦系統:從0到1》,原文連結
- 《愛奇藝個性化推薦排序實踐》,原文連結
- 《攜程個性化推薦演算法實踐》,原文連結
- 《蘑菇街推薦工程實踐》,原文連結
3.1 今日頭條推薦系統
今日頭條演算法架構師曹歡歡博士,做過一次 《今日頭條演算法原理》的報告。主要涉及4部分:系統概覽、內容分析、使用者標籤、評估分析。
- 四類典型推薦特徵
第一類是相關性特徵,就是評估內容的屬性和與使用者是否匹配。 第二類是環境特徵,包括地理位置、時間。這些既是bias特徵,也能以此構建一些匹配特徵。 第三類是熱度特徵。包括全域性熱度、分類熱度,主題熱度,以及關鍵詞熱度等。 第四類是協同特徵,它可以在部分程度上幫助解決所謂演算法越推越窄的問題。
- 模型的訓練上,頭條系大部分推薦產品採用實時訓練
模型的訓練上,頭條系大部分推薦產品採用實時訓練。實時訓練省資源並且反饋快,這對資訊流產品非常重要。使用者需要行為資訊可以被模型快速捕捉並反饋至下一刷的推薦效果。我們線上目前基於storm叢集實時處理樣本資料,包括點選、展現、收藏、分享等動作型別。模型引數伺服器是內部開發的一套高效能的系統,因為頭條資料規模增長太快,類似的開源系統穩定性和效能無法滿足,而我們自研的系統底層做了很多針對性的優化,提供了完善運維工具,更適配現有的業務場景。
目前,頭條的推薦演算法模型在世界範圍內也是比較大的,包含幾百億原始特徵和數十億向量特徵。整體的訓練過程是線上伺服器記錄實時特徵,匯入到Kafka檔案佇列中,然後進一步匯入Storm叢集消費Kafka資料,客戶端回傳推薦的label構造訓練樣本,隨後根據最新樣本進行線上訓練更新模型引數,最終線上模型得到更新。這個過程中主要的延遲在使用者的動作反饋延時,因為文章推薦後使用者不一定馬上看,不考慮這部分時間,整個系統是幾乎實時的。
但因為頭條目前的內容量非常大,加上小視訊內容有千萬級別,推薦系統不可能所有內容全部由模型預估。所以需要設計一些召回策略,每次推薦時從海量內容中篩選出千級別的內容庫。召回策略最重要的要求是效能要極致,一般超時不能超過50毫秒。
- 使用者標籤工程挑戰更大
內容分析和使用者標籤是推薦系統的兩大基石。內容分析涉及到機器學習的內容多一些,相比而言,使用者標籤工程挑戰更大。 今日頭條常用的使用者標籤包括使用者感興趣的類別和主題、關鍵詞、來源、基於興趣的使用者聚類以及各種垂直興趣特徵(車型,體育球隊,股票等)。還有性別、年齡、地點等資訊。性別資訊通過使用者第三方社交賬號登入得到。年齡資訊通常由模型預測,通過機型、閱讀時間分佈等預估。常駐地點來自使用者授權訪問位置資訊,在位置資訊的基礎上通過傳統聚類的方法拿到常駐點。常駐點結合其他資訊,可以推測使用者的工作地點、出差地點、旅遊地點。這些使用者標籤非常有助於推薦。
當然最簡單的使用者標籤是瀏覽過的內容標籤。但這裡涉及到一些資料處理策略。主要包括:一、過濾噪聲。通過停留時間短的點選,過濾標題黨。二、熱點懲罰。對使用者在一些熱門文章(如前段時間PG One的新聞)上的動作做降權處理。理論上,傳播範圍較大的內容,置信度會下降。三、時間衰減。使用者興趣會發生偏移,因此策略更偏向新的使用者行為。因此,隨著使用者動作的增加,老的特徵權重會隨時間衰減,新動作貢獻的特徵權重會更大。四、懲罰展現。如果一篇推薦給使用者的文章沒有被點選,相關特徵(類別,關鍵詞,來源)權重會被懲罰。當然同時,也要考慮全域性背景,是不是相關內容推送比較多,以及相關的關閉和dislike訊號等。
- Hadoop叢集壓力過大,上線 Storm叢集流式計算系統
面對這些挑戰。2014年底今日頭條上線了使用者標籤Storm叢集流式計算系統。改成流式之後,只要有使用者動作更新就更新標籤,CPU代價比較小,可以節省80%的CPU時間,大大降低了計算資源開銷。同時,只需幾十臺機器就可以支撐每天數千萬使用者的興趣模型更新,並且特徵更新速度非常快,基本可以做到準實時。這套系統從上線一直使用至今。
- 很多公司演算法做的不好,並非是工程師能力不夠,而是需要一個強大的實驗平臺,還有便捷的實驗分析工具
A/B test系統原理
這是頭條A/B Test實驗系統的基本原理。首先我們會做在離線狀態下做好使用者分桶,然後線上分配實驗流量,將桶裡使用者打上標籤,分給實驗組。舉個例子,開一個10%流量的實驗,兩個實驗組各5%,一個5%是基線,策略和線上大盤一樣,另外一個是新的策略。
實驗過程中使用者動作會被蒐集,基本上是準實時,每小時都可以看到。但因為小時資料有波動,通常是以天為時間節點來看。動作蒐集後會有日誌處理、分散式統計、寫入資料庫,非常便捷。
3.2 推薦演算法在閒魚小商品池的探索與實踐
- 閒魚中個性化推薦流程
商品個性化推薦演算法主要包含Match和Rank兩個階段:Match階段也稱為商品召回階段,在推薦系統中使用者對商品的行為稱為使用者Trigger,通過長期收集使用者作用在商品上的行為,建立使用者行為和商品的矩陣稱為X2I,最後通過使用者的Trigger和關係矩陣X2I進行商品召回。Rank階段利用不同指標的目標函式對商品進行打分,根據推薦系統的規則對商品的多個維度進行綜合排序。下面以閒魚的首頁feeds為例,簡單介紹閒魚的個性化推薦流程。
所示步驟1.1,利用使用者的資訊獲取使用者Trigger,使用者資訊包括使用者的唯一標識userId,使用者的裝置資訊唯一標識uttid。
所示步驟1.2,返回使用者Trigger其中包括使用者的點選、購買過的商品、喜歡的類目、使用者的標籤、常逛的店鋪、購物車中的商品、喜歡的品牌等。
所示步驟1.3,進行商品召回,利用Trigger和X2I矩陣進行join完成對商品的召回。
所示步驟1.4,返回召回的商品列表,在商品召回中一般以I2I關係矩陣召回的商品為主,其他X2I關係矩陣召回為輔助。
步驟2.1,進行商品過濾,對召回商品進行去重,過濾購買過的商品,剔除過度曝光的商品。
所示步驟2.2,進行商品打分,打分階段利用itemInfo和不同演算法指標對商品多個維度打分。
步驟2.3,進行商品排序,根據規則對商品多個維度的分數進行綜合排序。
步驟2.4,進行返回列表截斷,截斷TopN商品返回給使用者。
閒魚通過以上Match和Rank兩個階段八個步驟完成商品的推薦,同時從圖中可以看出為了支援商品的個性化推薦,需要對X2I、itemInfo、userTrigger資料迴流到搜尋引擎,這些資料包含天級別迴流資料和小時級別迴流資料。
- 小商品的特點
小商品池存在以下幾個特點。
實時性:在閒魚搭建的小商品池中要求商品可以實時的流入到該規則下的商品池,為使用者提供最新的優質商品。
週期性:在小商品池中,很多商品擁有周期屬性,例如免費送的拍賣場景,拍賣週期為6小時,超過6小時後將被下架。
目前頻道導購頁面大多還是利用搜尋引擎把商品呈現給使用者,為了保證商品的曝光,一般利用搜尋的時間視窗在商品池中對商品進一步篩選,但是仍存在商品曝光的問題,如果時間視窗過大,那麼將會造成商品過度曝光,如果商品視窗過小那麼就會造成商品曝光不足,同時還存在一個搜尋無法解決的問題,同一時刻每個使用者看到的商品都是相同的,無法針對使用者進行個性化推薦,為了進一步提升對使用者的服務,小商品池亟需引入個性化推薦。
- 推薦在小商品池的解決方案
在上文中利用全站X2I資料對小商品池的商品進行推薦過程中,發現在Match階段,當小商品池過小時會造成商品召回不足的問題,為了提升小商品池推薦過程中有效召回數量,提出瞭如下三種解決方案。
提前過濾法:資料迴流到搜尋引擎前,小商品池對資料進行過濾,產生小商品池的迴流資料,在商品進行召回階段,利用小商品池的X2I進行商品召回,以此提升商品的召回率。
商品向量化法: 在Match階段利用向量相似性進行商品召回,商品向量化是利用向量搜尋的能力,把商品的特性和規則通過函式對映成商品向量,同時把使用者的Trigger和規則對映成使用者向量,文字轉換向量常用詞袋模型和機器學習方法,詞袋模型在文字長度較短時可以很好的把文字用詞向量標識,但是文字長度過長時受限於詞袋大小,如果詞袋過小效果將會很差,機器學習的方法是利用Word2Vector把文字訓練成向量,根據經驗值向量維度一般為200維時效果較好。然後利用向量搜尋引擎,根據使用者向量搜尋出相似商品向量,以此作為召回的商品。如圖5所示商品的向量分兩部分,前20位代表該商品的規則,後200位代表商品的基本特徵資訊。
商品搜尋引擎法: 在Match階段利用商品搜尋引擎對商品進行召回,如圖6所示在商品進入搜尋引擎時,對商品結構進行理解,在商品引擎中加入Tag和規則,然後根據使用者的Trigger和規則作為搜尋條件,利用搜尋引擎完成商品的召回。搜尋引擎的天然實時性解決了小商品池推薦強實時性的問題。
3.3 餓了麼推薦系統:從0到1
對於任何一個外部請求, 系統都會構建一個QueryInfo(查詢請求), 同時從各種資料來源提取UserInfo(使用者資訊)、ShopInfo(商戶資訊)、FoodInfo(食物資訊)以及ABTest配置資訊等, 然後呼叫Ranker排序。以下是排序的基本流程(如下圖所示):
#調取RankerManager, 初始化排序器Ranker:
- 根據ABTest配置資訊, 構建排序器Ranker;
- 調取ScorerManger, 指定所需打分器Scorer(可以多個); 同時, Scorer會從ModelManager獲取對應Model, 並校驗;
- 調取FeatureManager, 指定及校驗Scorer所需特徵Features。
#調取InstanceBuilder, 彙總所有打分器Scorer的特徵, 計算對應排序項EntityInfo(餐廳/食物)排序所需特徵Features;
#對EntityInfo進行打分, 並按需對Records進行排序。
這裡需要說明的是:任何一個模型Model都必須以打分器Scorer形式展示或者被呼叫。主要是基於以下幾點考慮:
- 模型迭代:比如同一個Model,根據時間、地點、資料抽樣等衍生出多個版本Version;
- 模型引數:比如組合模式(見下一小節)時的權重與輪次設定,模型是否支援並行化等;
- 特徵引數:特徵Feature計算引數,比如距離在不同城市具有不同的分段引數。
3.4 愛奇藝個性化推薦排序實踐
我們的推薦系統主要分為兩個階段,召回階段和排序階段。
召回階段根據使用者的興趣和歷史行為,同千萬級的視訊庫中挑選出一個小的候選集(幾百到幾千個視訊)。這些候選都是使用者感興趣的內容,排序階段在此基礎上進行更精準的計算,能夠給每一個視訊進行精確打分,進而從成千上萬的候選中選出使用者最感興趣的少量高質量內容(十幾個視訊)。
推薦系統的整體結構如圖所示,各個模組的作用如下:
使用者畫像:包含使用者的人群屬性、歷史行為、興趣內容和偏好傾向等多維度的分析,是個性化的基石
特徵工程:包含了了視訊的類別屬性,內容分析,人群偏好和統計特徵等全方位的描繪和度量,是視訊內容和質量分析的基礎
召回演算法:包含了多個通道的召回模型,比如協同過濾,主題模型,內容召回和SNS等通道,能夠從視訊庫中選出多樣性的偏好內容
排序模型:對多個召回通道的內容進行同一個打分排序,選出最優的少量結果。
除了這些之外推薦系統還兼顧了推薦結果的多樣性,新鮮度,逼格和驚喜度等多個維度,更能夠滿足使用者多樣性的需求。
然後,介紹了推薦排序系統架構、推薦機器學習排序演算法演進。
3.5 攜程個性化推薦演算法實踐
推薦流程大體上可以分為3個部分,召回、排序、推薦結果生成,整體的架構如下圖所示。
召回階段,主要是利用資料工程和演算法的方式,從千萬級的產品中鎖定特定的候選集合,完成對產品的初步篩選,其在一定程度上決定了排序階段的效率和推薦結果的優劣。
業內比較傳統的演算法,主要是CF[1][2]、基於統計的Contextual推薦和LBS,但近期來深度學習被廣泛引入,演算法性取得較大的提升,如:2015年Netflix和Gravity R&D Inc提出的利用RNN的Session-based推薦[5],2016年Recsys上提出的結合CNN和PMF應用於Context-aware推薦[10],2016年Google提出的將DNN作為MF的推廣,可以很容易地將任意連續和分類特徵新增到模型中[9],2017年IJCAI會議中提出的利用LSTM進行序列推薦[6]。2017年攜程個性化團隊在AAAI會議上提出的深度模型aSDAE,通過將附加的side information整合到輸入中,可以改善資料稀疏和冷啟動問題[4]。
對於召回階段得到的候選集,會對其進行更加複雜和精確的打分與重排序,進而得到一個更小的使用者可能感興趣的產品列表。攜程的推薦排序並不單純追求點選率或者轉化率,還需要考慮距離控制,產品質量控制等因素。相比適用於搜尋排序,文字相關性檢索等領域的pairwise和listwise方法,pointwise方法可以通過疊加其他控制項進行干預,適用於多目標優化問題。
工業界的推薦方法經歷從線性模型+大量人工特徵工程[11] -> 複雜非線性模型-> 深度學習的發展。Microsoft首先於2007年提出採用Logistic Regression來預估搜尋廣告的點選率[12],並於同年提出OWLQN優化演算法用於求解帶L1正則的LR問題[13],之後於2010年提出基於L2正則的線上學習版本Ad Predictor[14]。
Google在2013年提出基於L1正則化的LR優化演算法FTRL-Proximal[15]。2010年提出的Factorization Machine演算法[17]和進一步2014年提出的Filed-aware Factorization Machine[18]旨在解決稀疏資料下的特徵組合問題,從而避免採用LR時需要的大量人工特徵組合工作。
阿里於2011年提出Mixture of Logistic Regression直接在原始空間學習特徵之間的非線性關係[19]。Facebook於2014年提出採用GBDT做自動特徵組合,同時融合Logistic Regression[20]。
近年來,深度學習也被成功應用於推薦排序領域。Google在2016年提出wide and deep learning方法[21],綜合模型的記憶和泛化能力。進一步華為提出DeepFM[15]模型用於替換wdl中的人工特徵組合部分。阿里在2017年將attention機制引入,提出Deep Interest Network[23]。
攜程在實踐相應的模型中積累了一定的經驗,無論是最常用的邏輯迴歸模型(Logistic Regression),樹模型(GBDT,Random Forest)[16],因子分解機(FactorizationMachine),以及近期提出的wdl模型。同時,我們認為即使在深度學習大行其道的今下,精細化的特徵工程仍然是不可或缺的。
基於排序後的列表,在綜合考慮多樣性、新穎性、Exploit & Explore等因素後,生成最終的推薦結果。
四、總結
之前沒有接觸過推薦系統,現在由於工作需要開始接觸這塊內容。很多概念和技術不懂,需要補很多東西。近期也去參加了內部推薦大賽真實地操作了一輪,同時開始學習推薦系統的基礎知識,相關架構等,為下一步工作打下必要的基礎。
推薦系統是能在幾乎所有產品中存在的載體,它幾乎可以無延時地以使用者需求為導向,來滿足使用者。其代表的意義和效率,遠遠超過傳統模式。毋庸置疑,牛逼的推薦系統就是未來。但這裡有個難點就在於,推薦系統是否做得足夠的好。而從目前來看,推薦演算法和推薦系統並沒有達到人們的預期。因為人的需求是極難猜測的。
又想到之前知乎看到一篇文章,說的是國內很多網際網路公司都有的運營崗位,在國外是沒有專設這個崗位的。還記得作者分析的較突出原因就是:外國人比較規矩,生活和飲食較單調,例如高興了都點披薩。而中國不一樣,從千千萬萬的菜品就能管中窺豹,國人的愛好極其廣泛,眾口難調。加上國外人工時很貴,那麼利用演算法去擬合使用者的愛好和需求,自動地去挖掘使用者需求,進行下一步的深耕和推薦就是一個替代方案。這也是國外很推崇推薦系統的側面原因。而在中國,人相對來說是便宜的,加上國人的口味更多更刁鑽,演算法表現不好,所以會設很多專門的運營崗位。但慢慢也開始意識到這將是一個趨勢,加上最近ai大熱,各家大廠都在這塊不斷深耕。
回到推薦系統上,從現實中客觀的原因就可以看到,真正能擬合出使用者的需求和愛好確實是很困難的事情。甚至有時候使用者都不知道自己想要的是啥,作為中國人,沒有主見和想法是正常的,太有主見是違背標準答案的。但推薦系統背後代表的意義是:你的產品知道使用者的興趣,能滿足使用者的興趣,那麼必定使用者就會離不開你。使用者離不開的產品,肯定會佔領市場,肯定就有極高的估值和想象空間。這也就是大家都在做推薦系統,雖然用起來傻傻的,效果也差強人意,依然願意大力投入的根本原因。
幾句胡謅,前期學習過後的簡單總結,自己還有很多東西和細節需要繼續學習和研究。能力有限,文中不妥之處還請指正~
(ps:文中一些截圖和文字的版權歸屬原作者,且均已標註引用資料來源地址,本文只是學習總結之用,如有侵權,聯絡我刪除)
問答
相關閱讀
此文已由作者授權騰訊雲+社群釋出,更多原文請點選
搜尋關注公眾號「雲加社群」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社群!