這篇 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
如何同時實現記憶和概括在推薦系統和檢索系統中都是一個挑戰~簡單來講,記憶就是經過學習歷史數據中頻繁出現的品類或特徵的共現,概括是經過相關性傳遞而且探索歷史數據中從未出現過的特徵組合。基於記憶的推薦系統一般更有針對性,與用戶歷史的行爲相關性更強。與記憶相比,概括更傾向於改善推薦內容的多樣性。在這篇 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 爲特徵,包括
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
同時,這兩種訓練的區別在模型大小上也有所體現,單獨訓練的模型會更大一些。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,可用性很強~