在工業應用中,推薦系統一般可分爲兩部分,召回和排序。python
召回階段對應的是以前幾篇文章所講的各類推薦算法,好比據資料所載,Spotify至少使用了三種算法來生成其廣受讚譽的Discover Weekly歌單,包括:git
這些算法各有特色,音頻分析顯然能夠用於解決冷啓動問題,NLP處理音樂評論更是能夠學得專業人士的領域知識,它們各自獨立運行給出本身的結果,因爲獨立,算法數目可增可減,亦可各自獨立迭代變化。github
這個過程會從幾千萬item中篩選出幾百或者上千的候選集,而後在排序階段選出30首歌曲給到每位用戶。這個排序可理解爲一個函數,,輸入爲用戶、物品、環境,輸出一個0到1之間的分數,取分數最高的幾首。這一過程一般稱爲CTR預估。算法
這篇文章來講一下該「函數」的常見形式及基本運做方式。網絡
最簡單的是邏輯迴歸(Logistic Regression),一個廣義線性模型。ide
拿某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很容易完成。code
傳統的LR只能在線下批量處理大量數據,沒法有效處理大規模的在線數據流。模型更新可能要一天甚至更多,不夠及時。而Google在2013提出了Follow The Regularized Leader(FTRL),一種在線邏輯迴歸算法。該方法對邏輯迴歸的目標函數進行了修改,加上各類系統工程上的調優,使得該模型的參數能夠在每個線上數據點進行動態更新。
能夠在網上找到很多FTRL的開源實現好比libftrl-python。
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的實現以供使用。
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包。
Google在Google Play中對App的推薦排序使用了一種名爲Wide & Deep的深寬模型。以下圖:
Wide部分就是廣義的線性模型,在本來的特徵基礎上適當加一些特徵組合,Deep部分是一個前饋神經網絡,能夠對一些稀疏的特徵學習到一個低維的稠密向量,將Wide與Deep的信息相加,依然使用Sigmond來預測函數,表示爲:
其中爲Sigmond函數,
是Wide部分的權重,
表示Wide部分的組合特徵,
爲Deep網絡最後一層輸出,
是線性模型的偏重。
將兩個模型放到一塊兒聯合訓練(不一樣於集成訓練須要將各模型單獨訓練再將結果匯合),互相彌補對方的不足(特徵工程困難和可解釋性差),該模型爲Google Play的在線收益相較於純Wide模型帶來了3.9%的提高。實現可參考tensorflow/models項目。