23張圖,帶你入門推薦系統(tǒng)
做廣告業(yè)務(wù)1年多時間了,但是平時的工作主要和 廣告工程 有關(guān),核心的廣告算法由 AI 部門支持,對我們而言可以說是「黑盒般」的存在,只需要對訓(xùn)練好的模型進行調(diào)用即可。
近期,我打算系統(tǒng)性地學(xué)習(xí)下廣告中的搜索和推薦算法,當(dāng)然更多是從工程的視角去弄清楚:算法的基本原理、以及面對線上海量數(shù)據(jù)時算法是如何解決性能問題的?整個過程,我會將有價值的技術(shù)點輸出成系列文章。
這篇文章屬于推薦系統(tǒng)的入門篇,本文暫不考慮線上環(huán)境的海量數(shù)據(jù),目的是先了解清楚推薦系統(tǒng)的基本構(gòu)成,我會通過圖解推薦算法以及程序demo的形式展開,內(nèi)容包括:
01 走進推薦系統(tǒng)的世界
“啤酒與尿布” 的故事相信很多人都聽過,年輕爸爸去超市購買尿布時,經(jīng)常會買點啤酒犒勞自己。因此,沃爾瑪將這兩種商品進行了捆綁銷售,最終獲得了更好的銷量。
“啤酒與尿布”的故事 這個故事背后的理論依據(jù)就是 “推薦算法”, 因為尿布和啤酒經(jīng)常出現(xiàn)在同一個購物車中,那么向購買尿布的年輕爸爸推薦啤酒確實有一定道理。
1. 推薦系統(tǒng)到底解決的是什么問題?
推薦系統(tǒng)從20世紀(jì)90年代就被提出來了,但是真正進入大眾視野以及在各大互聯(lián)網(wǎng)公司中流行起來,還是最近幾年的事情。
隨著移動互聯(lián)網(wǎng)的發(fā)展,越來越多的信息開始在互聯(lián)網(wǎng)上傳播,產(chǎn)生了嚴(yán)重的信息過載。因此,如何從眾多信息中找到用戶感興趣的信息,這個便是推薦系統(tǒng)的價值。精準(zhǔn)推薦解決了用戶痛點,提升了用戶體驗,最終便能留住用戶。
推薦系統(tǒng)本質(zhì)上就是一個信息過濾系統(tǒng),通常分為:召回、排序、重排序這3個環(huán)節(jié),每個環(huán)節(jié)逐層過濾,最終從海量的物料庫中篩選出幾十個用戶可能感興趣的物品推薦給用戶。
推薦系統(tǒng)的分階段過濾流程
2. 推薦系統(tǒng)的應(yīng)用場景 哪里有海量信息,哪里就有推薦系統(tǒng),我們每天最常用的APP都涉及到推薦功能: 頭條、京東、網(wǎng)易云音樂中的推薦功能 推薦系統(tǒng)的應(yīng)用場景通常分為以下兩類: 基于物品維度的推薦:根據(jù)用戶當(dāng)前瀏覽的標(biāo)的物進行推薦,比如打開京東APP的商品詳情頁,會推薦和主商品相關(guān)的商品給你。 搜索和推薦是AI算法最常見的兩個應(yīng)用場景,在技術(shù)上有相通的地方。這里提到廣告,主要考慮很多沒做過廣告業(yè)務(wù)的同學(xué)不清楚為什么廣告和搜索、推薦會有關(guān)系,所以做下解釋。 推薦:不具有目的性,依賴用戶的歷史行為和畫像數(shù)據(jù)進行個性化推薦。 廣告:借助搜索和推薦技術(shù)實現(xiàn)廣告的精準(zhǔn)投放,可以將廣告理解成搜索推薦的一種應(yīng)用場景,技術(shù)方案更復(fù)雜,涉及到智能預(yù)算控制、廣告競價等。
3. 搜索、推薦、廣告三者的異同
02 推薦系統(tǒng)的整體架構(gòu)
推薦系統(tǒng)的整體架構(gòu)
上面是推薦系統(tǒng)的整體架構(gòu)圖,自下而上分成了多層,各層的主要作用如下:
- 數(shù)據(jù)源:推薦算法所依賴的各種數(shù)據(jù)源,包括物品數(shù)據(jù)、用戶數(shù)據(jù)、行為日志、其他可利用的業(yè)務(wù)數(shù)據(jù)、甚至公司外部的數(shù)據(jù)。
-
計算平臺:負(fù)責(zé)對底層的各種異構(gòu)數(shù)據(jù)進行清洗、加工,離線計算和實時計算。
-
數(shù)據(jù)存儲層:存儲計算平臺處理后的數(shù)據(jù),根據(jù)需要可落地到不同的存儲系統(tǒng)中,比如Redis中可以存儲用戶特征和用戶畫像數(shù)據(jù),ES中可以用來索引物品數(shù)據(jù),F(xiàn)aiss中可以存儲用戶或者物品的embedding向量等。
-
召回層:包括各種推薦策略或者算法,比如經(jīng)典的協(xié)同過濾,基于內(nèi)容的召回,基于向量的召回,用于托底的熱門推薦等。為了應(yīng)對線上高并發(fā)的流量,召回結(jié)果通常會預(yù)計算好,建立好倒排索引后存入緩存中。
-
融合過濾層:觸發(fā)多路召回,由于召回層的每個召回源都會返回一個候選集,因此這一層需要進行融合和過濾。
-
排序?qū)樱?/strong>利用機器學(xué)習(xí)或者深度學(xué)習(xí)模型,以及更豐富的特征進行重排序,篩選出更小、更精準(zhǔn)的推薦集合返回給上層業(yè)務(wù)。
從數(shù)據(jù)存儲層到召回層、再到融合過濾層和排序?qū)樱?span style="color: rgb(74, 74, 74); font-size: 15px;">候選集逐層減少,但是精準(zhǔn)性要求越來越高,因此也帶來了計算復(fù)雜度的逐層增加,這個便是推薦系統(tǒng)的最大挑戰(zhàn)。 其實對于推薦引擎來說,最核心的部分主要是兩塊:特征和算法。
推薦引擎的核心功能和技術(shù)方案
特征計算由于數(shù)據(jù)量大,通常采用大數(shù)據(jù)的離線和實時處理技術(shù),像Spark、Flink等,然后將計算結(jié)果保存在Redis或者其他存儲系統(tǒng)中(比如HBase、MongoDB或者ES),供召回和排序模塊使用。 召回算法的作用是:從海量數(shù)據(jù)中快速獲取一批候選數(shù)據(jù),要求是快和盡可能的準(zhǔn)。這一層通常有豐富的策略和算法,用來確保多樣性,為了更好的推薦效果,某些算法也會做成近實時的。 排序算法的作用是:對多路召回的候選集進行精細化排序。它會利用物品、用戶以及它們之間的交叉特征,然后通過復(fù)雜的機器學(xué)習(xí)或者深度學(xué)習(xí)模型進行打分排序,這一層的特點是計算復(fù)雜但是結(jié)果更精準(zhǔn)。
03 圖解經(jīng)典的協(xié)同過濾算法
了解了推薦系統(tǒng)的整體架構(gòu)和技術(shù)方案后,下面帶大家深入一下算法細節(jié)。這里選擇圖解的是推薦系統(tǒng)中的明星算法:協(xié)同過濾(Collaborative Filtering,CF)。 對于工程同學(xué)來說,可能覺得 AI 算法晦澀難懂,門檻太高,確實很多深度學(xué)習(xí)算法的確是這樣,但是協(xié)同過濾卻是一個簡單同時效果很好的算法,只要你有初中數(shù)學(xué)的基礎(chǔ)就能看懂。
1. 協(xié)同過濾是什么?
協(xié)同過濾算法的核心就是「找相似」,它基于用戶的歷史行為(瀏覽、收藏、評論等),去發(fā)現(xiàn)用戶對物品的喜好,并對喜好進行度量和打分,最終篩選出推薦集合。它又包括兩個分支:
- 基于用戶的協(xié)同過濾: User-CF,核心是找相似的人。比如下圖中,用戶 A 和用戶 C 都購買過物品 a 和物品 b,那么可以認(rèn)為 A 和 C 是相似的,因為他們共同喜歡的物品多。這樣,就可以將用戶 A 購買過的物品 d 推薦給用戶 C 。
基于用戶的協(xié)同過濾示例
-
基于物品的協(xié)同過濾:Item-CF,核心是找相似的物品。比如下圖中,物品 a 和物品 b 同時被用戶 A,B,C 購買了,那么物品 a 和 物品 b 被認(rèn)為是相似的,因為它們的共現(xiàn)次數(shù)很高。這樣,如果用戶 D 購買了物品 a,則可以將和物品 a 最相似的物品 b 推薦給用戶 D。
前面講到,協(xié)同過濾的核心就是找相似,User-CF是找用戶之間的相似,Item-CF是找物品之間的相似,那到底如何衡量兩個用戶或者物品之間的相似性呢? 我們都知道,對于坐標(biāo)中的兩個點,如果它們之間的夾角越小,這兩個點越相似,這就是初中學(xué)過的余弦距離,它的計算公式如下: 舉個例子,A坐標(biāo)是(0,3,1),B坐標(biāo)是(4,3,0),那么這兩個點的余弦距離是0.569,余弦距離越接近1,表示它們越相似。 清楚了相似性的定義后,下面以Item-CF為例,詳細說下這個算法到底是如何選出推薦物品的? 第一步:整理物品的共現(xiàn)矩陣 第二步:計算物品的相似度矩陣 基于第1步計算出來的共現(xiàn)矩陣以及每個物品的喜歡人數(shù),便可以構(gòu)造出物品的相似度矩陣: 上面的公式有點抽象,直接看例子更容易理解,假設(shè)我要給用戶 E 推薦物品,前面我們已經(jīng)知道用戶 E 喜歡物品 b 和物品 c,喜歡程度假設(shè)分別為 0.6 和 0.4。那么,利用上面的公式計算出來的推薦結(jié)果如下: 04 從0到1搭建一個推薦系統(tǒng) 1. 選擇數(shù)據(jù)集 這里采用的是推薦領(lǐng)域非常經(jīng)典的 MovieLens 數(shù)據(jù)集,它是一個關(guān)于電影評分的數(shù)據(jù)集,官網(wǎng)上提供了多個不同大小的版本,下面以 ml-1m 數(shù)據(jù)集(大約100萬條用戶評分記錄)為例。 下載解壓后,文件夾中包含:ratings.dat、movies.dat、users.dat 3個文件,共6040個用戶,3900部電影,1000209條評分記錄。各個文件的格式都是一樣的,每行表示一條記錄,字段之間采用 :: 進行分割。 程序主要使用數(shù)據(jù)集中的 ratings.dat 這個文件,通過解析該文件,抽取出 user_id、movie_id、rating 3個字段,最終構(gòu)造出算法依賴的數(shù)據(jù),并保存在變量 dataset 中,它的格式為:dict[user_id][movie_id] = rate 基于第 2 步的 dataset,可以進一步統(tǒng)計出每部電影的評分次數(shù)以及電影的共生矩陣,然后再生成相似度矩陣。 最后,可以基于相似度矩陣進行推薦了,輸入一個用戶id,先針對該用戶評分過的電影,依次選出 top 10 最相似的電影,然后加權(quán)求和后計算出每個候選電影的最終評分,最后再選擇得分前 5 的電影進行推薦。 下面選擇 UserId=1 這個用戶,看下程序的執(zhí)行結(jié)果。由于推薦程序輸出的是 movieId 列表,為了更直觀的了解推薦結(jié)果,這里轉(zhuǎn)換成電影的標(biāo)題進行輸出。 最終推薦的前5個電影為: 05 線上推薦系統(tǒng)的挑戰(zhàn) 通過上面的介紹,大家對推薦系統(tǒng)的基本構(gòu)成應(yīng)該有了一個初步認(rèn)識,但是真正運用到線上真實環(huán)境時,還會遇到很多算法和工程上的挑戰(zhàn),絕對不是幾十行 Python 代碼可以搞定的。 1、上面的示例使用了標(biāo)準(zhǔn)化的數(shù)據(jù)集,而線上環(huán)境的數(shù)據(jù)是非標(biāo)準(zhǔn)化的,因此涉及到海量數(shù)據(jù)的收集、清洗和加工,最終構(gòu)造出模型可使用的數(shù)據(jù)集。 2、復(fù)雜且繁瑣的特征工程,都說算法模型的上限由數(shù)據(jù)和特征決定。對于線上環(huán)境,需要從業(yè)務(wù)角度選擇出可用的特征,然后對數(shù)據(jù)進行清洗、標(biāo)準(zhǔn)化、歸一化、離散化,并通過實驗效果進一步驗證特征的有效性。 3、算法復(fù)雜度如何降低?比如上面介紹的Item-CF算法,時間和空間復(fù)雜度都是O(N×N),而線上環(huán)境的數(shù)據(jù)都是千萬甚至上億級別的,如果不做算法優(yōu)化,可能幾天都跑不出數(shù)據(jù),或者內(nèi)存中根本放不下如此大的矩陣數(shù)據(jù)。 4、實時性如何滿足?因為用戶的興趣隨著他們最新的行為在實時變化的,如果模型只是基于歷史數(shù)據(jù)進行推薦,可能結(jié)果不夠精準(zhǔn)。因此,如何滿足實時性要求,以及對于新加入的物品或者用戶該如何推薦,都是要解決的問題。 5、算法效果和性能的權(quán)衡。從算法角度追求多樣性和準(zhǔn)確性,從工程角度追求性能,這兩者之間必須找到一個平衡點。 6、推薦系統(tǒng)的穩(wěn)定性和效果追蹤。需要有一套完善的數(shù)據(jù)監(jiān)控和應(yīng)用監(jiān)控體系,同時有 ABTest 平臺進行灰度實驗,進行效果對比。 基于物品的協(xié)同過濾 示例 2. 如何找相似?
最后一步,便可以基于相似度矩陣推薦物品了,公式如下:
寫在最后
這篇文章是推薦系統(tǒng)的入門篇,目的是讓大家對推薦系統(tǒng)先有一個整體的認(rèn)識,后續(xù)我會再連載出一些文章,詳細地介紹面對具體業(yè)務(wù)和線上海量數(shù)據(jù)時,推薦系統(tǒng)應(yīng)該如何設(shè)計?
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!