推薦系統是利用電子商務網站向客戶提供商品信息和建議,幫助用戶決定應該購買什麼產品,模擬銷售人員幫助客戶完成購買過程。個性化推薦是根據用戶的興趣特色和購買行爲,向用戶推薦用戶感興趣的信息和商品。git
隨着電子商務規模的不斷擴大,商品個數和種類快速增加,顧客須要花費大量的時間才能找到本身想買的商品。這種瀏覽大量無關的信息和產品過程無疑會使淹沒在信息過載問題中的消費者不斷流失。github
爲了解決這些問題,個性化推薦系統應運而生。個性化推薦系統是創建在海量數據挖掘基礎上的一種高級商務智能平臺,以幫助電子商務網站爲其顧客購物提供徹底個性化的決策支持和信息服務。面試
常見的推薦欄位例如:淘寶的猜你喜歡、看了又看、推薦商品,美團的首頁推薦、附近推薦等。算法
推薦系統是比較偏向於工程類的系統,要作得更加的精確,須要的不只僅是推薦算法,還有用戶意圖識別、文本分析、行爲分析等,是一個綜合性很強的系統。數據庫
本節介紹的幾種推薦系統架構,並非互相獨立的關係,實際的推薦系統可能會用到其中一種或者幾種的架構。在實際設計的過程當中,讀者能夠把本文介紹的架構做爲一個設計的起點,更多地結合自身業務特色進行獨立思
考,從而設計出適合自身業務的系統。服務器
根據響應用戶行爲的速度不一樣,推薦系統能夠大體分爲基於離線訓練和在線訓練的推薦系統。網絡
於離線訓練的推薦系統架構是最多見的一種推薦系統架構。這裏的「離線」訓練指的是使用歷史一段時間( 好比周或者幾周 )的數據進行訓練,模型迭代的週期較長(通常 以小時爲單位 )。模型擬合的是用戶的中長期興趣。架構
以下圖所示, 一個典型的基於離線訓練的推薦系統架構由數據上報、離線訓練、在線存儲、實時計算和 A/B 測試這幾個模塊組成。其中,數據上報和離線訓練組成了監督學習中的學習系統,而實時計算和 A/B 測試組成了預測系統。另外,除了模型以外,還有一個在線存儲模塊,用於存儲模型和模型須要的特徵信息供實時計算模塊調用。圖中的各個模塊組成了訓練和預測兩條數據流,訓練的數據流蒐集業務的數據最後生成模型存儲於在線存儲模塊;預測的數據流接受業務的預測請求,經過 A/B 測試模塊訪問實時計算模塊獲取預測結果。機器學習
數據上報:據上報模塊的做用是蒐集業務數據組成訓練樣本。通常分爲收集、驗證、清洗和轉換幾個步驟。將收集的數據轉化爲訓練所須要的樣本格式,保存到離線存儲模塊。分佈式
離線訓練:線訓練模塊又細分爲離線存儲和離線計算。實際業務中使用的推薦系統通常都須要處理海量的用戶行爲數據,因此離線存儲模塊須要有一個分佈式的文件系統或者存儲平臺來存儲這些數據。離線計算常見的操做有:樣本抽樣、特徵工程、模型訓練、類似度計算等。
在線存儲:由於線上的服務對於時延都有嚴格的要求。好比,某個用戶打開手機 APP ,他確定但願APP 可以快速響應,若是耗時過長,就會影響用戶的體驗。通常來講,這就要求推薦系統在幾十毫秒之內處理完用戶請求返回推薦結果,因此,針對線上的服務,須要有一個專門的在線存儲模塊,負責存儲用於線上的模型和特徵數據 。
實時推薦:實時推薦模塊的功能是對來自業務的新請求進行預測。1.獲取用戶特徵;2.調用推薦模型;3.結果排序。
在實際應用中,由於業務的物品列表太大,若是實時計算對每 個物品使用複雜的模型進行打分,就有可能耗時過長而影響用戶滿意度。因此,一種常見的作法是將推薦列表生成分爲召回和排序兩步。召回的做用是從大量的候選物品中(例如上百萬)篩選出一批用戶較可能喜歡的候選集 (通常是幾百)。排序的做用是對召回獲得的相對較小的候選集使用排序模型進行打分。更進一步,在排序獲得推薦列表後,爲了多樣性和運
營的一些考慮,還會加上第三步重排過濾,用於對精排後的推薦列表進行處理。
A/B測試:對於互聯網產品來講, A/B 測試基本上是一個必備的模塊,對於推薦系統來講也不例外,它能夠幫助開發人員評估新算法對客戶行爲的影響。除了 離線的指標外,一個新的推薦算法上線以前 般都會通過 A/B 測試來測試新算法的有效性。
下圖是與之對應的實際系統中各個組件的流轉過程。須要注意的是生成推薦列表就已經作完了召回和排序的操做,業務層直接調用API就能夠獲得這個推薦列表。
對於業務來講,咱們但願用戶對於上 個廣告的反饋 (喜歡或者不 歡,有沒有點擊 ,能夠很快地用於下
一個廣告的推薦中。這就要求咱們用另 種方法來解決這個問題,這個方法就是在線訓練。
基於在線訓練的推薦系統架構適合於廣告和電商等高維度大數據量且對實時性要求很高的場景 相比較基於離線訓練的推薦系統,基於在線訓練的推薦系統不區分訓練和測試階段,每一個回合都在學習,經過實時的反饋來調整策略。 方面,在線訓練要求其樣本、特徵和模型的處理都是實時的,以便推薦的內容更快地反映用戶實時的喜愛;另外一方面,由於在線訓練井不須要將全部的訓練數據都存儲下來,因此不須要巨大的離線存儲開銷,使得系統具備很好的伸縮性,能夠支持超大的數據量和模型。
要訓練推薦模型,就須要先收集用戶的行爲數據生成特徵向量之後才能進行訓練,而一個特徵向量由特徵以及特徵的權重組成,在利用用戶行爲計算特徵向量時須要考慮如下因素。
協同過濾算法起源於 1992 年,被 Xerox 公司用於個性化定製郵件系統。Xerox 司的用戶須要在數十種主題中選擇三到五種主題,協同過濾算法根據不一樣的主題過濾郵件,最終達到個性化的目的。
協同過濾算法分爲基於物品的協同過濾和基於用戶的協同過濾,輸出結果爲 TOPn 的推薦列表。
基於物品的協同過濾算法的核心思想:給用戶推薦那些和他們以前喜歡的物品類似的物品。
基於物品的協同過濾算法首先計算物品之間的類似度, 計算類似度的方法有如下幾種:
基於共同喜歡物品的用戶列表計算
\[w_{ij}=\frac{|N(i)\cap{}N(j)|}{\sqrt{|N(i)|*|N(j)|}}\]
在此,分母中 N(i) 是購買物品 i 的用戶數,N(j) 是購買物品 j 的用戶數,而分子 \(N(i)\cap{}N(j)\) 是同時購買物品i 和物品 j 的用戶數。。可見上述的公式的核心是計算同時購買這件商品的人數比例 。當同時購買這兩個物品人數越多,他們的類似度也就越高。另外值得注意的是,在分母中咱們用了物品總購買人數作懲罰,也就是說某個物品可能很熱門,致使它常常會被和其餘物品一塊兒購買,因此除以它的總購買人數,來下降它和其餘物品的類似分數。
基於餘弦的類似度計算
上面的方法計算物品類似度是直接使同時購買這兩個物品的人數。可是也有可能存在用戶購買了但不喜歡的狀況 因此若是數據集包含了具體的評分數據 咱們能夠進一步把用戶評分引入到類似度計算中 。
\[w_{ij}=cos\theta=\frac{N_i*N_j}{||N_i||||N_j||}=\frac{\sum_{k=1}^{len}(n_{ki}*n_{kj})}{\sqrt{\sum_{k=1}^{len}n_{ki}^2}*\sqrt{\sum_{k=1}^{len}n_{kj}^2}}\]
其中 \(n_{ki}\) 是用戶 k 對物品 i 的評分,若是沒有評分則爲 0。
熱門物品的懲罰
對於熱門物品的問題,能夠用以下公式解決:
\[w_{ij}=\frac{|N(i)\cap{}N(j)|}{|N(i)|^\alpha*|N(j)|^{1-\alpha}}\]
當 \(\alpha\in(0,0.5)\) 時,N(i) 越小,懲罰得越厲害,從而會使熱 物品相關性分數降低。
基於用戶的協同過濾(User CF )的原理實際上是和基於物品的協同過濾相似的。所不一樣的是,基於物品的協同過濾的原理是用戶 U 購買了 A 物品,推薦給用戶 U 和 A 類似的物品 B、C、D。而基於用戶的協同過濾,是先計算用戶 U 與其餘的用戶的類似度,而後取和 U 最類似的幾個用戶,把他們購買過的物品推薦給用戶U。
爲了計算用戶類似度,咱們首先要把用戶購買過物品的索引數據轉化成物品被用戶購買過的索引數據,即物品的倒排索引:
創建好物品的倒排索引後,就能夠根據類似度公式計算用戶之間的類似度:
\[w_{ab}=\frac{|N(a)\cap{}N(b)|}{\sqrt{|N(a)|*|N(b)|}}\]
其中 N(a) 表示用戶 a 購買物品的數量,N(b) 表示用戶 b 購買物品的數量,N(a)∩N(b) 表示用戶 a 和 b 購買相同物品的數量。有了用戶的類似數據,針對用戶 U 挑選 K 個最類似的用戶,把他們購買過的物品中,U 未購買過的物品推薦給用戶 U 便可。
上述計算會獲得一個類似度矩陣,而這個矩陣的大小和緯度都是很大的,須要進行降維處理,用到的是SVD的降維方法,具體能夠參考我以前寫的降維方法:2.5 降維方法
基於稀疏自編碼的矩陣分解
矩陣分解技術在推薦領域的應用比較成熟,可是經過上一節的介紹,咱們不難發現矩陣分解本質上只經過一次分解來對 原矩陣進行逼近,特徵挖掘的層次不夠深刻。另外矩陣分解也沒有運用到物品自己的內容特徵,例如書本的類別分類、音樂的流派分類等。隨着神經網絡技術的興起,筆者發現經過多層感知機,能夠獲得更加深度的特徵表示,而且能夠對內容分類特徵加以應用。首先,咱們介紹一下稀疏自編碼神經網絡的設計思路。
基礎的自編碼結構
最簡單的自編碼結構以下圖,構造個三層的神經網絡,咱們讓輸出層等於輸入層,且中間層的維度遠低於輸入層和輸出層,這樣就獲得了第一層的特徵壓縮。
簡單來講自編碼神經網絡嘗試學習中間層約等於輸入層的函數。換句話說,它嘗試逼近一個恆等函數。若是網絡的輸入數據是徹底隨機的,好比每個輸入都是一個跟其餘特徵徹底無關的獨立同分布高斯隨機變 ,那麼這一壓縮表示將會很是難於學習。可是若是輸入數據中隱含着 些特定的結構,好比某些輸入特徵是彼此相關的,那麼這一算法就能夠發現輸入數據中的這些相關性。
多層結構
基於以上的單層隱藏層的網絡結構,咱們能夠擴展至多層網絡結構,學習到更高層次的抽象特徵。
推薦系統中一個重要的分支,隱語義建模。隱語義模型LFM:Latent Factor Model,其核心思想就是經過隱含特徵聯繫用戶興趣和物品。
過程分爲三個部分,將物品映射到隱含分類,肯定用戶對隱含分類的興趣,而後選擇用戶感興趣的分類中的物品推薦給用戶。它是基於用戶行爲統計的自動聚類。
隱語義模型在Top-N推薦中的應用十分普遍。經常使用的隱語義模型,LSA(Latent Semantic Analysis),LDA(Latent Dirichlet Allocation),主題模型(Topic Model),矩陣分解(Matrix Factorization)等等。
首先經過一個例子來理解一下這個模型,好比說有兩個用戶A和B,目前有用戶的閱讀列表,用戶A的興趣涉及偵探小說,科普圖書以及一些計算機技術書,而用戶B的興趣比較集中在數學和機器學習方面。那麼如何給A和B推薦圖書呢?
對於UserCF,首先須要找到和他們看了一樣書的其餘用戶(興趣類似的用戶),而後在給他們推薦那些用戶喜歡的其餘書。
對於ItemCF,須要給他們推薦和他們已經看的書類似的書,好比用戶B 看了不少數據挖掘方面的書,那麼能夠給他推薦機器學習或者模式識別方面的書。
還有一種方法就是使用隱語義模型,能夠對書和物品的興趣進行分類。對於某個用戶,首先獲得他的興趣分類,而後從分類中挑選他可能喜歡的物品。
爲了解決上面的問題,研究人員提出:爲何咱們不從數據出發,自動地找到那些類,而後進行個性化推薦,隱語義分析技術由於採起基於用戶行爲統計的自動聚類,較好地解決了上面的問題。隱語義分析技術從誕生到今天產生了不少著名的模型和方法,其中和推薦技術相關的有pLSA,LDA,隱含類別模型(latent class model), 隱含主題模型(latent topic model), 矩陣分解(matrix factorization)。
LFM經過以下公式計算用戶 u 對物品 i 的興趣:
\[preference(u,i)=r_{ui}=p_u^Tq_i=\sum_{f=1}^Fp_{u,k}q_{i,k}\]
這個公式中 \(p_{u,k}\) 和 \(q_{i,k}\) 是模型的參數,其中 \(p_{u,k}\) 度量了用戶 u 的興趣和第 k 個隱類的關係,而\(q_{i,k}\)度量了第 k 個隱類和物品 i 之間的關係。那麼,下面的問題就是如何計算這兩個參數。
對最優化理論或者機器學習有所瞭解的讀者,可能對如何計算這兩個參數都比較清楚。這兩個參數是從數據集中計算出來的。要計算這兩個參數,須要一個訓練集,對於每一個用戶u,訓練集裏都包含了用戶u喜歡的物品和不感興趣的物品,經過學習這個數據集,就能夠得到上面的模型參數。
在工業應用中,推薦系統一般可分爲兩部分,召回和排序。協同過濾屬於召回的算法,從召回中獲得一個比較小的推薦列表,而後通過排序以後纔會輸出到最終的推薦列表裏,是一個有序的推薦列表。
這個過程會從幾千萬 item 中篩選出幾百或者上千的候選集,而後在排序階段選出30個給到每位用戶。這個排序可理解爲一個函數,F(user, item, context),輸入爲用戶、物品、環境,輸出一個0到1之間的分數,取分數最高的幾首。這一過程一般稱爲 CTR 預估。那麼 F 函數常見的運做形式有:
Logistic Regression
最簡單的是邏輯迴歸(Logistic Regression),一個廣義線性模型。拿某 user 的用戶畫像(一個向量)好比[3, 1]
,拼接上某 item 的物品畫像好比[4, 0]
,再加上表明 context 的向量[0, 1, 1]
後獲得[3, 1, 4, 0, 0, 1, 1]
,若該 user 曾與該 item 發生過聯繫則 label 爲1,這些加起來是一個正樣本,同時能夠將用戶「跳過」的 item 或熱門的卻沒有與用戶產生過聯繫的 item 做爲負樣本,label 爲0。按照這樣的輸入和輸出就能夠訓練出排序算法了。詳細模型見:2. 邏輯迴歸
GBDT
使用梯度提高決策樹(GBDT) 的方案也能夠解決這個排序的問題,只是模型與 LR 不同。GBDT做爲集成模型,會使用多棵決策樹,每棵樹去擬合前一棵樹的殘差來獲得很好的擬合效果。一個樣本輸入到一棵樹中,會根據各節點的條件往下走到某個葉子節點,將此節點值置爲1,其他置爲0。詳細模型算法見:3.2 GBDT
GBDT+LR
GBDT與LR的stacking模型相對於只用GBDT會有略微的提高,更大的好處是防止GBDT過擬合。升級爲GBDT+LR後,線上效果提高了約5%,而且由於省去了對新特徵進行人工轉換的步驟,增長特徵的迭代測試也更容易了。
GBDT+FM
GBDT是不支持高維稀疏特徵的,若是將高維特徵加到LR中,一方面須要人工組合高維特徵,另外一方面模型維度和計算複雜度會是O(N^2)級別的增加。因此設計了GBDT+FM的模型如圖所示,採用Factorization Machines模型替換LR。
Factorization Machines(FM)模型以下所示:
\[\hat{y}(x)=w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^n\sum_{j=i+1}^n<v_i,v_j>x_ix_j\]
具備如下幾個優勢
①前兩項爲一個線性模型,至關於LR模型的做用
②第三項爲一個二次交叉項,可以自動對特徵進行交叉組合
③經過增長隱向量,模型訓練和預測的計算複雜度降爲了O(N)
④支持稀疏特徵。
幾個優勢,使的GBDT+FM具備了良好的稀疏特徵支持,FM使用GBDT的葉子結點和稀疏特徵(內容特徵)做爲輸入,模型結構示意圖以下,GBDT+FM模型上線後相比GBDT+LR在各項指標的效果提高在4%~6%之間。
DNN+GBDT+FM
GBDT+FM模型,對embedding等具備結構信息的深度特徵利用不充分,而深度學習(Deep Neural Network)可以對嵌入式(embedding)特徵和普通稠密特徵進行學習,抽取出深層信息,提升模型的準確性,並已經成功應用到衆多機器學習領域。所以咱們將DNN引入到排序模型中,提升排序總體質量。
DNN+GBDT+FM的ensemble模型架構如圖所示,FM層做爲模型的最後一層,即融合層,其輸入由三部分組成:DNN的最後一層隱藏層、GBDT的輸出葉子節點、高維稀疏特徵。DNN+GBDT+FM的ensemble模型架構介紹以下所示,該模型上線後相對於GBDT+FM有4%的效果提高。
使用分佈式的TensorFlow進行訓練,使用基於TensorFlow Serving的微服務進行在線預測,DNN+GBDT+FM的ensemble模型使用的是Adam優化器。Adam結合了The Adaptive Gradient Algorithm(AdaGrad)和Root Mean Square Propagation(RMSProp)算法。具備更優的收斂速率,每一個變量有獨自的降低步長,總體降低步長會根據當前梯度進行調節,可以適應帶噪音的數據。實驗測試了多種優化器,Adam的效果是最優的。
工業界DNN ranking現狀
新的推薦模型上線後要進行A/B測試,將它和舊的算法進行比較。
AB測試是一種很經常使用的在線評測算法的實驗方法。它經過必定的規則將用戶隨機分紅幾組,並對不一樣組的用戶採用不一樣的算法,而後經過統計不一樣組用戶的各類不一樣的評測指標比較不一樣算法,好比能夠統計不一樣組用戶的點擊率,經過點擊率比較不一樣算法的性能。對AB測試感興趣的讀者能夠瀏覽一下網站http://www.abtests.com/ ,該網站給出了不少經過實際AB測試提升網站用戶滿意度的例子,從中咱們能夠學習到如何進行合理的AB測試。
切分流量是AB測試中的關鍵,不一樣的層以及控制這些層的團隊須要從一個統一的地方得到本身AB測試的流量,而不一樣層之間的流量應該是正交的。
「正交性」是從幾何中借來的術語。若是兩條直線相交成直角,他們就是正交的。用向量術語來講,這兩條直線互不依賴。
下圖是一個簡單的AB測試系統。用戶進入網站後,流量分配系統決定用戶是否須要被進行AB測試,若是須要的話,流量分配系統會給用戶打上在測試中屬於什麼分組的標籤。而後用戶瀏覽網頁,而用戶在瀏覽網頁時的行爲都會被經過日誌系統發回後臺的日誌數據庫。此時,若是用戶有測試分組的標籤,那麼該標籤也會被髮回後臺數據庫。在後臺,實驗人員的工做首先是配置流量分配系統,決定知足什麼條件的用戶參加什麼樣的測試。其次,實驗人員須要統計日誌數據庫中的數據,經過評測系統生成不一樣分組用戶的實驗報告,並比較和評測實驗結果。
當完成了AB測試後,根據指標結果,若是優於以前的推薦算法,那麼舊的算法就能夠替換成新的了。
模型準備就緒後,通常會先經過離線指標來評估模型的好壞, 而後再決定可否上線測試。離線算法評估常見的指標包括準確率、覆蓋度 、多樣性、新穎性和 UC 等。在線測試通常經過 A/B 測試進行,常見的指標有點擊率、用戶停留時間、 廣告收入等,須要注意分析統計顯著性。同時,須要注意短時間的指標和長期的指標相結合, 一些短時間指標的提高有時候反而會致使長期指標降低 好比 ,常常推薦美女或者搞笑類的內容會帶來短時間的點擊率提升,可是可能會引發長期的用戶粘性降低。設計者須要從本身的產品角度出發,根據產品的須要制定評估指標,這樣才能更好地指導推薦系統的優化方向。常見的評價指標以下:
冷啓動( cold start )在推薦系統中表示該系統積累數據量過少,沒法給新用戶做個性化推薦的問題,這是產品推薦的一大難題。每一個有推薦功能的產品都會遇到冷啓動的問題。一方面,當新商品時上架 會遇到冷啓動的問題,沒有收集到任何一個用戶對其瀏覽、點擊或者購買的行爲,也無從判斷如何將商品進行推薦;另外一方面,新用戶到來的時候,若是沒有他在應用上的行爲數據,也沒法預測其興趣,若是給用戶的推薦千篇律,沒有亮點,會使用戶在一開始就對產品失去興趣,從而放棄使用。因此在冷啓動的時候要同時考慮用戶的冷啓動和物品的冷啓動。
基本上,冷啓動題能夠分爲如下三類。
用戶冷啓動主要解決如何給新用戶做個性化推薦的問題。當新用戶到來時,我 沒有他的行爲數據,因此也沒法根據他的歷史行爲預 其興趣,從而沒法藉此給他作個性化推薦。解決方法參考如下:
物品冷啓動主要解決如何將新的物品推薦給可能對它感興趣的用戶這一問題。解決方法參考如下:
系統冷啓動主要解決如何在一個新開發的網站上(尚未用戶,也沒有用戶行爲,只有一些物品的信息)設計個性推薦系統,從而在產品剛上線時就讓用戶體驗到個性 推薦服務這一問題。
做者:@mantchs