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)容包括:
01 走進(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)量。
“啤酒與尿布”的故事 這個(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ù)。
推薦系統(tǒng)的分階段過(guò)濾流程
2. 推薦系統(tǒng)的應(yīng)用場(chǎng)景 哪里有海量信息,哪里就有推薦系統(tǒng),我們每天最常用的APP都涉及到推薦功能: 頭條、京東、網(wǎng)易云音樂(lè)中的推薦功能 推薦系統(tǒng)的應(yīng)用場(chǎng)景通常分為以下兩類(lèi): 基于物品維度的推薦:根據(jù)用戶(hù)當(dāng)前瀏覽的標(biāo)的物進(jìn)行推薦,比如打開(kāi)京東APP的商品詳情頁(yè),會(huì)推薦和主商品相關(guān)的商品給你。 搜索和推薦是AI算法最常見(jiàn)的兩個(gè)應(yīng)用場(chǎng)景,在技術(shù)上有相通的地方。這里提到廣告,主要考慮很多沒(méi)做過(guò)廣告業(yè)務(wù)的同學(xué)不清楚為什么廣告和搜索、推薦會(huì)有關(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à)等。
3. 搜索、推薦、廣告三者的異同
02 推薦系統(tǒng)的整體架構(gòu)
推薦系統(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ū)樱?/strong>利用機(jī)器學(xué)習(xí)或者深度學(xué)習(xí)模型,以及更豐富的特征進(jìn)行重排序,篩選出更小、更精準(zhǔn)的推薦集合返回給上層業(yè)務(wù)。
從數(shù)據(jù)存儲(chǔ)層到召回層、再到融合過(guò)濾層和排序?qū)樱?span style="color: rgb(74, 74, 74); font-size: 15px;">候選集逐層減少,但是精準(zhǔn)性要求越來(lái)越高,因此也帶來(lái)了計(jì)算復(fù)雜度的逐層增加,這個(gè)便是推薦系統(tǒng)的最大挑戰(zhàn)。 其實(shí)對(duì)于推薦引擎來(lái)說(shuō),最核心的部分主要是兩塊:特征和算法。
推薦引擎的核心功能和技術(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)。
03 圖解經(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è)分支:
- 基于用戶(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 。
基于用戶(hù)的協(xié)同過(guò)濾示例
-
基于物品的協(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。
基于物品的協(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ì)算公式如下: 舉個(gè)例子,A坐標(biāo)是(0,3,1),B坐標(biāo)是(4,3,0),那么這兩個(gè)點(diǎn)的余弦距離是0.569,余弦距離越接近1,表示它們?cè)较嗨啤? 清楚了相似性的定義后,下面以Item-CF為例,詳細(xì)說(shuō)下這個(gè)算法到底是如何選出推薦物品的? 第一步:整理物品的共現(xiàn)矩陣 第二步:計(jì)算物品的相似度矩陣 基于第1步計(jì)算出來(lái)的共現(xiàn)矩陣以及每個(gè)物品的喜歡人數(shù),便可以構(gòu)造出物品的相似度矩陣: 上面的公式有點(diǎn)抽象,直接看例子更容易理解,假設(shè)我要給用戶(hù) E 推薦物品,前面我們已經(jīng)知道用戶(hù) E 喜歡物品 b 和物品 c,喜歡程度假設(shè)分別為 0.6 和 0.4。那么,利用上面的公式計(jì)算出來(lái)的推薦結(jié)果如下: 04 從0到1搭建一個(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)行分割。 程序主要使用數(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 基于第 2 步的 dataset,可以進(jìn)一步統(tǒng)計(jì)出每部電影的評(píng)分次數(shù)以及電影的共生矩陣,然后再生成相似度矩陣。 最后,可以基于相似度矩陣進(jìn)行推薦了,輸入一個(gè)用戶(hù)id,先針對(duì)該用戶(hù)評(píng)分過(guò)的電影,依次選出 top 10 最相似的電影,然后加權(quán)求和后計(jì)算出每個(gè)候選電影的最終評(píng)分,最后再選擇得分前 5 的電影進(jìn)行推薦。 下面選擇 UserId=1 這個(gè)用戶(hù),看下程序的執(zhí)行結(jié)果。由于推薦程序輸出的是 movieId 列表,為了更直觀的了解推薦結(jié)果,這里轉(zhuǎn)換成電影的標(biāo)題進(jìn)行輸出。 最終推薦的前5個(gè)電影為: 05 線(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ì)比。
最后一步,便可以基于相似度矩陣推薦物品了,公式如下:
寫(xiě)在最后
這篇文章是推薦系統(tǒng)的入門(mén)篇,目的是讓大家對(duì)推薦系統(tǒng)先有一個(gè)整體的認(rèn)識(shí),后續(xù)我會(huì)再連載出一些文章,詳細(xì)地介紹面對(duì)具體業(yè)務(wù)和線(xiàn)上海量數(shù)據(jù)時(shí),推薦系統(tǒng)應(yīng)該如何設(shè)計(jì)?
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!