導(dǎo)讀:個(gè)性化推薦系統(tǒng),,簡(jiǎn)單來(lái)說(shuō)就是根據(jù)每個(gè)人的偏好推薦他喜歡的物品,。互聯(lián)網(wǎng)發(fā)展到現(xiàn)在,,推薦系統(tǒng)已經(jīng)無(wú)處不在,,在各行各業(yè)都得到普遍都應(yīng)用。亞馬遜號(hào)稱(chēng) 40% 的收入是來(lái)自個(gè)性化推薦系統(tǒng)的,,淘寶的個(gè)性化推薦系統(tǒng)也帶來(lái)非常大的收益,,新聞媒體的個(gè)性化推薦系統(tǒng)典型的是今日頭條,直播平臺(tái)給用戶推薦喜歡的主播,,金融網(wǎng)站給用戶推薦需要的理財(cái)產(chǎn)品,,社交網(wǎng)絡(luò)給用戶推薦大 V 或者其他朋友……越來(lái)越多的公司將推薦系統(tǒng)作為產(chǎn)品的標(biāo)配。 大家接觸推薦系統(tǒng)的概率會(huì)越來(lái)越大,。作為程序員,,了解推薦系統(tǒng)也越來(lái)越必要,甚至可以主動(dòng)選擇“推薦系統(tǒng)算法工程師”的相關(guān)職位,。那大家一定會(huì)關(guān)心推薦算法工程師需要哪些知識(shí)儲(chǔ)備,,以及作為一個(gè)推薦算法工程師,,未來(lái)的發(fā)展道路怎樣? 本文是作者計(jì)劃的一系列文章中的一篇,。作者在上篇文章《推薦系統(tǒng)介紹》中簡(jiǎn)單對(duì)推薦系統(tǒng)做了一個(gè)較全面的介紹,,相信大家對(duì)推薦系統(tǒng)有了初步的了解。本篇文章作者會(huì)結(jié)合多年推薦系統(tǒng)開(kāi)發(fā)的實(shí)踐經(jīng)驗(yàn)粗略介紹推薦系統(tǒng)的工程實(shí)現(xiàn),,簡(jiǎn)要說(shuō)明要將推薦系統(tǒng)很好地落地到產(chǎn)品中需要考慮哪些問(wèn)題及相應(yīng)的思路,、策略和建議,其中有大量關(guān)于設(shè)計(jì)哲學(xué)的思考,,希望對(duì)從事推薦算法工作或準(zhǔn)備入行推薦系統(tǒng)的讀者有所幫助,。為了描述方便,本文主要基于視頻推薦來(lái)講解,,作者這幾年也一直在從事視頻推薦系統(tǒng)開(kāi)發(fā)的工作,,其他行業(yè)的推薦系統(tǒng)工程實(shí)現(xiàn)思路類(lèi)似。本篇文章主要從整體上來(lái)介紹推薦系統(tǒng)工程實(shí)現(xiàn),,以后發(fā)布的系列文章會(huì)逐步介紹工程實(shí)現(xiàn)的各個(gè)細(xì)節(jié)實(shí)現(xiàn)原理與策略,。 推薦系統(tǒng)與大數(shù)據(jù) 推薦系統(tǒng)是幫助人們解決信息獲取問(wèn)題的有效工具,對(duì)互聯(lián)網(wǎng)產(chǎn)品而也用戶數(shù)和信息總量通常都是巨大的,,每天收集到的用戶在產(chǎn)品上的交互行為也是海量的,,這些大量的數(shù)據(jù)收集處理就涉及到大數(shù)據(jù)相關(guān)技術(shù),所以推薦系統(tǒng)與大數(shù)據(jù)有天然的聯(lián)系,,要落地推薦系統(tǒng)往往需要企業(yè)具備一套完善的大數(shù)據(jù)分析平臺(tái),。 推薦系統(tǒng)與大數(shù)據(jù)平臺(tái)的依賴(lài)關(guān)系如下圖。大數(shù)據(jù)平臺(tái)包含數(shù)據(jù)中心和計(jì)算中心兩大抽象,,數(shù)據(jù)中心為推薦系統(tǒng)提供數(shù)據(jù)存儲(chǔ),,包括訓(xùn)練推薦模型需要的數(shù)據(jù),依賴(lài)的其他數(shù)據(jù),,以及推薦結(jié)果,,而計(jì)算中心提供算力支持,支撐數(shù)據(jù)預(yù)處理,、模型訓(xùn)練,、模型推斷 (即基于學(xué)習(xí)到的模型,為每個(gè)用戶推薦) 等,。 推薦系統(tǒng)在整個(gè)大數(shù)據(jù)平臺(tái)的定位 大數(shù)據(jù)與人工智能具有千絲萬(wàn)縷的關(guān)系,,互聯(lián)網(wǎng)公司一般會(huì)構(gòu)建自己的大數(shù)據(jù)與人工智能團(tuán)隊(duì),構(gòu)建大數(shù)據(jù)基礎(chǔ)平臺(tái),,基于大數(shù)據(jù)平臺(tái)構(gòu)建上層業(yè)務(wù),,包括商業(yè)智能 (BI), 推薦系統(tǒng)及其他人工智能業(yè)務(wù),下圖是典型的基于開(kāi)源技術(shù)的視頻互聯(lián)網(wǎng)公司大數(shù)據(jù)與人工智能業(yè)務(wù)及相關(guān)的底層大數(shù)據(jù)支撐技術(shù)。 大數(shù)據(jù)支撐下的人工智能技術(shù)體系 (DS: 數(shù)據(jù)源,,DC: 大數(shù)據(jù)中心,,BIZ: 上層業(yè)務(wù)) 在產(chǎn)品中整合推薦系統(tǒng)是一個(gè)系統(tǒng)工程,怎么讓推薦系統(tǒng)在產(chǎn)品中產(chǎn)生價(jià)值,,真正幫助到用戶,,提升用戶體驗(yàn)的同時(shí)為平臺(tái)方提供更大的收益是一件有挑戰(zhàn)的事情,整個(gè)推薦系統(tǒng)的業(yè)務(wù)流可以用下圖來(lái)說(shuō)明,,它是一個(gè)不斷迭代優(yōu)化的過(guò)程,,是一個(gè)閉環(huán)系統(tǒng)。 有了上面這些介紹,,相信讀者對(duì)大數(shù)據(jù)與推薦系統(tǒng)的關(guān)系有了一個(gè)比較清楚的了解,,下面會(huì)著重講解推薦系統(tǒng)工程實(shí)現(xiàn)相關(guān)的知識(shí)。 推薦系統(tǒng)業(yè)務(wù)流及核心模塊 先介紹一下構(gòu)建一套完善的推薦系統(tǒng)涉及到的主要業(yè)務(wù)流程及核心模塊,,具體流程如下圖,,下面分別介紹各個(gè)模塊:
構(gòu)建推薦模型需要收集很多數(shù)據(jù),包括用戶行為數(shù)據(jù),,用戶相關(guān)數(shù)據(jù)及推薦“標(biāo)的物”相關(guān)數(shù)據(jù),。如果將推薦系統(tǒng)比喻為廚師做菜,那么這些數(shù)據(jù)是構(gòu)建推薦算法模型的原材料,。巧婦難為無(wú)米之炊, 要構(gòu)建好的推薦算法收集到足夠多的有價(jià)值的數(shù)據(jù)是非常關(guān)鍵和重要的,。
收集到的原始數(shù)據(jù)一般是非結(jié)構(gòu)化的,ETL 模塊的主要目的是從收集到的原始數(shù)據(jù)中提取關(guān)鍵字段 (拿視頻行業(yè)來(lái)說(shuō),,用戶 id,時(shí)間,,播放的節(jié)目,,播放時(shí)長(zhǎng),播放路徑等都是關(guān)鍵字段),,將數(shù)據(jù)轉(zhuǎn)化為結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)倉(cāng)庫(kù)中,。同時(shí)根據(jù)一定的規(guī)則或策略過(guò)濾掉臟數(shù)據(jù),保證數(shù)據(jù)質(zhì)量的高標(biāo)準(zhǔn),。在互聯(lián)網(wǎng)公司中,,用戶行為數(shù)據(jù)跟用戶規(guī)模呈正比,所以當(dāng)用戶規(guī)模很大時(shí)數(shù)據(jù)量非常大,,一般采用 HDFS,、Hive、HBase 等大數(shù)據(jù)分布式存儲(chǔ)系統(tǒng)來(lái)存儲(chǔ)數(shù)據(jù),。 用戶相關(guān)數(shù)據(jù)及推薦“標(biāo)的物”相關(guān)數(shù)據(jù)一般是結(jié)構(gòu)化的數(shù)據(jù),,一般是通過(guò)后臺(tái)管理模塊將數(shù)據(jù)存儲(chǔ)到 MySQL、ProgreSQL 等關(guān)系型數(shù)據(jù)庫(kù)中。
推薦系統(tǒng)采用各種機(jī)器學(xué)習(xí)算法來(lái)學(xué)習(xí)用戶偏好,,并基于用戶偏好來(lái)為用戶推薦“標(biāo)的物”, 而這些推薦算法用于訓(xùn)練的數(shù)據(jù)是可以“被數(shù)學(xué)所描述”的,,一般是向量的形式,其中向量的每一個(gè)分量 / 維度就是一個(gè)特征,,所以特征工程的目的就是將推薦算法需要的,,以及上述 ETL 后的數(shù)據(jù)轉(zhuǎn)換為推薦算法可以學(xué)習(xí)的特征。 當(dāng)然,,不是所有推薦算法都需要特征工程,,比如,如果要做排行榜相關(guān)的熱門(mén)推薦,,只需要對(duì)數(shù)據(jù)做統(tǒng)計(jì)排序處理就可以了,。最常用的基于物品的推薦和基于用戶的推薦也只用到用戶 id,標(biāo)的物 id,,用戶對(duì)標(biāo)的物的評(píng)分三個(gè)維度,,也談不上特征工程。像 logistic 回歸等復(fù)雜一些的機(jī)器學(xué)習(xí)算法需要做特征工程,,一般基于模型的推薦算法都需要特征工程,。 特征工程是一個(gè)比較復(fù)雜的過(guò)程,要做好需要很多技巧,、智慧,、行業(yè)知識(shí)、經(jīng)驗(yàn)等,,在這篇文章中作者不作詳細(xì)介紹,。
推薦算法模塊是整個(gè)推薦系統(tǒng)的核心之一,該模塊的核心是根據(jù)具體業(yè)務(wù)及可利用的所有數(shù)據(jù)設(shè)計(jì)一套精準(zhǔn),、易于工程實(shí)現(xiàn),、可以處理大規(guī)模數(shù)據(jù)的 (分布式) 機(jī)器學(xué)習(xí)算法,進(jìn)而可以預(yù)測(cè)用戶的興趣偏好,。這里一般涉及到模型訓(xùn)練,、預(yù)測(cè)兩個(gè)核心操作。下面用一個(gè)圖簡(jiǎn)單描述這兩個(gè)過(guò)程,,這也是機(jī)器學(xué)習(xí)的通用流程,。 好的推薦工程實(shí)現(xiàn),希望盡量將這兩個(gè)過(guò)程解耦合,,做到通用,,方便用到各種推薦業(yè)務(wù)中,后面在推薦系統(tǒng)架構(gòu)設(shè)計(jì)一節(jié)中會(huì)詳細(xì)講解具體的設(shè)計(jì)思路和哲學(xué),。
作者在最開(kāi)始做推薦系統(tǒng)時(shí)由于沒(méi)有經(jīng)驗(yàn),,開(kāi)始將推薦結(jié)果存儲(chǔ)在 Mysql 中,,當(dāng)時(shí)遇到最大的問(wèn)題是每天更新用戶的推薦時(shí),需要先找到用戶存儲(chǔ)的位置,,再做替換,,操作復(fù)雜,并且當(dāng)用戶規(guī)模大時(shí),,高并發(fā)讀寫(xiě),,大數(shù)據(jù)量存儲(chǔ),Mysql 也扛不住,,現(xiàn)在最好的方式是采用 CouchBase,,Redis 等可以橫向擴(kuò)容的數(shù)據(jù)庫(kù),可以完全避開(kāi) MySQL 的缺點(diǎn),。 在計(jì)算機(jī)工程中有“空間換時(shí)間”的說(shuō)法,,對(duì)于推薦系統(tǒng)來(lái)說(shuō),就是先計(jì)算好每個(gè)用戶的推薦,,將推薦結(jié)果存儲(chǔ)下來(lái),,通過(guò)預(yù)先將推薦結(jié)果存下來(lái),可以更快的為用戶提供推薦服務(wù), 提升用戶體驗(yàn),。由于推薦系統(tǒng)會(huì)為每個(gè)用戶生成推薦結(jié)果, 并且每天都會(huì) (基本全量) 更新用戶的推薦結(jié)果,,一般采用 NoSql 數(shù)據(jù)庫(kù)來(lái)存儲(chǔ),并且要求數(shù)據(jù)庫(kù)可拓展,,高可用,,支持大規(guī)模并發(fā)讀寫(xiě)。 推薦結(jié)果一般不是直接在模型推斷階段直接寫(xiě)入推薦存儲(chǔ)數(shù)據(jù)庫(kù),,較好的方式是通過(guò)一個(gè)數(shù)據(jù)管道 (如 kafka) 來(lái)解耦,,讓整個(gè)系統(tǒng)更加模塊化,易于維護(hù)拓展,。
該模塊是推薦系統(tǒng)直接服務(wù)用戶的模塊,,該模塊的主要作用是當(dāng)用戶在 UI 上觸達(dá)推薦系統(tǒng)時(shí),觸發(fā)推薦接口,,為用戶提供個(gè)性化推薦,該模塊的穩(wěn)定性,、響應(yīng)時(shí)長(zhǎng)直接影響到用戶體驗(yàn),。跟上面的推薦存儲(chǔ)模塊類(lèi)似,Web 服務(wù)模塊也需要支持高并發(fā)訪問(wèn),、水平可拓展,、亞秒級(jí) (一般 200ms 之內(nèi)) 響應(yīng)延遲。 下圖是作者公司相似影片推薦算法的一個(gè)簡(jiǎn)化版業(yè)務(wù)流向圖,,供大家與上面的模塊對(duì)照參考: 相似影片業(yè)務(wù)流 推薦系統(tǒng)支撐模塊 推薦系統(tǒng)想要很好的穩(wěn)定的發(fā)揮價(jià)值,,需要一些支撐業(yè)務(wù)來(lái)輔助,這些支撐業(yè)務(wù)雖然不是推薦系統(tǒng)的核心模塊,但卻是推薦業(yè)務(wù)穩(wěn)定運(yùn)行必不可少的部分,,主要包括如下 4 大支撐模塊,,下面分別簡(jiǎn)述各個(gè)模塊的作用和價(jià)值。 推薦系統(tǒng)核心支撐模塊
推薦評(píng)估模塊的主要作用是評(píng)估整個(gè)推薦系統(tǒng)的質(zhì)量及價(jià)值產(chǎn)出,。一般來(lái)說(shuō)可以從兩個(gè)維度來(lái)評(píng)估,。
一個(gè)推薦業(yè)務(wù)要產(chǎn)生價(jià)值,,所有依賴(lài)的任務(wù)都要正常運(yùn)行。推薦業(yè)務(wù)可以抽象為有向無(wú)環(huán)圖 (第六節(jié)推薦系統(tǒng)架構(gòu)設(shè)計(jì)會(huì)講到將推薦業(yè)務(wù)抽象為有向無(wú)環(huán)圖),,因此需要按照該有向圖的依賴(lài)關(guān)系依次執(zhí)行每個(gè)任務(wù),,這些任務(wù)的依賴(lài)關(guān)系就需要借助合適的調(diào)度系統(tǒng) (比如 Azkaban) 來(lái)實(shí)現(xiàn),早期我們采用 Crontab 來(lái)調(diào)度,,當(dāng)任務(wù)量多的時(shí)候就不那么方便了,,Crontab 也無(wú)法很好解決任務(wù)依賴(lài)關(guān)系。
監(jiān)控模塊解決的是當(dāng)推薦業(yè)務(wù) (依賴(lài)的) 任務(wù)由于各種原因調(diào)度失敗時(shí)可以及時(shí)告警,,通過(guò)郵件或者短信通知運(yùn)維或者業(yè)務(wù)的維護(hù)者,,及時(shí)發(fā)現(xiàn)問(wèn)題,或者可以在后臺(tái)自動(dòng)拉起服務(wù),。同時(shí)可以對(duì)服務(wù)的各種其他狀態(tài)做監(jiān)控,,比如文件大小、狀態(tài)變量的值,、日期時(shí)間等與業(yè)務(wù)正常執(zhí)行相關(guān)的狀態(tài)變量,,不正常時(shí)及時(shí)發(fā)現(xiàn)問(wèn)題。
審查模塊是對(duì)推薦系統(tǒng)結(jié)果數(shù)據(jù)格式的正確性,、有效性進(jìn)行檢查,,避免錯(cuò)誤產(chǎn)生,,一般的處理策略是根據(jù)業(yè)務(wù)定義一些審查用例 (類(lèi)似測(cè)試用例),在推薦任務(wù)執(zhí)行前或者執(zhí)行階段對(duì)運(yùn)算過(guò)程做 check,,發(fā)現(xiàn)問(wèn)題及時(shí)告警,。舉兩個(gè)例子,如果你的 DAU 是 100w,,每天大約要為這么多用戶生成個(gè)性化推薦結(jié)果,,但是由于一些開(kāi)發(fā)錯(cuò)誤,只計(jì)算了 20w 用戶的個(gè)性化推薦,,從監(jiān)控是無(wú)法發(fā)現(xiàn)問(wèn)題的,,如果增加推薦的用戶數(shù)量跟 DAU 的比例控制在 1 附近這個(gè)審查項(xiàng),就可以避免出現(xiàn)問(wèn)題,;在推薦結(jié)果插入數(shù)據(jù)庫(kù)過(guò)程中,,開(kāi)發(fā)人員升級(jí)了新的算法,不小心將數(shù)據(jù)格式寫(xiě)錯(cuò) (如 Json 格式不合法),,如果不加審查,,會(huì)導(dǎo)致最終插入的數(shù)據(jù)格式錯(cuò)誤,導(dǎo)致接口返回錯(cuò)誤或者掛掉,,對(duì)用戶體驗(yàn)有極大負(fù)面影響,。 推薦系統(tǒng)范式 推薦系統(tǒng)的目的是為用戶推薦可能喜歡的標(biāo)的物, 這個(gè)過(guò)程涉及到用戶、標(biāo)的物兩個(gè)重要要素,,我們可以根據(jù)這兩個(gè)要素的不同組合產(chǎn)生不同的推薦形態(tài),,即所謂的不同“范式 (paradigm)”(數(shù)學(xué)專(zhuān)業(yè)的同學(xué)不難理解范式,如果不好理解可以將范式看成具備某種相似性質(zhì)的對(duì)象的集合),,根據(jù)我自己構(gòu)建推薦系統(tǒng)的經(jīng)驗(yàn)可以將推薦系統(tǒng)總結(jié)為如下 5 種范式,,這 5 中范式可以應(yīng)用到產(chǎn)品的各種推薦場(chǎng)景中,后面會(huì)拿視頻 APP 舉例說(shuō)明具體的應(yīng)用場(chǎng)景,。
常見(jiàn)的猜你喜歡就是這類(lèi)推薦,,可以用于進(jìn)入首頁(yè)的綜合類(lèi)猜你喜歡推薦,,進(jìn)入各個(gè)頻道 (如電影) 頁(yè)的猜你喜歡推薦。下圖是電視貓首頁(yè)興趣推薦,,就是為每個(gè)用戶提供不一樣的個(gè)性化推薦,;
這里舉一個(gè)在作者公司利用范式 2 做推薦的例子,,我們?cè)陬l道頁(yè)三級(jí)列表中,會(huì)根據(jù)用戶的興趣對(duì)列表做個(gè)性化重排序,,讓與用戶更匹配的節(jié)目放到前面,,提升節(jié)目轉(zhuǎn)化,但是在實(shí)現(xiàn)時(shí),,為了節(jié)省存儲(chǔ)空間,,先對(duì)用戶聚類(lèi),同一類(lèi)用戶興趣相似,,對(duì)這一類(lèi)用戶,,列表的排序是一樣的,但是不同類(lèi)的用戶的列表是完全不一樣的,。見(jiàn)下圖的戰(zhàn)爭(zhēng)風(fēng)云 tab,,右邊展示的節(jié)目集合總量不變,只是在不同組的用戶看到的排序不一樣,,排序是根據(jù)與用戶的興趣匹配度高低來(lái)降序排列的,。
比如各類(lèi)排行榜業(yè)務(wù),,既可以作為首頁(yè)上的一個(gè)獨(dú)立的推薦模塊,,方便用戶發(fā)現(xiàn)新熱內(nèi)容,也可以作為猜你喜歡推薦新用戶冷啟動(dòng)的默認(rèn)推薦,,下圖是搜索模塊當(dāng)用戶未輸入搜索關(guān)鍵詞時(shí)給出的熱門(mén)內(nèi)容,,也是采用該范式的例子;
當(dāng)用戶瀏覽一個(gè)電影時(shí),,可以通過(guò)關(guān)聯(lián)相似的電影, 為用戶提供更多的選擇空間 (下圖就是電視貓電影詳情頁(yè)關(guān)聯(lián)的相似影片),;還可以當(dāng)用戶播放一個(gè)節(jié)目退出時(shí),推薦用戶可能還喜歡的其他節(jié)目,;針對(duì)短視頻,,可以將相似節(jié)目做成連播推薦列表,用戶播放當(dāng)前節(jié)目直接連播相似節(jié)目,,提升節(jié)目分發(fā)和用戶體驗(yàn),;
該范式跟 4 類(lèi)似,,只不過(guò)不同用戶在同一個(gè)節(jié)目得到的關(guān)聯(lián)節(jié)目不一樣,會(huì)結(jié)合用戶的興趣,,給出更匹配用戶興趣的關(guān)聯(lián)節(jié)目,; 由于每個(gè)用戶跟每個(gè)標(biāo)的物的組合推薦結(jié)果都不一樣, 往往用戶數(shù)和標(biāo)的物的數(shù)量都是巨大的, 沒(méi)有足夠的資源事先將所有的組合的推薦結(jié)果先計(jì)算存儲(chǔ)下來(lái),,一般是在用戶觸發(fā)推薦時(shí)實(shí)時(shí)計(jì)算推薦結(jié)果呈現(xiàn)給用戶,計(jì)算過(guò)程也要盡量簡(jiǎn)單,,在亞秒級(jí)就可以算完,,比如利用用戶的播放歷史,過(guò)濾掉用戶已經(jīng)看過(guò)的關(guān)聯(lián)節(jié)目,; 下面給一個(gè)簡(jiǎn)單的圖示來(lái)說(shuō)明這 5 種范式,,讓讀者有一個(gè)直觀形象的理解。 推薦算法的 5 種范式 總之,,推薦系統(tǒng)不是孤立存在的對(duì)象,,它一定是要整合到具體的業(yè)務(wù)中,在合適的產(chǎn)品交互流程中觸達(dá)用戶,,通過(guò)用戶觸發(fā)推薦行為,。所以,推薦系統(tǒng)要應(yīng)用到產(chǎn)品中需要嵌入到用戶使用產(chǎn)品的各個(gè)流程 (頁(yè)面) 中,。當(dāng)用戶訪問(wèn)首頁(yè)時(shí),,可以通過(guò)綜合推薦(范式 1)來(lái)給用戶提供個(gè)性化推薦內(nèi)容,當(dāng)用戶訪問(wèn)詳情頁(yè),,可以通過(guò)相似影片(范式 4)提供相似標(biāo)的物推薦,,當(dāng)用戶進(jìn)入搜索頁(yè)尚未輸入搜索內(nèi)容時(shí),可以通過(guò)熱門(mén)推薦給用戶推送新熱節(jié)目 (范式 3),。這樣處處都有推薦,,才會(huì)使產(chǎn)品顯得更加智能。所有這些產(chǎn)品形態(tài)基本都可以用上面介紹的 5 種范式來(lái)概括,。 推薦系統(tǒng)架構(gòu)設(shè)計(jì) 作者在早期構(gòu)建推薦系統(tǒng)時(shí)由于經(jīng)驗(yàn)不足,,而業(yè)務(wù)又比較多,當(dāng)時(shí)的策略是每個(gè)算法工程師負(fù)責(zé)幾個(gè)推薦業(yè)務(wù) (一個(gè)推薦業(yè)務(wù)對(duì)應(yīng)一個(gè)推薦產(chǎn)品形態(tài)),,由于每個(gè)人只對(duì)自己的業(yè)務(wù)負(fù)責(zé),,所以開(kāi)發(fā)基本是獨(dú)立的,每個(gè)人只關(guān)注自己的算法實(shí)現(xiàn),,雖然用到的算法是一樣的,,但前期在開(kāi)發(fā)過(guò)程中沒(méi)有將通用的模塊抽象出來(lái),每個(gè)開(kāi)發(fā)人員從 ETL,、算法訓(xùn)練,、預(yù)測(cè)到插入數(shù)據(jù)庫(kù)都是獨(dú)立的,并且每個(gè)人在實(shí)現(xiàn)過(guò)程中整合了自己的一些優(yōu)化邏輯,,一竿子插到底,,導(dǎo)致資源 (計(jì)算資源,存儲(chǔ)資源,人力資源) 利用率不高,,開(kāi)發(fā)效率低下,。經(jīng)過(guò)幾年的摸索,作者在團(tuán)隊(duì)內(nèi)部構(gòu)建了一套通用的算法組件 Doraemon 框架 (就像機(jī)器貓的小口袋,,有很多工具供大家方便構(gòu)建推薦業(yè)務(wù)),盡量做到資源的節(jié)省,,大大提升了開(kāi)發(fā)效率,。開(kāi)發(fā)過(guò)程的蛻變,可以用下面的圖示簡(jiǎn)單說(shuō)明,,從中讀者也可以對(duì) Doraemon 架構(gòu)落地前后的推薦業(yè)務(wù)開(kāi)發(fā)變化有個(gè)大致的了解,。 Doraemon 框架前后開(kāi)發(fā)方式對(duì)比 作者構(gòu)建 Doraemon 框架的初衷是希望構(gòu)建推薦業(yè)務(wù)就像搭積木一樣 (見(jiàn)下圖),可以快速構(gòu)建一套算法體系,,快速上線業(yè)務(wù),。算法或者處理邏輯就像一塊一塊的積木,而算法依賴(lài)的數(shù)據(jù) (及數(shù)據(jù)結(jié)構(gòu)) 就是不同積木之間是否可以銜接的“接口”,。 本著上面樸素的思想,,下面作者詳細(xì)說(shuō)說(shuō)構(gòu)建這套體系的思路和策略。 為了支撐更多類(lèi)型的推薦業(yè)務(wù),,減少系統(tǒng)的耦合,,便于發(fā)現(xiàn)和追蹤問(wèn)題,節(jié)省人力成本,,方便算法快速上線和迭代,,需要設(shè)計(jì)比較好的推薦系統(tǒng)架構(gòu),而好的推薦系統(tǒng)架構(gòu)應(yīng)該具備 6 大原則:通用性,,模塊化,,組件化,一致性,,可拓展性,,抽象性。下面分別對(duì)上述 6 大原則做簡(jiǎn)要說(shuō)明,,闡述清楚它們的目標(biāo)和意義,。
組件化和模塊化比較類(lèi)似,,目標(biāo)分別是為了更好的解耦和重用,,就像搭積木一樣構(gòu)建復(fù)雜系統(tǒng)。
操作 / 算法抽象:我們先對(duì)數(shù)據(jù)處理或者算法做一個(gè)抽象,,將利用輸入數(shù)據(jù)通過(guò)“操作”得到輸出的的過(guò)程抽象為“算子”,按照這個(gè)抽象,ETL,、機(jī)器學(xué)習(xí)訓(xùn)練模型,、機(jī)器學(xué)習(xí)推斷都是算子。其中輸入輸出可以是數(shù)據(jù)或者模型,。 算法或者操作的算子抽象 業(yè)務(wù)抽象:任何一個(gè)推薦業(yè)務(wù)可以抽象為由數(shù)據(jù) / 模型為節(jié)點(diǎn),,算子為邊的“有向無(wú)環(huán)圖”。下圖是深度學(xué)習(xí)的算法處理流程,整個(gè)算法實(shí)現(xiàn)就是一個(gè)有向無(wú)環(huán)圖,。 下圖是我們做的一個(gè)利用深度學(xué)習(xí)做電影猜你喜歡的推薦業(yè)務(wù)流程,,整個(gè)流程是由各個(gè)算子通過(guò)依賴(lài)關(guān)系鏈接起來(lái)的,就像一個(gè)有向無(wú)環(huán)圖,。 推薦業(yè)務(wù)的有向無(wú)環(huán)圖抽象 根據(jù) Doraemon 系統(tǒng)的設(shè)計(jì)哲學(xué)及上面描述的推薦系統(tǒng)的核心模塊,,結(jié)合業(yè)內(nèi),一般將推薦系統(tǒng)分為召回 (將用戶可能會(huì)喜歡的標(biāo)的物取出來(lái)) 和排序 (將取出的標(biāo)的物按照用戶喜好程度降序排列,,最喜歡的排在前面) 兩個(gè)過(guò)程,,推薦系統(tǒng)可以根據(jù)如下方式進(jìn)行設(shè)計(jì)。
在我們的業(yè)務(wù)實(shí)踐中,發(fā)現(xiàn)上述抽象很合理,,基本推薦業(yè)務(wù)涉及到的所有算子 (ETL,、模型訓(xùn)練、模型推薦,、排序框架,、數(shù)據(jù)過(guò)濾,具體業(yè)務(wù)邏輯等) 都可以采用該方式很好的抽象,。
這里要特別說(shuō)一下數(shù)據(jù) (模型),,數(shù)據(jù)作為算子的輸入輸出,一定要定義嚴(yán)格的范式 (具備固定的數(shù)據(jù)結(jié)構(gòu),,比如矩陣分解訓(xùn)練依賴(lài)的數(shù)據(jù)有三列,,一列用戶 id,一列物品 id,,一列用戶對(duì)物品的評(píng)分),,Spark 的 DataFrame 可以很好的支撐各種數(shù)據(jù)類(lèi)型。數(shù)據(jù)格式定義好后,,在算子讀入或者輸出時(shí),,可以對(duì)類(lèi)型做校驗(yàn),可以很好的避免很多由于業(yè)務(wù)開(kāi)發(fā)疏忽導(dǎo)致的問(wèn)題,。這有點(diǎn)類(lèi)似強(qiáng)類(lèi)型編程語(yǔ)言,,在編譯過(guò)程 (類(lèi)似算子) 可以檢查出類(lèi)型錯(cuò)誤。 我們將上面的 6 類(lèi)組件封裝成一個(gè) Doraemon 的 lib 庫(kù),,供具體的推薦業(yè)務(wù)使用,。 基于大數(shù)據(jù)的數(shù)據(jù)中心和計(jì)算中心的抽象, 我們將所有推薦業(yè)務(wù)中涉及到的數(shù)據(jù)和算子分別放入數(shù)據(jù)倉(cāng)庫(kù)和算子倉(cāng)庫(kù), 開(kāi)發(fā)推薦業(yè)務(wù)時(shí)根據(jù)推薦算法的業(yè)務(wù)流程從這兩個(gè)倉(cāng)庫(kù)中拿出對(duì)應(yīng)的“積木”來(lái)組裝業(yè)務(wù), 參考下圖。 基于 Doraemon 框架的算法組件化開(kāi)發(fā)方式 基于上面的設(shè)計(jì)原則,,推薦業(yè)務(wù)可以抽象為“數(shù)據(jù)流”和“算子流”兩個(gè)流的相互交織,,利用 Doraemon 框架構(gòu)建一個(gè)完善的推薦業(yè)務(wù)流程如下圖。 基于 Doraemon 框架開(kāi)發(fā)的推薦業(yè)務(wù),,數(shù)據(jù)流與算子流相互交織,,非常清晰 另外,如果公司做產(chǎn)品線的拓展,,比如今日頭條拓展新產(chǎn)品抖音,、西瓜視頻、火山小視頻等,,可以基于上面所提到的“推薦算法的范式”實(shí)現(xiàn)很多推薦業(yè)務(wù) (比如猜你喜歡,、相似影片,、熱門(mén)推薦等),將這些業(yè)務(wù)封裝到一個(gè) DoraemonBiz.jar 的 jar 包,,這樣這些能力可以直接平移到新的產(chǎn)品線,,賦能新業(yè)務(wù)。這種操作就是二次封裝,,具有極大的威力,,下面給一個(gè)形象的圖示來(lái)說(shuō)明這種二次賦能的邏輯,讓大家更好理解這種思想,。 通過(guò)二次封裝,,構(gòu)建推薦業(yè)務(wù)單元,賦能到新產(chǎn)品矩陣 從上面的介紹,,相信大家已經(jīng)感受到了 Doraemon 框架的威力了,,有了這套框架,我們可以高效的開(kāi)發(fā)算法了,,如果有新的技術(shù)突破,,我們可以將這些新算法實(shí)現(xiàn)并封裝到 Doraemon 框架中,不斷拓展 Doraemon 的能力,,讓 Doraemon 成長(zhǎng)為具備更多技能 (算子) 的巨人! 推薦系統(tǒng)工程實(shí)現(xiàn)的設(shè)計(jì)哲學(xué) 要為推薦系統(tǒng)設(shè)計(jì)一套好用高效的工程框架并不容易,,往往需要踩過(guò)很多坑,,通過(guò)多年經(jīng)驗(yàn)的積累才能深刻領(lǐng)悟。前面在“推薦系統(tǒng)架構(gòu)設(shè)計(jì)”一節(jié)已經(jīng)說(shuō)了很多構(gòu)建 Doraemon 框架的設(shè)計(jì)原則,,本節(jié)試圖從整個(gè)推薦業(yè)務(wù)工程實(shí)現(xiàn)的角度給出一些可供參考的設(shè)計(jì)哲學(xué), 以便大家可以更好的將推薦系統(tǒng)落地到業(yè)務(wù)中,。
個(gè)人認(rèn)為好的工程實(shí)現(xiàn)需要滿足如下幾個(gè)原則:
下圖是作者團(tuán)隊(duì)開(kāi)發(fā)的深度學(xué)習(xí)猜你喜歡推薦系統(tǒng) (基于 Tensorflow 開(kāi)發(fā)) 的業(yè)務(wù)流程圖, 對(duì)應(yīng)的代碼組織結(jié)構(gòu)和對(duì)應(yīng)的數(shù)據(jù)在本地文件系統(tǒng)中的存儲(chǔ)結(jié)構(gòu),基本按照上述設(shè)計(jì)原則來(lái)做,,看起來(lái)很清晰,,方便理解和問(wèn)題排查。 業(yè)務(wù)流,,數(shù)據(jù)存儲(chǔ),,代碼工程結(jié)構(gòu)保持對(duì)應(yīng) 近實(shí)時(shí)個(gè)性化推薦 推薦系統(tǒng)在實(shí)際業(yè)務(wù)實(shí)現(xiàn)時(shí)一般是 T+1 推薦 (每天更新一次推薦,今天利用昨天之前的數(shù)據(jù)計(jì)算用戶的推薦結(jié)果),,隨著移動(dòng)互聯(lián)網(wǎng)的深入發(fā)展,,特別是今日頭條和快手等新聞,短視頻 APP 的流行,,越來(lái)越多的公司將 T+1 和實(shí)時(shí)策略相結(jié)合 (比如采用流行的 lambda 架構(gòu),,下圖是一個(gè)采用 lambda 架構(gòu)的推薦架構(gòu)圖,供參考) 將推薦系統(tǒng)做到了近實(shí)時(shí)推薦, 根據(jù)用戶的興趣變化實(shí)時(shí)為用戶提供個(gè)性化推薦,。像新聞,、短視頻這類(lèi)滿足用戶碎片化時(shí)間需求的產(chǎn)品,做到實(shí)時(shí)個(gè)性化可以極大提升用戶體驗(yàn),,這樣可以更好地滿足用戶需求,,提升用戶在產(chǎn)品的停留時(shí)間。這里我們只是簡(jiǎn)單的介紹了一下實(shí)時(shí)個(gè)性化推薦,,我在后續(xù)的系列文章中會(huì)詳細(xì)講解實(shí)時(shí)推薦系統(tǒng),。 推薦系統(tǒng)的 lambda 架構(gòu) 推薦系統(tǒng)業(yè)務(wù)落地需要關(guān)注的問(wèn)題 推薦系統(tǒng)要想很好的落地產(chǎn)生價(jià)值,除了算法實(shí)現(xiàn),、核心模塊和支撐模塊構(gòu)建外, 還有很多方面需要考慮,,下面簡(jiǎn)單描述一下其他需要考慮的點(diǎn), 這些點(diǎn)都是非常重要的, 深入理解這些問(wèn)題,對(duì)真正發(fā)揮出推薦系統(tǒng)的價(jià)值有非常大的幫助,。
好的 UI 和交互的價(jià)值甚至比好的算法大很多
(1)推薦系統(tǒng)可以提升用戶體驗(yàn)和留存,,讓用戶更快更便捷找到想看的電影,減少找片時(shí)間:可以統(tǒng)計(jì)出推薦產(chǎn)生的播放量,,總播放時(shí)長(zhǎng),,人均播放時(shí)長(zhǎng),這些數(shù)值指標(biāo)跟大盤(pán)的平均指標(biāo)對(duì)比,,可以體現(xiàn)推薦系統(tǒng)的優(yōu)勢(shì),,推薦系統(tǒng)的這些指標(biāo)在大盤(pán)的占比也可以衡量推薦系統(tǒng)所占的分量; (2)推薦系統(tǒng)可以創(chuàng)造收益:通過(guò)精準(zhǔn)推薦會(huì)員節(jié)目,,用戶通過(guò)推薦的會(huì)員節(jié)目購(gòu)買(mǎi)會(huì)員可以產(chǎn)生會(huì)員收益,;在推薦的節(jié)目上做貼片廣告,用戶播放推薦的節(jié)目讓廣告曝光,,可以產(chǎn)生廣告收益,;這兩塊收益需要量化出來(lái),體現(xiàn)出推薦系統(tǒng)支撐商業(yè)變現(xiàn)的能力,; 推薦系統(tǒng)的技術(shù)選型 根據(jù)第二節(jié)推薦系統(tǒng)與大數(shù)據(jù)的描述,,推薦業(yè)務(wù)落地依賴(lài)大數(shù)據(jù)技術(shù), 推薦系統(tǒng)的中間過(guò)程和結(jié)果的存儲(chǔ)需要依賴(lài)數(shù)據(jù)庫(kù),,推薦系統(tǒng)接口實(shí)現(xiàn)需要依賴(lài) web 服務(wù)器,。這些方面需要的軟件和技術(shù)在前面基本都有簡(jiǎn)單介紹,也都有開(kāi)源的軟件供選擇,,對(duì)創(chuàng)業(yè)公司來(lái)說(shuō),,沒(méi)有資源和人力去自研相關(guān)技術(shù),選擇合適的開(kāi)源技術(shù)是最好最有效的方案,。 本節(jié)詳細(xì)描述一下推薦系統(tǒng)算法開(kāi)發(fā)所依賴(lài)的機(jī)器學(xué)習(xí)軟件選型, 方便大家在工程實(shí)踐中參考選擇,。 由于推薦系統(tǒng)落地強(qiáng)依賴(lài)于大數(shù)據(jù)相關(guān)技術(shù),而最流行的開(kāi)源大數(shù)據(jù)技術(shù)基于 Hadoop 生態(tài)系統(tǒng),,所以推薦算法技術(shù)選型要圍繞大數(shù)據(jù)生態(tài)系統(tǒng)來(lái)發(fā)展,,可以無(wú)縫的將大數(shù)據(jù)和人工智能結(jié)合起來(lái),。 基于大數(shù)據(jù)生態(tài)系統(tǒng)有很多機(jī)器學(xué)習(xí)軟件可以用來(lái)開(kāi)發(fā)推薦系統(tǒng),比如 Apache 旗下的工具 SparkMLlib,、Flink-ML,、Mahout、Storm,、SystemML,。以及可以運(yùn)行在 Hadoop 生態(tài)系統(tǒng)上的 DeepLearning4J(Java 深度學(xué)習(xí)軟件),TonY(TensorflowonYARN,,LinkedIn 開(kāi)源的),,CaffeOnSpark(雅虎開(kāi)源的),BigDL(基于 Spark 上的深度學(xué)習(xí),,Intel 開(kāi)源的) 等,。 隨著人工智能第三次浪潮的到來(lái),以 Tensorflow,,Pytorch,,MXNet 等為代表的深度學(xué)習(xí)工具得到工業(yè)界的大量采用,Tensorflow 上有關(guān)于推薦系統(tǒng)、排序框架的模塊和源代碼,,可供學(xué)習(xí)參考,,通過(guò)簡(jiǎn)單修改可以直接用于推薦業(yè)務(wù)中。 另外像 xgboost,scikit-learn,,H2O,,gensim 等框架也是非常流行實(shí)用的框架,可以用于實(shí)際工程項(xiàng)目中,。 國(guó)內(nèi)也有很多開(kāi)源的機(jī)器學(xué)習(xí)框架,,騰訊開(kāi)源的 Angel(基于參數(shù)服務(wù)器的分布式機(jī)器學(xué)習(xí)平臺(tái),可以直接運(yùn)行在 yarn 上),,百度開(kāi)源的 PaddlePaddle(深度學(xué)框架),,阿里開(kāi)源的 Euler(圖深度學(xué)習(xí)框架),X-DeepLearning(深度學(xué)習(xí)框架),,也值得大家學(xué)習(xí)參考,。 作者所在公司主要采用 SparkMllib,,Tensorflow,,gensim 等框架來(lái)實(shí)現(xiàn)推薦系統(tǒng)算法的開(kāi)發(fā)。 至于開(kāi)發(fā)語(yǔ)言,,Hadoop 生態(tài)圈基本采用 Java/Scala,,深度學(xué)習(xí)生態(tài)圈基本采用 Python(Tensorflow、Pytorch 都采用 python 作為用戶使用軟件的開(kāi)發(fā)語(yǔ)言,,但它們的底層還是用 C++ 開(kāi)發(fā)的),,所以采用 Java/Scala,,Python 作為開(kāi)發(fā)語(yǔ)言有很多開(kāi)源框架可供選擇,相關(guān)的生態(tài)系統(tǒng)也很完善,。 隨著大數(shù)據(jù),、云計(jì)算、深度學(xué)習(xí)驅(qū)動(dòng)的人工智能浪潮的發(fā)展,,越來(lái)越多的頂級(jí)科技公司開(kāi)源出很多好用有價(jià)值的機(jī)器學(xué)習(xí)軟件工具,,可以直接用于工程中,也算是創(chuàng)業(yè)公司的福音,。 推薦系統(tǒng)的未來(lái)發(fā)展 隨著移動(dòng)互聯(lián)網(wǎng),、物聯(lián)網(wǎng)的發(fā)展,5G 技術(shù)的商用,,未來(lái)推薦系統(tǒng)一定是互聯(lián)網(wǎng)公司產(chǎn)品的標(biāo)配技術(shù)和標(biāo)準(zhǔn)解決方案,,推薦系統(tǒng)會(huì)被越來(lái)越多的公司采用,用戶也會(huì)越來(lái)越依賴(lài)推薦系統(tǒng)來(lái)做出選擇,。 在工程實(shí)現(xiàn)上,,推薦系統(tǒng)會(huì)越來(lái)越采用實(shí)時(shí)推薦技術(shù)來(lái)更快的響應(yīng)用戶的興趣 (需求) 變化,給用戶強(qiáng)感知,,提升用戶體驗(yàn),,增加公司收益。 個(gè)人覺(jué)得未來(lái)會(huì)有專(zhuān)門(mén)的開(kāi)源的推薦引擎出現(xiàn),,并且是提供一站式服務(wù),,讓搭建推薦系統(tǒng)成本越來(lái)越低。同時(shí)隨著人工智能的發(fā)展,,越來(lái)越多的云計(jì)算公司會(huì)提供推薦系統(tǒng)的 PAAS 或者 SAS 服務(wù) (現(xiàn)在就有很多創(chuàng)業(yè)公司提供推薦服務(wù), 只不過(guò)還做的不夠完善),,創(chuàng)業(yè)公司可以直接購(gòu)買(mǎi)推薦系統(tǒng)云服務(wù),讓搭建推薦系統(tǒng)不再是技術(shù)壁壘,,到那時(shí)推薦系統(tǒng)的價(jià)值將會(huì)大放異彩,!到那時(shí), 不是每個(gè)創(chuàng)業(yè)公司都需要推薦算法開(kāi)發(fā)工程師了,只要你理解推薦算法原理, 知道怎么將推薦系統(tǒng)引進(jìn)產(chǎn)品中創(chuàng)造價(jià)值, 就可以直接采購(gòu)?fù)扑]云服務(wù),。就像李開(kāi)復(fù)博士最新的暢銷(xiāo)書(shū)《AI 未來(lái)》中所說(shuō)的,,很多工作會(huì)被 AI 取代,所以推薦算法工程師也要有危機(jī)意識(shí),,要不斷培養(yǎng)對(duì)業(yè)務(wù)的敏感度,,對(duì)業(yè)務(wù)的理解,短期是無(wú)法被機(jī)器取代的,,到時(shí)候說(shuō)不定可以做一個(gè)推薦算法商業(yè)策略師,。 小結(jié) 本文是作者多年推薦系統(tǒng)學(xué)習(xí)、實(shí)踐經(jīng)驗(yàn)的總結(jié),希望能夠幫助到即將入行推薦系統(tǒng)開(kāi)發(fā)的讀者或者推薦系統(tǒng)開(kāi)發(fā)人員,,讓大家少走彎路,。由于作者才疏學(xué)淺,雖殫精竭慮,,不當(dāng)之處在所難免,,歡迎大家評(píng)判指正,以便作者有所提高,! 作者介紹:gongyouliu |
|
來(lái)自: 麓山館藏 > 《大數(shù)據(jù)應(yīng)用》