實作 wide & deep 從訓練到推薦排序

Memorization & Generalization

在推薦系統中,如果要選第一個深度排序模型從傳統機器學習接軌到 DNN,那首推 google 在 2016 年提出的 Wide & Deep ,Wide & Deep 名稱來自其由一個 shallow 的 model 與一個 deep 的 network 組合而成。

在進入到 DNN 前,我們手上肯定有個正在線上運行的傳統排序模型 ex: FM, GBDT …,還有積累了很久的有效特徵組合,如果直接進入 DNN,這些經驗和積累打水漂不說,還得花很長的時間 tune 模型。

有了 Wide & Deep,我們只需將正在 serving 的那個排序模型的特徵放在 wide side 使用; 另外在建一個 deep side 的深度模型,兩個模型 joint training 即可無縫接軌到 DNN。

那 wide 跟 deep network 分別代表什麼呢 ?

Google 在 2016 的論文中總結出:Wide 負責 memorization , Deep 負責 Generalization , Wide & Deep 是 Memorization & Generalization 的體現,實際上也是推薦領域中經典的 Exploitation & Exploration 問題。


實時推薦策略流程

一個完整的工業級的推薦系統會分成兩大部分

  1. Online serving
  2. Offline data processing

此篇著重在電商推薦系統在 online serving 的算法策略架構

架構概述

Online serving 為當 user request 進來時算法的策略流程,什麼階段該做什麼事。一般來說 online serving 又可大致上分成三個 stages

  1. Match: 從百萬級的商品庫中召回數千或數百的商品
    • 此階段大致上, 模糊地召回 user 感興趣的商品
  2. Rank:對召回的數千或數百商品進行打分,決定針對 user 個性化排序召回的商品
    • 通常會用模型 ranking,模型會綜合考慮 user 的喜好以及商品本身的特徵進行打分
  3. Re rank:根據業務邏輯重新排序 ranking 結果

上面三個 stages 是一個推薦流程的抽象表示,實際上每個 stage 內還會細分出工程和業務考量的模組。


推薦系統中的瑞士刀 Factorization Machine

多才多藝的 Factorization Machine

在推薦領域,現今各種 DNN 模型當道,有個不怎麼深的模型卻小巧而美,既能做召回又能做排序,計算複雜度上又沒 DNN 耗時又耗錢

他 就是現今各種應用在推薦系統 DNN 的前輩 Factorization Machine (FM),這麼多才多藝的模型你值得擁有。

我們都知道 DNN 的本質是特徵的高階交叉,這點在 FM 上就能初見端倪:

FM 前兩項為 LR: $w_0 + \sum^n_{i=1}w_ix_i$,末項為二階特徵交叉項 ,這形式像極了 wide & deep,根本是 wide & deep 的前身,linear 項負責 memorization; cross 項負責 generalization。

FM 既能做召回又能做排序,甚至能在多路召回後對上萬個 entity 粗排打分,到底是怎麼做到的呢?

讓我們往下繼續看下去


透視 XGBoost(4) 神奇 optimization 在哪裡?

XGBoost 不只在算法上的改造,真正讓 XGBoost 大放異彩的是與工程優化的結合,這讓 XGBoost 在工業上可以應用於大規模數據的處理。

  • Approximate Greedy Algorithm
  • Weighted Quantile Sketch & Parallel Learning
  • Sparsity-Aware Split Finding
  • System Design

Approximate Greedy Algorithm

XGBoost 有兩種 split finding 策略,Exact Greedy and Approximate Greedy

data sample 量小的情況下, XGB tree 在建立分支時,會逐一掃過每個可能分裂點 (已對特徵值排序) 計算 similarity score 跟 gain, 即是 greedy algorithm。

greedy algorithm 會窮舉所有可能分裂點,因此能達到最準確的結果,因為他把所有可能的結果都看過一遍後選了一個最佳的。

但如果 data sample 不僅數量多 (row),特徵維度也多 (columns),採用 greedy algorithm,雖然準確卻也沒效率。


透視 XGBoost(3) 蘋果樹下的 objective function

XGBoost General Objective Function

XGboost 是 gradient boosting machine 的一種實作方式,xgboost 也是建一顆新樹 $f_m(x)$ 去擬合上一步模型輸出 $F_{m-1}(x)$ 的 $\text{residual}$

不同的是, XGBoost 用一種比較聰明且精準的方式去擬合 residual 建立子樹 $f_m(x)$

此篇首先推導了 XGBoost 的通用 Objective Function,然後解釋為何 second order Taylor expansion 可以讓 XGBoost 收斂更快更準確

XGBoost’s Objective Function

XGBoost 的 objective function 由 loss function term $l(y_i, \hat{y_i})$ 和 regularized term $\Omega$ 組成

  • $\mathcal{L}$ 表 objective function
  • $l(y_i, \hat{y_i})$ 表 loss function
    • in regression, loss function $l(y_i, \hat{y_i})$ commonly use square error
    • in classification,最大化 log likelihood 就是最小化 cross entropy
  • $f_m$ 表 第 m 步 XGB tree
  • regularized term $\Omega$ 跟 XGB tree $f_m(x)$ leaf node number $T_m$ 與 each leaf node output $\gamma$ 有關
    • $\Omega(f_m) = \tau T_m + \cfrac{1}{2}\lambda \lVert \gamma \rVert ^2$
      • $\lambda$ is a regularization parameter
      • $T_m$ is the number of leaf in tree $f_m$
      • $\tau$ 表對 $T_m$ 的 factor

在 第 $m-1$ 步建完 tree $f_{m-1}$時,total cost 為

  • $\hat{y_i}^{(m-1)}$ 表 $F_{m-1}(x_i)$ 預測值
  • $f_{m-1}$ 表 第 $m-1$ 步建立的 XGB tree

進入第 $m$ 步,我們建一顆新樹 $f_m(x)$ 進一步減少 total loss,使得 $\mathcal{L}^{(m)}< \mathcal{L}^{(m-1)}$ , 則 $m$ 步 cost function 為

現在要找出新樹 $f_m(x_i)$ 的每個 leaf node 輸出能使式 (5) $\mathcal{L}^{(m)}$ 最小

  • $j$ 表 leaf node index
  • $m$ 表第 $m$ 步
  • $\gamma_{j,m}$ $m$ 步 $f_m$ 第 $j$ 個 leaf node 的輸出值
  • $R_{jm}$ 表 $m$ 步 第 $j$ 個 leaf node,所包含的 data sample $x$ 集合

當 loss function $l(y, \hat{y})$ 為 square error 時,求解式 (6) 不難,但如果是 classification problem 時,就變得很棘手。

所以 GBDT 對 regression problem 與 classification problem 分別用了兩種不同方式求解極值,求出 leaf node 的輸出

Second Order Tayler Approximation 的步步逼近

XGBoost 直接以 Second Order Tayler Approximation 處理 classification 跟 regression 的 loss function part $l(y,\hat{y})$

式(5) 的 loss function part 在 $\hat{y}^{m-1}(x_i)$ 附近展開:

  • $\hat{y}^{(m-1)}$ 為 XGB 在 $m-1$ 步的 prediction $F_{m-1}(x)$
  • $g = \cfrac{d}{d \ F_{m-1}} \ l(y, F_{m-1})$
  • $h = \cfrac{d^2}{d^2 \ F_{m-1}} l(y, F_{m-1})$

將式 (7) 代入式(5):

  • $g_i$ 為 first derivative of loss function related to data sample $x_i$
  • $h_i$ 為 second derivative of loss function related to data sample $x_i$
  • $f_m(x_i)$ 為 $x_i$ 在 XGB tree $f_m(x)$ 的 output value

式 (8) 即 XGBoost 在 $m$ 步的 cost function

$\mathcal{L}^{(m)}$ 束手就擒

Second Order Tayler Approximation 逼近 loss function $l(y, \hat{y})$後 ,對 $\mathcal{L}^{(m)}$ 求 $\gamma_{j,m}$ 極值,就變得容易多了

先將 regularization term $\Omega({f_{m}})$ 展開代入式 (8),並拿掉之後對微分沒影響的常數項 $l(y_i, \hat{y}^{(m-1)}_i)$

  • $T_m$ is the number of leaf in tree $f_m$
  • $\tau$ 表對 $T_m$ 的 factor
  • $\gamma_{j,m}$ 表 $m$ 步 XGB tree $f_m$ 第 $j$ 個 leaf node 的輸出值
  • $R_{m,j}$ 表 leaf node j 下的 data sample $x$ 集合
  • 第一個等式到第二個等式 : 從原本遍歷所有 data sample $x$ 到遍歷所有 leaf node $R_{m,j}$ 下的 data sample

式 (9) 對 $\gamma_{j,m}$ 微分取極值

對於已經固定結構了 tree $f_m(x)$,式 (10) leaf node $j$ 的 output value $\gamma_{j,m}$ 為

  • $g_i$ 為 first derivative of loss function related to data sample $x_i$ : $g_i = \cfrac{d}{d \ F_{m-1}} \ l(y_i, F_{m-1}(x_i))$
  • $h_i$ 為 second derivative of loss function related to data sample $x_i$: $h_i = \cfrac{d^2}{d \ F_{m-1}^2} l(y_i, F_{m-1}(x_i))$

將 式(11) $\gamma_{j,m}^*$ 代回 式 (9),即 objective function 的極值

總結

XGBoost 通用 Objective Function

  • $g_i$ 為 first derivative of loss function related to data sample $x_i$ : $g_i = \cfrac{d}{d \ F_{m-1}} \ l(y_i, F_{m-1}(x_i))$
  • $h_i$ 為 second derivative of loss function related to data sample $x_i$: $h_i = \cfrac{d^2}{d \ F_{m-1}^2} l(y_i, F_{m-1}(x_i))$
  • $T_m$ is the number of leaf in tree $f_m$
  • $\tau$ 表對 $T_m$ 的 factor
  • $\gamma_{j,m}$ 表 $m$ 步 XGB tree $f_m$ 第 $j$ 個 leaf node 的輸出值

Optimal Output of Leaf Node $j$

Optimal Value of Objective Function

Why does Approximation with Taylor Expansion Work?

Traditional Gradient Decent

當我們在做 gradient decent 時,我們是在嘗試 minimize a cost function $f(x)$,然後讓 $w^{(i)}$ 往 negative gradient 的方向移動

但 gradient $\nabla f(w^{(i)})$ 本身只告訴我們方向,不會告訴我們真正的 the minimum value,我們得到的是每步後盡量靠近 the minimum value 一點,這使的我們無法保證最終到達極值點

同樣的表達式下的 gradient boost machine 也相似的的問題

傳統的 GBDT 透過建一顆 regression tree $f_m(x)$ 和合適的 step size $\nu$ (learning rate) 擬合 negative gradient 往低谷靠近,可以說 GBDT tree $f_m(x)$ 本身就代表 loss function 的 $\text{negative graident}$ 的方向

Better Gradient Decent: Newton’s Method

Newton’s method 是個改良自 gradient decent 的做法。他不只單純考慮了 gradient 方向 (即 first order derivative) ,還多考慮了 second order derivative 即所謂 gradient 的變化趨勢,這他更精準的定位極值的方向

XGBoost 引入了 Newton’s method 思維,在建立子樹 $f_m(x)$ 不再單純只是 $\text{negatvie gradient}$ 方向 (即 first order derivative) ,還多考慮了 second order derivative 即 gradient 的變化趨勢,這也是為什麼 XGBoost 全稱叫 Extreme Gradient Boosting

  • $\gamma_{j,m}$ 表 $m$ 步 XGB tree $f_m$ 第 $j$ 個 leaf node 的輸出值
  • $g_i$ 為 first derivative of loss function related to data sample $x_i$
  • $h_i$ 為 second derivative of loss function related to data sample $x_i$

而 loss function $l(y_i,\hat{y_i})$ 會因不同應用: regression , classification, rank 而有不同的 objective function,並不一定存在 second order derivative,所以 XGBoost 利用 Taylor expansion 藉由 polynomial function 可以逼近任何 function 的特性,讓 loss function 在 $f_m(x_i)$ 附近存在 second order derivative

可以說,XGBoos tree 以一種更聰明的方式往 the minimum 移動

總結

  • 一般 GBDT 用 regression tree 擬合 residuals,本質上是往 negative gradient 方向移動
  • XGBoost tree $f_m(x)$ 擬合 residuals,同時考慮 gradient 的方向和 gradient 變化趨勢,這讓他朝 optimal value 移動時顯得更加聰明有效
    • gradient 的方向: first order derivative
    • gradient 變化趨勢: second order derivative

Reference

  • Chen, T., & Guestrin, C. (2016). XGBoost: A scalable tree boosting system. Proceedings of the ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, 13-17-Augu, 785–794. https://doi.org/10.1145/2939672.2939785

XGBoost Part 1 (of 4): Regression

XGBoost Part 3 (of 4): Mathematical Details


透視 XGBoost(2) 圖解 Classification

TL;DR

  • XGBoost 與 GBDT 相比,同樣都是擬合上一步 $F_{m-1}(x)$ 預測值的 residual 。不同的是 XGBoost 在擬合 residual 時更為聰明有效,他有自己衡量分裂增益 gain 的方式去擬合 residual 建立 XGB tree $f_m(x)$
  • 分裂增益 gain ,的背後原理可以透過 XGBoost 通用 objective function 並填入 classification/regression/rank/etc.. 各自的 loss function 後推導出的 $\text{first derivative of loss function} = g_i \quad \text{and} \quad \text{second derivative of loss function} = h_i$
  • XGBoost 的 通用 objective function 由兩部份組成
    • first part is loss function,根據不同任務有不同的 loss function
    • second part is regularization term 防止 overfitting,限制 leaf node 輸出值大小 和 leaf nodes 的總數

透視 XGBoost(1) 圖解 Regression

Introduction

XGBoost

XGboost 是 gradient boosting machine 的一種實作方式,xgboost 也是建一顆新樹 $f_m(x)$ 去擬合上一步模型輸出 $F_{m-1}(x)$ 的 $\text{residual}$

不同的是,Xgboost 做了大量運算和擬合的優化,這讓他比起傳統 GBDT 更為高效率與有效


內容推薦 (3):主題卡片推薦

什麼是主題卡片推薦?

主題推薦,就是給定一個概念,然後推薦系統圍繞著這個主題將將相關聯的商品推薦給用戶。

“主題” 是個超越類目, 產品詞或標籤的存在,他可以是:

  • 旅行出行
  • 文青
  • 寬鬆顯瘦
  • 愛車人
  • 追星族
  • 愛美

等於是把商品池中的類目關係解構又重構出一個新的子集。

以用戶端接觸的 UI 來看,主題卡片推薦由兩個構成: Feed 流卡片推薦與 Landing Page 主題推薦。


內容推薦 (2) Title Embedding with Keyword

前言

在前篇 內容推薦 (1) 關鍵詞識別 中,我們利用 entropy 從商品池的 title 中辨識出 product word & label word

此篇,我們將利用已經辨識出的 product word & label word 回頭對商品池中的商品 title 做 embedding

當然你也可以直接將所有 title 送進 Word2Vec 硬 train 一發,然後對 title 內的所有的 word vectors 取平均得到 title vector。