在工業應用中,推薦系統通常可分為兩部分,召回和排序。
召回階段對應的是之前幾篇文章所講的各種推薦算法,比如據資料所載,Spotify至少使用了三種算法來生成其廣受贊譽的Discover Weekly歌單,包括:
- 矩陣分解來學習集體智慧;
- NLP處理音樂評論文章與報道;
- 對音頻使用卷積神經網絡進行分析。
這些算法各有特點,音頻分析顯然可以用于解決冷啟動問題,NLP處理音樂評論更是可以學得專業人士的領域知識,它們各自獨立運行給出自己的結果,由于獨立,算法數目可增可減,亦可各自獨立迭代變化。
這個過程會從幾千萬item中篩選出幾百或者上千的候選集,然后在排序階段選出30首歌曲給到每位用戶。這個排序可理解為一個函數,,輸入為用戶、物品、環境,輸出一個0到1之間的分數,取分數最高的幾首。這一過程通常稱為CTR預估。
這篇文章來說一下該“函數”的常見形式及基本運作方式。
LR
最簡單的是邏輯回歸(Logistic Regression),一個廣義線性模型。
拿某user的用戶畫像(一個向量)比如[3, 1]
,拼接上某item的物品畫像比如[4, 0]
,再加上代表context的向量[0, 1, 1]
后得到[3, 1, 4, 0, 0, 1, 1]
,若該user曾與該item發生過聯系則label為1,這些加起來是一個正樣本,同時可以將用戶“跳過”的item或熱門的卻沒有與用戶產生過聯系的item作為負樣本,label為0,擬合如下方程:
其中即為上述向量,
是與x每個元素相對應的權重,
為截距。其損失函數為:
其中為樣本的label0或1,
是根據模型預測的0到1之間的數字。
通過降低此損失函數來擬合訓練樣本來完成模型的訓練,利用模型對新的數據進行預測即完成了打分。訓練過程參考sklearn的LogisticRegression很容易完成。
傳統的LR只能在線下批量處理大量數據,無法有效處理大規模的在線數據流。模型更新可能要一天甚至更多,不夠及時。而Google在2013提出了Follow The Regularized Leader(FTRL),一種在線邏輯回歸算法。該方法對邏輯回歸的目標函數進行了修改,加上各種系統工程上的調優,使得該模型的參數可以在每一個線上數據點進行動態更新。
可以在網上找到不少FTRL的開源實現比如libftrl-python。
FM | FFM
FM與FFM分別是Factorization Machine與Field-aware Factorization Machine的簡稱。
LR作為廣義線性模型對特征向量與label之間的非線性關系會很苦手。這時便需要進行特征組合,比如使用線性模型來預測各種近似長方形形狀的面積,兩個特征為長與寬
,那么顯然并不能學到一個很好的模型,此時增加一個新的特征
,便可以得到很好的效果。
在實際應用中,特征向量的維度是很高的,很難像上例中直接看到這種有意義的組合,考慮所有特征兩兩組合則線性回歸方程變為:
除了原本特征的個權重外還要學習各特征組合情況對應的權重,對于參數
的訓練,需要大量
和
都不為0的樣本,然而由于one-hot編碼等原因帶來的稀疏性使得這個要求無法達成,那么訓練樣本不足便會導致
的不準確,從而影響模型的質量。
解決方案是使用矩陣分解。在推薦系統中會對user_item_matrix
做分解,為user及item學得一個低維的向量來代表自已。那么此處的情況可以與之類比,將特征組合的所有權重表示為一個形狀為(i * i)的矩陣,那么即為此矩陣第i行第j列的數值,將此高維度的矩陣進行分解,可以為每個特征得到一個關于權重的隱向量
,那么
使用
點乘
即可得到。此時線性方程變為:
以上模型稱為因子分解機(Factorization Machine),經過一些數學上的變換及處理,該模型可以在的復雜度下進行訓練和預測,是一種比較高效的模型。
在FM的基礎上有人提出了Field-aware Factorization Machine。比如特征向量中有200多維來代表一個user的國家,country.uk
和country.us
等等,那么這200多個特征可以認為是屬于一個field,區別在為特征學習隱向量時要為每一個field都學到一個相應的隱向量,特征組合權重
根據
關于
所在field的隱向量乘以
關于
所屬field的隱向量而得,線性方程變為:
該方法效果更好,而預測時間復雜度升至。有開源庫libffm的實現以供使用。
GBDT & LR
Facebook在廣告CTR預估上的做法是使用梯度提升決策樹(GBDT) & LR的方案。
思路是將原本要輸入LR的特征向量,先經過GBDT篩選和組合,生成新的特征向量再送到LR中。如圖所示:
GBDT作為集成模型,會使用多棵決策樹,每棵樹去擬合前一棵樹的殘差來得到很好的擬合效果。一個樣本輸入到一棵樹中,會根據各節點的條件往下走到某個葉子節點,將此節點值置為1,其余置為0。比如訓練使用了3棵決策樹,每棵決策樹有5個葉子節點,樣本在各樹分別落到了各樹從左往右的第1,2,3個節點上,則得到三個one-hot編碼為[1, 0, 0, 0, 0]
,[0, 1, 0, 0, 0]
,[0, 0, 1, 0, 0]
,拼接起來作為轉換后的特征向量:[1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0]
,輸入到LR模型中得到分值。
此模型為Facebook的廣告效果帶來了明顯的提升,在其發表的論文中,還討論了各種工程上的實踐與細節,包括GBDT與LR的更新頻率,降采樣的比例實踐等,值得參考。實現GBDT可以使用開源的XGBoost包。
Wide & Deep
Google在Google Play中對App的推薦排序使用了一種名為Wide & Deep的深寬模型。如下圖:
Wide部分就是廣義的線性模型,在原本的特征基礎上適當加一些特征組合,Deep部分是一個前饋神經網絡,可以對一些稀疏的特征學習到一個低維的稠密向量,將Wide與Deep的信息相加,依然使用Sigmond來預測函數,表示為:
其中為Sigmond函數,
是Wide部分的權重,
表示Wide部分的組合特征,
為Deep網絡最后一層輸出,
是線性模型的偏重。
將兩個模型放到一起聯合訓練(不同于集成訓練需要將各模型單獨訓練再將結果匯合),互相彌補對方的不足(特征工程困難和可解釋性差),該模型為Google Play的在線收益相較于純Wide模型帶來了3.9%的提升。實現可參考tensorflow/models項目。