推薦系統中的排序技術

在工業應用中,推薦系統通常可分為兩部分,召回和排序。

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

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

這些算法各有特點,音頻分析顯然可以用于解決冷啟動問題,NLP處理音樂評論更是可以學得專業人士的領域知識,它們各自獨立運行給出自己的結果,由于獨立,算法數目可增可減,亦可各自獨立迭代變化。

這個過程會從幾千萬item中篩選出幾百或者上千的候選集,然后在排序階段選出30首歌曲給到每位用戶。這個排序可理解為一個函數,F(user, item, context),輸入為用戶、物品、環境,輸出一個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,擬合如下方程:

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很容易完成。

傳統的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中。如圖所示:

image

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的深寬模型。如下圖:

image

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項目。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。