天天看點

個性推薦理論與實踐(上篇)

唐雲兵:在騰訊從事背景開發6年多,手Q個性裝扮和動漫背景leader。喜歡了解一些背景優秀元件設計,喜歡徒步和羽毛球。最近學習和實踐個性推薦。

一. 背景

去年年底開始做手Q個性裝扮的個性推薦的事情,進行了一次分享,主要講了個性推薦的一些理論和我們的一些實踐。本文重點從理論上出發,會提及少量個性裝扮的實踐。

為什麼要做個性推薦這個事情,比較常見的答案就是要做精細化營運。對于個性裝扮業務也是一樣,因為個性裝扮的物品越來越多,表情就有1600多套,加上原創開放平台的上線,各種作品迅猛增加。使用者手機端展示的區域有限,為了能讓使用者在有限的展示區域裡面盡量看到自己最喜歡的東西,是以啟動了個性推薦。

二. 衡量算法效果

在做個性推薦之前,我們需要先了解衡量這個事情效果的方法。《推薦系統實踐》這本書上有講到好多評估推薦效果的理論名額,其中使用頻率最高的還是準确率、召回率和覆寫率。

準确率其實就是推薦給使用者的東西裡面有多少東西是使用者用了的。如果推薦的東西絕大部分都被使用者使用了,那就是推薦得準;如果推薦的東西使用者都不喜歡,不使用,那就是推薦得不準确。公式如下:

個性推薦理論與實踐(上篇)

在離線訓練挑選模型的時候通常都會使用這些名額來指導我們選擇哪個算法模型。推薦算法線上上營運的時候,我們更多的就是看一些實際的業務名額了。比如拉開通的資料對比、拉活躍的資料對比、下載下傳的資料對比。在我們個性裝扮的業務場景裡面更多的是希望使用者能點選看詳情或使用,是以我們重點關心的名額是點選曝光率——用點選量除以曝光量。關于衡量名額和資料上一定要有對比,保留一部分流量走原來的邏輯,大部分流量走推薦邏輯,這樣就可以進行資料的對比,而且可以在後續的營運和算法更新中,檢查算法是不是出問題了。更好的一種做法是保留對比邏輯的那部分小流量也不是固定的某些使用者,這樣能避免這些使用者無法使用體驗較好的邏輯,也能避免因為流量使用者劃分的因素對資料的影響。

三. 協同過濾

推薦最早最經典的算法就是基于物品的協同過濾算法。使用的地方也很多,典型的就有亞馬遜網站。其基于的一個理念是:一個使用者可能會喜歡跟他曾經喜歡過的物品相似的物品。比如說你比較喜歡《機器學習》這本書,《深度學習》和《機器學習》比較類似,是不是你也很大可能喜歡《深度學習》。

怎麼來定義物品是相似的呢?比較自然的想法是看物品的屬性資訊,比如類型、标簽、描述等。也有一些推薦算法就是這麼來做的,但是根據這些判斷比較依賴标簽等資訊的客觀和完整,不好确定物品之間的相似性。可以參考的一個思路就是對物品的屬性資料,根據文本相似度來衡量物品的相似度。

相比這個比較自然的想法,還有一個經典的思路就是協同,根據使用者已經産生的行為來計算物品之間的相似度。這個相似度基于的一個假設是:喜歡物品A同時喜歡物品B的人越多,那麼A和B的相似度就越高。這樣一來根據使用者的行為資料計算物品的相似讀就有一個公式:

個性推薦理論與實踐(上篇)

這樣的話計算出來的物品相似度是基于使用者行為空間的,并不是基于物品屬性空間的。經典的案例就是啤酒和尿布,這兩個在物品屬性空間上風牛馬不相及的物品,在使用者行為空間上就是相似度特别高的。下面的圖就是示例如何從使用者行為資料得到物品之間相似度的資料:

個性推薦理論與實踐(上篇)

上面的公式在有一種場景時比較不合理,就是物品j是一個熱門物品,這樣的話物品j和所有物品的相似度都很高。熱門物品往往沒有非熱門物品更能展現一個使用者的喜好。是以對上面的公式進行優化就有:

個性推薦理論與實踐(上篇)

從上面的步驟,我們得到了物品之間的相似度,那麼怎麼給一個具體的使用者進行推薦呢,哪個物品又更應該推薦在前面呢?我們可以通過使用者對自己已有的物品的喜歡程度和這些物品相似度高的物品進行計算得到一個使用者對一個推薦物品的喜歡預估,公式如下:

個性推薦理論與實踐(上篇)

公式中K的值怎麼選取可以根據工程實際來确定一個比較合适的值。K值在非極端情況下,差一點點對結果影響很小。

比如說使用者有一本《C++Primer中文版》喜歡度是1.3,有一本《程式設計之美》喜好度是0.9,下面的示例就是怎麼計算即将推薦的物品的先後排序。

個性推薦理論與實踐(上篇)

這裡是在使用者行為空間找物品的相似度,然後根據使用者已有的物品推薦行為空間上的相似物品。基于物品屬性空間相似度的推薦思路其實差不多。

這裡其實還有兩個問題,一個就是使用者冷啟動,一個就是物品冷啟動。

從預估使用者對推薦物品的喜歡程度的公式可以看出,如果使用者擁有或喜歡的物品集合是空集,那這個公式就無從算起。針對使用者冷啟動有很多解決方案,我們通常簡單有效的方法就是對冷啟動使用者推薦熱門物品。另外一個思路就是從其他的一些特征(比如使用者的性别、年齡、教育程度、文化、職業等)找到相似的使用者,然後推薦相似的使用者用的多的物品。

物品冷啟動就是一個物品新上架的時候,還沒有任何使用者使用,這個時候在使用者行為空間是找不到跟這個物品相似的物品的。是以對這種物品也就無法用上面的方法進行推薦。一個比較簡單有效的方法就是在産品邏輯層面增加一個新品子產品,新上架物品在新品子產品展示推廣。也有一些其他的思路,就比如利用物品的屬性空間上物品的相似度來進行推薦。

說了基于物品的協同過濾推薦算法,必然少不了要提及基于使用者的協同過濾算法。基于使用者的協同過濾算法基于的一個理念是:一個使用者會喜歡與Ta相似的使用者所喜歡的東西。比如你和Ta都是喜歡看科幻片的人,Ta喜歡看《西部世界》,你很大可能也喜歡看《西部世界》。那這裡的相似的使用者又是怎麼定義和衡量的呢。一個比較自然的想法就是使用者的屬性,比如使用者的性别、宗教信仰、年齡、教育程度、文化、職業等。同樣的也可以在使用者的行為空間上來定義和衡量使用者的相似——使用共同物品越多兩個使用者越相似。

在使用者的行為空間上通常使用距離來衡量使用者的相似度,典型的距離計算公式有Jaccard公式和餘弦相似度,公式分别如下:

個性推薦理論與實踐(上篇)

Jaccard距離公式

個性推薦理論與實踐(上篇)

餘弦相似度公式

通常會使用餘弦相似度公式進行使用者相似度的計算。基于一個假設:對非熱門物品的喜歡更能代表喜歡的一緻,可以得到一個改進的餘弦相似度公式,如下:

個性推薦理論與實踐(上篇)

得到使用者的相似度之後,可以通過如下的公式計算使用者對即将推薦的物品的喜歡程度預估,公式如下:

個性推薦理論與實踐(上篇)

這個公式裡面也有一個K值需要确定,可以根據工程實際來确定一個。下圖是MovieLens資料集在不用K值下的測評性能。

個性推薦理論與實踐(上篇)

從圖中我們可以看到,K值隻要在合适區間内,值大小差一點對結果影響很小。同時K值不是越大越好。

協同過濾算法在推薦系統上是很經典和适用很廣泛的算法。同樣有很多庫可以幫助我們使用協同過濾算法,比如spark裡面mllib庫就有CF算法,比如mahout(The Apache Mahout™ project's goal is tobuild an environment for quickly creating scalable performant machine learningapplications.)也能幫助我們快速的實作一個協同過濾算法。不同的庫網上能找到不同的參考代碼,這裡貼部分mahout實作的關鍵實作部分代碼。

個性推薦理論與實踐(上篇)

四. Word2Vec的嘗試

上面都是傳統經典的推薦算法,很多時候會跟其他推薦算法混合到一起使用,有的時候會借鑒這些算法的思想,衍生出一些新的推薦算法,比如在我們表情商城就有參考ItemCF的思想,用Word2Vec進行物品之間的相似度計算,然後推薦的。

用Word2Vec進行推薦的一個處理思想是:把每個表情當作是一個詞,使用者下載下傳和使用表情的序列當作一句話,使用全部使用者的行為資料,用Word2Vec算法模型計算出每個詞(表情物品)之間的距離(相似度)然後進行推薦。

個性推薦理論與實踐(上篇)

Word2Vec網上可以下載下傳到源代碼,有興趣的可以從代碼上深入了解。

表情商城的推薦部分流量就是使用Word2Vec進行的。同時更多的場景使用的是GBDT進行推薦。先給出下效果(如下圖)

個性推薦理論與實踐(上篇)

下篇詳細分析GBDT推薦和深度學習在推薦上的實驗。