論文筆記 - Wide & Deep Learning for Recommender Systems

這篇 paper 講道理也 delay 好久了~最近終於又抽了點時間從新看了一下這篇 paper~看這篇 paper 的背景是由於目前我所負責的推薦項目所使用的模型和 wide&deep 這個模型的背景很是很是類似~基本都是線性模型做爲 wide 模型,隱性模型做爲 deep 模型,好比咱們模型 deep 部分目前使用的是 embedding-based 模型,FM,而這篇 paper 是在 deep 這部分使用了神經網絡。數據庫

先推薦一波本身以前的分享~markdown

億級用戶個性化品類推薦實戰網絡

而後,放上 paper 地址~多線程

Wide &Deep Learning for Recommender Systems架構

這篇 paper 的核心就是結合 wide 模型和 deep 模型,最終的組合模型能夠達到有效的記憶和概括。app

Introduction機器學習

paper 中將推薦系統視做了一個檢索系統,輸入的查詢條件是用戶和上下文信息,輸出是一個有序的推薦列表。當給定一個查詢時,推薦系統的任務是:ide

  1. 從數據庫中找到與查詢條件相關性最強的推薦內容
  2. 而後將查詢出的內容根據必定條件進行排序,好比點擊或購買

如何同時實現記憶和概括在推薦系統和檢索系統中都是一個挑戰~簡單來講,記憶就是經過學習歷史數據中頻繁出現的品類或特徵的共現,概括是經過相關性傳遞而且探索歷史數據中從未出現過的特徵組合。基於記憶的推薦系統一般更有針對性,與用戶歷史的行爲相關性更強。與記憶相比,概括更傾向於改善推薦內容的多樣性。在這篇 paper 中,更專一於 Google play 應用商店的應用推薦問題,可是這個研究一樣適用於普通推薦系統。函數

大規模的在線推薦系統,LR 這樣的線性模型很是經常使用,由於簡單而且可解釋性強,可是線性模型沒法學習到沒有出現過的特徵組合,須要人工特徵工程。性能

而 embedding-based 模型,好比 FM 或者神經網絡,能夠經過學習每一次 query 中低維的向量來泛化以前沒有出現過得特徵組合。可是,當數據稀疏且高維的時候,是很難學習到有效的低維向量的。

Recommender System Overview

上圖給出了一個推薦系統的架構,總體由上一節說到的兩部分組成,檢索系統和排序系統,當用戶訪問 APP store 的時候視做一次查詢,包含用戶和上下文的特徵,而後檢索這部分會根據用戶的偏好行爲,好比點擊、購買,返回用戶最感興趣的 APP 列表。同時,這一次的用戶行爲會記錄在日誌中做爲訓練數據。

目前數據庫中已有的 APP 已經數以百萬計,因此若是每一次查詢的時候都計算用戶對每一個 APP 的 score,這樣是不現實的。所以,第一步應該是挑選召回集。檢索也就是召回系統會返回與當前用戶最匹配的不多的 APP 列表,這裏的檢索一般會結合機器學習模型和人工定義規則的兩種方法,召回最佳候選集後,再使用排序系統對每一個 APP 進行 score 的計算和最終排序。這裏計算出的 score 一般是P(y|x),即當給定特徵 x,用戶行爲的機率,這裏的 y 是用戶的行爲,即 label,這裏的 x 爲特徵,包括

  • user feature
    • country,language,demographics
    • 即用戶特徵
  • Contextual feature
    • device,hour of the day,day of the week
    • 即上下文特徵
  • Impression feature
    • app age,historical statistics of an app
    • 即 APP 統計特徵

Wide & Deep Learning

在介紹中說到,這篇 paper 的核心點就在於,結合了 wide model 和 deep model,一個用做記憶,一個用做概括泛化,結合各自的優點行程了 Wide&Deep 模型用於推薦排序。

Wide Model

上圖的左半部分就是組合模型中的 wide model,這部分使用的模型是 LR,這部分主要用做學習樣本中特徵的共現性,產生的結果是和用戶有過直接行爲的 item,線性模型表達以下,

y = \mathbf{w}^T \mathbf{x} + b

其中 y 是預測的機率,x 是表示特徵的向量,w 表示模型的參數,也就是最終訓練出來的每一個特徵向量的權重,b 是 bias 項,也就是常數項。

在這部分特徵使用 one-hot 編碼,爲了達到記憶的目的,對稀疏的特徵採用了 cross-product transformation,表達以下

\phi_k(\mathbf{x}) = \prod_{i = 1}^d x_i^{c_{k_i}}\quad c_{k_i} \in {0, 1}

好比對於「AND(gender=female, language=en)」這個特徵,當且僅當這個用戶的性別爲 female,語言爲 en 的時候,這個特徵值才爲 1,其餘狀況都爲 0。這個操做,增長了二元特徵之間的相互做用,而且爲線性模型增長了非線性因素。

Deep Model

圖中的右半部分也就是組合模型中的 deep model,這部分使用的是前饋神經網絡。對於分類特徵,特徵輸入一般是 string,好比"language=en",這樣的高維分類特徵首先會被轉換成一個低維的且密集的實數向量。向量的維數一般在O(10)到O(100)之間,這些向量通常使用隨機的方法進行初始化,隨機能夠均勻隨機也能夠隨機成正態分佈,隨機初始化的目的是將向量初始化到一個數量級,在訓練過程當中經過最小化損失函數來優化模型。而後將這些低維向量傳入到神經網絡的隱層中去。

每一個隱層中都作這樣的計算,

a^{(l+1)} = f(W^{(l)}a^{(l)} + b^{(l)})

其中,l 是層數,f 是激活函數,一般使用 ReLU。

一般狀況下這部分特徵使用的是用戶行爲特徵,用於學習歷史數據中不存在的特徵組合。

組合訓練

對於兩個模型的輸出分別計算比值比,而後取 log 後加權求和做爲最終的 score。

區分 ensemble 和 joint\quad training

  • Emsemble 表示兩個模型分別獨立訓練,只有在最終預測的時候纔將兩個模型組合計算
  • Join training 經過在訓練的時候同時考慮 wide model 和 deep model 以及兩個部分拼接起來的特徵的權重來同時優化全部參數

同時,這兩種訓練的區別在模型大小上也有所體現,單獨訓練的模型會更大一些。wide&deep model 使用 mini-batch stochastic optimization 進行訓練,在實驗中,wide model 使用了 FTRL+L1 正則,而 deep model 使用了 AdaGrad。

對於 LR,模型預測以下,

P(Y = 1|\mathbf{x}) = \sigma(\mathbf{w}^T_{wide}[\mathbf{x},\phi(\mathbf{x})] + \mathbf{w}^T_{deep}a^{(l_f)}+b)

其中,Y 是二分類的 label,\sigma 表示 sigmoid 函數,\phi(\mathbf{x})表示原始特徵\mathbf{x} cross product transformations,b 表示 bias 項,\mathbf{w}_{deep} 表示最終激活 a^{(l_f)} 的權重。

System Implementation

應用推薦的 pipline 主要包含三個階段:數據生成,模型訓練和模型服務,以下圖,

數據生成

在這部分,選取一個時間週期內用戶和 APP 數據做爲訓練數據。

Label:應用下載,當應用被下載,則爲 1,不然爲 0

Vocabularies:將類別特徵映射爲整型 ID,連續的實數特徵先映射到 CDF,而後再作離散化。

模型訓練

模型結構如圖,

在訓練過程當中,咱們輸入的隱層獲取訓練數據和 vocabularies,生成稀疏和密集的特徵並與 label 進行拼接。wide 部分包含用戶展現和安裝 APP 的 cross-product transformation,deep 部分,每一個分類特徵都是一個 32 維的向量進行學習。咱們將全部 embedding 和密集的特徵鏈接在一塊兒,造成一個約爲 1200 維的密集向量。而後將鏈接的向量輸入3個 ReLU 層,最後輸入到邏輯輸出單元。

在這部分須要注意的點是,若是每一次都從新訓練的話,時間成本很高,因此爲了解決這個問題,當新的訓練數據來的時候,咱們使用熱啓動,方法是從以前的模型中讀取 embeddings 和線性模型的權重來初始化新模型。同時,咱們會使用以前的模型進行及安裝檢查,保證在接入實時流的時候不會出現問題。

模型服務

爲了保證每一個請求均可以在 10 ms 內返回結果,咱們經過多線程並行運行來優化性能,而不是單個 batch 內對全部候選集的 score 進行計算。

總結

總體上來說,這篇 paper 的模型適用的場景很普遍,目前也有不少公司都在用 wide&deep,可用性很強~

相關文章
相關標籤/搜索