23張圖,帶你入門(mén)推薦系統(tǒng)

3 評(píng)論 45363 瀏覽 119 收藏 21 分鐘

編輯導(dǎo)語(yǔ):隨著電子商務(wù)規(guī)模的不斷擴(kuò)大、商品個(gè)數(shù)和種類(lèi)快速增長(zhǎng),顧客需要花費(fèi)大量的時(shí)間才能找到自己想買(mǎi)的商品。這種瀏覽大量無(wú)關(guān)的信息無(wú)疑會(huì)使淹沒(méi)在信息過(guò)載問(wèn)題中的消費(fèi)者不斷流失。為解決這些問(wèn)題,推薦系統(tǒng)應(yīng)運(yùn)而生。推薦系統(tǒng)建立在海量數(shù)據(jù)挖掘基礎(chǔ)上,為用戶(hù)提供個(gè)性化的決策支持和信息服務(wù)。本文作者通過(guò)23張圖,帶你入門(mén)推薦系統(tǒng)。

做廣告業(yè)務(wù)1年多時(shí)間了,但是平時(shí)的工作主要和廣告工程有關(guān),核心的廣告算法由 AI 部門(mén)支持,對(duì)我們而言可以說(shuō)是「黑盒般」的存在,只需要對(duì)訓(xùn)練好的模型進(jìn)行調(diào)用即可。

近期,我打算系統(tǒng)性地學(xué)習(xí)下廣告中的搜索和推薦算法,當(dāng)然更多是從工程的視角去弄清楚:算法的基本原理、以及面對(duì)線(xiàn)上海量數(shù)據(jù)時(shí)算法是如何解決性能問(wèn)題的?

整個(gè)過(guò)程,我會(huì)將有價(jià)值的技術(shù)點(diǎn)輸出成系列文章。

這篇文章屬于推薦系統(tǒng)的入門(mén)篇,本文暫不考慮線(xiàn)上環(huán)境的海量數(shù)據(jù),目的是先了解清楚推薦系統(tǒng)的基本構(gòu)成,我會(huì)通過(guò)圖解推薦算法以及程序demo的形式展開(kāi),內(nèi)容包括:

23張圖,帶你入門(mén)推薦系統(tǒng)

一、走進(jìn)推薦系統(tǒng)的世界

“啤酒與尿布” 的故事相信很多人都聽(tīng)過(guò),年輕爸爸去超市購(gòu)買(mǎi)尿布時(shí),經(jīng)常會(huì)買(mǎi)點(diǎn)啤酒犒勞自己。因此,沃爾瑪將這兩種商品進(jìn)行了捆綁銷(xiāo)售,最終獲得了更好的銷(xiāo)量。

23張圖,帶你入門(mén)推薦系統(tǒng)

“啤酒與尿布”的故事

這個(gè)故事背后的理論依據(jù)就是 “推薦算法”,因?yàn)槟虿己推【平?jīng)常出現(xiàn)在同一個(gè)購(gòu)物車(chē)中,那么向購(gòu)買(mǎi)尿布的年輕爸爸推薦啤酒確實(shí)有一定道理。

1. 推薦系統(tǒng)到底解決的是什么問(wèn)題?

推薦系統(tǒng)從20世紀(jì)90年代就被提出來(lái)了,但是真正進(jìn)入大眾視野以及在各大互聯(lián)網(wǎng)公司中流行起來(lái),還是最近幾年的事情。

隨著移動(dòng)互聯(lián)網(wǎng)的發(fā)展,越來(lái)越多的信息開(kāi)始在互聯(lián)網(wǎng)上傳播,產(chǎn)生了嚴(yán)重的信息過(guò)載。因此,如何從眾多信息中找到用戶(hù)感興趣的信息,這個(gè)便是推薦系統(tǒng)的價(jià)值。精準(zhǔn)推薦解決了用戶(hù)痛點(diǎn),提升了用戶(hù)體驗(yàn),最終便能留住用戶(hù)。

推薦系統(tǒng)本質(zhì)上就是一個(gè)信息過(guò)濾系統(tǒng),通常分為:召回、排序、重排序這3個(gè)環(huán)節(jié),每個(gè)環(huán)節(jié)逐層過(guò)濾,最終從海量的物料庫(kù)中篩選出幾十個(gè)用戶(hù)可能感興趣的物品推薦給用戶(hù)。

23張圖,帶你入門(mén)推薦系統(tǒng)

推薦系統(tǒng)的分階段過(guò)濾流程

2. 推薦系統(tǒng)的應(yīng)用場(chǎng)景

哪里有海量信息,哪里就有推薦系統(tǒng),我們每天最常用的APP都涉及到推薦功能:

  • 資訊類(lèi):今日頭條、騰訊新聞等
  • 電商類(lèi):淘寶、京東、拼多多、亞馬遜等
  • 娛樂(lè)類(lèi):抖音、快手、愛(ài)奇藝等
  • 生活服務(wù)類(lèi):美團(tuán)、大眾點(diǎn)評(píng)、攜程等
  • 社交類(lèi):微信、陌陌、脈脈等

23張圖,帶你入門(mén)推薦系統(tǒng)

頭條、京東、網(wǎng)易云音樂(lè)中的推薦功能

推薦系統(tǒng)的應(yīng)用場(chǎng)景通常分為以下兩類(lèi):

  • 基于用戶(hù)維度的推薦:根據(jù)用戶(hù)的歷史行為和興趣進(jìn)行推薦,比如淘寶首頁(yè)的猜你喜歡、抖音的首頁(yè)推薦等。
  • 基于物品維度的推薦:根據(jù)用戶(hù)當(dāng)前瀏覽的標(biāo)的物進(jìn)行推薦,比如打開(kāi)京東APP的商品詳情頁(yè),會(huì)推薦和主商品相關(guān)的商品給你。

3. 搜索、推薦、廣告三者的異同

搜索和推薦是AI算法最常見(jiàn)的兩個(gè)應(yīng)用場(chǎng)景,在技術(shù)上有相通的地方。這里提到廣告,主要考慮很多沒(méi)做過(guò)廣告業(yè)務(wù)的同學(xué)不清楚為什么廣告和搜索、推薦會(huì)有關(guān)系,所以做下解釋。

  • 搜索:有明確的搜索意圖,搜索出來(lái)的結(jié)果和用戶(hù)的搜索詞相關(guān)。
  • 推薦:不具有目的性,依賴(lài)用戶(hù)的歷史行為和畫(huà)像數(shù)據(jù)進(jìn)行個(gè)性化推薦。
  • 廣告:借助搜索和推薦技術(shù)實(shí)現(xiàn)廣告的精準(zhǔn)投放,可以將廣告理解成搜索推薦的一種應(yīng)用場(chǎng)景,技術(shù)方案更復(fù)雜,涉及到智能預(yù)算控制、廣告競(jìng)價(jià)等。

二、推薦系統(tǒng)的整體架構(gòu)

23張圖,帶你入門(mén)推薦系統(tǒng)

推薦系統(tǒng)的整體架構(gòu)

上面是推薦系統(tǒng)的整體架構(gòu)圖,自下而上分成了多層,各層的主要作用如下:

  • 數(shù)據(jù)源:推薦算法所依賴(lài)的各種數(shù)據(jù)源,包括物品數(shù)據(jù)、用戶(hù)數(shù)據(jù)、行為日志、其他可利用的業(yè)務(wù)數(shù)據(jù)、甚至公司外部的數(shù)據(jù);
  • 計(jì)算平臺(tái):負(fù)責(zé)對(duì)底層的各種異構(gòu)數(shù)據(jù)進(jìn)行清洗、加工,離線(xiàn)計(jì)算和實(shí)時(shí)計(jì)算;
  • 數(shù)據(jù)存儲(chǔ)層:存儲(chǔ)計(jì)算平臺(tái)處理后的數(shù)據(jù),根據(jù)需要可落地到不同的存儲(chǔ)系統(tǒng)中,比如Redis中可以存儲(chǔ)用戶(hù)特征和用戶(hù)畫(huà)像數(shù)據(jù),ES中可以用來(lái)索引物品數(shù)據(jù),F(xiàn)aiss中可以存儲(chǔ)用戶(hù)或者物品的embedding向量等;
  • 召回層:包括各種推薦策略或者算法,比如經(jīng)典的協(xié)同過(guò)濾,基于內(nèi)容的召回,基于向量的召回,用于托底的熱門(mén)推薦等。為了應(yīng)對(duì)線(xiàn)上高并發(fā)的流量,召回結(jié)果通常會(huì)預(yù)計(jì)算好,建立好倒排索引后存入緩存中;
  • 融合過(guò)濾層:觸發(fā)多路召回,由于召回層的每個(gè)召回源都會(huì)返回一個(gè)候選集,因此這一層需要進(jìn)行融合和過(guò)濾;
  • 排序?qū)樱豪脵C(jī)器學(xué)習(xí)或者深度學(xué)習(xí)模型,以及更豐富的特征進(jìn)行重排序,篩選出更小、更精準(zhǔn)的推薦集合返回給上層業(yè)務(wù)。

從數(shù)據(jù)存儲(chǔ)層到召回層、再到融合過(guò)濾層和排序?qū)?,候選集逐層減少,但是精準(zhǔn)性要求越來(lái)越高,因此也帶來(lái)了計(jì)算復(fù)雜度的逐層增加,這個(gè)便是推薦系統(tǒng)的最大挑戰(zhàn)。

其實(shí)對(duì)于推薦引擎來(lái)說(shuō),最核心的部分主要是兩塊:特征和算法。

23張圖,帶你入門(mén)推薦系統(tǒng)

推薦引擎的核心功能和技術(shù)方案

特征計(jì)算由于數(shù)據(jù)量大,通常采用大數(shù)據(jù)的離線(xiàn)和實(shí)時(shí)處理技術(shù),像Spark、Flink等。然后將計(jì)算結(jié)果保存在Redis或者其他存儲(chǔ)系統(tǒng)中(比如HBase、MongoDB或者ES),供召回和排序模塊使用。

召回算法的作用是:從海量數(shù)據(jù)中快速獲取一批候選數(shù)據(jù),要求是快和盡可能的準(zhǔn)。這一層通常有豐富的策略和算法,用來(lái)確保多樣性,為了更好的推薦效果,某些算法也會(huì)做成近實(shí)時(shí)的。

排序算法的作用是:對(duì)多路召回的候選集進(jìn)行精細(xì)化排序。它會(huì)利用物品、用戶(hù)以及它們之間的交叉特征,然后通過(guò)復(fù)雜的機(jī)器學(xué)習(xí)或者深度學(xué)習(xí)模型進(jìn)行打分排序,這一層的特點(diǎn)是計(jì)算復(fù)雜但是結(jié)果更精準(zhǔn)。

三、圖解經(jīng)典的協(xié)同過(guò)濾算法

了解了推薦系統(tǒng)的整體架構(gòu)和技術(shù)方案后,下面帶大家深入一下算法細(xì)節(jié),這里選擇圖解的是推薦系統(tǒng)中的明星算法:協(xié)同過(guò)濾(Collaborative Filtering,CF)。

對(duì)于工程同學(xué)來(lái)說(shuō),可能覺(jué)得 AI 算法晦澀難懂,門(mén)檻太高,確實(shí)很多深度學(xué)習(xí)算法的確是這樣,但是協(xié)同過(guò)濾卻是一個(gè)簡(jiǎn)單同時(shí)效果很好的算法,只要你有初中數(shù)學(xué)的基礎(chǔ)就能看懂。

1. 協(xié)同過(guò)濾是什么?

協(xié)同過(guò)濾算法的核心就是「找相似」,它基于用戶(hù)的歷史行為(瀏覽、收藏、評(píng)論等),去發(fā)現(xiàn)用戶(hù)對(duì)物品的喜好,并對(duì)喜好進(jìn)行度量和打分,最終篩選出推薦集合,它又包括兩個(gè)分支:

1)基于用戶(hù)的協(xié)同過(guò)濾

User-CF,核心是找相似的人。

比如下圖中,用戶(hù) A 和用戶(hù) C 都購(gòu)買(mǎi)過(guò)物品 a 和物品 b,那么可以認(rèn)為 A 和 C 是相似的,因?yàn)樗麄児餐矚g的物品多。這樣,就可以將用戶(hù) A 購(gòu)買(mǎi)過(guò)的物品 d 推薦給用戶(hù) C。

23張圖,帶你入門(mén)推薦系統(tǒng)

基于用戶(hù)的協(xié)同過(guò)濾示例

2)基于物品的協(xié)同過(guò)濾

Item-CF,核心是找相似的物品。比如下圖中,物品 a 和物品 b 同時(shí)被用戶(hù) A,B,C 購(gòu)買(mǎi)了,那么物品 a 和 物品 b 被認(rèn)為是相似的,因?yàn)樗鼈兊墓铂F(xiàn)次數(shù)很高。

這樣,如果用戶(hù) D 購(gòu)買(mǎi)了物品 a,則可以將和物品 a 最相似的物品 b 推薦給用戶(hù) D。

23張圖,帶你入門(mén)推薦系統(tǒng)

基于物品的協(xié)同過(guò)濾示例

2. 如何找相似?

前面講到,協(xié)同過(guò)濾的核心就是找相似,User-CF是找用戶(hù)之間的相似,Item-CF是找物品之間的相似,那到底如何衡量?jī)蓚€(gè)用戶(hù)或者物品之間的相似性呢?

我們都知道,對(duì)于坐標(biāo)中的兩個(gè)點(diǎn),如果它們之間的夾角越小,這兩個(gè)點(diǎn)越相似,這就是初中學(xué)過(guò)的余弦距離,它的計(jì)算公式如下:

23張圖,帶你入門(mén)推薦系統(tǒng)

舉個(gè)例子,A坐標(biāo)是(0,3,1),B坐標(biāo)是(4,3,0),那么這兩個(gè)點(diǎn)的余弦距離是0.569,余弦距離越接近1,表示它們?cè)较嗨啤?/p>

23張圖,帶你入門(mén)推薦系統(tǒng)

除了余弦距離,衡量相似性的方法還有很多種,比如:歐式距離、皮爾遜相關(guān)系數(shù)、Jaccard 相似系數(shù)等等,這里不做展開(kāi),只是計(jì)算公式上的差異而已。

3. Item-CF的算法流程

清楚了相似性的定義后,下面以Item-CF為例,詳細(xì)說(shuō)下這個(gè)算法到底是如何選出推薦物品的?

第一步:整理物品的共現(xiàn)矩陣

假設(shè)有 A、B、C、D、E 5個(gè)用戶(hù),其中用戶(hù) A 喜歡物品 a、b、c,用戶(hù) B 喜歡物品 a、b等等。

23張圖,帶你入門(mén)推薦系統(tǒng)

所謂共現(xiàn),即:兩個(gè)物品被同一個(gè)用戶(hù)喜歡了。比如物品 a 和 b,由于他們同時(shí)被用戶(hù) A、B、C 喜歡,所以 a 和 b 的共現(xiàn)次數(shù)是3,采用這種統(tǒng)計(jì)方法就可以快速構(gòu)建出共現(xiàn)矩陣。

第二步:計(jì)算物品的相似度矩陣

對(duì)于 Item-CF 算法來(lái)說(shuō),一般不采用前面提到的余弦距離來(lái)衡量物品的相似度,而是采用下面的公式:

23張圖,帶你入門(mén)推薦系統(tǒng)

其中,N(u) 表示喜歡物品 u 的用戶(hù)數(shù),N(v) 表示喜歡物品 v 的用戶(hù)數(shù),兩者的交集表示同時(shí)喜歡物品 u 和物品 v 的用戶(hù)數(shù)。很顯然,如果兩個(gè)物品同時(shí)被很多人喜歡,那么這兩個(gè)物品越相似。

基于第1步計(jì)算出來(lái)的共現(xiàn)矩陣以及每個(gè)物品的喜歡人數(shù),便可以構(gòu)造出物品的相似度矩陣:

23張圖,帶你入門(mén)推薦系統(tǒng)

第三步:推薦物品

最后一步,便可以基于相似度矩陣推薦物品了,公式如下:

23張圖,帶你入門(mén)推薦系統(tǒng)

其中,Puj 表示用戶(hù) u 對(duì)物品 j 的感興趣程度,值越大,越值得被推薦。N(u) 表示用戶(hù) u 感興趣的物品集合,S(j,N) 表示和物品 j 最相似的前 N 個(gè)物品,Wij 表示物品 i 和物品 j 的相似度,Rui表示用戶(hù) u 對(duì)物品 i 的興趣度。

上面的公式有點(diǎn)抽象,直接看例子更容易理解,假設(shè)我要給用戶(hù) E 推薦物品,前面我們已經(jīng)知道用戶(hù) E 喜歡物品 b 和物品 c,喜歡程度假設(shè)分別為 0.6 和 0.4。那么,利用上面的公式計(jì)算出來(lái)的推薦結(jié)果如下:

23張圖,帶你入門(mén)推薦系統(tǒng)

因?yàn)槲锲?b 和物品 c 已經(jīng)被用戶(hù) E 喜歡過(guò)了,所以不再重復(fù)推薦。最終對(duì)比用戶(hù) E 對(duì)物品 a 和物品 d 的感興趣程度,因?yàn)?0.682 > 0.3,因此選擇推薦物品 a。

四、從0到1搭建一個(gè)推薦系統(tǒng)

有了上面的理論基礎(chǔ)后,我們就可以用 Python 快速實(shí)現(xiàn)出一個(gè)推薦系統(tǒng)。

1. 選擇數(shù)據(jù)集

這里采用的是推薦領(lǐng)域非常經(jīng)典的 MovieLens 數(shù)據(jù)集,它是一個(gè)關(guān)于電影評(píng)分的數(shù)據(jù)集,官網(wǎng)上提供了多個(gè)不同大小的版本,下面以 ml-1m 數(shù)據(jù)集(大約100萬(wàn)條用戶(hù)評(píng)分記錄)為例。

下載解壓后,文件夾中包含:ratings.dat、movies.dat、users.dat 3個(gè)文件,共6040個(gè)用戶(hù),3900部電影,1000209條評(píng)分記錄。各個(gè)文件的格式都是一樣的,每行表示一條記錄,字段之間采用 :: 進(jìn)行分割。

以ratings.dat為例,每一行包括4個(gè)屬性:UserID, MovieID, Rating, Timestamp。通過(guò)腳本可以統(tǒng)計(jì)出不同評(píng)分的人數(shù)分布:

23張圖,帶你入門(mén)推薦系統(tǒng)

2. 讀取原始數(shù)據(jù)

程序主要使用數(shù)據(jù)集中的 ratings.dat 這個(gè)文件,通過(guò)解析該文件,抽取出 user_id、movie_id、rating 3個(gè)字段,最終構(gòu)造出算法依賴(lài)的數(shù)據(jù),并保存在變量 dataset 中,它的格式為:dict[user_id][movie_id] = rate

23張圖,帶你入門(mén)推薦系統(tǒng)

3. 構(gòu)造物品的相似度矩陣

基于第 2 步的 dataset,可以進(jìn)一步統(tǒng)計(jì)出每部電影的評(píng)分次數(shù)以及電影的共生矩陣,然后再生成相似度矩陣。

23張圖,帶你入門(mén)推薦系統(tǒng)

4. 基于相似度矩陣推薦物品

最后,可以基于相似度矩陣進(jìn)行推薦了,輸入一個(gè)用戶(hù)id,先針對(duì)該用戶(hù)評(píng)分過(guò)的電影,依次選出 top 10 最相似的電影,然后加權(quán)求和后計(jì)算出每個(gè)候選電影的最終評(píng)分,最后再選擇得分前 5 的電影進(jìn)行推薦。

23張圖,帶你入門(mén)推薦系統(tǒng)

5. 調(diào)用推薦系統(tǒng)

下面選擇UserId=1 這個(gè)用戶(hù),看下程序的執(zhí)行結(jié)果。由于推薦程序輸出的是 movieId 列表,為了更直觀的了解推薦結(jié)果,這里轉(zhuǎn)換成電影的標(biāo)題進(jìn)行輸出。

23張圖,帶你入門(mén)推薦系統(tǒng)

最終推薦的前5個(gè)電影為:

23張圖,帶你入門(mén)推薦系統(tǒng)

五、線(xiàn)上推薦系統(tǒng)的挑戰(zhàn)

通過(guò)上面的介紹,大家對(duì)推薦系統(tǒng)的基本構(gòu)成應(yīng)該有了一個(gè)初步認(rèn)識(shí),但是真正運(yùn)用到線(xiàn)上真實(shí)環(huán)境時(shí),還會(huì)遇到很多算法和工程上的挑戰(zhàn),絕對(duì)不是幾十行 Python 代碼可以搞定的。

  1. 上面的示例使用了標(biāo)準(zhǔn)化的數(shù)據(jù)集,而線(xiàn)上環(huán)境的數(shù)據(jù)是非標(biāo)準(zhǔn)化的,因此涉及到海量數(shù)據(jù)的收集、清洗和加工,最終構(gòu)造出模型可使用的數(shù)據(jù)集。
  2. 復(fù)雜且繁瑣的特征工程,都說(shuō)算法模型的上限由數(shù)據(jù)和特征決定。對(duì)于線(xiàn)上環(huán)境,需要從業(yè)務(wù)角度選擇出可用的特征,然后對(duì)數(shù)據(jù)進(jìn)行清洗、標(biāo)準(zhǔn)化、歸一化、離散化,并通過(guò)實(shí)驗(yàn)效果進(jìn)一步驗(yàn)證特征的有效性。
  3. 算法復(fù)雜度如何降低?比如上面介紹的Item-CF算法,時(shí)間和空間復(fù)雜度都是O(N×N),而線(xiàn)上環(huán)境的數(shù)據(jù)都是千萬(wàn)甚至上億級(jí)別的,如果不做算法優(yōu)化,可能幾天都跑不出數(shù)據(jù),或者內(nèi)存中根本放不下如此大的矩陣數(shù)據(jù)。
  4. 實(shí)時(shí)性如何滿(mǎn)足?因?yàn)橛脩?hù)的興趣隨著他們最新的行為在實(shí)時(shí)變化的,如果模型只是基于歷史數(shù)據(jù)進(jìn)行推薦,可能結(jié)果不夠精準(zhǔn)。因此,如何滿(mǎn)足實(shí)時(shí)性要求,以及對(duì)于新加入的物品或者用戶(hù)該如何推薦,都是要解決的問(wèn)題。
  5. 算法效果和性能的權(quán)衡。從算法角度追求多樣性和準(zhǔn)確性,從工程角度追求性能,這兩者之間必須找到一個(gè)平衡點(diǎn)。
  6. 推薦系統(tǒng)的穩(wěn)定性和效果追蹤。需要有一套完善的數(shù)據(jù)監(jiān)控和應(yīng)用監(jiān)控體系,同時(shí)有 ABTest 平臺(tái)進(jìn)行灰度實(shí)驗(yàn),進(jìn)行效果對(duì)比。

 

作者:駱俊武,微信公眾號(hào):IT人的職場(chǎng)進(jìn)階

本文由 @哇咔咔咔 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載

題圖來(lái)自 Pexels,基于 CC0 協(xié)議

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 好專(zhuān)業(yè),非技術(shù)出身看不懂

    回復(fù)
  2. 到了python那一部分就看不懂了

    來(lái)自廣東 回復(fù)
  3. 請(qǐng)問(wèn)Rui是怎么得出來(lái)的呢?

    來(lái)自上海 回復(fù)