CTR預估系列(3)——Wide&Deep理論與實踐

1. 名詞解釋

1.1 Memorization 和 Generalization

Google Wide&Deep論文中,通篇都是這兩個詞,必須搞懂是怎麼回事!

這個是從人類的認知學習過程中演化來的。人類的大腦很複雜,它可以記憶(memorize)下每天發生的事情(麻雀可以飛,鴿子可以飛)然後泛化(generalize)這些知識到之前沒有看到過的東西(有翅膀的動物都能飛)。

但是泛化的規則有時候不是特別的準,有時候會出錯(有翅膀的動物都能飛嗎)。那怎麼辦那,沒關係,記憶(memorization)可以修正泛化的規則(generalized rules),叫做特例(企鵝有翅膀,但是不能飛)。

這就是Memorization和Generalization的來由或者說含義。

Wide&Deep Mode就是希望計算機可以像人腦一樣,可以同時發揮memorization和generalization的作用。–Heng-Tze Cheng(Wide&Deep作者)

1.2 Wide 和 Deep

同樣,這兩個詞也是通篇出現,究竟什麼意思你明白了沒?

其實,Wide也是一種特殊的神經網絡,他的輸入直接和輸出相連。屬於廣義線性模型的範疇。Deep就是指Deep Neural Network,這個很好理解。Wide Linear Model用於memorization;Deep Neural Network用於generalization。

左側是Wide-only,右側是Deep-only,中間是Wide & Deep:

CTR預估系列(3)——Wide&Deep理論與實踐


1.3 Cross-product transformation

Wide中不斷提到這樣一種變換用來生成組合特徵,也必須搞懂才行哦。它的定義如下:

CTR預估系列(3)——Wide&Deep理論與實踐


k表示第k個組合特徵。i表示輸入X的第i維特徵。C_ki表示這個第i維度特徵是否要參與第k個組合特徵的構造。d表示輸入X的維度。那麼到底有哪些維度特徵要參與構造組合特徵那?這個是你之前自己定好的,在公式中沒有體現。

饒了一大圈,整這麼一個複雜的公式,其實就是我們之前一直在說的one-hot之後的組合特徵:僅僅在輸入樣本X中的特徵gender=female和特徵language=en同時為1,新的組合特徵AND(gender=female, language=en)才為1。所以只要把兩個特徵的值相乘就可以了。

Cross-product transformation 可以在二值特徵中學習到組合特徵,並且為模型增加非線性

2. Wide & Deep Model

Memorization:

之前大規模稀疏輸入的處理是:通過線性模型 + 特徵交叉。所帶來的Memorization以及記憶能力非常有效和可解釋。但是Generalization(泛化能力)需要更多的人工特徵工程。

Generalization:

相比之下,DNN幾乎不需要特徵工程。通過對低緯度的dense embedding進行組合可以學習到更深層次的隱藏特徵。但是,缺點是有點over-generalize(過度泛化)。推薦系統中表現為:會給用戶推薦不是那麼相關的物品,尤其是user-item矩陣比較稀疏並且是high-rank(高秩矩陣)

兩者區別:

Memorization趨向於更加保守,推薦用戶之前有過行為的items。相比之下,generalization更加趨向於提高推薦系統的多樣性(diversity)。

Wide & Deep:

Wide & Deep包括兩部分:線性模型 + DNN部分。結合上面兩者的優點,平衡memorization和generalization。

原因:綜合memorization和generalizatio的優點,服務於推薦系統。相比於wide-only和deep-only的模型,wide & deep提升顯著(這麼比較臉是不是有點大。。。)

2.1 推薦系統

2.1.1 介紹

推薦系統分為兩種: CF-Based(協同過濾)、Content-Based(基於內容的推薦)

  • 協同過濾(collaborative filtering)就是指基於用戶的推薦,用戶A和B比較相似,那麼A喜歡的B也可能喜歡
  • 基於內容推薦是指物品item1和item2比較相似,那麼喜歡item1的用戶多半也喜歡item2

2.1.2 線性模型

大規模的在線推薦系統中,logistic regression應用非常廣泛,因為其**簡單、易擴展、可解釋性。**LR的輸入多半是二值化後的one-hot稀疏特徵。Memorization可以通過在稀疏特徵上cross-product transformations來實現,比如:AND(user_installed_app=QQ, impression_app=WeChat),當特徵user_installed_app=QQ,和特徵impression_app=WeChat取值都為1的時候,組合特徵AND(user_installed_app=QQ, impression_app=WeChat)的取值才為1,否則為0。

推薦系統可以看成是一個search ranking問題,根據query得到items候選列表,然後對items通過ranking算法排序,得到最終的推薦列表。Wide & Deep模型是用來解決ranking問題的。

如果僅僅使用線性模型:無法學習到訓練集中沒有的query-item特徵組合。 Embedding-based Model可以解決這個問題。

2.1.3 Embedding-Based

FM和DNN都算是這樣的模型,可以在很少的特徵工程情況下,通過學習一個低緯度的embedding vector來學習訓練集中從未見過的組合特徵。

FM和DNN的缺點在於:當query-item矩陣是稀疏並且是high-rank的時候(比如user有特殊的愛好,或item比較小眾),很難非常效率的學習出低維度的表示。這種情況下,大部分的query-item都沒有什麼關係。但是dense embedding會導致幾乎所有的query-item預測值都是非0的,這就導致了推薦過度泛化,會推薦一些不那麼相關的物品。

相反,linear model卻可以通過cross-product transformation來記住這些exception rules,而且僅僅使用了非常少的參數。

總結一下:

線性模型無法學習到訓練集中未出現的組合特徵; FM或DNN通過學習embedding vector雖然可以學習到訓練集中未出現的組合特徵,但是會過度泛化。

Wide & Deep Model通過組合這兩部分,解決了這些問題。

2.1.4 工作流程

總的來說, 推薦系統 = Retrieval + Ranking

推薦系統工作流程如下:

CTR預估系列(3)——Wide&Deep理論與實踐


想象這樣一個實際情況:我們打開Google APP store,首頁展示給我們一些APP,我們點擊或者下載或者購買了其中一個APP。在這樣一個流程中,推薦系統是如何工作的那?

我們對比上面的圖一點點來說:

Query:當我們打開APP Store的時候,就產生了一次Query,它包含兩部分的特徵:User features, contextual features。UserFeatures包括性別、年齡等人口統計特徵,ContextualFeatures包括設備、時間等上下文特徵。

Items:

APP store接著展示給我們一系列的app,這些app就是推薦系統針對我們的Query給出的推薦。這個也被叫做impression

User Actions:

針對推薦給你的任何一個APP,我們都可以點擊、下載、購買等操作。也就是說推薦給你的APP,你產生了某種行為。這不正是我們的最終目的嗎!

Logs:

Logs = Query + Impression + UserAction 查詢、展示列表、操作會被記錄到logs中作為訓練數據給Learner來學習。

Retrieval:

假如讓你來想一個最簡單的推薦系統,

針對這一次Query,來給出推薦列表。你能想到的最簡單,最暴力的做法是什麼那?

給數據庫中所有的APP都打一個分數,然後按照分數從高到低返回前N個(比如說前100個)

但是有個問題,這樣數據庫中的APP實在是太多了,為了保證響應時間,這樣做太慢了!Retrieval就是用來解決這個問題的。它會利用機器學習模型和一些人為定義的規則,來返回最匹配當前Query的一個小的items集合,這個集合就是最終的推薦列表的候選集。

Ranking:

今天的主角Wide&Deep Model就是用來做這個事情的啦。

前面Learner學習到了一個Model,利用這個Model對Retrieval給出的候選集APP打分!並按照打分從高到低來排序,並返回前10個APP作為最終的推薦結果展示給用戶。

Retrieval system完了之後,就是Ranking system。Retrieval減小了候選items池,Ranking system要做的就是對比當前的Query,對Candidate pool裡面的所有item打分!

得分score表示成P(y|x), 表示的是一個條件概率。y是label,表示user可以採取的action,比如點擊或者購買。x表示輸入,特徵包括:

  • User features(年齡、性別、語言、民族等)
  • Contextual features(上下文特徵:設備,時間等)
  • Impression features(展示特徵:app age、app的歷史統計信息等)

2.2 Wide Part

Wide Part其實是一個廣義的線性模型

使用特徵包括:

  • raw input 原始特徵
  • cross-product transformation 組合特徵

接下來我們用同一個例子來說明:你給model一個query(你想吃的美食),model返回給你一個美食,然後你購買/消費了這個推薦。 也就是說,推薦系統其實要學習的是這樣一個條件概率: P(consumption | query, item)

CTR預估系列(3)——Wide&Deep理論與實踐

Wide Part可以對一些特例進行memorization。比如AND(query=”fried chicken”, item=”chicken fried rice”)雖然從字符角度來看很接近,但是實際上完全不同的東西,那麼Wide就可以記住這個組合是不好的,是一個特例,下次當你再點炸雞的時候,就不會推薦給你雞肉炒米飯了。

2.3 Deep Part


CTR預估系列(3)——Wide&Deep理論與實踐

Deep Part通過學習一個低緯度的dense representation(也叫做embedding vector)對於每一個query和item,來

泛化給你推薦一些字符上看起來不那麼相關,但是你可能也是需要的。比如說:你想要炸雞,Embedding Space中,炸雞和漢堡很接近,所以也會給你推薦漢堡。

Embedding vectors被隨機初始化,並根據最終的loss來反向訓練更新。這些低維度的dense embedding vectors被作為第一個隱藏層的輸入。隱藏層的激活函數通常使用ReLU。

2.4 模型訓練

原始的稀疏特徵,在兩個組件中都會用到,比如query="fried chicken" item="chicken fried rice":

CTR預估系列(3)——Wide&Deep理論與實踐

在訓練的時候,根據最終的loss計算出gradient,反向傳播到Wide和Deep兩部分中,分別訓練自己的參數。也就是說,兩個模塊是一起訓練的,注意這不是模型融合。

  • Wide部分中的組合特徵可以記住那些稀疏的,特定的rules
  • Deep部分通過Embedding來泛化推薦一些相似的items

Wide模塊通過組合特徵可以很效率的學習一些特定的組合,但是這也導致了他並不能學習到訓練集中沒有出現的組合特徵。所幸,Deep模塊彌補了這個缺點。

另外,因為是一起訓練的,wide和deep的size都減小了。wide組件只需要填補deep組件的不足就行了,所以需要比較少的cross-product feature transformations,而不是full-size wide Model。

論文中的實現:

  • 訓練方法是用mini-batch stochastic optimization。
  • Wide組件是用FTRL(Follow-the-regularized-leader) + L1正則化學習。
  • Deep組件是用AdaGrad來學習。

3. 系統實現


CTR預估系列(3)——Wide&Deep理論與實踐


3.1 訓練數據生成

請大家一定格外的關注訓練數據到底是什麼?這對於理解推薦系統到底是怎麼回事很重要。

先給出結論:

一次展示中的一個Item就是一條樣本。

樣本的label要根據實際的業務需求來定,比如APP Store中想要提高APP的下載率,那麼就以這次展示的這個Item中用戶有沒有下載,作為label。下載了label為1,否則為0.

說白了,模型需要預測,在當前Query的條件下,對於這個Item,用戶下載的條件概率。

離散特徵map成id

過濾掉出現次數少於設定閾值的離散特徵取值,然後把這些全部map成一個ID。離散特徵取值少,就直接編號。多的話可能要Hash

連續特徵通過分位數規範化到[0,1]

先把所有的值分成n份,那麼屬於第i部分的值規範化之後的值為 (i - 1)/(n - 1)。

3.2 模型訓練


CTR預估系列(3)——Wide&Deep理論與實踐

Deep部分使用的特徵:

  • 連續特徵
  • Embedding後的離散特徵,Item特徵

Wide部分使用的特徵:

  • Cross Product Transformation生成的組合特徵

但是,官方給出的示例代碼中,Wide部分還使用了離散特徵(沒有one-hot)。也有大佬說不用特徵交叉效果也很好,這個大家在實際項目中就以實驗為準吧。

每當有新的數據到達的時候,就要重新訓練。如果每次都從頭開始會非常耗時,Google給出的解決辦法是:實現了warm-starting system, 它可以用之前模型的embeddings 和 線性模型的weights來初始化新的模型。

Embedding維度大小的建議:

Wide&Deep的作者指出,從經驗上來講Embedding層的維度大小可以用如下公式來確定:

CTR預估系列(3)——Wide&Deep理論與實踐

n是原始維度上特徵不同取值的個數;k是一個常數,通常小於10.

3.3 線上使用

模型被部署之後。每一次請求,服務器會收到一系列的app候選集(從app retrival system輸出的)以及user features(用於為每一個app打分)。然後,模型會把APP按照score排序,並展示給user,按照這個順序展示。score就是對於wide & deep模型的一次 forward pass。為了控制每一次request響應時間在10ms內,引入了並行化技術。將app候選集分成多個小的batches,並行化預測score。

4. 適用範圍

Wide & Deep Model適用於輸入非常稀疏的大規模分類或迴歸問題。比如推薦系統、search、ranking問題。

輸入稀疏通常是由離散特徵有非常非常多個可能的取值造成的,one-hot之後維度非常大。

5. 優缺點

缺點:Wide部分還是需要人為的特徵工程。

優點:實現了對memorization和generalization的統一建模。

6.代碼實踐

代碼放到github: https://github.com/gutouyu/ML_CIA/tree/master/Wide%26Deep

數據集:https://archive.ics.uci.edu/ml/machine-learning-databases/adult 代碼主要包括兩部分:Wide Linear Model 和 Wide & Deep Model。

數據集長這樣,最後一行是label,預測收入是否超過5萬美元,二分類問題。

CTR預估系列(3)——Wide&Deep理論與實踐

6.1 Wide Linear Model

離散特徵處理分為兩種情況:

  • 知道所有的不同取值,而且取值不多。tf.feature_column.categorical_column_with_vocabulary_list
  • 不知道所有不同取值,或者取值非常多。tf.feature_column.categorical_column_with_hash_bucket


CTR預估系列(3)——Wide&Deep理論與實踐

原始連續特徵

:tf.feature_column.numeric_column

CTR預估系列(3)——Wide&Deep理論與實踐

規範化到[0,1]的連續特徵:tf.feature_column.bucketized_column

CTR預估系列(3)——Wide&Deep理論與實踐

組合特徵/交叉特徵:tf.feature_column.crossed_column

CTR預估系列(3)——Wide&Deep理論與實踐

組裝模型:這裡主要用了離散特徵 + 組合特徵

CTR預估系列(3)——Wide&Deep理論與實踐

訓練 & 評估

CTR預估系列(3)——Wide&Deep理論與實踐

6.2 Wide & Deep Model

Deep部分用的特徵: 未處理的連續特徵 + Embedding(離散特徵)

在Wide的基礎上,增加Deep部分:

離散特徵embedding之後,和連續特徵串聯。

CTR預估系列(3)——Wide&Deep理論與實踐

組合Wide & Deep:DNNLinearCombinedClassifier

CTR預估系列(3)——Wide&Deep理論與實踐

訓練 & 評估

CTR預估系列(3)——Wide&Deep理論與實踐

運行結果

CTR預估系列(3)——Wide&Deep理論與實踐

Reference

  1. Wide & Deep Learning for Recommender Systems
  2. Google AI Blog Wide & Deep Learning: Better Together with TensorFlow https://ai.googleblog.com/2016/06/wide-deep-learning-better-together-with.html
  3. TensorFlow Linear Model Tutorial https://www.tensorflow.org/tutorials/wide
  4. TensorFlow Wide & Deep Learning Tutorial https://www.tensorflow.org/tutorials/wide_and_deep
  5. TensorFlow 數據集和估算器介紹 http://developers.googleblog.cn/2017/09/tensorflow.html
  6. absl https://github.com/abseil/abseil-py/blob/master/smoke_tests/sample_app.py


分享到:


相關文章: