一文看懂推荐系统:排序11:Deep Cross Network(DCN)
一文看懂推薦系統:排序11:Deep & Cross Network(DCN)
提示:最近系統性地學習推薦系統的課程。我們以小紅書的場景為例,講工業界的推薦系統。
我只講工業界實際有用的技術。說實話,工業界的技術遠遠領先學術界,在公開渠道看到的書、論文跟工業界的實踐有很大的gap,
看書學不到推薦系統的關鍵技術。
看書學不到推薦系統的關鍵技術。
看書學不到推薦系統的關鍵技術。
王樹森娓娓道來**《小紅書的推薦系統》**
GitHub資料連接:http://wangshusen.github.io/
B站視頻合集:https://space.bilibili.com/1369507485/channel/seriesdetail?sid=2249610
基礎知識:
【1】一文看懂推薦系統:概要01:推薦系統的基本概念
【2】一文看懂推薦系統:概要02:推薦系統的鏈路,從召回粗排,到精排,到重排,最終推薦展示給用戶
【3】一文看懂推薦系統:召回01:基于物品的協同過濾(ItemCF),item-based Collaboration Filter的核心思想與推薦過程
【4】一文看懂推薦系統:召回02:Swing 模型,和itemCF很相似,區別在于計算相似度的方法不一樣
【5】一文看懂推薦系統:召回03:基于用戶的協同過濾(UserCF),要計算用戶之間的相似度
【6】一文看懂推薦系統:召回04:離散特征處理,one-hot編碼和embedding特征嵌入
【7】一文看懂推薦系統:召回05:矩陣補充、最近鄰查找,工業界基本不用了,但是有助于理解雙塔模型
【8】一文看懂推薦系統:召回06:雙塔模型——模型結構、訓練方法,召回模型是后期融合特征,排序模型是前期融合特征
【9】一文看懂推薦系統:召回07:雙塔模型——正負樣本的選擇,召回的目的是區分感興趣和不感興趣的,精排是區分感興趣和非常感興趣的
【10】一文看懂推薦系統:召回08:雙塔模型——線上服務需要離線存物品向量、模型更新分為全量更新和增量更新
【11】一文看懂推薦系統:召回09:地理位置召回、作者召回、緩存召回
【12】一文看懂推薦系統:排序01:多目標模型
【13】一文看懂推薦系統:排序02:Multi-gate Mixture-of-Experts (MMoE)
【14】一文看懂推薦系統:排序03:預估分數融合
【15】一文看懂推薦系統:排序04:視頻播放建模
【16】一文看懂推薦系統:排序05:排序模型的特征
【17】一文看懂推薦系統:排序06:粗排三塔模型,性能介于雙塔模型和精排模型之間
【18】一文看懂推薦系統:特征交叉01:Factorized Machine (FM) 因式分解機
【19】一文看懂推薦系統:物品冷啟01:優化目標 & 評價指標
【20】一文看懂推薦系統:物品冷啟02:簡單的召回通道
【21】一文看懂推薦系統:物品冷啟03:聚類召回
【22】一文看懂推薦系統:物品冷啟04:Look-Alike 召回,Look-Alike人群擴散
【23】一文看懂推薦系統:物品冷啟05:流量調控
【24】一文看懂推薦系統:物品冷啟06:冷啟的AB測試
【25】推薦系統最經典的 排序模型 有哪些?你了解多少?
【26】一文看懂推薦系統:排序07:GBDT+LR模型
【27】一文看懂推薦系統:排序08:Factorization Machines(FM)因子分解機,一個特殊的案例就是MF,矩陣分解為uv的乘積
【28】一文看懂推薦系統:排序09:Field-aware Factorization Machines(FFM),從FM改進來的,效果不咋地
【29】一文看懂推薦系統:排序10:wide&deep模型,wide就是LR負責記憶,deep負責高階特征交叉而泛化
提示:文章目錄
文章目錄
- 一文看懂推薦系統:排序11:Deep & Cross Network(DCN)
- Deep & Cross Network(DCN)
- 一、動機
- 二、DCN網絡結構
- 2.1 DCN整體結構
- 2.2 cross network部分
- 我們來看個paddle的實現,完整的代碼參見 DCN
- 三、DCN網絡一些參數設置
- 總結
Deep & Cross Network(DCN)
這篇文章是斯坦福和谷歌合作發表在ADKDD’17上的成果,
這篇paper的一作是斯坦福的數學&統計系的學生,
在谷歌實習時,與谷歌的研究人員合作發表了這篇文章。
這篇文章的思想依然是推薦系統模型的永恒主題——
如何得到更有效的交叉特征,從而提高模型的表達能力。
其主要工作是針對wide&deep網絡中wide部分做了改進,
在wide&deep網絡中,wide部分是個簡單的線性模型,其交叉特征依然需要人工設計,
而在DCN中設計了專門的cross網絡用于自動學習交叉特征。
關于這個cross網絡目前存在一定的爭議,
比如在xdeepFM這篇論文中認為DCN中cross網絡交叉的本質
只是對輸入向量x 0 x_0 做了一個和x 0的相關的放縮。
我個人認為,DCN中cross網絡還是有一定作用的,但這個交叉是bit-wise的,
并不像FM系列的vector-wise,
所以其交叉能力應該不像FM系列這么強。
至于到實踐中,其效果還需要在具體的場景中來驗證,
如果你的場景中目前還在用LR等模型,想要應用深度模型,個人更推薦直接跨越到deepFM。
言歸正傳,我們來看看這篇文章,還是和以前的博客結構差不多,從動機、模型結構、細節等入手。
一、動機
這篇文章的動機可以歸納為兩個點:
普通的DNN雖然理論上可以逼近任意的函數,
隨著網絡層數加深能學到任意的特征組合,
但實際上其很難有效的學到特征的二階交叉甚至三階交叉。
個人認為那些懷抱著只要有足夠的數據,其他的都交給DNN去辦想法的,
基本上很難取得令人滿意的效果。
引用本文作者在DCN V2論文中的一段話:
People generally consider DNNs as universal function approximators, that could potentially learn all kinds of feature interactions. However, recent studies found that DNNs are inefficient to even approximately model 2nd or 3rd-order feature crosses。
正因為DNN無法有效的學到明顯的交叉特征,
所以大多還是人工手動的做一些交叉特征,
比如wide&deep模型中wide部分的特征,
但顯然人工的去設計,會面臨著諸多的痛點:組合爆炸問題,需要先驗的專家知識等。
基于以上兩個痛點,這篇文章提出了DCN模型,
其包含兩個部分:
cross網絡和普通的dnn網絡,
cross網絡能夠自動的學習任意高階的交叉特征。
二、DCN網絡結構
2.1 DCN整體結構
這里直接拿原始論文中的網絡結構圖,如下圖所示。
從圖中能夠比較清晰的看到DCN的結構也是類似于wide&deep這種范式,
不同的是用了一個cross network替代了wide network,
右邊都是一樣的,用了普通的DNN。
所以我們接下來也是把重心放在cross network上。
2.2 cross network部分
整篇論文的核心,也將是本篇博客的重點筆墨的部分。
cross network的網絡結構如下所示(引用DCN V2論文[2]中的的圖):
其中一層的計算是
再結合形式化的公式一起,感覺更好理解:
在實踐中顯然是不能按照這個公式去算得,因為復雜度有點高。
我們稍微把這個公式變個形,
一來更方面計算,
二來也更加有利于理解及實現(作者在dcn v2這篇論文中也是這樣寫的):
我們來看個paddle的實現,完整的代碼參見 DCN
def _cross_layer(self, input_0, input_x):"""input_0: Tensor(shape=[8, 247]), 8=batch_sizeinput_x: Tensor(shape=[8, 247])"""# input_x, Tensor(shape=[8, 247]) --> 8=batch_size# layer_w, shape=[247]# input_w, Tensor(shape=[8, 247])input_w = paddle.multiply(input_x, self.layer_w) # Tensor(shape=[8, 1])input_w1 = paddle.sum(input_w, axis=1, keepdim=True) # input_0=[8, 247], input_w1=[8,1]# broadcast --> [8, 247]input_ww = paddle.multiply(input_0, input_w1)input_layer_0 = paddle.add(input_ww, self.layer_b)input_layer = paddle.add(input_layer_0, input_x)# print("-----input_layer----", input_layer)return input_layer, input_w這里是用的數據集是Criteo的Display Advertising Challenge數據集,
26個類別特征,13個連續值特征,
這里類別特征embedding維度為9,因此x 0的維度為13+26*9=247。
一步步來看下這個代碼:
input_w = paddle.multiply(input_x, self.layer_w) 為一個哈達瑪積,即對應元素相乘
input_w1 = paddle.sum(input_w, axis=1, keepdim=True) 然后做一個sum,這兩步的結果為一個 8 ? 1 8*18?1的矩陣:
上面的例子能夠比較清晰的看出cross network這種結構是如何做到特征交叉的,
并且cross network的網絡層數決定了特征交叉的階數。
三、DCN網絡一些參數設置
通過看這些網絡結構的一些超參數的設置以及訓練時的一些小trick,
多多少少能對我們有一些幫助,下面來看看DCN的一些超參數的設置:
總結
提示:如何系統地學習推薦系統,本系列文章可以幫到你
(1)找工作投簡歷的話,你要將招聘單位的崗位需求和你的研究方向和工作內容對應起來,這樣才能契合公司招聘需求,否則它直接把簡歷給你掛了
(2)你到底是要進公司做推薦系統方向?還是純cv方向?還是NLP方向?還是語音方向?還是深度學習機器學習技術中臺?還是硬件?還是前端開發?后端開發?測試開發?產品?人力?行政?這些你不可能啥都會,你需要找準一個方向,自己有積累,才能去投遞,否則面試官跟你聊什么呢?
(3)今日推薦系統學習經驗:DCN是對wide&deep網絡中wide部分做了改進為cross network
總結
以上是生活随笔為你收集整理的一文看懂推荐系统:排序11:Deep Cross Network(DCN)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android studio使用开源项目
- 下一篇: 中山公园再添一座新地标,青岛首家丛林书吧