Wide&deep 點擊率預估模型
導語
PaddlePaddle提供了豐富的運算單元,幫助大家以模塊化的方式構建起千變萬化的深度學習模型來解決不同的應用問題。這裡,我們針對常見的機器學習任務,提供了不同的神經網路模型供大家學習和使用。本周推文目錄如下:
周一:【點擊率預估】
Wide&deep 點擊率預估模型
周二:【文本分類】
基於DNN/CNN的情感分類
周三:【文本分類】
基於雙層序列的文本分類模型
周四:【排序學習】
基於Pairwise和Listwise的排序學習
周五:【結構化語義模型】
深度結構化語義模型
點擊率預估模型預判用戶對一條廣告點擊的概率,對每次廣告的點擊情況做出預測,是廣告技術的核心演算法之一。邏諦斯克回歸對大規模稀疏特徵有著很好的學習能力,在點擊率預估任務發展的早期一統天下。近年來,DNN 模型由於其強大的學習能力逐漸接過點擊率預估任務的大旗。
在點擊率預估任務中,我們給出谷歌提出的 Wide & Deep 模型。這一模型融合了適用於學習抽象特徵的DNN和適用於大規模稀疏特徵的邏諦斯克回歸兩者的優點,可以作為一種相對成熟的模型框架使用,在工業界也有一定的應用。
【點擊率預估】
Wide&deep 點擊率預估模型
以下是本例目錄包含的文件以及對應說明:
├── README.md # 本教程markdown 文檔
├── dataset.md # 數據集處理教程
├── images # 本教程圖片目錄
│ ├── lr_vs_dnn.jpg
│ └── wide_deep.png
├── infer.py # 預測腳本
├── network_conf.py # 模型網路配置
├── reader.py # data reader
├── train.py # 訓練腳本
└── utils.py # helper functions
└── avazu_data_processer.py # 示例數據預處理腳本
|1.背景介紹
CTR(Click-Through Rate,點擊率預估)[1] 是對用戶點擊一個特定鏈接的概率做出預測,是廣告投放過程中的一個重要環節。精準的點擊率預估對在線廣告系統收益最大化具有重要意義。
當有多個廣告位時,CTR 預估一般會作為排序的基準,比如在搜索引擎的廣告系統里,當用戶輸入一個帶商業價值的搜索詞(query)時,系統大體上會執行下列步驟來展示廣告:
獲取與用戶搜索詞相關的廣告集合
業務規則和相關性過濾
根據拍賣機制和 CTR 排序
展出廣告
可以看到,CTR 在最終排序中起到了很重要的作用。
A.發展階段
在業內,CTR 模型經歷了如下的發展階段:
Logistic Regression(LR) / GBDT + 特徵工程
LR + DNN 特徵
DNN + 特徵工程
在發展早期時 LR 一統天下,但最近 DNN 模型由於其強大的學習能力和逐漸成熟的性能優化, 逐漸地接過 CTR 預估任務的大旗。
B.LR vs DNN
下圖展示了 LR 和一個 (3x2) 的 DNN 模型的結構:
Figure 1. LR 和 DNN 模型結構對比
LR 的藍色箭頭部分可以直接類比到 DNN 中對應的結構,可以看到 LR 和 DNN 有一些共通之處(比如權重累加), 但前者的模型複雜度在相同輸入維度下比後者可能低很多(從某方面講,模型越複雜,越有潛力學習到更複雜的信息); 如果 LR 要達到匹敵 DNN 的學習能力,必須增加輸入的維度,也就是增加特徵的數量, 這也就是為何 LR 和大規模的特徵工程必須綁定在一起的原因。
LR 對於 DNN 模型的優勢是對大規模稀疏特徵的容納能力,包括內存和計算量等方面,工業界都有非常成熟的優化方法; 而 DNN 模型具有自己學習新特徵的能力,一定程度上能夠提升特徵使用的效率, 這使得 DNN 模型在同樣規模特徵的情況下,更有可能達到更好的學習效果。
本文後面的章節會演示如何使用 PaddlePaddle 編寫一個結合兩者優點的模型
|2.數據和任務抽象
我們可以將click作為學習目標,任務可以有以下幾種方案:
直接學習 click,0,1 作二元分類
Learning to rank, 具體用 pairwise rank(標籤 1>0)或者 listwise rank
統計每個廣告的點擊率,將同一個 query 下的廣告兩兩組合,點擊率高的>點擊率低的,做 rank 或者分類
我們直接使用第一種方法做分類任務。我們使用 Kaggle 上Click-through rate prediction任務的數據集[2] 來演示本例中的模型。具體的特徵處理方法參看 data process。(http://paddlepaddle.org/docs/develop/models/ctr/dataset.html)
本教程中演示模型的輸入格式如下:
# click
1 23 190 230:0.12 3421:0.9 23451:0.12 0
23 231 1230:0.12 13421:0.9 1
詳細的格式描述如下:
dnn input ids採用 one-hot 表示,只需要填寫值為1的ID(注意這裡不是變長輸入)
lr input sparse values使用了ID:VALUE的表示,值部分最好規約到值域[-1, 1]。
此外,模型訓練時需要傳入一個文件描述 dnn 和 lr兩個子模型的輸入維度,文件的格式如下:
dnn_input_dim:
lr_input_dim:
其中,表示一個整型數值。
本目錄下的avazu_data_processor.py可以對下載的演示數據集[2] 進行處理,具體使用方法參考如下說明:
usage: avazu_data_processer.py [-h] --data_path DATA_PATH --output_dir
OUTPUT_DIR
[--num_lines_to_detect NUM_LINES_TO_DETECT]
[--test_set_size TEST_SET_SIZE]
[--train_size TRAIN_SIZE]
PaddlePaddle CTR example
optional arguments:
-h, --help show this help message and exit
--data_path DATA_PATH
path of the Avazu dataset
--output_dir OUTPUT_DIR
directory to output
--num_lines_to_detect NUM_LINES_TO_DETECT
number of records to detect dataset"s meta info
--test_set_size TEST_SET_SIZE
size of the validation dataset(default: 10000)
--train_size TRAIN_SIZE
size of the trainset (default: 100000)
data_path是待處理的數據路徑
output_dir生成數據的輸出路徑
num_lines_to_detect預先掃描數據生成ID的個數,這裡是掃描的文件行數
test_set_size生成測試集的行數
train_size生成訓練姐的行數
|3. Wide & Deep Learning Model
谷歌在 16 年提出了 Wide & Deep Learning 的模型框架,用於融合適合學習抽象特徵的 DNN 和 適用於大規模稀疏特徵的 LR 兩種模型的優點。
A.模型簡介
Wide & Deep Learning Model[3] 可以作為一種相對成熟的模型框架使用, 在 CTR 預估的任務中工業界也有一定的應用,因此本文將演示使用此模型來完成 CTR 預估的任務。
模型結構如下:
Figure 2. Wide & Deep Model
模型上邊的 Wide 部分,可以容納大規模係數特徵,並且對一些特定的信息(比如 ID)有一定的記憶能力; 而模型下邊的 Deep 部分,能夠學習特徵間的隱含關係,在相同數量的特徵下有更好的學習和推導能力。
B.編寫模型輸入
模型只接受 3 個輸入,分別是
dnn_input,也就是 Deep 部分的輸入
lr_input,也就是 Wide 部分的輸入
click, 點擊與否,作為二分類模型學習的標籤
C.編寫 Wide 部分
Wide 部分直接使用了 LR 模型,但激活函數改成了RELU來加速
defbuild_lr_submodel():
fc = layer.fc(
input=lr_merged_input, size=1, name="lr", act=paddle.activation.Relu())
return fc
D.編寫 Deep 部分
Deep 部分使用了標準的多層前向傳導的 DNN 模型
defbuild_dnn_submodel(dnn_layer_dims):
dnn_embedding = layer.fc(input=dnn_merged_input, size=dnn_layer_dims[])
_input_layer = dnn_embedding
for i, dim inenumerate(dnn_layer_dims[1:]):
fc = layer.fc(
input=_input_layer,
size=dim,
act=paddle.activation.Relu(),
name="dnn-fc-%d"% i)
_input_layer = fc
return _input_layer
E.兩者融合
兩個 submodel 的最上層輸出加權求和得到整個模型的輸出,輸出部分使用sigmoid作為激活函數,得到區間 (0,1) 的預測值, 來逼近訓練數據中二元類別的分布,並最終作為 CTR 預估的值使用。
# conbine DNN and LR submodels
defcombine_submodels(dnn, lr):
merge_layer = layer.concat(input=[dnn, lr])
fc = layer.fc(
input=merge_layer,
size=1,
name="output",
# use sigmoid function to approximate ctr,wihch is a float value between 0 and 1.
act=paddle.activation.Sigmoid())
return fc
F.訓練任務的定義
dnn = build_dnn_submodel(dnn_layer_dims)
lr = build_lr_submodel()
output = combine_submodels(dnn, lr)
# ==================
# cost and train period
# ===================
classification_cost = paddle.layer.multi_binary_label_cross_entropy_cost(
input=output, label=click)
paddle.init(use_gpu=False, trainer_count=11)
params = paddle.parameters.create(classification_cost)
optimizer = paddle.optimizer.Momentum(momentum=)
trainer = paddle.trainer.SGD(
cost=classification_cost, parameters=params, update_equation=optimizer)
dataset = AvazuDataset(train_data_path, n_records_as_test=test_set_size)
defevent_handler(event):
ifisinstance(event, paddle.event.EndIteration):
if event.batch_id %100==:
logging.warning("Pass %d, Samples %d, Cost %f"% (
event.pass_id, event.batch_id * batch_size, event.cost))
if event.batch_id %1000==:
result = trainer.test(
reader=paddle.batch(dataset.test, batch_size=1000),
feeding=field_index)
logging.warning("Test %d-%d, Cost %f"% (event.pass_id, event.batch_id,
result.cost))
trainer.train(
reader=paddle.batch(
paddle.reader.shuffle(dataset.train, buf_size=500),
batch_size=batch_size),
feeding=field_index,
event_handler=event_handler,
num_passes=100)
|4. 運行訓練和測試
訓練模型需要如下步驟:
1.準備訓練數據
從 Kaggle CTR(https://www.kaggle.com/c/avazu-ctr-prediction/data) 下載 train.gz
解壓 train.gz 得到 train.txt
mkdir -p output; python avazu_data_processer.py --data_path train.txt --output_dir output --num_lines_to_detect 1000 --test_set_size 100生成演示數據
2.執行python train.py --train_data_path ./output/train.txt --test_data_path ./output/test.txt --data_meta_file ./output/data.meta.txt --model_type=0開始訓練
上面第2個步驟可以為train.py填充命令行參數來定製模型的訓練過程,具體的命令行參數及用法如下
usage: train.py [-h] --train_data_path TRAIN_DATA_PATH
[--test_data_path TEST_DATA_PATH] [--batch_size BATCH_SIZE]
[--num_passes NUM_PASSES]
[--model_output_prefix MODEL_OUTPUT_PREFIX] --data_meta_file
DATA_META_FILE --model_type MODEL_TYPE
PaddlePaddle CTR example
optional arguments:
-h, --help show this help message and exit
--train_data_path TRAIN_DATA_PATH
path of training dataset
--test_data_path TEST_DATA_PATH
path of testing dataset
--batch_size BATCH_SIZE
size of mini-batch (default:10000)
--num_passes NUM_PASSES
number of passes to train
--model_output_prefix MODEL_OUTPUT_PREFIX
prefix of path for model to store (default:
./ctr_models)
--data_meta_file DATA_META_FILE
path of data meta info file
--model_type MODEL_TYPE
model type, classification: 0, regression 1 (default
classification)
train_data_path: 訓練集的路徑。
test_data_path: 測試集的路徑。
num_passes: 模型訓練多少輪。
data_meta_file: 參考上文數據和任務抽象的描述。
model_type: 模型分類或回歸。
|5. 用訓好的模型做預測
訓好的模型可以用來預測新的數據, 預測數據的格式為
#
1 23 190 230:0.12 3421:0.9 23451:0.12
23 231 1230:0.12 13421:0.9
這裡與訓練數據的格式唯一不同的地方,就是沒有標籤,也就是訓練數據中第3列click對應的數值。infer.py的使用方法如下
usage: infer.py [-h] --model_gz_path MODEL_GZ_PATH --data_path DATA_PATH
--prediction_output_path PREDICTION_OUTPUT_PATH
[--data_meta_path DATA_META_PATH] --model_type MODEL_TYPE
PaddlePaddle CTR example
optional arguments:
-h, --help show this help message and exit
--model_gz_path MODEL_GZ_PATH
path of model parameters gz file
--data_path DATA_PATH
path of the dataset to infer
--prediction_output_path PREDICTION_OUTPUT_PATH
path to output the prediction
--data_meta_path DATA_META_PATH
path of trainset"s meta info, default is ./data.meta
--model_type MODEL_TYPE
model type, classification: 0, regression 1 (default
classification)
model_gz_path_model:用gz壓縮過的模型路徑。
data_path: 需要預測的數據路徑。
prediction_output_paht:預測輸出的路徑。
data_meta_file:參考上文數據和任務抽象的描述。
model_type:分類或回歸。
示例數據可以用如下命令預測
最終的預測結果位於predictions.txt
【參考文獻】
https://en.wikipedia.org/wiki/Click-through_rate
https://www.kaggle.com/c/avazu-ctr-prediction/data
Cheng H T, Koc L, Harmsen J, et al. Wide & deep learning for recommender systems[C]//Proceedings of the 1st Workshop on Deep Learning for Recommender Systems. ACM, 2016: 7-10.
end
*原創貼,版權所有,未經許可,禁止轉載
*值班小Paddle:wangp
*歡迎在留言區分享您的觀點
*為了方便大家問題的跟進解決,我們採用Github Issue來採集信息和追蹤進度。大家遇到問題請搜索Github Issue,問題未解決請優先在Github Issue上提問,有助於問題的積累和沉澱
※參數設置相關問題匯總
※【使用指南】用pip安裝paddlepaddle
TAG:PaddlePaddle |