5000字,從0到1構建推薦系統
編輯導語:伴隨著移動互聯網的快速發展與信息量的飛速增長,如今用戶可能每天都需要接收海量級別的信息。而推薦系統的產生讓用戶在一定程度上可以更精準地接收自己所需信息。那么,如何搭建好一個推薦系統?本文作者結合自身經驗,總結了從0到1搭建推薦系統的一套方法,一起來看一下。
一、前言
本文主要是筆者在負責實際項目中積累的關于推薦系統的皮毛認知和理解。
原先都是以用戶的身份接觸推薦系統,所以在以PM的身份接到任務時自然是一頭霧水。各種問題浮現在腦海:推薦系統是什么?能解決什么問題?如何構建?等等。
說實話,這些問題每一個都困擾了我許久。光是思考第一個問題就花了一個多月,回過頭來看,整個項目周期中,大概70%的時間用于思考“是什么”的問題,剩下30%的時間是解決“怎么做”的問題(實際上整個項目中的應用系統除了推薦系統還有用戶畫像系統)。
當然最終的結果是樂觀的。所以有意寫下此文,一來是記錄心得,二來是給有需要的朋友做實戰分享,三來就是拋磚引玉,促進共同交流。因筆者在該行業中經驗積累較為淺薄,疑慮和不妥之處還望賜教和指正。
二、推薦系統簡述
1. 推薦系統是什么
從應用層面簡而言之,推薦系統的主要功能是基于已知的用戶數據通過算法計算并給出用戶可能感興趣的信息/物品。
2. 推薦系統誕生背景簡述
隨著知識的運用積累、科學技術的進步等,人類在近幾百年來通過幾次工業革命使得社會的生產力水平得到大幅提升。此外,從第二次世界大戰結束后,人類社會加速邁入全面和平時代,全球各國的主基調以經濟發展為核心主題,因而進一步加速了社會經濟發展水平。
在此基礎上,我們從一個生產力水平相對低下、生活物品匱乏的年代逐漸向物質水平充足、信息爆炸再過渡到當下的商品過剩、信息過載的年代??梢灶A見的是在未來人們在同一決策下將面臨越來越多的選擇。
在此背景下,消費者(用戶)在面臨大量的信息或者物品時可能無法真正從中獲得自己期望或有用的信息或商品。與此同時,生產者的困擾在于如何讓自己的信息/商品呈現給更多用戶,如何在海量的信息/商品中脫穎而出。
而推薦系統正是解決這一矛盾重要工具。尤其是在平臺經濟模式下,推薦系統的應用最為廣泛,其中較為典型并具有良好的發展和應用前景的領域包括電子商務領域、電影/視頻、音樂、閱讀等。
本文主要以項目中涉及的領域【電影/視頻】領域為出發點進行展開。
三、從0到1構建推薦系統
1. 推薦系統的核心功能
推薦系統的核心功能就是為用戶推薦其可能感興趣的商品。大致的過程可以簡述為:推薦系統依據已知的用戶數據,經過推薦引擎(推薦算法)計算,并給出用戶可能感興趣的商品集合,最終再通過前端界面的方式將特定的商品呈現在用戶眼前。
比如:已知用戶的觀影數據,此時可通過推薦算法得知用戶是一名喜劇電影愛好者,于是便可以向用戶推薦喜劇電影題材的視頻內容。
此外,這里需要重點說明的是,如何判斷用戶是否感興趣的主要依據來源于已知的用戶數據。本質上是基于數據統計推斷。所以這里描述的是可能感興趣。這一點很重要。而說到用戶數據,這里需要提一下方便后續的理解和擴展,用戶數據的主要類型:
- 用戶基本屬性:這里主要是用戶地理信息,用戶社會屬性數據(性別、年齡等)等。
- 用戶行為數據:這里主要是用戶的觀影數據(點擊、播放、收藏、訂購)等。當然,考慮到人類行為動力學特征研究結果(大多數情況下,人對一件事情的關注只能持續較短的時間),在此還需要做拆分,即歷史行為數據和實時行為數據。比較典型的實時推薦:某寶購物在線輸入關鍵字搜索后退出,此時再次進入app則可能會看到與搜索關鍵字相關的物品。
下圖為推薦系統基本功能和簡要的過程:
2. 推薦系統的構建
說到這里,我們似乎發現了,其實推薦系統說簡單一點就是:給用戶推薦商品。
如果拓展一下:那就是給什么樣的用戶推薦什么樣的商品。再拓展一下:給什么樣的(具有某種特征的用戶)用戶用什么樣的方式(不同場景下的推薦算法)推薦什么樣的(與用戶特征相匹配的商品)商品。
這樣理解的話,我們似乎知道可以從哪里下手了。
1)用戶特征與商品特征定義
① 用戶和商品的關聯關系
我們需要定義一套規則把用戶和商品關聯起來。這樣可以使得用戶和商品存在某種關聯關系以便達到對某特征的用戶推薦關聯特征的商品。
可以說用戶特征和商品特征之間的關聯是相輔相依的。比如:為喜劇電影偏好者推薦喜劇電影。
那么問題來了,用戶和商品之間本身不存在關聯關系,可以說都是相對獨立的,何來關系之有?何談建立關聯關系?
這里的答案是用戶的行為,用戶行為使得用戶和商品之間產生關聯。因為一次交互,所以產生了聯系。于是便有了關聯關系。那么這個“交互”其實就是方才提到的: 點擊、播放、收藏、訂購等。用戶播放了喜劇電影,則意味著用戶與該喜劇電影產生了關聯關系。
于是乎,我們似乎可以下一個初步的結論,用戶可能對喜劇電影感興趣。進而我們是否可以考慮為該用戶推薦喜劇電影呢?有點欠妥,因為僅憑一次觀影,數據量不足。
但是如果我們根據用戶的大量歷史行為數據發現該用戶看的電影中喜劇偏多,而此刻我們認為用戶對喜劇電影有偏好的結論似乎就可以站得住腳了。進而,我們可以試著給用戶推薦喜劇電影了。
② 商品特征和用戶特征
商品特征源自于對商品不同維度的描述。這里用商品屬性代替。下表中的第一列就是商品屬性(業界通常把電影電視劇等統稱為媒資,因而后文中牽涉到商品的內容將以媒資來描述)。
商品屬性及其屬性值。這個比較好理解。下圖中的【媒資題材】其實就是屬性的一種,對應的屬性值有:喜劇、懸疑、動作等等。
而我們可以通過商品具備的屬性來建立屬于商品固有的特征。商品屬性越多,商品特征越豐富。如:一部喜劇電影和一部成龍主演的喜劇電影。很顯然是后者的特征更豐富。所以我們明確一點:屬性是構成特征的基本要素。
同理,對于用戶特征亦是如此。通過用戶屬性來建立用戶固有的特征(通常用用戶標簽來描述)。下表中是用戶特征的簡要示例。
在說完商品特征/用戶特征以及二者之間的關系后,我們可以發現。用戶通過主動行為,與商品發生關聯關系,從而建立了用戶與商品之間的聯系,因而這就為我們做商品推薦奠定了基礎。
2)推薦場景及算法邏輯構建
① 推薦場景和推薦算法的聯系
通過上述過程,我們建立了用戶和商品之間的聯系,剩下的工作就是需要一套自動化的程序將二者的關系打通。這個自動化程序即我們要說的推薦算法。
方才有提到,推薦的本質上是基于數據統計推斷。而數據我們在這里主要分為兩種:
- 基于用戶基本屬性數據;
- 基于用戶行為數據(包含歷史行為數據和實時行為數據)。
我們先做個小結:這里所有的推薦算法都是基于上述兩種數據完成的。
與此同時,我們不妨再回顧一下:給什么樣的(具有某種特征的用戶)用戶用什么樣的方式(不同場景下的推薦算法)推薦什么樣的(與用戶特征相匹配的商品)商品。
這里需要有一個問題值得思考,為什么推薦算法還需要區分場景。
這其實主要源自于應用端需求。比如,我打開了某寶,首頁中可能出現了我搜索過的商品種類推薦,而在我下單后可能系統又為我推薦了其他的商品。
這里提到的“首頁狀態”和“下單后”兩種分別屬于不同的場景。前者是我剛進app,系統可能通過我過去的行為數據發現我可能對搜索過的商品比較感興趣,所以為我推薦相關商品,而后者是系統通過全網用戶數據發現購買了當前商品A的用戶同時也購買了另一款產品B,而此時我購買了該商品于是認為我可能也會下單商品B,所以為我推薦了商品B。
不同的場景下,需要有對應合適的推薦方式。于是我們將推薦場景和推薦算法聯系到了一起。
我們簡單地整理出示意表格中的實例:基于不同場景下對用戶數據采用特定的推薦算法進行計算。
至此,我們還需要完成一項工作才能構成一個簡單的推薦系統:推薦算法的邏輯。
② 推薦算法的邏輯構建
在上述的示例中,我們列舉了部分推薦算法,下面一一說明:
用戶偏好推薦
簡而言之,依據用戶歷史的行為數據推薦他平常喜歡看的內容。
還是拿前面說過的:為喜劇電影偏好者推薦喜劇電影。所以我們可以制定量化規則。
如:我們統計了該用戶過去的觀影數據,其中觀看【喜劇片】10次,【懸疑片】5次,【戰爭片】4次,【愛情片】1次,那么加起來合計觀影次數=10+5+4+1=20次,其中按照比例計算分別占比:50%、25%、20%、5%。
那么我們通過現有的數據可以觀察到,該用戶的僅有數據中顯示其對【喜劇片】和【懸疑片】較為有興趣(這里我們定義從歷史數據中取Top2,【喜劇】和【懸疑】符合我們自定規則),于是當用戶下次開機時,我們有了在首頁為用戶推薦一定數量的【喜劇片】和【懸疑片】的依據。上述,大概是簡單的用戶偏好推薦算法。
協同過濾推薦
這里我就不獻丑了。這種推薦算法比較經典,也是業界常用的推薦算法。比較典型的案例是:啤酒和尿布。超市人員發現購買啤酒的用戶同時也購買了尿布。于是這個故事可以寫成:買尿布的家庭中有嬰兒,母親照顧嬰兒,父親去超市買尿布同時也買啤酒。
明星偏好推薦
這里同上述第一項相似,就不再贅述了。主要目的有兩個,一個是篩選出近期比較熱的明星,推薦他的內容;另一部分是按照用戶對明星的偏好,推薦用戶偏好的明星的內容。
通過上述的推薦算法的規則的建立,結合已知的數據,我們似乎可以為單個用戶做個性化推薦了。下圖所示,但這里只是整個系統的一部分。
3)推薦結果的過濾和排序
完成了前面的內容后,理論上我們可以做出一個較為簡單的推薦系統。但是在實際業務中還會牽涉到兩項比較重要的工作需要完成:過濾和排序。
① 推薦結果的過濾
這里的過濾:主要是針對媒資庫中剔除不符合業務規則的媒資的過程。而不符合業務規則需要依據實際的業務來確定,常見的不符合規則的類型有如下:
- 被加入黑名單的媒資內容:加入黑名單后將不再呈現在用戶視野中,故而需要過濾掉。
- 媒資版權過期:媒資庫中過濾掉版權過期的內容。
- 話題敏感的媒資內容:某些時間段或特殊事件引發的敏感內容“下架”。
- 排重過濾:這里的排重過濾也有多種形式,常見的是:推薦系統在最近的一段時間段為用戶推薦過某電影,但是用戶并沒有播放,可能是用戶對該項推薦不感興趣。當推薦次數積累到一定程度時,系統將自動過濾該媒資。
- 其他:這里的過濾條件可能會有多種,主要源自于業務需求,故而不再一一列舉。下面的流程圖中是實際業務中需要進行過濾的選項。
② 推薦結果的排序
通過上述過濾,推薦結果的媒資集合已經被清理了一輪。但集合中剩余的內容并不是所有的媒資都需要呈現給用戶。用戶的視野是有限的,推薦位的數量也是有限的,所以我們應該從這個集合中再次篩選出比較“易產生興趣”的內容,進而提升用戶可能對推薦內容產生的興趣。
排序的方式有多種,這里只列舉了一部分并且是單一的排序方式。也可以通過算法規則進行綜合排序等,這里只討論單一排序。排序方式包括:
- 熱度排序:媒資集合中所有的媒資按照熱度來排序;
- 評分排序:按照評分大小來排序;
- 上線時間排序:按照上線的時間遠近來排序;
- 其他。
4)推薦結果的展示
推薦結果的展示
在經過媒資的過濾和排序后,推薦內容已經準備好進入用戶的視野了。我們重新整理并對先前的示意圖做一下優化,如下:
整個過程相對清晰,但總有點抽象。所以,我打算用一個簡單的示例來進行回顧和說明。
延續上述提到的例子。我們統計了小明過去的觀影數據,其中觀看【喜劇片】10次、【懸疑片】5次、【戰爭片】4次、【愛情片】1次,那么加起來合計觀影次數=10+5+4+1=20次,其中按照比例計算分別占比:50%、25%、20%、5%。
那么我們通過現有的數據可以觀察到,該用戶的僅有數據中顯示其對【喜劇片】和【懸疑片】較為有興趣(這里我們定義從歷史數據中取Top2,【喜劇】和【懸疑】符合我們自定規則)。于是當小明下次開機時,來到了首頁(這里示例默認了只使用一種推薦引擎)。此時系統的工作:
a. 從媒資庫中取了1000部【喜劇片】和1000部【懸疑片】,并對兩種類型的電影做了【過濾】,各剩下500部符合業務規則的電影。
b. 系統各將這500部電影按照【熱度】進行了排序,原先的無序媒資集合有序了。
但是值得注意的是,這個集合很大,而我們現在首頁的推薦位只有9個。我們需要解決的問題有兩個,一個是我們已經知道的,我們1次最多只能推9個,另一個是我們要給小明推薦兩種類型的影片,如何分配數量。
相信說到這里,大家自有答案。我們按照【喜劇片】50%占比,【懸疑片】25%占比:即【喜劇片】比【懸疑片】=2:1來分配數量。于是【喜劇片】=9*2/3=6個,【懸疑片】=9*1/3=3個。
c. 如此,我們將媒資集合中【喜劇片】排名前6個影片以及【懸疑片】前3個影片,呈現在小明的眼前。
以上大致是一個簡要的推薦系統的構建以及整個過程的描述。
當然在實際的業務中,會有偏差,也有一部分重要的問題這里沒有提及。比如:推薦算法種類的多樣性和準確性;推薦結果的反饋、推薦效果如何等等。
總而言之,通過整個過程我們大致了解了推薦系統的本質,也了解到一個簡要的推薦系統如何構建以及可能存在的問題和優化的方向。如果這個目的實現了,那么本文的目的也就達到了。希望對有需要的朋友提供思路,同時也歡迎多多交流。
四、心得:寫在最后
推薦系統對于一個產品經理來說不是一個常見的產品,因為市面上幾乎找不到類似的產品,更別說做什么競品分析。因為能使用到推薦系統的公司往往都是科技巨頭,比如電商平臺淘寶京東PDD、短視頻平臺小破站抖音等或者其他的平臺型公司,主要原因在于這些平臺有大量的用戶同時也有大量的信息/商品。
一般的公司是不可能用到這樣的系統,自然市面上就沒有較多的參考內容,所以整個系統可以看作是一個自主原創的從0到1。
筆者原是一名汽車電子行業勉強入流的工程師,后通過自學轉行至互聯網PM。入行前后約一年時間,做的第一個大的項目就是這個推薦系統。這個系統成敗對于我來說很關鍵,所以也是不惜一切代價,從搞清楚問題到可以解決問題的確耗費了很多時間和精力。
而對我來說除了負責人對我的指導和紓困外,幫助較大的是兩本書:《推薦系統實戰—項亮》以及亞里士多德《形而上學》。前者是基本概念和實踐思想指導后者是“第一性原理”思想指導。
關于后者,其實我想單獨拿出來多說一句。亞里士多德——古希臘三杰之一,是一名偉大的哲學家、科學家……他的這本《形而上學》是哲學類的書籍,主要是研究和對事物的本質的思考。
講真,我的非功利閱讀區大多是這類書籍。有意思的是,我自己也不知道什么是哲學。但我始終認同一個觀點:哲學不能幫助我們直接解決實際問題,但卻能給我們思維的指引。如果這個時候我們再思考一次這個問題:推薦系統是什么。可能就沒那么抽象了。
總的來說,這個產品對我來說最大的價值在于:實現“知行合一”,即一次較為成功的自我認知和實踐的閉環。
作者:REVIN
本文由 @雜技演員瑞文 原創發布于人人都是產品經理,未經許可,禁止轉載。
題圖來自 Unsplash,基于CC0協議
本身推薦系統是重技術輕產品&運營的, 這是該系統的特點決定的。 文章里面少了“召回”相關的信息。 關于推薦系統可以去CSDN里面有很多大牛的成熟方案。(題外話:干這個最好能結合搜索一起做)
感謝推薦。剛去CSDN上看了一下,基本都是技術篇的帖子。所以看起來產品這一部分還真的少有提及。文中使用的是“匹配”來替代“召回”一筆帶過了。一方面是研究不多一方面也非本文重點,故而一筆帶過了。站在產品的角度,個人的理解是推薦系統只是數據應用層面的一個模塊。如果要做應用閉環,還需要結合畫像系統,運營系統,數據分析系統等。目前還在琢磨中。