推薦系統中的排序技術

在工業應用中,推薦系統一般可分爲兩部分,召回和排序。python

召回階段對應的是以前幾篇文章所講的各類推薦算法,好比據資料所載,Spotify至少使用了三種算法來生成其廣受讚譽的Discover Weekly歌單,包括:git

  1. 矩陣分解來學習集體智慧;
  2. NLP處理音樂評論文章與報道;
  3. 對音頻使用卷積神經網絡進行分析。

這些算法各有特色,音頻分析顯然能夠用於解決冷啓動問題,NLP處理音樂評論更是能夠學得專業人士的領域知識,它們各自獨立運行給出本身的結果,因爲獨立,算法數目可增可減,亦可各自獨立迭代變化。github

這個過程會從幾千萬item中篩選出幾百或者上千的候選集,而後在排序階段選出30首歌曲給到每位用戶。這個排序可理解爲一個函數,F(user, item, context),輸入爲用戶、物品、環境,輸出一個0到1之間的分數,取分數最高的幾首。這一過程一般稱爲CTR預估。算法

這篇文章來講一下該「函數」的常見形式及基本運做方式。網絡

LR

最簡單的是邏輯迴歸(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,擬合以下方程:函數

y = \frac{1}{1 + e ^ {- (w ^ {T}x + w_0)}}

其中x即爲上述向量,w是與x每一個元素相對應的權重,b爲截距。其損失函數爲:學習

loss =\sum_{(x, y) \in D}-y \log \left(y^{\prime}\right)-(1-y) \log \left(1-y^{\prime}\right)

其中y爲樣本的label0或1,y^{\prime}是根據模型預測的0到1之間的數字。編碼

經過下降此損失函數來擬合訓練樣原本完成模型的訓練,利用模型對新的數據進行預測即完成了打分。訓練過程參考sklearn的LogisticRegression很容易完成。code

傳統的LR只能在線下批量處理大量數據,沒法有效處理大規模的在線數據流。模型更新可能要一天甚至更多,不夠及時。而Google在2013提出了Follow The Regularized Leader(FTRL),一種在線邏輯迴歸算法。該方法對邏輯迴歸的目標函數進行了修改,加上各類系統工程上的調優,使得該模型的參數能夠在每個線上數據點進行動態更新。
能夠在網上找到很多FTRL的開源實現好比libftrl-python

FM | FFM

FM與FFM分別是Factorization Machine與Field-aware Factorization Machine的簡稱。

LR做爲廣義線性模型對特徵向量與label之間的非線性關係會很苦手。這時便須要進行特徵組合,好比使用線性模型來預測各類近似長方形形狀的面積,兩個特徵爲長x_1與寬x_2,那麼顯然並不能學到一個很好的模型,此時增長一個新的特徵x_3=x_1 * x_2,即可以獲得很好的效果。

在實際應用中,特徵向量的維度是很高的,很難像上例中直接看到這種有意義的組合,考慮全部特徵兩兩組合則線性迴歸方程變爲:

y(\mathbf{x})=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n} w_{i j} x_{i} x_{j}

除了本來特徵的i個權重外還要學習各特徵組合狀況對應的權重,對於參數w_{ij}的訓練,須要大量x_ix_j都不爲0的樣本,然而因爲one-hot編碼等緣由帶來的稀疏性使得這個要求沒法達成,那麼訓練樣本不足便會致使w_{ij}的不許確,從而影響模型的質量。

解決方案是使用矩陣分解。在推薦系統中會對user_item_matrix作分解,爲user及item學得一個低維的向量來表明自已。那麼此處的狀況能夠與之類比,將特徵組合的全部權重表示爲一個形狀爲(i * i)的矩陣,那麼w_{ij}即爲此矩陣第i行第j列的數值,將此高維度的矩陣進行分解,能夠爲每一個特徵獲得一個關於權重的隱向量v_i,那麼w_{i j}使用v_i點乘v_j便可獲得。此時線性方程變爲:

y(\mathbf{x})=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle x_{i} x_{j}

以上模型稱爲因子分解機(Factorization Machine),通過一些數學上的變換及處理,該模型能夠在O(kn)的複雜度下進行訓練和預測,是一種比較高效的模型。

在FM的基礎上有人提出了Field-aware Factorization Machine。好比特徵向量中有200多維來表明一個user的國家,country.ukcountry.us等等,那麼這200多個特徵能夠認爲是屬於一個field,區別在爲特徵x_i學習隱向量時要爲每個field都學到一個相應的隱向量,特徵組合權重w_{ij}根據x_i關於x_j所在field的隱向量乘以x_j關於x_i所屬field的隱向量而得,線性方程變爲:

y(\mathbf{x})=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n}\left\langle\mathbf{v}_{{i}, f_{j}}, \mathbf{v}_{{j, f_{i}}}\right\rangle x_{i} x_{j}

該方法效果更好,而預測時間複雜度升至O(kn^2)。有開源庫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來預測函數,表示爲:

P(Y=1 | \mathbf{x})=\sigma\left(\mathbf{w}\_{w i d e}^{T}[\mathbf{x}, \phi(\mathbf{x})]+\mathbf{w}\_{d e e p}^{T} a^{\left(l_{f}\right)}+b\right)

其中\sigma爲Sigmond函數,W_{wide}^T是Wide部分的權重,\phi(\mathbf{x})表示Wide部分的組合特徵,a^{\left(l_{f}\right)}爲Deep網絡最後一層輸出,b是線性模型的偏重。

將兩個模型放到一塊兒聯合訓練(不一樣於集成訓練須要將各模型單獨訓練再將結果匯合),互相彌補對方的不足(特徵工程困難和可解釋性差),該模型爲Google Play的在線收益相較於純Wide模型帶來了3.9%的提高。實現可參考tensorflow/models項目。

相關文章
相關標籤/搜索