1. 程式人生 > 實用技巧 >推薦系統一——深入理解推薦系統召回演算法(1)

推薦系統一——深入理解推薦系統召回演算法(1)

作為【推薦系統】系列文章的第二篇,將以“召回”作為今天的主角,會從四個方面來介紹召回的不同演算法方式,即基於內容的召回、協同過濾、基於FM模型召回和基於深度學習的方法。

一、背景介紹

推薦系統整體架構

召回是推薦系統的第一階段,主要根據使用者和商品部分特徵,從海量的物品庫裡,快速找回一小部分使用者潛在感興趣的物品,然後交給排序環節。這部分需要處理的資料量非常大,速度要求快,所有使用的策略、模型和特徵都不能太複雜。下面主要介紹四種常見的召回方法:

  • 基於內容的召回:使用item之間的相似性來推薦與使用者喜歡的item相似的item。
    例如:如果使用者A看了《繡春刀2》這部楊冪主演的電影后,則會為他推薦楊冪主演的其他電影或電視劇

  • 協同過濾:同時使用query和item之間的相似性來進行推薦。
    例如:如果使用者A與使用者B類似,並且使用者B喜歡視訊1,則系統可以向用戶A推薦視訊1(即使使用者A尚未看過任何與視訊1類似的視訊)。

  • 基於FM模型召回:FM是基於矩陣分解的推薦演算法,其核心是二階特徵組合。

  • 基於深度神經網路的方法:利用深度神經網路生成相應的候選集。

二、基於內容的召回

在這裡插入圖片描述

基於內容的召回( CB召回 ),一般也叫做標籤召回。當談起CB的時候,大家可能會覺的很簡單,用tag或者用cate召回就行了,好像沒什麼可做的。可事實上,CB並不僅僅是用tag和cate做個倒排就搞定了。這類召回的核心思想是基於item自身的屬性,這些屬性可以表達為tag,Cate,也可以用來表達使用者ID,使用者型別等,更可以通過⼀些交叉驗證的⽅式,針對內容提取向量,將內容表達為連續向量的方式進行召回。接下來我們進一步來理解基於內容的過濾。

在實際的應用中,如電影推薦,首先我們根據使用者之前的歷史行為資訊(如點選,評論,觀看等),CB會使用item相關特徵來推薦給使用者與之前喜歡的item類似的item。為了更形象的表示CB,假設一個應用商店要推薦給使用者相應的APP。下圖是相應的特徵矩陣,其中每一行代表一個應用程式,每一列代表一個特徵。包括不同的類別特徵,應用程式的釋出者資訊等。為簡化起見,假定此特徵矩陣是布林型別的的:非零值表示應用程式具有該特徵。
在這裡插入圖片描述

還可以在同一特徵空間中表示使用者。一些與使用者相關的特徵可以由使用者明確提供。例如,使用者在其個人資料中選擇“娛樂應用”。其他特徵可能是隱式的,具體取決於它們先前安裝的應用程式。例如,使用者安裝了由Science R Us釋出的另一個應用程式。

模型應推薦與此使用者有關的item。為此,必須首先選擇一個相似性指標(如,點積)。然後,推薦系統會根據此相似性度量標準為每個候選item打分。請注意,建議是針對該使用者的,因為該模型未使用其他使用者的任何資訊。

2.1 基於內容召回的優點

該模型不需要其他使用者的任何資料,因為推薦是針對該使用者的。 這使得更容易擴充套件到大量使用者。
該模型可以捕獲使用者的特定興趣。

2.2 基於內容召回的缺點

  • 由於item的特徵表示在某種程度上是手工設計的,因此該技術需要大量領域知識。因此,模型很依賴手工設計特徵的好壞。
  • 該模型只能根據使用者的現有興趣提出建議。換句話說,該模型擴充套件使用者現有興趣的能力有限。

基於內容的召回看似比較容易,如果當我們的item屬性越來越多的時候,比如⼀個視訊可能有多個平行的tag以及其它屬性,那麼,為了把這些資訊綜合利用起來,我們還會利用多term檢索的方式,去提升CB的效果。下面,我們針對這些內容詳細的來聊⼀聊CB的常見優化點。

2.3 倒排優化

優化倒排的主要目的是提升cb召回的推薦效果,常見的倒排基本是和線上排序指標⼀致的,比如,如果排序的指標是點選率,倒排理所應當,也是點選率。但這樣的排序方式有個小問題,因為倒排排序使用的是後驗的值,而排序通常也是單指標排序,這樣,就很容易出現我們之前提到的,單指標被hack的問題,比如,用點選率倒排,頭部都是標題黨等。所以,這個問題是需要額外注意的。另外,也要考慮指標的bias的問題,例如,用完成率倒排導致短的視訊都排到了頭部。這種問題可以通過歸一化的方式緩解。但有⼀個潛在風險,資源的後驗表現的分佈往往會跟資源本身的型別有關。

2.4 觸發key的優化

key的優化要求只有⼀點,保證每次選擇的key,是使用者點選概率最⼤的key即可,所以通用的方式是把使用者的點選歷史按照屬性加和取top,比如,在某個類別上點選的次數排序,把點選次數最多的那幾個類別留作觸發的key,這個過程很簡單,沒太多優化點,我們就不繼續討論了。這⾥想聊的是關於使用者不⼀樣的行為差異化權重的問題,我們選取key的過程實際是判斷使用者對某⼀類內容感興趣的過程,也就是通過行為,來判斷使用者的感興趣程度,在只有瀏覽功能的產品⾥,點選就是表達使用者興趣的唯一行為,但產品通常會設計很多互動功能,來幫助使用者進行有效的興趣表達,所以,在觸發key的選取的時候需要考慮到這⼀點,至於怎麼做是和業務形態相關的事,這⾥就不展開了。

2.5 多維度內容屬性

最後,我們來講⼀下cb⾥⾯比較高階的問題,多term的問題。我們先考慮這樣⼀種情況,一個視訊有很多個tag,tag的特性是平行不唯⼀。我們線上通過點選量匯聚得到了使用者的高頻點選tag,通常的方式是,每⼀個tag都會有⼀個倒排,然後各自召回。但很容易想到的,當用戶同時有“帥哥”,“萌寵”這兩個tag的時候,通過萌寵給使用者召回⼀個美女+萌寵的視訊顯然沒有召回⼀個帥哥+萌寵的視訊更有吸引力,也就是說,我們在召回的時候,如果能同時考慮多個term之間的關係,會更有效⼀些。傳統搜尋⾥對於多term召回是有⼀套實現方式的,通過設定每個term的權重,可以在返回結果⾥去得到包含多term的結果,這部分屬於搜尋架構的內容範疇,我在此不展開了,有興趣的同學可以找身邊做搜尋的同學瞭解⼀下。我們講⼀個更和推薦match的方式,使用者身上有多個標籤,內容上面也有多個標籤,我們在做多term匹配的時候,就是標籤的list到標籤的list,使得他們點選的概率最大即可。是不是覺得豁然開朗了?是不是轉化成點選率建模問題了?更簡單地,直接使用word2vec,把使用者標籤和內容標籤作為⼀個sentence訓練,再離線把內容的標籤加和表徵為內容的屬性向量,線上做召回即可。當然,也可以⽤更復雜的⽅式來做,提升精度,大同小異,就不展開說了。那作者,內容的其他緯度等資訊也是可以⼀樣的方式加進去的,這就留給大家來討論了。

三、協同過濾

為了解決基於內容的召回所存在的弊端,人們提出了協同過濾召回方式(Collaborative filtering,CF),CF同時使用user和item之間的相似性來進行推薦。 這樣可以提高模型的推薦拓展性。也就是說,協同過濾模型可以根據相似使用者B的興趣向用戶A推薦商品。此外,可以自動學習Embedding,而無需依賴手工設計的特徵。

一般來說,協同過濾推薦分為三種類型。第一種是基於使用者(user-based)的協同過濾,第二種是基於專案(item-based)的協同過濾,第三種是基於模型(model based)的協同過濾

  • 基於使用者(user-based)的協同過濾:主要考慮的是使用者和使用者之間的相似度,只要找出相似使用者喜歡的物品,並預測目標使用者對對應物品的評分,就可以找到評分最高的若干個物品推薦給使用者。
  • 基於專案(item-based)的協同過濾:和基於使用者的協同過濾類似,只不過這時我們轉向找到物品和物品之間的相似度,只有找到了目標使用者對某些物品的評分,那麼我們就可以對相似度高的類似物品進行預測,將評分最高的若干個相似物品推薦給使用者。比如你在網上買了一本機器學習相關的書,網站馬上會推薦一堆機器學習,大資料相關的書給你,這裡就明顯用到了基於專案的協同過濾思想。
  • 基於模型(model based)的協同過濾:是目前最主流的協同過濾型別了,所含演算法是非常之多的,如矩陣分解、關聯演算法、聚類演算法、深度學習、圖模型等等。

這裡我們帶來一個有關電影推薦系統的簡單例子幫助更好的理解協同過濾。首先,考慮一個電影推薦系統,其中訓練資料由一個反饋矩陣組成,其中每行代表一個user,每一列代表一個item。

關於電影的反饋分為以下兩類:

  • 顯示反饋:使用者通過提供評分來指定他們對特定電影的喜歡程度。

  • 隱式反饋:如果使用者觀看電影,則系統會推斷使用者感興趣。
    假設反饋矩陣是布林型別的,即值為1和0分別表示對電影是否感興趣,當用戶訪問首頁時,系統會根據以下兩種情況推薦電影:

  • 與使用者過去喜歡的電影相似(Item-Based CF)

  • 類似使用者喜歡的電影(User-Based CF)

為便於舉例闡述,讓我們手工設計用以描述電影的一些特徵:

在這裡插入圖片描述

3.1 一維Embedding

假設我們為每部電影分配一個標量,用於描述該電影是適合兒童(負值)還是適合成人(正值)觀看。 假設我們還為每個使用者分配了一個標量,用於描述使用者對兒童電影(接近-1)或成人電影(接近+1)的興趣。 對於我們希望使用者喜歡的電影,電影Embedding和使用者Embedding的乘積應更高(接近1)。
在這裡插入圖片描述

在下圖中,每個對號標記都標識特定使用者觀看的電影。 第三和第四使用者具有的特徵很好地表示了使用者的偏好:第三使用者偏愛兒童電影,第四使用者偏愛成人電影。 但是,單個特徵無法很好地表示第一和第二使用者的偏好。這時候需要考慮二維甚至更高維度的特徵。
在這裡插入圖片描述

3.2 二維Embedding

一個特徵不足以解釋所有使用者的偏好。 為了克服這個問題,讓我們新增第二個特徵:每部電影是商業流行片或是小眾文藝片上的表現程度。 通過這個特徵,我們現在可以使用以下二維Embedding來表示每部電影:
在這裡插入圖片描述
我們再次將使用者放置在相同的嵌入空間中,以最好地解釋反饋矩陣:對於(使用者,商品)對,我們希望使用者Embedding和商品Embedding的點積在使用者觀看商品時接近1 電影,否則為0。
在這裡插入圖片描述
在這個例子中,我們對Embedding進行了手工設計。在實踐中,可以自動學習Embedding向量表示,這是協同過濾模型的強大功能。在接下來的內容中,我們將討論學習這些嵌入表示的不同模型以及如何對其進行訓練。

當模型自動學習Embedding時,這種方法的協同性質就顯而易見了。假設電影的Embedding向量是固定的。然後,模型可以為使用者學習Embedding向量,以最好地解釋他們的偏好。 因此,具有相似偏好的使用者的Embedding將緊密在一起。同樣,如果使用者的Embedding是固定的,則我們可以學習電影Embedding以最好地解釋反饋矩陣。結果,類似使用者喜歡的電影的Embedding將在Embedding空間中緊密在一起。

3.3 基於模型(model based)的協同過濾

矩陣分解是一個簡單的Embedding模型。 給定反饋矩陣 A ∈ R m × n A\in R^{m\times n} ARm×n,其中 m m m是使用者(或query)數量, n n n是item數量,該模型將學習:

  • user Embedding矩陣 U ∈ R m × d U\in R^{m\times d} URm×d,其中第i行是 u s e r i user_i useri的Embedding。
  • item Embedding矩陣 V ∈ R n × d V\in R^{n\times d} VRn×d,其中第j行是 i t e m j item_j itemj的Embedding。

Embedding通過學習,使得 U V T UV^T UVT的乘積是反饋矩陣 A A A的良好近似。 U V T UV^T UVT ( i , j ) (i,j) (i,j)項就是 u s e r i user_i useri i t e m j item_j itemj對應的兩個embedding的點積,使其儘量接近 A i , j A_{i,j} Ai,j

注意:與學習完整矩陣相比,矩陣分解通常會得到更簡潔的表示。 完整矩陣具有 O ( n m ) O(nm) O(nm)項,而Embedding矩陣具有 O ( ( n + m ) × d ) O((n+m)\times d) O((n+m)×d)項,其中Embedding維數 d d d通常比 m m m n n n小得多。 最終,觀測矩陣會被對映到低維子空間中,矩陣分解就可以在資料中找到其對應的潛在資訊。 在前面的示例中 n n n m m m d d d的值都非常小,因此優勢可以忽略不計。 但是,在現實世界中的推薦系統中,矩陣分解可以比學習整個矩陣要簡潔得多。

3.4 選擇目標函式

一種直觀的目標函式是距離的平方, 即在所有觀察到的矩陣項上最小化平方誤差之和:
在這裡插入圖片描述

在此目標函式中,只求觀察到的對 ( i , j ) (i,j) (i,j)的誤差和,即對反饋矩陣中的非零值求和。 但是,只求1的誤差總和並不是一個好方法。最小化矩陣中所有為1元素產生的模型,並不能進行很好的推薦,而且泛化性較差。
在這裡插入圖片描述

也許可以將未觀察到的值視為零,並對矩陣中的所有條目求損失和。這樣其實就是最小化 A A A及其近似值 U V T UV^T UVT之間Frobenius距離的平方:
在這裡插入圖片描述
可以通過矩陣的奇異值分解(SVD)解決此二次問題。 但是,SVD並不是一個很好的解決方案,因為在實際應用中,矩陣 A A A可能非常稀疏。 例如,將抖音上所有視訊與特定使用者觀看過的視訊進行比較。 得到的解 U V T UV^T UVT(對應於模型對輸入矩陣的近似值)可能接近於零,從而導致泛化效能較差。

相比之下,加權矩陣分解將目標分解為以下兩部分的和:

  • 觀察到的誤差和
  • 未觀察到的誤差和(視作0)

在這裡插入圖片描述

w 0 w_0 w0是調節兩項加權的超參,以使目標不被其中一項所支配。 調整此超引數非常重要。

在實際應用中,還需要仔細權衡觀察到的資料。例如,頻繁的item(如,非常受歡迎的視訊)或頻繁的query(例如,重度使用者)可能會主導目標功能。可以通過對頻繁出現的item所對應的訓練樣本進行加權來糾正此影響。 換句話說,您可以將目標函式替換為:

在這裡插入圖片描述

w i , j w_{i,j} wi,j是query i i i和item j j j對應的頻率函式。

3.5 最小化目標函式

最小化目標函式的常用演算法包括:

  • **隨機梯度下降(SGD)**是使損失函式最小化的通用方法。

  • **加權交替最小二乘(WALS)**專用於此特定目標函式。
    在兩個矩陣 U U U V V V中,每個目標都是二次的。(需要請注意的是,聯合問題並不是凸的)WALS的工作方式是隨機初始化Embedding,然後在以下條件之間交替進行:

  • 固定 U U U求解 V V V

  • 固定 U U U求解 V V V
    每步都可以準確地求解(通過線性問題的解決方法)並可以進行分散式計算。 該技術可以保證收斂,因為可以確保每一步都可以減少損失。

3.6 SGD和WALS

下面對SGD和WALS優缺點進行比較:

SGD優點:非常靈活:適用於其他損失函式;可以並行化。

SGD缺點:較慢,收斂速度不那麼快;難以處理未觀察到的項(entries),需要使用負取樣或gravity。

WALS優點:可以並行化;收斂速度比SGD更快;更容易處理未觀察到的項(entries)。

WALS缺點:僅適用於平方損失;

3.7 協同過濾的優缺點

優點

  • 無需領域知識:不需要相關領域知識,因為Embedding是自動學習的。
  • 發掘使用者興趣:該模型可以幫助使用者發現新的興趣點。 系統可能並不知道使用者對給定的item的興趣度,但是模型仍會推薦給他,因為相似的使用者有著相同的興趣點。
  • 很好的初始模型:在某種程度上,該方法僅需要反饋矩陣即可訓練矩陣分解模型。 而且該方法不需要上下文特徵。 實際上,該方法可以用作多個召回佇列中的一個。

缺點

  • 冷啟動問題

模型預測結果是給定的(使用者,商品)相應Embedding的點積。因此,如果在訓練資料中item從未出現過,則系統也無法計算其Embedding,也無法得到相應的預測結果。此問題通常稱為冷啟動問題。但是,以下技術可以在某種程度上解決冷啟動問題:

(1)利用WALS進行預測。給定一個在訓練集中未出現的item,如果系統與使用者有一些互動,則系統可以很容易計算出該item的Embedding,而無需重新訓練整個模型。只需求解以下方程式或其加權形式:

上述方程對應於WALS中的一個迭代:使用者Embedding保持固定,系統求解item的Embedding。對於新使用者也可以這樣做。

(2)啟發式生成新item的Embedding。如果系統沒有相應的互動資訊,則系統可以通過對來自同一類別,來自同一上傳者(在視訊推薦中)的item的Embedding進行平均來近似其Embedding。

  • 難以融入query/item的附加特徵
    附加特徵是query或itemID以外的其他特徵。 對於電影推薦,附加特徵可能包括國家或年齡。 融入可用的附加特徵可以提高模型的效果。 儘管在WALS中融入付諸特徵可能並不容易,但是WALS的泛化模型使這成為可能。

更多內容參見:

深入理解推薦系統召回演算法(2)