推薦系統技術內幕(四):算法篇之召回與融合

基於內容的推薦算法

基於內容的推薦算法,建立在這樣一個基本假設上:用戶會喜歡他喜歡的物品的相似物品。

這是一個很樸素的假設,也比較符合人性,比如如果喜歡看喜劇之王,大概率也會喜歡大話西遊。在這個假設的基礎上,我們的推薦算法的過程就是:將找到用戶喜歡的物品的相似物品,如果用戶還沒有消費過,就推薦給他。

原理是不是很簡單。

在新物品加入的時候,還沒有積累任何的用戶行爲數據,這時候只能靠基於內容的推薦了。基於內容的推薦的基礎是對物品本身信息的挖掘。

下面是基於內容的推薦系統的架構圖:
在這裏插入圖片描述

  • 內容源的信息經過內容分析後,得到結構化的內容庫以及內容模型,也就是物品畫像;這部分算法在推薦系統技術內幕(二):算法篇之物品畫像中講解過。
  • 用戶的反饋數據,結合內容庫,經過用戶畫像學習,得到用戶畫像,這部分的算法在推薦系統技術內幕(三):算法篇之用戶畫像中講解過。
  • 新物品加入後,進過內容模型的處理,得到新物品畫像,結合用戶畫像,就可以進過推薦算法進行推薦了。得到展示的物品,有了用戶反饋數據,可以用來繼續訓練用戶畫像,如此週而復始。

注意,這裏說基於內容的推薦系統,不需要用戶反饋數據,是指候選的物品可以沒有用戶相關的反饋,而不是說整個系統不需要用戶反饋數據。相反,整個系統是需要用戶反饋數據去學習用戶畫像的。

內容分析的輸出,包括結構化內容庫和內容模型,新物品加入後就是利用這些內容模型,得出新物品的畫像信息的,這些內容模型包括:

  • 分詞、命名實體識別模型
  • 關鍵詞抽取模型
  • 分類、聚類模型
  • 主題學習模型
  • 嵌入學習模型

基於內容的推薦,常採用的推薦方式是,將物品畫像、用戶畫像,結合用戶的行爲日誌,轉換爲訓練樣本,通過評分預估或行爲預估爲目標,訓練出預估模型。

樣本的特徵包括物品畫像特徵,上下文特徵特徵,用戶畫像特徵;樣本的標註通過用戶反饋日誌自動標註。基於內容的推薦模型常用的有邏輯迴歸(Logistic Regression)和梯度提升數(GBDT).

基於協同過濾的推薦算法

協同過濾應該是推薦系統領域最著名的算法。

協同過濾算法背後的假設是:用戶會喜歡與他相似用戶喜歡的物品,用戶會喜歡他們喜歡的物品的相似物品。對應的,協同過濾算法分兩種:

  • user-based: 首先找到目標用戶的相似用戶,然後將相似用戶喜歡的、目標用戶還未消費的物品,推薦給目標用戶
  • item-based: 首先找到目標用戶消費的物品的相似物品,然後將這些物品中還未被目標用戶消費過的物品,推薦給用戶

協同過濾在尋找相似用戶或相似物品的時候,依賴的數據並非基於內容的分析的產出,而是因爲在經過內容推薦後,熬過了冷啓動借點,這時候已經積累的用戶反饋數據。從用戶行爲日誌裏提取的用戶與物品間的關係,一般一矩陣形式存在,稱爲用戶物品關係矩陣。關係的值可以是是否消費記錄或則用戶對物品的評分。

協同過濾算法是一個比較大算法範疇,一般又可以劃分爲:

  • memory-based: 基於記憶的協同過濾是基礎,直接通過用戶的消費歷史,推薦相似的物品,或相似用戶消費的物品。
  • model-based: 基於模型的系統過濾,通過用戶的消費歷史數據,訓練出模型,通過模型推薦物品。

Memory Based

首先看比較基礎的基於記憶的協同過濾,這類算法又細分爲user-based和item-based。先看user-based。算法的主要步驟是:

1. 從關係矩陣構造用戶向量,用戶向量的緯度是物品的個數,向量的每個緯度的取值表示用戶是否消費過該物品或則是否喜歡該物品。

2. 計算用戶向量之間的相似度。相似度的計算方法有很多中,比如常見的有:

  • 歐氏距離

d(s,t)=in(siti)2d(s,t)=\sqrt{\sum_{i}^{n}(s_i - t_i)^2}

歐氏距離的取值範圍是[0,+)[0, +\infty),可以通過下面公式轉化爲(0,1](0,1]之間的相似度:

sim(s,t)=1d(s,t)+1sim(s,t) = \frac{1}{d(s,t) + 1}

  • 餘弦相似度:

sim(s,t)=in(siti)insi2inti2sim(s,t)=\frac{\sum_{i}^{n}(s_it_i)}{\sqrt{\sum_{i}^{n}s_i^2}\sqrt{\sum_{i}^{n}t_i^2}}

  • jaccard相似度,適用於計算兩個集合相似度

sim(S,T)=STSTsim(S,T)=\frac{|S\cap T|}{|S\cup T|}

其中,S,TS,T表示兩用戶喜歡的物品組成的集合。

  • Pearson相關係數

sim(s,t)=in(sis)(tit)in(sis)2in(tit)2sim(s,t)=\frac{\sum_{i}^{n}(s_i-\overline s)(t_i-\overline t)}{\sqrt{\sum_{i}^n(s_i-\overline s)^2}\sqrt{\sum_{i}^n(t_i-\overline t)^2}}

3. 每個用戶會有n個相鄰用戶,通過相似度值選取最相似的若干用戶。這個選取的過程可以是Top N選取,也可以通過設計相似度閾值。

4. 相似用戶喜歡的每一個物品x,過濾掉用戶已經消費過的物品,計算一個推薦分數,計算公式爲:

R(u,x)=vksim(u,v)R(v,x)vksim(u,v)R(u, x)=\frac{\sum_{v}^ksim(u,v)\cdot R(v,x)}{\sum_{v}^{k}sim(u,v)}

其中u表示推薦目標用戶,有k個相鄰用戶。

item-Based的算法,過程比較類似,算法過程爲:

1.從關係矩陣構造物品向量,向量的緯度是用戶的數量,每個緯度的值表示用戶是否喜歡此物品或則用戶對物品的評分。

2.計算物品間的相似度,計算可以採用歐氏相似度或則餘弦相似度。

3.更具物品間的相似度,爲沒一個物品產生一個相似物品集合,也可以爲用戶產生一個集合,方法是對每個物品x,計算一個推薦分數,計算方法爲:

R(u,x)=insim(x,i)R(u,i)insim(x,i)R(u,x)=\frac{\sum_i^nsim(x,i)\cdot R(u,i)}{\sum_i^nsim(x,i)}

其中,用戶u有n個喜歡的物品。

Model Based

基於記憶的協同過濾,對關係矩陣的利用比較基礎,關係矩陣可以是評分矩陣,也可以是消費行爲矩陣。Model Based適用於評分矩陣,其基本思路是通過以後的評分數據,學習一個模型,將關係矩陣中空缺值填上。

評分預測問題最著名的就是基於矩陣分解的算法。矩陣分解的過程就是將原始的評分舉證分解成兩個矩陣相乘的過程:

Rm×n=Um×kVn×kTR_{m\times n} = U_{m\times k}V_{n\times k}^T

矩陣分解是一個算法範疇,有很多中分解算法,比較基礎的SVD算法。

SVD算法的過程,基本思路就是不斷調整Um×n,Vn×kU_{m\times n},V_{n\times k}的值,使相乘結果不斷接近Rm×nR_{m\times n}的過程,是一個標準的機器學習過程。

基礎的SVD的損失函數定義爲:

cost=uv(ruvpuqvT)2cost = \sum_{u}\sum_v(r_{uv}-p_u\cdot q_v^T)^2

其中pup_u表示用戶u的向量表示,緯度爲kk,所以用戶的向量表示構成矩陣Um×kU_{m\times k}qvq_v表示物品v的向量表示,緯度也爲kk,所以物品的向量表示構成了矩陣Vn×kV_{n\times k}.

一般的爲了增強模型的泛化能力,會記上正則化項:

cost=uv(ruvpuqvT)2+λ(pu2+qv2)cost = \sum_{u}\sum_v(r_{uv}-p_u\cdot q_v^T)^2 + \lambda(|||p_u||^2 + ||q_v||^2)

有了損失函數,接下來要解決的問題就是學習算法的問題,一般會採用基於梯度的學習算法或則交替最小二乘算法。

在基礎的SVD基礎上,有很多擴展的算法,比如加入時間,歷史,偏移等等信息的考慮。

另外,R. R. Salakhutdinov等人提出了一種使用受限玻爾茲曼機(RBM)來進行協同過濾的方法,這裏就不展開介紹了。

推薦的融合

前面說過,很多推薦系統包括兩個主要的階段:召回和融合,召回階段就是通過以上介紹和沒介紹的種種推薦算法,產生候選集,融合就是對前階段的輸出進行統一的排序,產生最終的推薦結果。

推薦的融合方式分爲兩種:

  • 基於規則: 別小看規則,前面說過,做好推薦系統,還需要很好的領域知識,領域知識的存在形式之一就是規則,最好的推薦系統一定領域知識與數據驅動算法的結合。比如可以根據具體的業務,制定多種推薦結果的加權規則、或切換規則、融合規則。例如什麼情況下用內容推薦的結果,什麼情況下用協同推薦的結果,或則兩種推薦結果都用,怎麼混合推薦結果,各取TOP多少,等等。
  • 自動融合:以具體的業務指標爲導向的,比如指標可以是CTR,或停留時長,等等,學習出一個模型,通過模型產生統一的推薦結果。常用的算法模型有GBDT,FM,Wide And Deep等等,關於模型的具體介紹,這裏也不再展開了。

冷啓動問題

推薦領域的冷啓動問題,一般指代兩類問題:

  • 新物品:新加入系統的新物品還未被展示過,未產生任何用戶的反饋數據,如何對新物品進行推薦的問題被稱爲物品冷啓動問題。
  • 新用戶:類似的,新加入系統的新用戶未在系統內產生任何的消費行爲,如何向這類新用戶推薦物品的問題被稱爲用戶冷啓動問題。

物品冷啓動問題,一般採用基於內容的推薦算法,在介紹基於內容的推薦的時候,已經介紹了。而用戶冷啓動問題是推薦領域並未完全解決的問題,可以從下面幾個層面的方法可以嘗試。

算法層面:

  • 興趣試探算法,比如Bandit,增強學習等等。這類算法的思路,簡單來說就是一邊推薦,一邊根據反饋數據修正推薦策略。

數據層面:

  • 利用用戶基本信息,比如用戶的地域位置,使用的手機型號,等等
  • 主動詢問興趣,很多個性化的產品在第一次使用的時候,都會主動讓用戶選擇一些興趣點或則具體的感興趣的物品
  • 引入第三方數據

領域知識層面:

  • 用優質的物品:一般來說,在不知道推薦哪些物品的情況下,穩妥的策略就是推薦高質量的優質物品,這個原則在很多領域的推薦系統都是成立的,比如信息流推薦,視頻推薦。

探索與利用(Explore & Exploit)

人性是複雜的,人類是好惡有一定的穩定性,同時人類也是善變的,一直爲用戶推薦目前喜歡的物品絕非最優策略,推薦系統需要探索和發現用戶的新興趣點。所以推薦需要除了會利用目前的興趣點產生推薦物品外,還會爲了試探用戶的未知興趣點爲用戶推薦試探的物品。

探索與利用問題也是推薦系統經典問題之一,目前的實現的方式不盡相同,從簡單的隨機試探,到基於強化學習的試探都有嘗試,可以參考相關的資料,這裏不展開詳述了。

推薦系統的演進

目前爲止介紹了很多推薦相關算法,有關於數據挖掘的,有基於內容的、協同過濾的、Bandit、增強學習等等的推薦的,林林總總。但實際當中,沒有一個系統是一步到位的,都會經歷一個由起步到完善的演進的過程。那麼在演進的過程中就有一個重要的實際問題,也就是決定先做什麼,後做什麼的問題,本文給出一些建議。

  • 起步階段:百廢待興,系統的一切從零開始,包括數據的收集、處理和存儲,服務間的通信,模型的訓練和使用;一般來說開源社區版的工具就可以滿足我們系統的需求,此階段的重點是快速利用開源工具搭建起推薦系統的基礎版本。模型可以考慮使用簡單的LR模型或決策樹類的模型,並且可以採用離線訓練的方式。另外要做好物品的畫像分析等數據挖掘工作,此階段的推薦主要依賴的特徵是數據挖掘輸出的結構化的知識,也就是基於內容的推薦。
  • 發展階段:度過了起步階段的系統,接下來的發展階段的目標,就是提高推薦的效果;數據層面,可以精細化數據處理,包括數據的採樣、去噪等;特徵層面可以嘗試更多的高級特徵,包括預訓練向量,動態特徵等等。模型方面,因爲積累是一定的用戶數據,可以嘗試更多更復雜的模型,比如基於協同過濾的和深度學習的模型,同時可以嘗試在線學習模型。
  • 完善階段:一方面,隨着用戶量的進一步增長,開源工具難以滿足越來越複雜的業務場景的需求,組件的定製化需求凸現出來。另一方面,爲了進一步提高推薦的效果,領域知識與推薦算法的結合,是推薦系統發展的一個方向,儘管這個方向存在一定的爭議性,爭議來自於算法至上和人機結合的爭論。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章