日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

10、DCN 介绍

發布時間:2023/12/16 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 10、DCN 介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

傳統的CTR預估模型需要大量的特征工程,耗時耗力;引入DNN之后,依靠神經網絡強大的學習能力,可以一定程度上實現自動學習特征組合。但是DNN的缺點在于隱式的學習特征組合帶來的不可解釋性,以及低效率的學習(并不是所有的特征組合都是有用的)。
最開始FM使用隱向量的內積來建模組合特征;FFM在此基礎上引入field的概念,針對不同的field上使用不同隱向量。但是,這兩者都是針對低階的特征組合進行建模的。
而DNN學習到的特征都是高度非線性的高階組合特征,含義非常難以解釋。

1、 DCN 介紹

DCN全稱Deep & Cross Network,是谷歌和斯坦福大學在2017年提出的用于Ad Click Prediction的模型。DCN(Deep Cross Network)在學習特定階數組合特征的時候效率非常高,而且同樣不需要特征工程,引入的額外的復雜度也是微乎其微的。

2、DCN模型結構


DCN架構圖如上圖所示:最開始是Embedding and stacking layer,然后是并行的Cross Network和Deep Network,最后是Combination Layer把Cross Network和Deep Network的結果組合得到Output。

2.1 Embedding and Stacking Layer

  • 為什么要Embed?

    • 在web-scale的推薦系統比如CTR預估中,輸入的大部分特征都是類別型特征,通常的處理辦法就是one-hot,但是one-hot之后輸入特征維度非常高非常稀疏。
    • 所以有了Embedding來大大的降低輸入的維度,就是把這些binary features轉換成dense vectors with real values。
    • Embedding操作其實就是用一個矩陣和one-hot之后的輸入相乘,也可以看成是一次查詢(lookup)。這個Embedding矩陣跟網絡中的其他參數是一樣的,是需要隨著網絡一起學習的。
  • 為什么要Stack?
    處理完了類別型特征,還有連續型特征沒有處理那。所以我們把連續型特征規范化之后,和嵌入向量stacking到一起,就得到了原始的輸入:

2.2 Cross Network

Cross Network是整篇論文的核心。它被設計來高效的學習組合特征,關鍵在于如何高效的進行feature crossing。形式化如下:

xl和xl+1 分別是第l層和第l+1層cross layer的輸出,wl和bl是這兩層之間的連接參數。注意上式中所有的變量均是列向量,W也是列向量,并不是矩陣。

  • 該怎么理解?
    其實也不難,xl+1 = f(xl, wl, bl) + xl. 每一層的輸出,都是上一層的輸出加上feature crossing f。而f就是在擬合該層輸出和上一層輸出的殘差。 針對one cross layer可視化如下:

  • High-degree Interaction Across Features:

Cross Network特殊的網絡結構使得cross feature的階數隨著layer depth的增加而增加。相對于輸入x0來說,一個l層的cross network的cross feature的階數為l+1。

  • 復雜度分析:
    假設一共有Lc層cross layer,起始輸入x0的維度為d。那么整個cross network的參數個數為:


因為每一層的W和b都是d維度的。
從上式可以發現,復雜度是輸入維度d的線性函數。所以相比于deep network,cross network引入的復雜度微不足道。這樣就保證了DCN的復雜度和DNN是一個級別的。論文中表示,Cross Network之所以能夠高效的學習組合特征,就是因為x0 * xT的秩為1,使得我們不用計算并存儲整個的矩陣就可以得到所有的cross terms。
但是,正是因為cross network的參數比較少導致它的表達能力受限,為了能夠學習高度非線性的組合特征,DCN并行的引入了Deep Network。

2.3 Deep Network

這一部分沒什么特別的,就是一個前向傳播的全連接神經網絡,我們可以計算一下參數的數量來估計下復雜度。假設輸入x0維度為d,一共有Lc層神經網絡,每一層的神經元個數都是m個。那么總的參數或者復雜度為:

2.4 Combination Layer

Combination Layer把Cross Network和Deep Network的輸出拼接起來,然后經過一個加權求和后得到logits,然后經過sigmoid函數得到最終的預測概率。形式化如下:

p是最終的預測概率;XL1是d維的,表示Cross Network的最終輸出;hL2是m維的,表示Deep Network的最終輸出;Wlogits是Combination Layer的權重;最后經過sigmoid函數,得到最終預測概率。

損失函數使用帶正則項的log loss,形式化如下:


另外,針對Cross Network和Deep Network,DCN是一起訓練的,這樣網絡可以知道另外一個網絡的存在。

3、實例

接下來使用的代碼主要采用開源的DeepCTR,相應的API文檔可以在這里閱讀
https://deepctr-doc.readthedocs.io/en/latest/Examples.html

import pandas as pd from sklearn.preprocessing import LabelEncoder, MinMaxScaler from sklearn.model_selection import train_test_split from deepctr.models.dcn import DCN from deepctr.feature_column import SparseFeat, DenseFeat, get_feature_namesdata = pd.read_csv('./criteo_sample.txt')sparse_features = ['C' + str(i) for i in range(1, 27)] dense_features = ['I' + str(i) for i in range(1, 14)]data[sparse_features] = data[sparse_features].fillna('-1', ) data[dense_features] = data[dense_features].fillna(0, ) target = ['label']for feat in sparse_features:lbe = LabelEncoder()data[feat] = lbe.fit_transform(data[feat])mms = MinMaxScaler(feature_range=(0, 1)) data[dense_features] = mms.fit_transform(data[dense_features])sparse_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].nunique(), embedding_dim=4)for i, feat in enumerate(sparse_features)] # 或者hash,vocabulary_size通常要大一些,以避免hash沖突太多 # sparse_feature_columns = [SparseFeat(feat, vocabulary_size=1e6,embedding_dim=4,use_hash=True) # for i,feat in enumerate(sparse_features)]#The dimension can be set according to data dense_feature_columns = [DenseFeat(feat, 1)for feat in dense_features]dnn_feature_columns = sparse_feature_columns + dense_feature_columns linear_feature_columns = sparse_feature_columns + dense_feature_columns feature_names = get_feature_names(linear_feature_columns + dnn_feature_columns)train, test = train_test_split(data, test_size=0.2)train_model_input = {name: train[name].values for name in feature_names} test_model_input = {name: test[name].values for name in feature_names}model = DCN(linear_feature_columns, dnn_feature_columns, task='binary') model.compile("adam", "binary_crossentropy",metrics=['binary_crossentropy'], )history = model.fit(train_model_input, train[target].values,batch_size=256, epochs=10, verbose=2, validation_split=0.2, ) pred_ans = model.predict(test_model_input, batch_size=256)

4、 總結

DCN特點如下:

  • 使用cross network,在每一層都應用feature crossing。高效的學習了bounded degree組合特征。不需要人工特征工程。
  • 網絡結構簡單且高效。多項式復雜度由layer depth決定。
  • 相比于DNN,DCN的logloss更低,而且參數的數量將近少了一個數量級。

總結

以上是生活随笔為你收集整理的10、DCN 介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。