1. 初識推薦系統
所謂推薦系統,簡言之就是根據用戶的偏好推薦其最有可能感興趣的內容。
以新聞平臺為例,過去主要以新浪新聞這類中心化內容平臺為代表;
而現在,以今日頭條為代表的新聞APP 均在首頁根據用戶偏好推送不同內容的定制化新聞,推動了整個行業向個性化推薦轉型。
在淘寶、京東、亞馬遜等電商網站的首頁都設有“猜你喜歡”專區,根據用戶最近瀏覽和購
買的行為記錄推薦商品。
在新興的短視頻領域,以抖音和快手為代表的APP 以推薦為流量分發的主要手段。
在互聯網金融領域,各大平臺也開始主打針對個人定制化的千人千面投資推薦。
毫無疑問,個性化推薦己成為所有新聞、視頻、音頻、電商、互聯網金融等相關平臺的標配。
推薦系統,
對用戶來說,在用戶需求并不十分明確的情況下進行信息的過濾,與搜索系統相比,推薦系統更多的利用用戶的各類歷史
信息猜測其可能喜歡的內容;
對公司而言,解決產品能夠最大限度地吸引用戶,留存用戶,增長用戶黏性,提高用戶轉化率,從而達到公司商目標連續增長
的目的;
- 個性化推薦的成功應用需要兩個條件:
- 信息過載,因為用戶如果可以很容易地從所有物品中找到喜歡的物品,就不需要個性化推薦了。
- 用戶大部分時候沒有特別明確的需求,因為用戶如果有明確的需求,可以直接通過搜索引擎找到感興趣的物品。
推薦系統的基本任務是聯系用戶和物品,解決信息過載的問題。本質上是一種實現將用戶-商品-公司之間利益最大化的手段.
2. 推薦系統的常用評測指標
2.1. 用戶滿意度
用戶作為推薦系統的重要參與者,其滿意度是評測推薦系統的最重要指標。但是,用戶滿意度沒有辦法離線計算,只能通過用戶調查或者在線實驗獲得。
用戶調查獲得用戶滿意度主要是通過調查問卷的形式。用戶對推薦系統的滿意度分為不同的層次。
在在線系統中,用戶滿意度主要通過一些對用戶行為的統計得到,比如,利用購買率度量用戶的滿意度;
此外,有些網站會通過設計一些用戶反饋界面收集用戶滿意度。比如,電商、外賣的app收貨后彈出的評價提示;
2.2 預測準確度
預測準確度度量一個推薦系統或者推薦算法預測用戶行為的能力。這個指標是最重要的推薦系統離線評測指標,從推薦系統誕生的那一天起,幾乎99%與推薦相關的論文都在討論這個指標。因為該指標可以通過離線實驗計算。
下面是不同的研究方向的預測準確度指標:
2.2.1 評分預測
很多網站都有一個讓用戶給物品打分的功能,那么,如果知道了用戶對物品的歷史評分,就可以從中習得用戶的興趣模型,并預測該用戶在將來看到一個他沒有評過分的物品時,會給這個物品評多少分。預測用戶對物品評分的行為稱為評分預測。
評分預測的預測準確度一般通過均方根誤差(RMSE)和平均絕對誤差(MAE)計算。
對于測試集中的一個用戶u和物品i,令是用戶u對物品i的實際評分,而
是推薦算法給出的預測評分,那么RMSE的定義為:
MAE采用絕對值計算預測誤差,它的定義為:
假設我們用一個列表records存放用戶評分數據,
令records[i]= [u,i,rui,pui],其中rui是用戶u對物品i的實際評分,pui是算法預測出來的用戶u對物品i的評分,
那么下面的代碼分別實現了RMSE和MAE的計算過程。
def RMSE(records):
return math.sqrt(sum([(rui-pui)**2 for u,i,rui,pui in records]) / float(len(records)))
def MAE(records):
return sum([abs(rui-pui) for u,i,rui,pui in records]) / float(len(records))
關于RMSE和MAE這兩個指標的優缺點,
Netflix認為RMSE加大了對預測不準的用戶物品評分的懲罰(平方項的懲罰),因而對系統的評測更加苛刻。
研究表明,如果評分系統是基于整數建立的(即用戶給的評分都是整數),那么對預測結果取整會降低MAE的誤差②。
2.2.2. TopN推薦
網站在提供推薦服務時,一般是給用戶一個個性化的推薦列表,這種推薦叫做TopN推薦。
TopN推薦的預測準確率一般通過準確率(precision)/召回率(recall)度量。
令R( u)是根據用戶在訓練集上的行為給用戶作出的推薦列表,而T( u)是用戶在測試集上的行為列表。那么,
- 精確率(precision):
分類正確的正樣本個數占分類器判定為正樣本的樣本個數比例(這里 R(u)R?(u) 相當于是模型判定的正樣本)
即:精確率 = 分類正確的正樣本個數 / 所有判定為正樣本的樣本個數
- 召回率(recall):
分類正確的正樣本個數占真正的正樣本個數的比例(這里的相當于真正的正樣本集合)
即:召回率 = 分類正確的正樣本個數 / 所有真正的正樣本的樣本個數
為了全面評測TopN推薦的準確率和召回率,一般會選取不同的推薦列表長度N,計算出一組準確率/召回率,然后畫出準確率/召
回率曲線(precision/recall curve)。
補充知識點:
-
精確率( Precision) (也叫查準率)
TP / TP+ FP
精準率反應的是預測準確的數量,即預測為正的樣本中有多少是真正的正樣本,
預測準確的次數越多,這個數值就越大。精準率是針對我們預測結果而言的,
它表示的是預測為正的樣本中有多少是真正的正樣本。那么預測為正就有兩種可能了,
一種就是把正類預測為正類(TP),另一種就是把負類預測為正類(FP),
-
召回率( Recall)
TP / TP+ FN
召回率反應的是預測準確的概率,它表示的是樣本中的正例有多少被預測正確了,
如果預測百分之百地準確,那這個數值就會很高。
召回率是針對我們原來的樣本而言的,它表示的是樣本中的正例有多少被預測正確了。
也有兩種可能,一種是把原來的正類預測成正類(TP),另一種就是把原來的正類預測為負類(FN)。
-
AUC(Area Under Curve)
AUC 即ROC曲線下的面積,ROC曲線下與坐標軸圍成的面積,顯然這個面積的數值不會大于1。
又由于ROC曲線一般都處于y=x這條直線的上方,所以AUC的取值范圍在0.5和1之間。
AUC越接近1.0,檢測方法真實性越高;
等于0.5時,則真實性最低,無應用價值。
roc.png
精確率和召回率的代碼實現:
from sklearn import metrics
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import average_precision_score
from sklearn.metrics import accuracy_score
#分類結果
y_pred = [0, 1, 0, 0]
y_true = [0, 1, 1, 1]
print("precision_score:", metrics.precision_score(y_true, y_pred))
print("recall_score:", metrics.recall_score(y_true, y_pred))
auc代碼實現:
# auc
import numpy as np
from sklearn import metrics
y = np.array([1, 1, 2, 2])
pred = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, pred, pos_label=2)
metrics.auc(fpr, tpr)
# 當類別滿足{0, 1}時,可直接使用metrics.roc_auc_score(y,pred)
metrics.roc_auc_score(y,pred)
0.75
ROC曲線代碼實現:
## ROC曲線
from sklearn.metrics import roc_curve
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1]
y_true = [0, 1, 1, 0, 1, 0, 1, 1, 0, 1]
FPR,TPR,thresholds=roc_curve(y_true, y_pred)
plt.title('ROC')
plt.plot(FPR, TPR,'b')
plt.plot([0,1],[0,1],'r--')
plt.ylabel('TPR')
plt.xlabel('FPR')
小知識點:
- 關于評分預測和 TopN 推薦的討論
指出電影推薦的目的是找到用戶最有可能感興趣的電影,而不是預測用戶看了電影后會給電影什么樣的評分。因此,TopN推薦更符合實際的應用需求。也許有一部電影用戶看了之后會給很高的分數,但用戶看的可能性非常小。因此,預測用戶是否會看一部電影,應該比預測用戶看了電影后會給它什么評分更加重要。
因此,后面的重點也是在TopN推薦。
2.2.3 覆蓋率
覆蓋率(coverage)描述一個推薦系統對物品長尾的發掘能力。定義為推薦系統能夠推薦出來的物品占總物品集合的比例。
假設系統的用戶集合為U,推薦系統給每個用戶推薦一個長度為N的物品列表R(u)。那么推薦系統的覆蓋率的公式:
即:覆蓋率 = 推薦出來的商品數量 / 總商品數量
為了更細致地描述推薦系統發掘長尾的能力,需要統計推薦列表中不同物品出現次數的分布。如果所有的物品都出現在推薦列表中,且出現的次數差不多,那么推薦系統發掘長尾的能力就很好。
因此,可以通過研究物品在推薦列表中出現次數的分布描述推薦系統挖掘長尾的能力。
如果這個分布比較平,那么說明推薦系統的覆蓋率較高,而如果這個分布較陡峭,說明推薦系統的覆蓋率較低。
在信息論和經濟學中有兩個著名的指標可以用來定義覆蓋率。
第一個是信息熵:
其中 p(i)p?(i) 是物品 ii 的流行度除以所有物品流行度之和;
第二個指標是基尼系數(Gini Index):
其中 ijij 是按照物品流行度p從小到大排序的物品列表中第 jj 個物品;
2.2.4 多樣性
為了滿足用戶廣泛的興趣,推薦列表需要能夠覆蓋用戶不同的興趣領域,即推薦結果需要具有多樣性。
盡管用戶的興趣在較長的時
間跨度中是一樣的,但具體到用戶訪問推薦系統的某一刻,其興趣往往是單一的,那么如果推薦列表只能覆蓋用戶的一個興趣點,而這個興趣點不是用戶這個時刻的興趣點,推薦列表就不會讓用戶滿意。反之,如果推薦列表比較多樣,覆蓋了用戶絕大多數的興趣點,那么就會增加用戶找到感興趣物品的概率。因此給用戶的推薦列表也需要滿足用戶廣泛的興趣,即具有多樣性。
多樣性描述了推薦列表中物品兩兩之間的不相似性。因此,多樣性和相似性是對應的。
假設定義了物品i和 j之間的相似度,那么用戶u的推薦列表R(u)的多樣性定義如下:
推薦系統的整體多樣性可以定義為所有用戶推薦列表多樣性的平均值:
不同的物品相似度度量函數s(i,j)可以定義不同的多樣性;
如果用內容相似度描述物品間的相似度,我們就可以得到內容多樣性函數,
如果用協同過濾的相似度函數描述物品間的相似度,就可以得到協同過濾的多樣性函數。
2.2.5 新穎性
新穎的推薦是指給用戶推薦那些他們以前沒有聽說過的物品。在一個網站中實現新穎性的最簡單辦法是,把那些用戶之前在網站中對其有過行為的物品從推薦列表中過濾掉。
比如在一個視頻網站中,新穎的推薦不應該給用戶推薦那些他們已經看過、打過分或者瀏覽過的視頻。
但是,有些視頻可能是用戶在別的網站看過,或在電視上看過,因此僅僅過濾掉本網站中用戶有過行為的物品還不能完全實現新穎性。
有研究表明,評測新穎度的最簡單方法是利用推薦結果的平均流行度,因為越不熱門的物品越可能讓用戶覺得新穎。因此,如果推薦結果中物品的平均熱門程度較低,那么推薦結果就可能有比較高的新穎性。
但是,用推薦結果的平均流行度度量新穎性比較粗略,因為不同用戶不知道的東西是不同的。要準確地統計新穎性需要做用戶調查。
2.2.6 驚喜度
簡單來說,驚喜度(serendipity)就是,如果推薦結果和用戶的歷史興趣不相似,但卻讓用戶覺得滿意,那么就可以說推薦結果的驚喜度很高,而推薦的新穎性僅僅取決于用戶是否聽說過這個推薦結果。
即:令用戶驚喜的推薦結果是和用戶歷史上喜歡的物品不相似,但用戶卻覺得滿意的推薦
因此,提高推薦驚喜度,需要提高推薦結果的用戶滿意度,同時降低推薦結果和用戶歷史興趣的相似度。
2.2.7 信任度
度量推薦系統的信任度只能通過問卷調查的方式,詢問用戶是否信任推薦系統的推薦結果。
提高推薦系統的信任度主要有兩種方法。
首先需要增加推薦系統的透明度(transparency ),而增加推薦系統透明度的主要辦法是提供推薦解釋。只有讓用戶了解推薦系統的運行機制,讓用戶認同推薦系統的運行機制,才會提高用戶對推薦系統的信任度。
其次是考慮用戶的社交網絡信息,利用用戶的好友信息給用戶做推薦,并且用好友進行推薦解釋。這是因為用戶對他們的好友一般都比較信任,因此如果推薦的商品是好友購買過的,那么他們對推薦結果就會相對比較信任。
2.2.8 實時性
在很多網站中,因為物品(新聞、微博等)具有很強的時效性,所以需要在物品還具有時效性時就將它們推薦給用戶。
比如,給用戶推薦昨天的新聞顯然不如給用戶推薦今天的新聞。
推薦系統的實時性包括兩個方面。
-
首先,推薦系統需要實時地更新推薦列表來滿足用戶新的行為變化。
比如,當一個用戶購買了iPhone,如果推薦系統能夠立即給他推薦相關配件,那么肯定比第二天再給用戶推薦相關配件更有價值。
第二個方面是推薦系統需要能夠將新加入系統的物品推薦給用戶。這主要考驗了推薦系統處理物品冷啟動的能力。關于如何將新加入系統的物品推薦給用戶。
2.2.9 健壯性
健壯性(即robust,魯棒性)指標衡量了一個推薦系統抗擊作弊的能力。
最著名的就是行為注入攻擊(profile injection attack)。眾所周知,絕大部分推薦系統都是通過分析用戶的行為實現推薦算法的。
比如,亞馬遜有一種推薦叫做“購買商品A的用戶也經常購買的其他商品”。主要計算方法是統計購買商品A的用戶購買其他商品的次數。
那么,我們可以很簡單地攻擊這個算法,讓自己的商品在這個推薦列表中獲得比較高的排名,比如可以注冊很多賬號,用這些賬號同時購買A和自己的商品。
還有一種攻擊主要針對評分系統,比如豆瓣的電影評分。這種攻擊很簡單,就是雇用一批人給自己的商品非常高的評分,而評分行為是推薦系統依賴的重要用戶行為。
算法健壯性的評測主要利用模擬攻擊。
在實際系統中,提高系統的健壯性,除了選擇健壯性高的算法,還有以下方法:
- 設計推薦系統時盡量使用代價比較高的用戶行為。比如,如果有用戶購買行為和用戶瀏覽行為,那么主要應該使用用戶購買行為,因為購買需要付費,所以攻擊購買行為的代價遠遠大于攻擊瀏覽行為。
- 在使用數據前,進行攻擊檢測,從而對數據進行清理。
2.2.10 商業目標
網站評測推薦系統更加注重網站的商業目標是否達成,不同的網站具有不同的商業目標。
比如電子商務網站的目標可能是銷售額,基于展示廣告盈利的網站其商業目標可能是廣告展示總數,基于點擊廣告盈利的網站其商業目標可能是廣告點擊總數。
因此,設計推薦系統時需要考慮最終的商業目標,而網站使用推薦系統的目的除了滿足用戶發現內容的需求,也需要利用推薦系統加快實現商業上的指標。
2.3 評測維度
一個推薦算法,雖然整體性能不好,但可能在某種情況下性能比較好,而增加評測維度的目的就是知道一個算法在什么情況下性能最好。
一般來說,評測維度分為如下3種:
- 用戶維度 主要包括用戶的人口統計學信息、活躍度以及是不是新用戶等。
- 物品維度 包括物品的屬性信息、流行度、平均分以及是不是新加入的物品等。
- 時間維度 包括季節,是工作日還是周末,是白天還是晚上等。
3. 召回和排序
推薦系統要根據已有的用戶畫像和內容畫像去推薦,涉及到兩個關鍵問題:召回和排序。
召回(match)”指從全量信息集合中觸發盡可能多的正確結果,并將結果返回給“排序”。
召回的方式有多種:協同過濾、主題模型、內容召回和熱點召回等,
而“排序(rank)“則是對所有召回的內容進行打分排序,選出得分最高的幾個結果推薦給用戶。
召回策略的評估:
主要根據兩個評價指標:召回率和準確率。
下面是召回層與排序層的特點
- 召回層: 待計算的候選集合大、計算速度快、模型簡單、特征較少,盡量讓用戶感興趣的物品在這個階段能夠被快速召回,即保證相關物品的召回率;
- 排序層: 首要目標是得到精準的排序結果。需要處理的物品數量少,可以利用較多的特征,使用比較復雜的模型。
設計召回層時,“計算速度”和“召回率”其實是矛盾的兩個指標,為提高“計算速度”,需要使召回策略盡量簡單一些;而為了提高“召回率”,要求召回策略盡量選出排序模型所需要的候選集,這也就要求召回策略不能過于簡單。在權衡計算速度和召回率后,目前工業界主流的召回方法是采用多個簡單策略疊加的“多路召回策略”。
3.1 多路召回
指采用不同的策略、特征或簡單模型,分別召回一部分候選集,然后把候選集混合在一起供后續排序模型使用,
其中,各種簡單策略保證候選集的快速召回,從不同角度設計的策略保證召回率接近理想的狀態,不至于損傷排序效果。
在多路召回中,每個策略之間毫不相關,所以一般可以寫并發多線程同時進行,這樣可以更加高效。
針對不同的任務就會有對于該業務真實場景下需要考慮的召回規則。例如視頻推薦,召回規則可以是“熱門視頻”、“導演召回”、“演員召回”、“最近上映“、”流行趨勢“、”類型召回“等等。
- 多路召回存在的問題:
對于每一路召回都會從商品集合中拉回K個商品,這里的K是一個超參數,對于K的選擇一般需要通過離線評估加線上的A/B測試來確定合理的K值。
除此之外,對于不同的任務具體策略的選擇也是人工基于經驗的選擇,選擇的策略之間的信息是割裂的,無法總和考慮不同策略對一個物品的影響。
3.2 Embedding召回
Embedding召回是一個綜合性強且計算速度也能滿足需求的召回方法。
Embedding其實是一種思想,主要目的是將稀疏的向量(如one-hot編碼)表示轉換成稠密的向量,
下圖直觀的顯示了one-hot編碼和Embedding表示的區別于聯系,
即Embedding相當于是對one-hot做了平滑,而onehot相當于是對Embedding做了max pooling。
目前主流的Embedding技術主要可以分為三大類。
- text embedding
- image embedding
- graph embedding
在推薦系統領域,text embedding技術是目前使用最多的embedding技術,
對于文本特征可以直接使用該技術,
對于非文本的id類特征,可以先將其轉化成id序列再使用text embedding的技術獲取id的embedding再做召回。
常見的text Embedding的技術有:
- 靜態向量:word2vec, fasttext, glove
- 動態向量:ELMO, GPT, BERT
對于image embedding其實主要是對于有圖或者視頻的特征,對于圖像與視頻的識別都有效果比較好的模型,大部分都是卷積模塊通過各種連接技巧搭建的高效模型,可以使用現有的預訓練模型提取圖像或者視頻的向量特征,然后用于召回。
對于社交網絡相關的推薦,進行推薦的用戶與用于之間或者商品之間天然的存在某種復雜的圖結構的關系,如何利用圖中節點與節點之間的關系對其進行向量化是非常關鍵的,在這種場景下基于序列的text embedding和基于卷積模型的image embedding都顯得力不從心,在這樣的背景下Graph Embedding逐漸在推薦系統中流行起來。
經典的Graph Embedding模型有, Deep Walk, Node2Vec,LINE以及比較新的阿里巴巴2018年公布的EGES graph Embedding模型。
參考鏈接;
《推薦系統實踐》
推薦策略中的“召回