<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          DeepCrossing模型

          共 6694字,需瀏覽 14分鐘

           ·

          2024-04-11 01:39

          DeepCrossing

          1. 動機(jī)

          這個模型就是一個真正的把深度學(xué)習(xí)架構(gòu)應(yīng)用于推薦系統(tǒng)中的模型了, 2016年由微軟提出, 完整的解決了特征工程、稀疏向量稠密化, 多層神經(jīng)網(wǎng)絡(luò)進(jìn)行優(yōu)化目標(biāo)擬合等一系列深度學(xué)習(xí)再推薦系統(tǒng)的應(yīng)用問題。 這個模型涉及到的技術(shù)比較基礎(chǔ),在傳統(tǒng)神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)上加入了embedding,殘差連接等思想,且結(jié)構(gòu)比較簡單,對初學(xué)者復(fù)現(xiàn)和學(xué)習(xí)都比較友好。

          DeepCrossing模型應(yīng)用場景是微軟搜索引擎Bing中的搜索廣告推薦, 用戶在輸入搜索詞之后, 搜索引擎除了返回相關(guān)結(jié)果, 還返回與搜索詞相關(guān)的廣告,Deep Crossing的優(yōu)化目標(biāo)就是預(yù)測對于某一廣告, 用戶是否會點擊,依然是點擊率預(yù)測的一個問題。

          這種場景下,我們的輸入一般會有類別型特征,比如廣告id,和數(shù)值型特征,比如廣告預(yù)算,兩種情況。 對于類別型特征,我們需要進(jìn)行one-hot編碼處理,而數(shù)值型特征 一般需要進(jìn)行歸一化處理,這樣算是把數(shù)據(jù)進(jìn)行了一個簡單清洗。 DeepCrossing模型就是利用這些特征向量進(jìn)行CRT預(yù)估,那么它的結(jié)構(gòu)長啥樣, 又是怎么做CTR預(yù)估的呢? 這又是DeepCrossing的核心內(nèi)容。

          2. 模型結(jié)構(gòu)及原理

          為了完成端到端的訓(xùn)練, DeepCrossing模型要在內(nèi)部網(wǎng)絡(luò)結(jié)構(gòu)中解決如下問題:

          1. 離散類特征編碼后過于稀疏, 不利于直接輸入神經(jīng)網(wǎng)絡(luò)訓(xùn)練, 需要解決稀疏特征向量稠密化的問題
          2. 如何解決特征自動交叉組合的問題
          3. 如何在輸出層中達(dá)成問題設(shè)定的優(yōu)化目標(biāo)

          DeepCrossing分別設(shè)置了不同神經(jīng)網(wǎng)絡(luò)層解決上述問題。模型結(jié)構(gòu)如下

          aa71baf185a8a78f874b6946d9d028c5.webp

          下面分別介紹一下各層的作用:

          2.1 Embedding Layer

          將稀疏的類別型特征轉(zhuǎn)成稠密的Embedding向量,Embedding的維度會遠(yuǎn)小于原始的稀疏特征向量。 Embedding是NLP里面常用的一種技術(shù),這里的Feature #1表示的類別特征(one-hot編碼后的稀疏特征向量), Feature #2是數(shù)值型特征,不用embedding, 直接到了Stacking Layer。 關(guān)于Embedding Layer的實現(xiàn), 往往一個全連接層即可,Tensorflow中有實現(xiàn)好的層可以直接用。 和NLP里面的embedding技術(shù)異曲同工, 比如Word2Vec, 語言模型等。

          2.2 Stacking Layer

          這個層是把不同的Embedding特征和數(shù)值型特征拼接在一起,形成新的包含全部特征的特征向量,該層通常也稱為連接層, 具體的實現(xiàn)如下,先將所有的數(shù)值特征拼接起來,然后將所有的Embedding拼接起來,最后將數(shù)值特征和Embedding特征拼接起來作為DNN的輸入,這里TF是通過Concatnate層進(jìn)行拼接。

                
                #將所有的dense特征拼接到一起
          dense_dnn_list = list(dense_input_dict.values())
          dense_dnn_inputs = Concatenate(axis=1)(dense_dnn_list) # B x n (n表示數(shù)值特征的數(shù)量)

          # 因為需要將其與dense特征拼接到一起所以需要Flatten,不進(jìn)行Flatten的Embedding層輸出的維度為:Bx1xdim
          sparse_dnn_list = concat_embedding_list(dnn_feature_columns, sparse_input_dict, embedding_layer_dict, flatten=True

          sparse_dnn_inputs = Concatenate(axis=1)(sparse_dnn_list) # B x m*dim (n表示類別特征的數(shù)量,dim表示embedding的維度)

          # 將dense特征和Sparse特征拼接到一起
          dnn_inputs = Concatenate(axis=1)([dense_dnn_inputs, sparse_dnn_inputs]) # B x (n + m*dim)

          2.3 Multiple Residual Units Layer

          該層的主要結(jié)構(gòu)是MLP, 但DeepCrossing采用了殘差網(wǎng)絡(luò)進(jìn)行的連接。通過多層殘差網(wǎng)絡(luò)對特征向量各個維度充分的交叉組合, 使得模型能夠抓取更多的非線性特征和組合特征信息, 增加模型的表達(dá)能力。殘差網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示:

          bf0a550f2a45d3fb27ffe5c583a4e9a0.webp

          Deep Crossing模型使用稍微修改過的殘差單元,它不使用卷積內(nèi)核,改為了兩層神經(jīng)網(wǎng)絡(luò)。我們可以看到,殘差單元是通過兩層ReLU變換再將原輸入特征相加回來實現(xiàn)的。具體代碼實現(xiàn)如下:

                
                # DNN殘差塊的定義
          class ResidualBlock(Layer):
              def __init__(self, units): # units表示的是DNN隱藏層神經(jīng)元數(shù)量
                  super(ResidualBlock, self).__init__()
                  self.units = units

              def build(self, input_shape):
                  out_dim = input_shape[-1]
                  self.dnn1 = Dense(self.units, activation='relu')
                  self.dnn2 = Dense(out_dim, activation='relu'# 保證輸入的維度和輸出的維度一致才能進(jìn)行殘差連接
              def call(self, inputs):
                  x = inputs
                  x = self.dnn1(x)
                  x = self.dnn2(x)
                  x = Activation('relu')(x + inputs) # 殘差操作
                  return x

          2.4 Scoring Layer

          這個作為輸出層,為了擬合優(yōu)化目標(biāo)存在。 對于CTR預(yù)估二分類問題, Scoring往往采用邏輯回歸,模型通過疊加多個殘差塊加深網(wǎng)絡(luò)的深度,最后將結(jié)果轉(zhuǎn)換成一個概率值輸出。

                
                # block_nums表示DNN殘差塊的數(shù)量
          def get_dnn_logits(dnn_inputs, block_nums=3):
              dnn_out = dnn_inputs
              for i in range(block_nums):
                  dnn_out = ResidualBlock(64)(dnn_out)
              
              # 將dnn的輸出轉(zhuǎn)化成logits
              dnn_logits = Dense(1, activation='sigmoid')(dnn_out)

              return dnn_logits

          3. 總結(jié)

          這就是DeepCrossing的結(jié)構(gòu)了,比較清晰和簡單,沒有引入特殊的模型結(jié)構(gòu),只是常規(guī)的Embedding+多層神經(jīng)網(wǎng)絡(luò)。但這個網(wǎng)絡(luò)模型的出現(xiàn),有革命意義。DeepCrossing模型中沒有任何人工特征工程的參與,只需要簡單的特征處理,原始特征經(jīng)Embedding Layer輸入神經(jīng)網(wǎng)絡(luò)層,自主交叉和學(xué)習(xí)。 相比于FM,F(xiàn)FM只具備二階特征交叉能力的模型,DeepCrossing可以通過調(diào)整神經(jīng)網(wǎng)絡(luò)的深度進(jìn)行特征之間的“深度交叉”,這也是Deep Crossing名稱的由來。

          如果是用于點擊率預(yù)估模型的損失函數(shù)就是對數(shù)損失函數(shù):

          其中表示真實的標(biāo)簽(點擊或未點擊),表示Scoring Layer輸出的結(jié)果。但是在實際應(yīng)用中,根據(jù)不同的需求可以靈活替換為其他目標(biāo)函數(shù)。

          4. 代碼實現(xiàn)

          從模型的代碼結(jié)構(gòu)上來看,DeepCrossing的模型輸入主要由數(shù)值特征和類別特征組成,并將經(jīng)過Embedding之后的類別特征及類別特征拼接在一起,詳細(xì)的拼接代碼如Staking Layer所示,下面是構(gòu)建模型的核心代碼,詳細(xì)代碼參考github。

                
                def DeepCrossing(dnn_feature_columns):
              # 構(gòu)建輸入層,即所有特征對應(yīng)的Input()層,這里使用字典的形式返回,方便后續(xù)構(gòu)建模型
              dense_input_dict, sparse_input_dict = build_input_layers(dnn_feature_columns)

              # 構(gòu)建模型的輸入層,模型的輸入層不能是字典的形式,應(yīng)該將字典的形式轉(zhuǎn)換成列表的形式
              # 注意:這里實際的輸入與Input()層的對應(yīng),是通過模型輸入時候的字典數(shù)據(jù)的key與對應(yīng)name的Input層
              input_layers = list(dense_input_dict.values()) + list(sparse_input_dict.values())
              
              # 構(gòu)建維度為k的embedding層,這里使用字典的形式返回,方便后面搭建模型
              embedding_layer_dict = build_embedding_layers(dnn_feature_columns, sparse_input_dict, is_linear=False)

              #將所有的dense特征拼接到一起
              dense_dnn_list = list(dense_input_dict.values())
              dense_dnn_inputs = Concatenate(axis=1)(dense_dnn_list) # B x n (n表示數(shù)值特征的數(shù)量)

              # 因為需要將其與dense特征拼接到一起所以需要Flatten,不進(jìn)行Flatten的Embedding層輸出的維度為:Bx1xdim
              sparse_dnn_list = concat_embedding_list(dnn_feature_columns, sparse_input_dict, embedding_layer_dict, flatten=True

              sparse_dnn_inputs = Concatenate(axis=1)(sparse_dnn_list) # B x m*dim (n表示類別特征的數(shù)量,dim表示embedding的維度)

              # 將dense特征和Sparse特征拼接到一起
              dnn_inputs = Concatenate(axis=1)([dense_dnn_inputs, sparse_dnn_inputs]) # B x (n + m*dim)

              # 輸入到dnn中,需要提前定義需要幾個殘差塊
              output_layer = get_dnn_logits(dnn_inputs, block_nums=3)

              model = Model(input_layers, output_layer)
              return model

          為了方便大家的閱讀,我們這里還給大家畫了一個整體的模型架構(gòu)圖,幫助大家更好的了解每一塊以及前向傳播。(畫的圖不是很規(guī)范,先將就看一下,后面我們會統(tǒng)一在優(yōu)化一下這個手工圖)。

          15fa7d29b28c95336a94185ba6618af8.webp

          下面是一個通過keras畫的模型結(jié)構(gòu)圖,為了更好的顯示,數(shù)值特征和類別特征都只是選擇了一小部分,畫圖的代碼也在github中。

          95d7c56112ee7e9df0d2ac1f03691c0d.webpDeepCrossing

          5. 參考資料

          • deepctr
          • 論文原文
          • AI上推薦 之 AutoRec與Deep Crossing模型(改變神經(jīng)網(wǎng)絡(luò)的復(fù)雜程度)


          瀏覽 63
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美精品久久久免费观看 | 蜜臀av在线免费观看 | 性爱福利网站 | 精品国产黄色电影 | 黄色视频网站观看 |