paddle ctr利器DeepFM

先貼重要的鏈接
DeepFM的論文參考 https://arxiv.org/pdf/1703.04247.pdf
代碼倉: https://github.com/PaddlePaddle/models/tree/develop/PaddleRec/ctr/deepfm

爲什麼用paddle做ctr預估

因爲之前待過廣告公司,所以對ctr這塊一直有關注。CTR簡介請參考我的另一篇文章https://blog.csdn.net/oqqYuan1234567890/article/details/105460846

paddle團隊維護的models庫中,有一個deepfm的例子,去年10月參加百度舉辦的AI快車道培訓,還沒有放出這個模型。到了年底看的時候已經有了。

其實tf社區也有deepFM的實現,但有兩個因素是paddle的優勢

  • 百億稀疏特徵的embedding
  • 分佈式異步訓練也能保證足夠好的收斂效果(根據當時主講的工程師說,異步訓練的理論支撐不是很完備,但是百度的實踐經驗中,paddle的收斂效果是可以保證的)
    所以paddle還是挺不錯的,tf一直缺少稀疏特徵的參數服務器,既然paddle有提供,那是很不錯的,所以一直都有關注。
    github上也有tf實現的例子,但是用的數據集都比較小。paddle的deepfm用的數據規模還行,最近把完整的數據跑一下。

熟悉數據

這個模型用的數據,是kaggle一個點擊率比賽的數據集,具體的鏈接在: https://www.kaggle.com/c/criteo-display-ad-challenge/data
代碼倉中,數據下載的代碼在
data/download_preprocess.py
裏面主要下載兩份數據,一份數據是特徵字典,可能是模型作者擔心復現代碼的開發者機器內存不夠,就預處理了一份,這份數據用的是百度對象存儲的服務,比較快。
主要數據的地址:https://s3-eu-west-1.amazonaws.com/kaggle-display-advertising-challenge-dataset/dac.tar.gz
由於這份criteo的ctr數據是託管在amason s3服務的,國內下特別慢,建議找個windows的機器開迅雷下,在linux用uget工具開多線程都特別慢。

解壓dac.tar.gz數據,可以看一下實際的數據量

$ cat train.txt|wc -l
45840617
$ cat test.txt|wc -l
6042135

訓練數據大約4500萬行,規模還是可以的。

數據格式說明

  • Label - Target variable that indicates if an ad was clicked (1) or not (0).
  • I1-I13 - A total of 13 columns of integer features (mostly count features).
  • C1-C26 - A total of 26 columns of categorical features. The values of these features have been hashed onto 32 bits for anonymization purposes.
  • 一共39個特徵維度,1086460個特徵數量。

評價指標AUC

AUC是從混淆矩陣裏面演變出來的,參考 https://blog.csdn.net/u012735708/article/details/82877501

paddle裏面,有一個auc layer用於auc計算,api說明位於https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/layers_cn/auc_cn.html

import paddle.fluid as fluid
import numpy as np

data = fluid.layers.data(name="input", shape=[-1, 100], dtype="float32")
label = fluid.layers.data(name="label", shape=[1], dtype="int")
fc_out = fluid.layers.fc(input=data, size=1)
predict = fluid.layers.softmax(input=fc_out)
result=fluid.layers.auc(input=predict, label=label)

place = fluid.CPUPlace()
exe = fluid.Executor(place)

exe.run(fluid.default_startup_program())
x = np.random.rand(3,100).astype("float32")
y = np.array([1,0,1])
output= exe.run(feed={"input": x,"label": y},
                 fetch_list=[result[0]])
print(output)

組網

模型
在這裏插入圖片描述
y hat主要由fm部分與dnn部分相加,DNN負責特徵交叉,不用做太多的特徵工程。

fm部分

在這裏插入圖片描述
FM部分比較簡單,按特徵做embedding,然後做內積

dnn部分

在這裏插入圖片描述
DNN部分特徵做emvedding,然後經過一個MLP網絡

目標函數

採用 log loss 函數
N爲樣本數量,pip_i 爲預測輸入實例 xix_i 屬於類別 1 的概率
在這裏插入圖片描述

訓練

訓練環境

GTX 1070TI 8G
batch_size: 100, 一個epoch約耗時40分鐘
batch_size: 400, 一個epoch約耗時10分鐘,

我跑了8個epoch,驗證集的AUC在0.79左右

根據Readme的介紹,22epoch的AUC大約是0.8046
由於自帶的代碼中沒有實現checkpoint 恢復參數的功能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章