計算廣告CTR預估系列(十)--AFM模型理論與實踐

2021-02-21 機器學習薦貨情報局

Attention-based Pooling Layer的輸入是Pair-wise Interaction Layer的輸出。它包含m(m-1)/2個向量,每個向量的維度是k。(k是嵌入向量的維度,m是Embedding Layer中嵌入向量的個數)

Attention-based Pooling Layer的輸出是一個k維向量。它對Interacted vector使用Attention score進行了weighted sum pooling操作。

Attention score的學習是一個問題。一個常規的想法就是隨著最小化loss來學習,但是這樣做對於訓練集中從來沒有一起出現過的特徵組合的Attention score無法學習。

AFM用一個Attention Network來學習。

Attention network實際上是一個one layer MLP,激活函數使用ReLU,網絡大小用attention factor表示,就是神經元的個數。

Attention network的輸入是兩個嵌入向量element-wise product之後的結果(interacted vector,用來在嵌入空間中對組合特徵進行編碼);它的輸出是組合特徵對應的Attention score。最後,使用softmax對得到的Attention score進行規範化,Attention Network形式化如下:

Attention Network

總結,AFM模型總形式化如下:

AFM模型總形式化
前面一部分是線性部分;後面一部分對每兩個嵌入向量進行element-wise product得到Interacted vector;然後使用Attention機製得到每個組合特徵的Attention score,並用這個score來進行weighted sum pooling;最後將這個k維的向量通過權重矩陣p得到最終的預測結果。3.2 模型訓練

AFM針對不同的任務有不同的損失函數。

回歸問題。square loss。

分類問題。log loss。

論文中針對回歸問題來討論,所以使用的是square loss,形式化如下:

AFM square loss

模型參數估計使用的是SGD。

3.3 過擬合

防止過擬合常用的方法是Dropout或者L2 L1正則化。AFM的做法是:

在Pair-wise Interaction Layer的輸出使用Dropout

在Attention Network中使用L2正則化

Attention Network是一個one layer MLP。不給他使用Dropout是因為,作者發現如果同時在interaction layer和Attention Network中使用Dropout會使得訓練不穩定,並且降低性能。

所以,AFM的loss函數更新為:

AFM Loss Function

其中W是Attention Network的參數矩陣。

四、總結

AFM是在FM的基礎上改進的。相比於其他的DNN模型,比如Wide&Deep,DeepCross都是通過MLP來隱式學習組合特徵。這些Deep Methods都缺乏解釋性,因為並不知道各個組合特徵的情況。相比之下,FM通過兩個隱向量內積來學習組合特徵,解釋性就比較好。

通過直接擴展FM,AFM引入Attention機制來學習不同組合特徵的權重,即保證了模型的可解釋性又提高了模型性能。但是,DNN的另一個作用是提取高階組合特徵,AFM依舊只考慮了二階組合特徵,這應該算是AFM的一個缺點吧。

五、代碼實踐

完成代碼、數據以及論文資料請移步github,不要忘記star呦~

https://github.com/gutouyu/ML_CIA

核心的網絡構建部分代碼如下:

先準備設置參數,以及初始化Embedding和Linear的權重矩陣:

1
2field_size = params['field_size']
3feature_size = params['feature_size']
4embedding_size = params['embedding_size']
5l2_reg = params['l2_reg']
6learning_rate = params['learning_rate']
7
8dropout = params['dropout']
9attention_factor = params['attention_factor']
10
11
12Global_Bias = tf.get_variable("bias", shape=[1], initializer=tf.constant_initializer(0.0))
13Feat_Wgts = tf.get_variable("linear", shape=[feature_size], initializer=tf.glorot_normal_initializer())
14Feat_Emb = tf.get_variable("emb", shape=[feature_size, embedding_size], initializer=tf.glorot_normal_initializer())
15
16
17feat_ids = features['feat_ids']
18feat_vals = features['feat_vals']
19feat_ids = tf.reshape(feat_ids, shape=[-1, field_size])
20feat_vals = tf.reshape(feat_vals, shape=[-1, field_size]) 

FM的線性部分:

1
2with tf.variable_scope("Linear-part"):
3    feat_wgts = tf.nn.embedding_lookup(Feat_Wgts, feat_ids) 
4    y_linear = tf.reduce_sum(tf.multiply(feat_wgts, feat_vals), 1)

Embedding Layer部分:

1
2with tf.variable_scope("Embedding_Layer"):
3    embeddings = tf.nn.embedding_lookup(Feat_Emb, feat_ids) 
4    feat_vals = tf.reshape(feat_vals, shape=[-1, field_size, 1]) 
5    embeddings = tf.multiply(embeddings, feat_vals) 

Pair-wise Interaction Layer對每一對嵌入向量都進行element-wise produce:

1with tf.variable_scope("Pair-wise_Interaction_Layer"):
2    num_interactions = field_size * (field_size - 1) / 2
3    element_wise_product_list = []
4    for i in range(0, field_size):
5        for j in range(i + 1, field_size):
6            element_wise_product_list.append(tf.multiply(embeddings[:, i, :], embeddings[:, j, :]))
7    element_wise_product_list = tf.stack(element_wise_product_list) 
8    element_wise_product_list = tf.transpose(element_wise_product_list, perm=[1,0,2]) 

Attention Network用來得到Attention Score:

1
2with tf.variable_scope("Attention_Netowrk"):
3
4    deep_inputs = tf.reshape(element_wise_product_list, shape=[-1, embedding_size]) 
5
6    deep_inputs = contrib.layers.fully_connected(inputs=deep_inputs, num_outputs=attention_factor, activation_fn=tf.nn.relu,weights_regularizer=contrib.layers.l2_regularizer(l2_reg), scope="attention_net_mlp")
7
8    aij = contrib.layers.fully_connected(inputs=deep_inputs, num_outputs=1, activation_fn=tf.identity, weights_regularizer=contrib.layers.l2_regularizer(l2_reg), scope="attention_net_out") 
9
10    
11    aij = tf.reshape(aij, shape=[-1, int(num_interactions), 1])
12    aij_softmax = tf.nn.softmax(aij, dim=1, name="attention_net_softout") 
13
14    if mode == tf.estimator.ModeKeys.TRAIN:
15        aij_softmax = tf.nn.dropout(aij_softmax, keep_prob=dropout[0])

得到Attention Score之後,和前面的Interacted vector進行weighted sum pooling,也就是Attention-based Pooling Layer:

1with tf.variable_scope("Attention-based_Pooling_Layer"):
2    deep_inputs = tf.multiply(element_wise_product_list, aij_softmax) 
3    deep_inputs = tf.reduce_sum(deep_inputs, axis=1) 
4
5    
6    if mode == tf.estimator.ModeKeys.TRAIN:
7        deep_inputs = tf.nn.dropout(deep_inputs, keep_prob=dropout[1])
8
9    

Prediction Layer,最後把Attention-based Pooling Layer的輸出k維度向量,得到最終預測結果。這一層可以看做直接和一個神經元進行向量。注意這個神經元得到類似logists的值,還不是概率。這個值和後面的FM全局偏置、FM linear part得到最終的logists,然後再通過sigmoid得到最終預測概率:

1with tf.variable_scope("Prediction_Layer"):
2    
3    deep_inputs = contrib.layers.fully_connected(inputs=deep_inputs, num_outputs=1, activation_fn=tf.identity, weights_regularizer=contrib.layers.l2_regularizer(l2_reg), scope="afm_out") 
4    y_deep = tf.reshape(deep_inputs, shape=[-1]) 
5
6with tf.variable_scope("AFM_overall"):
7    y_bias = Global_Bias * tf.ones_like(y_deep, dtype=tf.float32)
8    y = y_bias + y_linear + y_deep
9    pred = tf.nn.sigmoid(y)

運行結果截圖:

Train
Evaluate
PredictReference

Attentional Factorization Machines: Learning the Weight of Feature Interactions via Attention Networks

https://github.com/lambdaji/tf_repos/blob/master/deep_ctr/Model_pipeline/AFM.py

計算廣告CTR預估系列往期回顧

計算廣告CTR預估系列(一)--DeepFM理論
計算廣告CTR預估系列(二)--DeepFM實踐
計算廣告CTR預估系列(三)--FFM理論與實踐
計算廣告CTR預估系列(四)--Wide&Deep理論與實踐
計算廣告CTR預估系列(五)--阿里Deep Interest Network理論
計算廣告CTR預估系列(六)--阿里Mixed Logistic Regression
計算廣告CTR預估系列(七)--Facebook經典模型LR+GBDT理論與實踐
計算廣告CTR預估系列(八)--PNN模型理論與實踐
計算廣告CTR預估系列(九)--NFM模型理論與實踐

機器學習薦貨情報局,特別有料!

機器學習薦貨情報局

相關焦點

  • 計算廣告CTR預估系列(一)--DeepFM理論
    計算廣告CTR預估系列(一)--DeepFM理論認真閱讀完本文,抓住DeepFM的理論核心不成問題!
  • 推薦系統遇上深度學習(八)--AFM模型理論和實踐
    推薦系統遇上深度學習系列:推薦系統遇上深度學習(一)--FM模型理論和實踐推薦系統遇上深度學習(二)--FFM
  • 從FM推演各深度CTR預估模型(附代碼)
    接下來將串講從embedding+MLP自身的演進特點的CTR預估模型主線,而這條思路與我們之前的FM思路同樣有千絲萬縷的聯繫。 Google在2016年提出的寬度與深度模型(Wide&Deep)在深度學習CTR預估模型中佔有非常重要的位置,它奠定了之後基於深度學習的廣告點擊率預估模型的框架。
  • 淺談 CTR 預估模型發展史
    ©PaperWeekly 原創 · 作者|Zhang學校|上海交通大學碩士生研究方向|深度學習、自然語言處理背景介紹Click Through Rate (CTR) Prediction 是一項非常重要的工業任務,例如計算廣告中、推薦系統中的應用
  • 聊聊FFM在CTR預估中的應用
    CTR預估在計算廣告學中具有非常重要的作用。其中,基於分解機FM(factorization machines)的模型在CTR預估中廣泛應用。
  • 深度CTR預估模型的演化之路
    導讀:本文主要介紹深度CTR經典預估模型的演化之路以及在
  • GBDT + LR理論與實踐
    ,預估準確性直接影響公司廣告收入。FM模型(對FM算法不熟悉的,FM理論與實踐)通過隱變量的方式,發現兩兩特徵之間的組合關係,但這種特徵組合僅限於兩兩特徵之間,後來發展出來了使用深度神經網絡去挖掘更高層次的特徵組合關係。但其實在使用神經網絡之前,GBDT也是一種經常用來發現特徵組合的有效思路。
  • CTR學習筆記&代碼實現2-深度ctr模型 MLP->Wide&Deep
    AINLP原創 · 作者 | 風雨中的小七背景這一篇我們從基礎的深度ctr模型談起。我很喜歡Wide&Deep的框架感覺之後很多改進都可以納入這個框架中。Wide負責樣本中出現的頻繁項挖掘,Deep負責樣本中未出現的特徵泛化。
  • 代碼+實戰:TensorFlow Estimator of Deep CTR——DeepFM/NFM/AFM/...
    深度學習在 ctr 預估領域的應用越來越多,新的模型不斷冒出。從 ctr 預估問題看看 f(x) 設計—DNN 篇整理了各模型之間的聯繫之後,一直在琢磨這些東西如何在工業界落地。做 ctr 預估的優勢,paper 關注點大都放在 ID 類特徵如何做 embedding 上,至於連續特徵如何處理很少討論,大概有以下 3 種方式:--不做 embedding   |1--concat[continuous, emb_vec] 做 fc--做 embedding   |2--離散化之後 embedding
  • 推薦系統遇上深度學習(六)--PNN模型理論和實踐
    作者:石曉文   中國人民大學信息學院在讀研究生個人公眾號:小小挖掘機(ID:wAIsjwj)
  • 計算廣告中主要模塊、策略及其場景(下)
    廣告排序架構圖廣告架構圖中最重要的就是精排,前文也有講,離線要為在線提供模型等等,離線訓練和在線預估統稱為CTR預估。真實出價:就是按照計算的曝光價值出價,計算多少就出價多少,當然轉化率預估的問題之前也有提到。受限點擊成本出價:在CPC模式下,廣告主一般會設定可接受的最高點擊成本(mCPC),這時就可以通過計算mCPC*CTR來出價。如果點擊率預估準確,該策略可以保證其支出小於收入。線性出價:出價與估計的點擊率成正比,但要設置基準出價,即:
  • 谷歌、阿里等10大深度學習CTR模型最全演化圖譜
    隨著微軟的 Deep Crossing、Google 的 Wide&Deep 以及 FNN、PNN 等一大批優秀的深度學習 CTR 預估模型在 2016 年被提出,計算廣告和推薦系統領域全面進入了深度學習時代,時至今日,深度學習 CTR 模型已經成為廣告和推薦領域毫無疑問的主流。
  • 從模型到部署,FPGA該怎樣加速廣告推薦算法
    今天就介紹一下推薦系統中的重要成員 CTR 預估模型,下面先讓大家對 CTR 預估模型有一個初步認識。先了解兩個名詞CTR(Click-Through-Rate)點擊率,它是在一定時間內點擊量/曝光量*100%,意味著投放了 A 條廣告有 A*CTR 條被點擊了。
  • 視覺信息助力廣告點擊率預估--京東廣告團隊技術論文入圍KDD2020
    這其中很大一部分原因得益於AI技術在廣告業務的大範圍應用。據京東商業提升事業部廣告質量部負責人包勇軍介紹,京東機器學習在2015年正式應用在在線廣告中,初版排序模型使用淺層FM base的超稀疏模型,淺層模型時代的模型工作,主要著眼在業務理解和特徵提取。這為以後模型發展技術路線奠定了一定的迭代基礎,相對於當時許多tree base model架構的業務線,京東更容易向神經網絡遷移。
  • 視覺信息助力廣告點擊率預估-京東廣告團隊技術論文入圍KDD2020
    這其中很大一部分原因得益於AI技術在廣告業務的大範圍應用。據京東商業提升事業部廣告質量部負責人包勇軍介紹,京東機器學習在2015年正式應用在在線廣告中,初版排序模型使用淺層FM base的超稀疏模型,淺層模型時代的模型工作,主要著眼在業務理解和特徵提取。這為以後模型發展技術路線奠定了一定的迭代基礎,相對於當時許多tree base model架構的業務線,京東更容易向神經網絡遷移。
  • 算法大佬看了流淚,為什麼這麼好的CTR預估總結之前沒分享(上篇)
    導語在廣告、推薦系統CTR預估問題上,早期的完全規則方法被過渡到以LR為代表的機器學習方法,為了充分發揮組合特徵的價值,在相當長一段時間裡,業界熱衷於使用LR+人工特徵工程。但人工組合特徵成本高昂 ,在不同任務上也難以復用。
  • 推薦系統遇上深度學習(一)--FM模型理論和實踐
    www.jianshu.com/u/c5df9e229a67)     天善社區:https://www.hellobi.com/u/58654/articles     騰訊云:https://cloud.tencent.com/developer/user/16221401、FM背景在計算廣告和推薦系統中
  • 推薦系統遇上深度學習(二)--FFM模型理論和實踐
    作者:石曉文   中國人民大學信息學院在讀研究生個人公眾號:小小挖掘機(ID:wAIsjwj)
  • 百度飛槳分布式訓練在 Volcano 系統上的實踐
    以工業界應用必需的分布式訓練能力為例,在最新的 Paddle Fluid 1.5.2 版本中,飛槳支持數據並行、模型並行、流水線並行等多種並行模式,參數伺服器架構和點對點同步訓練架構全面支持在 CPU、GPU 等硬體資源設備上的大規模訓練。本文將介紹飛槳分布式訓練在 Kubernetes 社區中的 Volcano 系統上進行實踐的案例。
  • 【推薦算法】AttentionFM模型原理和實踐
    AFM模型引入attention機制,針對不同的特徵組合使用不同的權重,增強了模型的表達能力。這也使得模型的可解釋性更強,方便後續針對重要的特徵組合進行深入研究。2 模型結構AFM模型是在「特徵交叉層」和「輸出層」之間引入注意力網絡實現的,注意力網絡的作用為每一個交叉特徵提供權重。AFM模型結構如下圖所示。AFM模型結構值得注意的是,上圖忽略了FM中的lr部分,只是針對FM的二次項部分進行了結構的展示。