本文的主要內容是推薦系統相關的東西,會涵蓋推薦系統相關的大部分知識點,對于非技術人員應該是能基本了解推薦系統了。
建議Mark之后慢慢看,畢竟文章有點長,而且第一遍也不一定能看懂…
本文主要包括推薦系統的相關概念、推薦系統的架構和流程、常見的推薦算法、挖掘、召回、排序、評估和總結這幾部分。
概念部分會簡述推薦系統相關的理論知識,架構和流程主要是介紹推薦系統的通用架構和常規的推薦流程。
算法部分主要是一些常見的推薦算法介紹,挖掘》召回》排序主要是基于推薦流程的詳細展開。
評估部分指的是如何評估一個推薦系統的好壞,總結部分主要是整體內容的回顧,以及一個真實推薦系統的案例。
可以按照個人興趣直接跳至對應的小節瀏覽,也可以按照順序進行閱讀,遇到看不懂的部分建議先跳過,遇到讀不下去的情況,建議先Mark…
以下,開始正文部分。
推薦系統的相關概念
在正式展開文章之前,我們先簡單的了解下推薦系統相關的理論知識。
什么是推薦系統
先來看下Wiki的定義:
一種信息過濾系統,用來預測用戶對物品的行為和偏好。
按照字面意思理解下來,就是幫助過濾信息,預測用戶對物品的行為和偏好。
在今日頭條曹歡歡博士的一次分享中提到了這樣一個定義:
資訊推薦系統本質上要解決用戶,資訊和環境的匹配,y=F(Xi,Xu,Xc)
感覺把這個定義延伸到其他推薦系統上也是成立的,那就是推薦系統本質上要解決用戶,物品和環境的匹配問題,幫助建立用戶和物品之間的連接。
回到定義本身,理論上說能實現這個功能的系統都可以稱之為推薦系統。
為什么要有推薦系統
先來回顧一下互聯網誕生到目前為止,我們尋找信息方式的變化歷程…
最早期的時候,信息是比較稀缺的,那個時候信息比較分散,尋找的效率較低,主要是人找信息。
后來信息逐漸豐富起來了,有些人或者公司專門把各種信息聚集在一個地方,人們可以通過類目導航進行查找,典型的公司是三大門戶。
再后來信息量越來越大,人工添加的類目已經不能覆蓋所有信息了,于是誕生了另外一種信息獲取方式——搜索,典型的公司是google、百度。
再再后來,人與信息的關系從單向的人找信息演變成了現在的雙向關系,人在海量的信息中找著自己需要的東西,同時海量的信息也在找合適的人。
從這個演化過程中,我們可以看到推薦系統的出現有兩個重要的前提,一個是信息過載,一個是需求不明確。
數量有限的情況下根本不需要推薦,用戶自己就能瀏覽完所有的物品。再往后發展,數量級不大的情況下,人工干預就可以解決,當人工干預也無法解決時,這個時候就需要推薦系統了。
當用戶需求比較明確的時候,用戶會傾向于使用搜索,需求不太明確時,基于用戶歷史的一些行為和偏好給用戶推薦一些東西能讓用戶先留下來,在逛的過程中可能就產生了一些新的訴求。
從以上的部分可以看到推薦系統是一個多方共贏的存在:
- 對用戶而言,能夠發現自己感興趣的東西,提升用戶體驗;
- 對物品而言,能夠發掘長尾物品的利用效率,盤活整體資源;
- 對平臺而言,能夠獲取用戶價值和商業價值。
推薦系統典型的應用場景比如電商類的買了又買、看了又看,社交產品中你可能感興趣的人,音樂電影中的猜你喜歡,以及一些信息流產品等。
你需要推薦系統么
既然推薦系統那么好,要不在產品中加一個唄?
在決定如何加一個推薦系統之前,先確定要不要做,以及投入產出比是否合適。
首先對于不同業務模式,不同階段的業務需要關注的側重點是不同的,比如一個工具型產品需要推薦系統么,一個資訊App的早期需要推薦系統么…
其次推薦系統短期內的價值容易被高估,而且搭建起來也是比較費時費力費錢的。
雖然用一些簡單的算法就可以有一定的效果,想進一步提升效果,則需要很大的投入。
事情都是相對而言的,具體是否需要搭建推薦系統,需結合業務模式、時間點、戰略需求、團隊能力等多方面因素綜合考慮…
推薦系統的架構和流程
這部分主要是關于推薦系統整體的架構以及如何實現推薦流程的。
通用推薦架構
這部分內容主要分為整體技術框架,推薦系統架構、推薦引擎架構這幾部分。
它們依次為包含關系,推薦系統是整體技術框架中的一環,推薦引擎又是推薦系統的一環。
整體技術框架
下圖為推薦系統的整體技術框架:
從下往上依次為數據的生產、存儲、候選集觸發,融合過濾重排序。重排序之后就是輸出的推薦結果,然后再供各業務調用,比如猜你喜歡,看了又看,買了又買…
推薦系統架構
整個推薦系統可以看作是一個加工廠,輸入用戶和物品數據,輸出用戶可能會感興趣的物品清單,然后從物品清單中取前若干個作為推薦結果給到用戶。
在這個過程中還需要做一些過濾,排序工作,輸出結果的時候最好能讓用戶知道為什么推薦這個東西,這樣用戶的接受度會高一些。
比如已經產生了一個用戶可能感興趣物品的Top100,之后需要把用戶已經買過的東西過濾掉。
然后再基于用戶的一些歷史行為進行排序,比如經常看的東西權重高一些,很久之前看的東西權重低一些,最終排一個名次,再按照排序名次取前10個展示給用戶。
要實現這個效果,就需要依賴于很多推薦引擎,簡單理解就是會很多個推薦人,各自負責推薦一些候選結果。
推薦引擎架構
單個推薦引擎和整體推薦架構沒什么特別大的差異,無非是推薦引擎先自己走一遍推薦流程,把輸出的推薦結果作為新的輸入部分,再走一遍推薦流程。
推薦引擎整體可以分為四部分,分別是用戶特征、物品候選集、用戶-物品匹配、過濾、融合和排序。
用戶特征部分做的事情主要是將用戶的行為數據(點擊、瀏覽、購買等)和屬性數據(人口屬性、用戶關系、興趣愛好等)轉化為對應的特征,供用戶-物品匹配部分利用。
物品候選集就是需要給用戶匹配的物品,通常也需要轉化為對應的物品特征。
有了物品特征和用戶特征之后,需要做的就是生成用戶-物品的初始化推薦列表。
再之后就是基于初始推薦列表的一些處理,過濾掉一些東西,按照用戶的行為反饋、物品屬性和一些產品策略再進行列表順序的調整,生成最終的推薦結果。
通用推薦流程
上面主要是一些架構相關的東西,這部分主要是如何生成推薦結果。
理論上推薦流程可以分為挖掘》召回》排序這幾部分。
挖掘就是上面說的用戶特征和物品特征的生成部分,這部分做好了,后面的推薦結果才會有好的效果。
召回就是從原始的數據集中基于種種策略先挑選一部分物品,這部分需要盡可能全的覆蓋用戶需求,通常會把十萬甚至百萬級的候選集過濾到數百量級。
排序就是針對召回的數百個物品進行更深層次的加工,優先選擇若干個結果推薦給用戶,通常數量在數十級。
以上是理論上的流程,然而實際上每個部分都比較復雜,而且也不僅僅只有一個模型,通常情況下都會有N多模型,不同的模型用到的可能是不同的算法和策略…
常見的推薦算法
這部分主要是一些常見算法的簡單介紹,篇幅有限不詳細展開,之前寫過一篇算法相關的文章,感興趣的可以看一下。
產品經理必知的推薦算法二三事
基于流行度的推薦
其實就是我們通常說的熱門,基于最高評分、最多購買、最多下載、最多觀看等維度給用戶進行推薦。
通常情況下可以作為冷啟動策略或者兜底的策略,前者是用戶剛進來沒有任何信息和行為偏好的時候,后者是在其他算法沒有推薦結果的時候作為替補策略。
通常情況下計算規則基本都符合下面這個公式:
- 熱度分=(基礎分+加權分+行為交互分)*時間衰減
這里面會有很多變形,比如可能需要按照不同類目、維度給予不同的初始權重,可能會人工干預做一些升降權,不同行為的權重會不同等等…
基于內容的推薦
首先澄清一個誤解,基于內容的推薦包含有標簽的推薦,但并不等于標簽的推薦,標簽只是基于內容推薦的一小部分。
標簽、關鍵詞、實體、分類、主題、詞嵌入向量等,都是內容推薦中的一些手段。
基于內容推薦的核心是得到內容畫像和用戶畫像,整體實現流程是先通過內容挖掘得到內容畫像,然后基于用戶的行為生成對應的用戶畫像,再基于用戶畫像和內容之間的相似度來給用戶推薦不同的內容。
舉個栗子:
現在要推薦一個新的視頻,但視頻沒有畫像,無法推薦,只能隨機推一部分流量先看下效果;
通過對標題文本進行分析之后發現這是個娛樂類的視頻,這個時候就能定向推一部分用戶了,效果會比隨機推薦好;
經過對文本進一步分析后發現內容屬于某影視劇的主題,那這個時候就可以基于該主題進行分發,會更精準一些;
通過對視頻內容識別之后,發現視頻中有XX明星,那這個時候推給Ta的粉絲,效果會更好。
以上,就是在內容挖掘之后,基于內容畫像進行的推薦。
對于消費了該視頻的用戶,就可以打上XX標簽、主題,然后再不斷更新用戶畫像對應的維度和權重。
此外在新內容冷啟動的時候,也可以先計算和現有物品的相似度,然后再基于相似度推薦給可能感興趣的人群。
近鄰推薦
也就是大名鼎鼎的基于用戶的協同過濾和基于物品的協同過濾。核心思想是物以類聚,人以群分…
基于用戶的協同過濾
整體思想是找到和用戶相似的群體,給用戶推薦這群用戶中比較流行但該用戶沒有聽說過的東西。
比如A點擊喜歡了一篇文章,這個時候就可以給A推薦Ta所在群體中其他人喜歡,但是A沒有看過的文章。
這個策略的主要問題在于如何計算用戶之間的相似度,通常的計算方法有兩種:
計算用戶之間的余弦相似度;
計算用戶之間有正反饋物品的相似度,比如A喜歡了的文章和B喜歡了的文章有多少是重合的。
基于物品的協同過濾
用戶協同過濾的思想是計算用戶-用戶的相似度,物品協同過濾就是基于物品-物品相似度的推薦,先找到用戶喜歡過的物品最相似的物品列表,然后給用戶推薦這些物品。
只不過這個物品-物品的相似度并不是直接計算得到的,而是通過喜歡物品一的用戶和喜歡物品二的用戶的交集來計算的,兩個物品相似是因為它們出現在很多共同用戶的喜好列表中。
這里面需要注意的是熱門物品和其他物品之間的相似度,理論上來說大多數用戶都可能會喜歡熱門物品,這樣就可能造成熱門物品-單個物品的相似度很高,所以需要適當的對熱門物品進行降權處理。
矩陣分解
矩陣分解可以看作是隱語義模型的一種實現方式,核心是為了獲得物品和用戶的隱向量,然后基于隱向量進行后續的計算和推薦。
近鄰推薦是基于用戶-用戶或者用戶-物品矩陣中已有的數據去計算未知的數據,矩陣分解則是將這個矩陣分解為兩個小矩陣,后續的計算不再使用原始矩陣,而是采用這兩個小矩陣。
比如分解用戶-物品矩陣后得到用戶u的向量是 Pu,物品i的向量是Qi,那么要計算物品i推薦給用戶u的推薦分數,直接計算點積即可。
矩陣分解有時也被稱作SVD,但SVD 和矩陣分解不能劃等號,因為除了SVD還有一些別的矩陣分解方法。
比如加了用戶隱式反饋行為和屬性的SVD++,加了時間因素的Time-SVD,還有用來求解矩陣的交替最小二乘法ALS等…
基于關聯規則的推薦
關聯規則更多是基于統計模型的推薦,表現形式為A和B有很大的關聯性,買了A我就給你推薦B。
通常在電商中運用的比較多,比如買了個炒鍋為你推薦鍋鏟,買了個手機為你推薦耳機等…
基于圖模型的推薦
圖模型指的是把用戶行為表示為二分圖模型,將個性化推薦算法放到二分圖模型上。
那給用戶u推薦物品的問題就可以轉化為度量用戶頂點Vu和與它沒有邊相連的物品頂點在圖上的相關性,相關性越高,物品在推薦列表中的權重越高。
深度學習
CNN、RNN等…
混合推薦
通常情況下上面的這些算法大都是同時存在的,畢竟本身就會有N個推薦引擎。
通常情況下,常見的混合策略一般是加權、交叉、切換、分級、分層…
- 加權指的給不同的算法賦予不同的權重,將多個算法的推薦結果組合在一起,然后取TopN;
- 交叉指的是直接將不同算法的結果推薦給用戶,比如固定位置展示或者按照百分比出;
- 切換指的是在不同的場景下采用不同的算法,比如資訊類產品優先基于內容推薦,找不到合適的內容再基于協同過濾,最后基于熱門;
- 分級指的是按照算法的效果好壞進行使用,優先使用效果好的算法,無推薦結果時再使用次好的算法;
- 分層指的是把前一層算法輸出的結果作為后一層的輸入結果,然后再不斷的進行優化。
以上,就是常用算法相關的內容,后面是基于推薦流程展開的內容,分別是挖掘、召回和排序。
挖掘
挖掘也就是通常說的特征工程,有效的特征和特征組合直接決定著后續推薦結果的好壞。本部分會簡單的說下整體流程,以及常見的特征。
整體流程
特征工程整體流程大致可以分為特征清洗、特征預處理、特征處理和特征監控這幾部分。
特征清洗主要是將一些異常樣本進行清洗,對一些樣本進行采樣。
特征預處理主要是對單個特征類型的一些轉換,同時對異常值、缺失值進行處理,此外還有對多個特征的降維、選擇。
特征處理主要是對特征進行離散、平滑、組合、聚合等處理,以達到更好的效果。
特征監控一方面是對特征的有效性進行分析,看特征是否真的有效,另一方面是監控特征的重要性是否有變化,避免影響模型效果。
常見的特征
常見的特征可以分為用戶特征、物品特征、相關性特征、環境特征、上下文特征等…
用戶特征指的是自然屬性(姓名、性別、年齡等)、畫像特征(興趣愛好、行為等)、關系特征(人群屬性、親密度、關注關系等)…
物品特征可以分為靜態和動態兩大類,靜態指的是物品的固有屬性,如分類、標簽、關鍵詞、主題、類型、語義等,動態指的是全局熱度、分類熱度、關鍵詞熱度等。
相關性特征指的是分類匹配、關鍵詞匹配、語義匹配、uid-mid匹配、點擊相似、興趣分類相似、主題相似、興趣詞相似,向量相似等。
環境特征指的是時間、地點、網絡環境、天氣等…
上下文指的是用戶最近N條瀏覽內容、點擊內容,或者是內容的相關內容,內容發布者的其他內容等。
下面為今日頭條的一些特征,可以簡單的了解下。
召回
通常情況下候選集的數量可能有十萬,百萬甚至千萬的量級,這種情況下如果直接計算用戶相似度或者物品相似度的話,復雜度會非常高,成本也會非常大。
召回這個環節的主要任務就是從大規模的候選集中初步篩選出來一部分內容,供后續的排序環節使用,所以這個環節需要覆蓋很廣很全的范圍。
召回的觸發機制主要是基于用戶特征和環境特征,比如用戶畫像相關、興趣相關、行為相關、上下文相關等,此外還有一些運營規則和產品策略,比如熱門、特定類型提權、降權等。
常見的召回策略包括上文算法部分的那些算法,以及一些其他策略,比如基于熱門、內容、協同過濾、關聯規則、圖模型、地理位置、時間、用戶關系等的召回策略…
有了初步的召回集之后,就可以考慮一些過濾規則了,比如過濾掉用戶曾經購買過、明確表示過不喜歡的物品或者已經失去了時效性的物品等。
如果候選集較小,可以考慮在生成候選集之后就進行過濾,如果候選集較大,可以考慮在初始推薦列表中再過濾掉不該在候選集中的物品。
排序
按照排序類型來劃分的話,排序可以分為粗排和精排,按照目標來劃分的話,排序可以分為單目標排序和多目標排序。
單目標和多目標倒還好理解一些,畢竟不同的目標需要的模型和策略可能是不同的,那為什么類型又區分成粗排和精排。
主要可以分為兩方面的原因,一方面大多數用戶其實消費不了那么多內容,我們精心為用戶準備了Top100的內容,大多數情況下用戶可能只消費10條內容,那90條內容的工作量可能就浪費了。
另一方面排序的核心任務是對召回集給出的結果進行精準的排序,需要兼顧很多模型和特征,這就需要在效率、成本和性能之間做平衡了。
基于這兩點原因,將排序又分為了粗排和精排兩個階段。
粗排階段處理的物品數量在數百級,主要負責對召回的物品進行打分,也可以理解為用戶的感興趣程度。
精排階段處理的物品在數十級,同時還會有一些產品規則方面的考慮,比如對于多樣性、新穎性、興趣探索方面的考慮,以及對于特定內容的加權、過濾或者強制隔離等。
單目標排序比較常見的是CTR(點擊率)預估,當然這個C并不一定只能是Click,也可以是其他任何行為。
比如視頻是不是會看完,看完后是不是會收藏,是不是會分享到第三方平臺,查看的商品是不是會購買等,這些都可以看成那個可以被預估發生概率的CTR。
多目標顧名思義就是在排序階段希望能夠滿足多個目標,比如視頻的點擊率+停留時長+完播率,電商的點擊率+購買率+客單價。
知乎的排序模型就是一個多目標模型,有基于點擊率的模型,基于收藏率的模型,基于點贊率,基于評論率等一共8個目標。
排序模型一般用目標值和AUC來進行衡量,目標值就是排序模型最開始的目標,點擊率、停留時長、購買率等。
AUC全稱是Area Under Curve,意思是曲線下的面積,這里的曲線就是ROC曲線,這個值在數學上等價于模型把關心的那一類樣本排在其他樣本前面的概率。
AUC最大是1,完美結果,0.5就是隨機排列,0就是完美地全部排錯,當然0也可以變成1,效果最差的其實是0.5左右的。
評估
這部分主要來源于《推薦系統實踐》這本書,篇幅有限,不再展開,后面會單獨寫一篇文章來看如何評估一個推薦系統的好壞。
用戶滿意度
點擊率,用戶停留時長,轉化率等指標。
預測準確度
分為評分預測和TopN預測。
評分預測主要是通過RMSE來衡量,即預測評分和真實評分之間的均方根誤差。
TopN預測主要是用召回率和準確率來進行衡量。
- 召回率=推薦數與有反饋數的交集/有反饋數
- 準確率=推薦數與有反饋數的交集/推薦數
覆蓋率
推薦系統能夠推薦出來的物品,占總物品集合的比例。
多樣性
描述的是推薦列表中物品兩兩之間的不相似性,希望盡可能多的覆蓋用戶的興趣點。
新穎性
給用戶推薦那些他們以前沒有見過的東西。
驚喜度
給用戶的推薦結果是和用戶歷史上喜歡的物品不相似,但用戶卻又覺得滿意的推薦。
信任度
增加推薦系統的透明度,讓用戶知道推薦的理由。
比如為什么給用戶推薦了這個東西,可能是歷史基于歷史的某次行為,也可能是基于某個好友信息…
實時性
能夠實時更新推薦列表,來滿足用戶行為的變化,能夠將新加入系統的物品推薦給用戶。
健壯性
推薦系統抗擊作弊的能力。
商業目標
能否滿足商業需求,比如GMV、廣告收入等。
最后
以上就是本文的主要內容,先簡單的介紹了一些理論知識,然后介紹了通用的推薦系統架構和流程,之后按照推薦流程的挖掘》召回》排序環節進行展開,最后簡單的列舉了一些衡量推薦系統好壞的指標。
整個推薦系統的核心是幫助用戶發現潛在的用戶-物品或者用戶-用戶連接,先盡可能全的進行覆蓋,再盡可能精準的進行排序。
主要流程可以總結成下圖,分別是挖掘》召回》排序。
下圖為微博的推薦系統的整體架構,感興趣的可以研究一下。
素材來源于《AI時代精準個性化推薦》
下圖是微博推薦算法的架構,包括基礎層(挖掘)、召回層、排序層,可以結合著上面章節的內容再深入了解下。
素材來源于《AI時代精準個性化推薦》
作者:王家郴 資深產品經理