Introduction
現在推薦系統的一個難點就是同時實現Memorization以及Generalization,這個難點與搜尋排名問題相似。
Memorization:
之前大規模稀疏輸入的處理是:透過線性模型 + 特徵交叉。透過特徵交叉能夠帶來很好的效果並且可解釋性強。但是Generalization(泛化能力)需要更多的人工特徵工程。
Generalization:
相比之下,DNN幾乎不需要特徵工程。透過對低緯度的dense embedding進行組合可以學習到更深層次的隱藏特徵。但是,缺點是有點over-generalize(過度泛化)。推薦系統中表現為:會給使用者推薦不是那麼相關的物品,尤其是user-item矩陣比較稀疏並且是high-rank(高秩矩陣)
Wide&Deep
本文中,介紹了一種新的方法,Wide&Deep,包括兩部分,Wide Part和Deep Part。
Wide部分:利用了廣義線性模型,提高可解釋性。
在大規模的線上推薦系統中,logistic regression應用非常廣泛,因為其簡單、易擴充套件、可解釋性。LR的輸入多半是二值化後的one-hot稀疏特徵。Memorization可透過在稀疏特徵上做特徵交叉來實現,例如:user_installed_app=netflix,impression_app=pandora,當user_installed_app與impression_app的取值都為1時,其組合特徵AND(user_installed_app=netflix, impression_app=pandora)的值則為1,否則為0。
缺點:無法學習高階組合特徵,並且需要進行人工特徵工程。
Deep部分:主要是發現訓練集中未出現的高階組合特徵。
Embedding-based模型可以在很少的特徵工程情況下,透過學習一個低維的embedding vector來學習訓練集中從未見過的組合特徵。例如,FM與DNN。不需要進行復雜的特徵工程。
缺點:當query-item矩陣是稀疏並且是high-rank的時候(比如user有特殊的愛好,或item比較小眾),很難非常效率的學習出低維度的表示。這種情況下,大部分的query-item都沒有什麼關係。但是dense embedding會導致幾乎所有的query-item預測值都是非0的,這就導致了推薦過度泛化,會推薦一些不那麼相關的物品。
總結
Wide&Deep結合以上兩者的優點,平衡Memorization和Generalization。相比於wide-only和deep-only的模型,Wide&Deep提升顯著。
推薦系統
推薦系統可以看成是一個search ranking問題,根據query得到items候選列表,然後對items透過ranking演算法排序,得到最終的推薦列表。Wide&Deep模型是用來解決ranking問題的。
推薦系統示意圖:
推薦系統會返回一個apps列表,這些列表中包含了user actions,例如點選或者購買。
本文是在Google APP store上的推薦,主要流程為:
Query: 當我們開啟APP Store的時候,就產生了一次Query,它包含兩部分的特徵:user features, contextual features。user features 包括性別、年齡,國家,語言等人口統計特徵,contextual features包括裝置、時間(hour of the day, day of the week)等上下文特徵。
Items: APP store接著展示給我們一系列的app,這些app就是推薦系統針對我們的Query給出的推薦。這個也被叫做impression。
User Actions: 針對推薦給你的任何一個APP,我們都可以點選、下載、購買等操作。也就是說推薦給你的APP,你產生了某種行為。
Logs: Logs = Query + Impression + UserAction 查詢、展示列表、操作會被記錄到logs中作為訓練資料給Learner來學習。
Retrieval:針對這一次Query,來給出推薦列表。暴力做法:給資料庫中所有的APP都打一個分數,然後按照分數從高到低返回前N個(比如說前100個)。機器學習方法:利用機器學習模型和一些人為定義的規則,來返回最匹配當前Query的一個小的items集合,這個集合就是最終的推薦列表的候選集。
Ranking:前面Learner學習到了一個Model,利用這個Model對Retrieval給出的候選集APP打分!並按照打分從高到低來排序,並返回前10個APP作為最終的推薦結果展示給使用者。
Recommender system = Retrieval system + Ranking system
Retrieval system:對當前Query構造候選item集。
Ranking system:對候選item集中的item進行打分,減小候選item集數量。得分score表示成P(y|x), 表示的是一個條件機率。y是label,表示user可以採取的action,比如點選或者購買。x表示輸入,特徵包括:
User features(eg.country, language, demographics)
Contextual features(eg.device, hour of the day, day of the week)
Impression features(eg.app age, historical statistics of an app)
Wide&Deep Model主要是進行Ranking部分。
Wide&Deep模型
結構圖:
The Wide Component
廣義線性模型
結構圖:
輸入特徵:
raw input 原始特徵
cross-product transformation 組合特徵
組合特徵公式:
\Phi(X) = \prod_{i = 1}^{d}x_{i}^{c_{ki}}, c_{ki} \in (0,1)
其中i表示輸入x的第i維特徵,cki表示這個第i維度特徵是否要參與第k個組合特徵的構造。
主要是category特徵進行one-hot編碼後進行交叉組合,例如,AND(gender=female, language=en)。
The Deep Component
這裡採用了DNN模型,結構圖如下:
對於分類特徵,原始輸入是特徵字串(例如“language = en”)。 首先將這些稀疏高維分類特徵中的每一個轉換成低維且密集的實值向量,通常稱為embedding vector。embedding vector傳給隱藏層進行前向訓練。隱藏層的啟用函式通常使用ReLU。
系統實現
本文中採用的方法:
- 訓練方法是用mini-batch stochastic optimization
- Wide元件是用FTRL(Follow-the-regularized-leader) + L1正則化學習。
- Deep元件是用AdaGrad來學習。
apps recommender結構圖:
資料處理
- Categorical Features(種類特徵)map 成id
過濾掉出現次數少於設定閾值的離散特徵取值,然後把這些全部map成一個ID。離散特徵取值少,就直接編號。多的話可能要Hash - Continuous Features(連續特徵)透過分位數規範化到[0,1]
先把所有的值分成n份,那麼屬於第i部分的值規範化之後的值為 (i - 1)/(n - 1)。
訓練
- Wide Part:
Cross Product Transformation(組合特徵) - Deep Part:
Continuous Features + embedding(Categorical Features)
Embedding維度大小的建議:
Wide&Deep的作者指出,從經驗上來講Embedding層的維度大小可以用如下公式:
其中n是原始維度上特徵不同取值的個數;K是一個常數,通常小於10.
結論
推薦系統中Memorization和Generalization都十分重要,Wide&Deep模型實現了對Memorization和Generalization的統一建模。
本作品採用《CC 協議》,轉載必須註明作者和本文連結