最近特別忙,工作日幾乎沒什麼時間學習。平時攢了一堆推薦相關的文章,趁週末整體學習了一下。主要是參考了網上的一篇技術文章(迄今爲止我看到的比較好的推薦Embedding總結)以及我自己的一些理解。
Embedding概念
首先一些概念性的內容要科普下。推薦系統分召回和排序,召回爲將每個用戶找出他可能喜歡的物品的候選集,排序是對候選集按照用戶的喜愛程度進行排序,最終得出給用戶推薦的結果。
在推薦系統的召回階段,需要對每個用戶和每個被推薦物品做數學層面的表示,目前比較主流的方法是通過向量,也就是Embedding表示。舉個例子,假設傲海和兩個物品的Embedding表示法如下:
傲海=[1,32,53,657,863]
物品1=[32,53,46,75,68]
物品2=[2,32,53,657,863]
相比於物品1,傲海的向量距離顯然與物品2更小,在推薦系統中就會優先爲傲海推薦物品1而不是物品2。這種表示方法就將推薦召回模塊抽象成是否可以準確的表示每個人和物品的Embedding,越準確則推薦效果越佳。
I2I和U2I的召回方案
那向量召回有哪些模式呢?其實最核心的是I2I和U2I,當然還有一些衍生的比如U2U2I,這裏不再贅述。
U2I主要是通過計算人(USER)和物品(ITEM)的距離做召回,就跟我上文提到的傲海和兩個物品的向量距離計算一樣。U2I對算法的要求是,需要把人和物品的特徵同時加入算法進行計算,這樣人和物品的向量維度和意義才一致,做人和物品的向量距離計算纔有意義。
I2I是不考慮人的因素的,I2I一般應用到以下場景:
“比如一個人喜歡買各種X類型的手機,把所有物品的Embedding,然後找跟X類型手機距離近的物品推薦給這個人即可”。所以I2I算法更多地是考慮如何求物品間的相關性,並表示成Embedding。
我把I2I和U2I的比較流行的算法做了個彙總,如下圖:
I2I算法介紹
先來講I2I算法,爲什麼分文字和圖片兩個類目呢?因爲平時我們看到的新聞大致是這樣的:
商品大致是這樣的:
待推薦物品都會包含圖片和說明文字,需要同時考慮這兩部分的Embedding。
圖片類型比較簡單,一般都是ResNet這些算法的中間向量結果導出作爲這個圖片的Embedding表示:
文本類的Embedding可以分爲兩種,一種是比較傳統的word2vector、fasttext、glove這些算法的方案,叫做詞向量固定表徵類算法,這些算法主要是通過分析詞的出現頻率來進行Embedding生成,不考慮文本上下文。
而另一種文本Embedding方法,也是目前最流行的方案是動態詞表徵算法,比如Bert、ELMo、GPT,這類算法會考慮文本上下文。
動態詞表徵和固定詞表徵算法的區別可以舉個例子說明,比如下面這句話:“小明愛喫蘋果,也愛使用蘋果手機”。需要對“蘋果”這個詞做Embedding,固定詞表徵算法很難區分出喫的蘋果和手機蘋果品牌,而動態的表徵方法是可以的。
U2I算法
1.ALS
U2I算法可以分爲4類,最經典的就是MF矩陣分解算法ALS,
比如在ALS算法輸入的是下圖這樣的人對歌的打分數據,
ALS會根據這樣的數據產出兩個矩陣,這兩個矩陣分別表示每個聽衆的Embedding和每首歌的Embedding。
2.基於瀏覽序列Embedding
另一種相對高級的人的Embedding方案是Bert+LSTM,這類方案叫瀏覽序列Embedding法。我們可以把每個用戶歷史的瀏覽記錄作爲這個人的屬性的表示。
假設一個用戶先後瀏覽過3篇文章,分別是:
-
“巴特爾掀翻奧尼爾”
-
“易建聯怒砍3分,2籃板”
-
“孫悅率領湖人勇奪總冠軍”
那就可以把這3篇新聞標題用Bert向量化,再將這些向量按照瀏覽序列輸入LSTM,最終就生成這個用戶的Embedding表示。
3.動態協同過濾
接着再介紹一種基於簇羣的協同過濾召回方案,一般是KMEANS+CF。CF就是協同過濾法,原理不多說了。這種召回方案一般是先將每個用戶按照他的標籤做Tag Embedding,比如可以按照年齡、性別、身高做個Embedding。
小明=[29,1,180]
(29歲,1代表男性,身高180)
然後用KMEANS做所有用戶的自動聚類,接着針對每個聚類簇內部的用戶做相互之間的協同過濾,這樣可以保證爲相似口味的人推送互相都喜歡的物品。
4.圖神經網絡
圖神經網絡Embedding是目前比較熱門的,效果也是相對比較好的一個方案。圖神經網絡把每個用戶有過行爲交互物品看作一個點,把具體的行爲看作邊。如下圖所示:
用戶1看按照DAB的順序跟物品交互,用戶2按照BE DEF的順序交互,依此類推,可以構建一個圖關係。這個圖關係隱藏着用戶和物品的屬性,可以生成人和物品的Embedding向量。常用的圖神經網絡算法有GraphSage和DeepWalk。
總結
Embedding向量生成之後,可以用Faiss引擎去方便的計算向量間的距離,從而實現推薦召回。這個方案是目前主流的推薦引擎召回方案。相信後續會有越來越多的算法誕生,我也會持續關注。
參考:https://www.jiqizhixin.com/articles/2020-06-30-11