1. 程式人生 > >從FM推演各深度CTR預估模型(附程式碼)

從FM推演各深度CTR預估模型(附程式碼)

宣告:版權所有,轉載請聯絡作者並註明出處。本文程式碼部分參考了lambda等同學的tensorflow實現,在此向原作者表示感謝。

注:本文根據作者在公司內訓講稿整理而成。

多年以後,當資深演算法專家們看著無縫對接使用者需求的廣告收入節節攀升時,他們可能會想起自己之前痛苦推導FM與深度學習公式的某個夜晚……——題記

1.引言

**點選率(click-through rate, CTR)**是網際網路公司進行流量分配的核心依據之一。比如網際網路廣告平臺,為了精細化權衡和保障使用者、廣告、平臺三方的利益,準確的CTR預估是不可或缺的。CTR預估技術從傳統的邏輯迴歸,到近兩年大火的深度學習,新的演算法層出不窮:DeepFM, NFM, DIN, AFM, DCN……
然而,相關的綜述文章不少,但碎片羅列的居多,模型之間內在的聯絡和演化思路如何揭示?怎樣才能迅速get到新模型的創新點和適用場景,快速提高新論文速度,節約理解、復現模型的成本?這些都是亟待解決的問題。
我們認為,從FM及其與神經網路的結合出發,能夠迅速貫穿很多深度學習CTR預估網路的思路,從而更好地理解和應用模型

2.本文的思路與方法

  1. 我們試圖從原理上進行推導、理解各個深度CTR預估模型之間的相互關係,知其然也知其所以然。(以下的分析與拆解角度,是一種我們嘗試的理解視角,並不是唯一的理解方式)
  2. 推演的核心思路:“通過設計網路結構進行組合特徵的挖掘”
  3. 具體來說有兩條:其一是從FM開始推演其在深度學習上的各種推廣(對應下圖的紅線),另一條是從embedding+MLP自身的演進特點結合CTR預估本身的業務場景進行推演(對應下圖黑線部分)

關係圖

  1. 為了便於理解,我們簡化了資料案例——只考慮離散特徵資料的建模,以分析不同神經網路在處理相同業務問題時的不同思路
  2. 同時,我們將各典型論文不同風格的神經網路結構圖統一按照計算圖來繪製,以便於對比不同模型

3.FM:降維版本的特徵二階組合

CTR預估本質是一個二分類問題,以移動端展示廣告推薦為例,依據日誌中的使用者側的資訊(比如年齡,性別,國籍,手機上安裝的app列表)、廣告側的資訊(廣告id,廣告類別,廣告標題等)、上下文側資訊(渠道id等),去建模預測使用者是否會點選該廣告。
FM出現之前的傳統的處理方法是人工特徵工程加上線性模型(如邏輯迴歸Logistic Regression)。為了提高模型效果,關鍵技術是找到到使用者點選行為背後隱含的特徵組合。如男性、大學生使用者往往會點選遊戲類廣告,因此**“男性且是大學生且是遊戲類”**的特徵組合就是一個關鍵特徵。但這本質仍是線性模型,其假設函式表示成內積形式一般為:

ylinear=σ(w,x)y _ { linear } = \sigma \left( \langle \vec { w } , \vec { x } \rangle \right)

其中x\vec{x}為特徵向量,w\vec{w}為權重向量,σ()σ()sigmoid函式。

但是人工進行特徵組合通常會存在諸多困難,如特徵爆炸、特徵難以被識別、組合特徵難以設計等。為了讓模型自動地考慮特徵之間的二階組合資訊,線性模型推廣為二階多項式(2dPolynomial2d-Polynomial)模型:

ypoly=σ(w,x+i=1nj=1nwijxixj)y _ { p o l y } = \sigma \left( \langle \vec { w } , \vec { x } \rangle + \sum _ { i = 1 } ^ { n } \sum _ { j = 1 } ^ { n } w _ { i j } \cdot x _ { i } \cdot x _ { j } \right)

其實就是對特徵兩兩相乘(組合)構成新特徵(離散化之後其實就是“且”操作),並對每個新特徵分配獨立的權重,通過機器學習來自動得到這些權重。將其寫成矩陣形式為:

ypoly=σ(wTx+xTW(2)x)y _ { p o l y } = \sigma \left( \vec { w } ^ { T } \cdot \vec { x } + \vec { x } ^ { T } \cdot W ^ { ( 2 ) } \cdot \vec { x } \right)

其中W(2)W^{(2)}為二階特徵組合的權重矩陣,是對稱矩陣。而這個矩陣引數非常多,為O(n2)O(n^2)。為了降低該矩陣的維度,可以將其因子分解(FactorizationFactorization)為兩個低維(比如nkn*k)矩陣的相乘。則此時WW矩陣的引數就大幅降低,為O(nk)O(nk)。公式如下:

W(2)=WTWW ^ { ( 2 ) } = W ^ { T } \cdot W

這就是RendleRendle等在2010年提出因子分解機(Factorization Machines,FM)的名字的由來。FM的矩陣形式公式如下:

yFM=σ(wTx+xTWTWx)y _ { F M } = \sigma \left( \vec { w } ^ { T } \cdot \vec { x } + \vec { x } ^ { T } \cdot W ^ { T } \cdot W \cdot \vec { x } \right)

將其寫成內積的形式:
yFM=σ(w,x+Wx,Wx) y _ { F M } = \sigma ( \langle \vec { w } , \vec { x } \rangle + \langle W \cdot \vec { x } , W \cdot \vec { x } \rangle )
利用$ \langle \sum_{i=1}^n \vec{a_i},\sum_{i=1}^n \vec{a_i}\rangle= \sum_{i=1}n\sum_{j=1}n \langle \vec{a_i}, \vec{a_j}\rangle $,可以將上式進一步改寫成求和式的形式:
yFM=σ(w,x+i=1nj=1nxivi,xjvj) y _ { F M } = \sigma \left( \langle \vec { w } , \vec { x } \rangle + \sum _ { i = 1 } ^ { n } \sum _ { j = 1 } ^ { n } \left\langle x _ { i } \cdot \vec { v } _ { i } , x _ { j } \cdot \vec { v } _ { j } \right\rangle \right)
其中vi\vec{v_i}向量是矩陣WW的第ii列。為了去除重複項與特徵平方項,上式可以進一步改寫成更為常見的FM公式:
yFM=σ(w,x+i=1nj=i+1nvi,vjxixj) y _ { F M } = \sigma \left( \langle \vec { w } , \vec { x } \rangle + \sum _ { i = 1 } ^ { n } \sum _ { j = i + 1 } ^ { n } \left\langle \vec { v } _ { i } , \vec { v } _ { j } \right\rangle x _ { i } \cdot x _ { j } \right)
對比二階多項式模型,FM模型中特徵兩兩相乘(組合)的權重是相互不獨立的,它是一種引數較少但表達力強的模型。

此處附上FM的TensorFlow程式碼實現,完整資料和程式碼請參考網盤。注意FM通過內積進行無重複項與特徵平方項的特徵組合過程使用了一個小trick,就是:
i=1nj=i+1nxixj=1/2×[(i=1nxi)2i=1nxi2]\sum_{i=1}^n\sum_{j=i+1}^n x_ix_j = 1/2 × [(\sum_{i=1}^n x_i)^2 - \sum_{i=1}^n x_i^2]

class FM(Model):
    def __init__(self, input_dim=None, output_dim=1, factor_order=10, init_path=None, opt_algo='gd', learning_rate=1e-2,
                 l2_w=0, l2_v=0, random_seed=None):
        Model.__init__(self)
        # 一次、二次交叉、偏置項
        init_vars = [('w', [input_dim, output_dim], 'xavier', dtype),
                     ('v', [input_dim, factor_order], 'xavier', dtype),
                     ('b', [output_dim], 'zero', dtype)]
        self.graph = tf.Graph()
        with self.graph.as_default():
            if random_seed is not None:
                tf.set_random_seed(random_seed)
            self.X = tf.sparse_placeholder(dtype)
            self.y = tf.placeholder(dtype)
            self.vars = init_var_map(init_vars, init_path)

            w = self.vars['w']
            v = self.vars['v']
            b = self.vars['b']
            
            # [(x1+x2+x3)^2 - (x1^2+x2^2+x3^2)]/2
            # 先計算所有的交叉項,再減去平方項(自己和自己相乘)
            X_square = tf.SparseTensor(self.X.indices, tf.square(self.X.values), tf.to_int64(tf.shape(self.X)))
            xv = tf.square(tf.sparse_tensor_dense_matmul(self.X, v))
            p = 0.5 * tf.reshape(
                tf.reduce_sum(xv - tf.sparse_tensor_dense_matmul(X_square, tf.square(v)), 1),
                [-1, output_dim])
            xw 
            
           

相關推薦

FM深度CTR模型(程式碼)

宣告:版權所有,轉載請聯絡作者並註明出處。本文程式碼部分參考了lambda等同學的tensorflow實現,在此向原作者表示感謝。 注:本文根據作者在公司內訓講稿整理而成。 多年以後,當資深演算法專家們看著無縫對接使用者需求的廣告收入節節攀升時,他們可能會想起

深度長文 | FM深度CTR模型開原始碼)

作者丨龍心塵 & 寒小陽研究方向丨機器學習,資料探勘題記:多年以後,當資深演算法專家們看

PaddlePaddle分散式訓練及CTR模型應用

  前言:我在github上建立了一個新的repo:PaddleAI, 準備用Paddle做的一系列有趣又實用的案例,所有的案例都會上傳資料程式碼和預訓練模型,下載後可以在30s內上手,跑demo出結果,讓大家儘快看到訓練結果,用小批量資料除錯,再用全量資料跑模型,當然,也可以基於我上傳的預訓練模型進行遷移學

CTR模型演變及學習筆記

【說在前面】本人部落格新手一枚,象牙塔的老白,職業場的小白。以下內容僅為個人見解,歡迎批評指正,不喜勿噴![握手][握手] 【再囉嗦一下】如果你對智慧推薦感興趣,歡迎先瀏覽我的另一篇隨筆:智慧推薦演算法演變及學習筆記 【最後再說一下】本文只對智慧推薦演算法中的CTR預估模型演變進行具體介紹! 一、傳統CTR預

深度學習在CTR中的應用

搜索 前言 deep 帶來 python 2017年 進入 訓練 信息 歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐幹貨哦~ 本文由鵝廠優文發表於雲+社區專欄 一、前言 二、深度學習模型 1. Factorization-machine(FM) FM = LR

深度學習在CTR的應用

深度學習在各個領域的成功 深度學習在影象和音訊等方向比傳統方向有大的提升,導致很多產品能快速落地 第一行三張圖片代表圖片和音訊方向相比傳統提升30%-50%,第二行第一張代表深度學習在自然語言處理方面方向的應用(相比傳統學習方法有提升,但是提升效果有限),後兩張代表生成式模型(生成圖片

基於深度學習的廣告CTR演算法

數十款阿里雲產品限時折扣中,趕緊點選這裡,領劵開始雲上實踐吧!   演講嘉賓簡介: 朱小強,花名懷人,阿里媽媽高階演算法專家,領導了核心的排序演算法與機器學習平臺團隊,負責阿里精準展示廣告的CTR/CVR預估系統/演算法

facebook:gbdt+lr在ctr中的應用

span ctr .com 關聯 auc left under mar 結構 背景 facebook上的廣告並不是與query關聯的,而是與用戶的興趣及其人口信息相關,所以相比於搜索其候選廣告的體量要大的多; 級聯模型:解決上述大量候選集合的問題,逐級增大計算復雜度;

CTR中GBDT與LR融合方案

1、 背景       CTR預估(Click-Through Rate Prediction)是網際網路計算廣告中的關鍵環節,預估準確性直接影響公司廣告收入。CTR預估中用的最多的模型是LR(Logistic Regression)[1],LR是廣義線性模型,與傳統線性模

聊聊CTR演算法DeepFM

DeepFM這種演算法是一種基於分解機的神經網路,該演算法由哈爾濱工業大學深圳研究生院聯合華為諾亞方舟實驗室於2017年提出的。 這種演算法是一種端到端的學習模型,不僅考慮了低階的特徵融合,也考慮了高階的特徵融合。該演算法利用深度學習來學習特徵,利用分解機做推薦。

【實踐】CTR中的貝葉斯平滑方法(二)

1. 前言 這篇部落格主要是介紹如何對貝葉斯平滑的引數進行估計,以及具體的程式碼實現。 首先,我們回顧一下前文中介紹的似然函式,也就是我們需要進行最大化的目標函式: 下面我們就基於這個目標函式介紹怎樣估計引數。 2. 引數估計的幾種方法 1. 矩估計 矩估計在這裡有點亂

科大訊飛AI營銷大賽 CTR總結

背景介紹: 科大訊飛AI營銷雲在高速發展的同時,積累了海量的廣告資料和使用者資料,如何有效利用這些資料去預測使用者的廣告點選概率,是大資料應用在精準營銷中的關鍵問題,也是所有智慧營銷平臺必須具備的核心技術。本次大賽提供了訊飛AI營銷雲的海量廣告投放資料,參賽選手通過人工智慧技術構建預測模型預

ctr的負取樣比率修正公式

p=c1p′−1+cp=c1p′−1+c c∼(0,1]c∼(0,1]: 負樣本取樣比例。如果正負樣本都取樣,取樣比分別為c1,c2c1,c2, 則 c=c2/c1c=c2/c1 p′p′:使用有采

計算廣告CTR系列(一)--DeepFM理論

計算廣告CTR預估系列(一)–DeepFM理論 本文首發於公眾號: 機器學習薦貨情報局 認真閱讀完本文,抓住DeepFM的理論核心不成問題! 配合《計算廣告CTR預估系列(二)–DeepFM實踐》食用更佳!敬請期待。。。 De

用機器學習對CTR建模(一)

資料集介紹: train - Training set. 10 days of click-through data, ordered chronologically. Non-clicks and clicks are subsampled acco

CTR特徵工程

特徵工程 專案資料格式 CTR預估的流程 資料—>預處理—>特徵提取—>模型訓練—>後處理 模型和特徵的關係 一句話概括這個問題,特徵決定了上界,而模型決定了接近上界的程度。 資料預處理 首先要進行

計算廣告CTR的特徵處理方法

1.CTR預估,發現CTR預估一般都是用LR,而且特徵都是離散的。為什麼一定要用離散特徵呢?這樣做的好處在哪裡? A:在工業界,很少直接將連續值作為邏輯迴歸模型的特徵輸入,而是將連續特徵離散化為一系列0、1特徵交給邏輯迴歸模型,這樣做的優勢有以下幾點: 離散特徵的增加

OpenCV+深度學習訓練模型,簡單搞定影象識別 | 教程

轉載:https://mp.weixin.qq.com/s/J6eo4MRQY7jLo7P-b3nvJg 李林 編譯自 pyimagesearch 作者 Adrian Rosebrock 量子位 報道 | 公眾號 QbitAI OpenCV是一個2000年釋出的

(讀論文)推薦系統之ctr-DeepFM模型解析

今天第二篇(最近更新的都是Deep模型,傳統的線性模型會後面找個時間更新的哈)。本篇介紹華為的DeepFM模型 (2017年),此模型在 Wide&Deep 的基礎上進行改進,成功解決了一些問題,具體的話下面一起來看下吧。 原文:Deepfm: a factorization-machine base

阿里CTR:使用者行為長序列建模

本文將介紹Alibaba發表在KDD’19 的論文《Practice on Long Sequential User Behavior Modeling for Click-Through Rate Prediction》。文章針對長序列使用者行為建模的問題從線上系統和演算法兩方面進行改進,已經成功部署在阿里