當下,個性化推薦成了互聯網產品的標配。可是,人們對推薦該如何來作,也就是推薦技術自己,還不甚瞭解。爲此,好學的你確定在收藏着朋友圈裏流傳的相關文章,轉發着微博上的相關討論話題,甚至還會不斷奔走在各類大小行業會議之間,聽着大廠職工們講那些乾貨。我知道,這樣碎片化的吸取,增長了知識的同時,也增長了焦慮。由於技術的不平等普遍存在於業界內,推薦系統也不例外。推薦系統從搜索引擎借鑑了很多技術和思想,好比內容推薦有很多技術就來自搜索引擎, 由 Amazon 發揚光大的。推薦系統也是如今熱門的人工智能分支之一,但凡人工智能類的落地,都須要具有這幾個基本元素才行:數據、算法、場景、計算力。推薦系統也不例外,而恰好,如今的時代,這些元素的得到成本相比十年前已經小了不少。將來隨着各類硬件設備愈來愈智能,萬物互聯得愈來愈緊密,人們的個性化需求、場景的多樣性、數據的複雜性都對推薦系統提出了更高的要求。面試
推薦系統歸納一下,其實就是如下的的目標主要包括: 算法
基於這些目標,推薦系統包括四種推薦方式:網絡
其中,前三者是和機器學習沒有任何關係的,但倒是推薦效果最好的三種方式。通常說來,這部份內容應該佔到總的推薦內容的80%左右,另外20%則是對長尾內容的個性化推薦。session
業務網關,推薦服務的入口,負責推薦請求的合法性檢查,組裝請求響應的結果。架構
推薦引擎,推薦系統核心,包括online邏輯,召回、過濾、特徵計算、排序、 多樣化等處理過程。框架
一、請求的刷新從gateway,通過流量分配模塊,傳到業務gateway,業務gateway支持http,tcp(使用thirtf協議或者protobuf 協議)等多種類型接口;機器學習
二、用戶行爲數據,從gateway到Flume agent,而後到kafka,爲後面online,realtime userprofile部分的提供實時數據,也爲offline部分的數據存儲系統提供數據。tcp
本文從大框架上介紹推薦系統架構,在許多公司面試中會給你一個推薦或者數據挖掘的問題,好比讓你簡單設計一個feed流推薦系統,因此須要對推薦系統的總體框架要了解。下面是一個推薦系統的主要部分工具
從框架的角度看,推薦系統基本能夠分爲數據層、召回層、排序層。學習
數據層包括數據生成和數據存儲,主要是利用各類數據處理工具對原始日誌進行清洗,處理成格式化的數據,落地到不一樣類型的存儲系統中,供下游的算法和模型使用。
sessionlog:對原始數據進行清洗合併,sessionlog通常就是清洗合併後的數據,後續的算法和統計都是根據sessionlog進行再加工。
userprofile:對用戶屬性和行爲等信息進行採集和統計,爲後續算法提供特徵支持。
itemDoc:對視頻、商品等屬性、曝光、點擊等字段進行統計, 爲後續算法提供特徵支持。
召回層主要是從用戶的歷史行爲、實時行爲等角度利用各類觸發策略產生推薦的候選集,對不一樣的策略和算法產生的候選集進行融合並按照產品規則進行過濾,通常融合和過濾後的候選集仍是比較多的,一次線上請求過來以後線上系統沒法對那麼多的候選集進行排序,因此在召回層通常還會有粗排序,對融合的候選集進行一次粗排序,過濾掉粗排分數較低的候選集。
排序層主要是利用機器學習的模型對召回層篩選出來的候選集進行精排序。
數據決定了特徵,特徵決定了效果的上限,模型決定了接近效果上限的程度。
行爲類別 |
行爲表現 |
用戶主動行爲 |
點擊、分享、評分 |
用戶畫像 |
用戶屬性(性別、年齡、收入)、視頻分類興趣分佈、地域、時間 |
負反饋 |
負評 |
協同過濾(Collaborative Filtering)可說是推薦系統裏資歷最老最經典的一種算法了,如 userCF、itemCF。原理是基於用戶對內容的行爲協同,爲某一用戶沒有看過的某條內容做出點擊預測。實現方法有不少種,如傳統的 Memory-based 方法、基於矩陣分解的方法(LFM/SVD/SDV++)、基於 DNN 的方法。
Memory-based 方法很簡單,是基於統計的一種算法。以 item-based CF 舉例:
然而 Memory-based 方法不能解決的問題是,當咱們的矩陣很稀疏時,大多數 item 和 item 之間是沒有關聯的(類似度爲0),這也就形成最後咱們召回的內容覆蓋率很低,也許大多集中在頭部內容。因而基於矩陣分解的方法誕生了。
MF(Matrix Factorization)的原理是將一個高維稀疏矩陣分解成兩個低秩矩陣,其中 k 被稱爲隱向量維度。在原始的稀疏矩陣 R 中,大部分二階特徵的關係係數是缺失的。而經過訓練模型最小化 R 和預測矩陣 R‘ 的損失(如最小二乘),能夠求出任意 Ri,j 的值。
MF 可說是大部分推薦系統裏協同過濾的標杆方法了,但仍然存在一些問題。好比過於稀疏的矩陣對於最後評分的預測依然有很大影響,而且當用戶特徵或者內容特徵缺失(即冷啓動)時,沒法進行合理的預測。此時,基於深度學習的一些嘗試開始了。如基於DNN實現,能夠很輕易地將內容的一些語義特徵,以及用戶的固有屬性與行爲特徵拼接在一塊兒做爲神經網絡輸入來訓練,能夠在以前行爲協同的前提下加入對內容特徵的學習,從而解決冷啓動問題。感興趣的同窗能夠閱讀相關論文,在此不作展開。
主要是以以前 NLP 獲得的內容畫像爲基礎,以item 對應分類/主題/關鍵詞的權重創建召回,依據用戶畫像的相應權重和內容畫像的距離排序召回。
基於用戶羣
首先咱們須要對用戶分羣,聚類的方案有不少,
一、對item進行向量化(w2v)而後對item進行聚類,用戶對item的行爲就能夠把item的簇賦值到user身上。
二、直接對用戶進行向量化,好比降維。
總之最終的目的就是將用戶embedding成一個向量,而後在對用戶向量進行聚類,通常k-means就能夠勝任大部分的場景。
tag-itemList,對每一個用戶的tag進行遍歷,而後經過倒排鏈快速找到含有該tag的itemList而後topN抽取。
爲告終合不一樣觸發算法的優勢,同時提升候選集的多樣性和覆蓋率,須要將不一樣的觸發算法融合在一塊兒。常見的融合的方法有如下幾種[3]:
目前咱們使用的方法集成了調製和分級兩種融合方法,不一樣的算法根據歷史效果表現給定不一樣的候選集構成比例,同時優先採用效果好的算法觸發,若是候選集不夠大,再採用效果次之的算法觸發,依此類推。
如上所述,對於不一樣算法觸發出來的候選集,只是根據算法的歷史效果決定算法產生的item的位置顯得有些簡單粗暴,同時,在每一個算法的內部,不一樣item的順序也只是簡單的由一個或者幾個因素決定,這些排序的方法只能用於第一步的初選過程,最終的排序結果須要藉助機器學習的方法,使用相關的排序模型,綜合多方面的因素來肯定。
非線性模型能較好的捕捉特徵中的非線性關係,但訓練和預測的代價相對線性模型要高一些,這也致使了非線性模型的更新週期相對要長。反之,線性模型對特徵的處理要求比較高,須要憑藉領域知識和經驗人工對特徵作一些先期處理,但由於線性模型簡單,在訓練和預測時效率較高。所以在更新週期上也能夠作的更短,還能夠結合業務作一些在線學習的嘗試。在咱們的實踐中,非線性模型和線性模型都有應用。
目前咱們主要採用了非線性的樹模型gbdt,相對於線性模型,非線性模型能夠更好的處理特徵中的非線性關係,沒必要像線性模型那樣在特徵處理和特徵組合上花費比較大的精力。gbdt是一個加性模型,由不少個樹組成,後面的樹不斷擬合前一顆樹的殘差,並且每個樹帶入的都是全訓練集,由此能夠減少過擬合的影響。後續的文章會單獨總結gbdt的應用和落地細節、公式推導、面試問點等細節.
目前應用比較多的線性模型非Logistic Regression莫屬了。爲了能實時捕捉數據分佈的變化,咱們引入了online learning,接入實時數據流,使用google提出的FTRL[5]方法對模型進行在線更新。後續也會單獨寫一篇FTRL的應用、特徵、落地、面試問點等細節。
主要的步驟以下:
在咱們目前的重排序模型中,大概分爲如下幾類特徵:
對於非線性模型,上述特徵能夠直接使用;而對於線性模型,則須要對特徵值作一些分桶、歸一化等處理,使特徵值成爲0~1之間的連續值或01二值。
一、推薦系統的架構流程圖和每個模塊的做用必定要了解,通常會讓你一邊畫流程圖一邊講解每一個模塊。
二、召回模塊通常就是在作候選集篩選和粗排序,緣由是item太多了,一個user的請求過來線上系統不能在100ms之內對全部的item進行排序。
後面的章節會針對各個模塊進行具體的算法和架構講解、踩過的坑、落地、面試問題等。
轉載請註明——redbear博客