作者:阿澤(阿澤的學(xué)習(xí)筆記)
本文介紹阿里媽媽廣告算法團(tuán)隊發(fā)表于 2018 年 SIGIR 一篇論文《Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate》。
傳統(tǒng)的 CVR 通常會面臨樣本選擇偏差和數(shù)據(jù)稀疏兩大的問題,從而使得模型訓(xùn)練變得相當(dāng)困難。本文作者提出 ESMM 算法,通過定義新型多任務(wù)聯(lián)合訓(xùn)練的方式,以全新的視角對 CVR 進(jìn)行建模。
通過淘寶推薦系統(tǒng)的實驗表明,ESMM 的性能明顯優(yōu)于其他算法。
看到這里,大家可能有很多疑問:
CVR 預(yù)估任務(wù)中,樣本選擇偏差是什么問題?
ESMM 是怎樣多任務(wù)訓(xùn)練的,又是如何聯(lián)合訓(xùn)練的?
帶著問題,我們來閱讀以下內(nèi)容。
Introduction
post-click conversion rate 翻譯過來就是:點擊后轉(zhuǎn)化率,也就是說 CVR 是建立在用戶點擊的基礎(chǔ)上的進(jìn)行的。
作者將用戶的行為簡化為:曝光->點擊->轉(zhuǎn)換三個步驟,三者的區(qū)別如下圖所示:
傳統(tǒng)的 CVR 任務(wù)中,工程師通常將以點擊未購買的樣本作為負(fù)樣本,而點擊購買的樣本作為正樣本,并以此訓(xùn)練模型,將其部署到線上使用。
但這樣的訓(xùn)練方式有一個問題,模型是針對點擊的商品進(jìn)行訓(xùn)練的,而線上數(shù)據(jù)集大部分都是未點擊的,此時便會出現(xiàn)樣本選擇偏差(sample selection bias,SSB) 的問題。
此外,點擊商品本身就非常少,所以通過這種方式構(gòu)建的數(shù)據(jù)集還會面臨數(shù)據(jù)稀疏(data sparsity,DS) 的問題。
SSB 問題會影響模型的泛化性能,而 DS 問題會影響模型的擬合。
現(xiàn)有的一些研究試圖去解決這些問題,比如說:建立基于不同特征的分層估計器,并將其與 LR 模型相結(jié)合來解決 DS 問題,或者利用對未曝光未點擊的樣本做采樣來緩解 SSB 問題。這些策略在一定程度上可以消除 SSB 和 DS 問題,但都顯得不夠優(yōu)雅,并且也都不能真正解決 CVR 建模中的問題。
上述策略的一大關(guān)鍵在于沒有考慮到 CTR 和 CVR 的順序動作信息,而阿里媽媽的同學(xué)通過充分利用用戶操作的順序性提出了 ESMM 算法,該方法能夠同時解決 SSB 和 DS 問題。
ESMM 中引入了兩個輔助任務(wù),分別是 CTR 和點擊后轉(zhuǎn)換的 CTCVR 任務(wù)。ESMM 并不是直接使用曝光樣本來訓(xùn)練 CVR,而是利用 的關(guān)系,CTCVR 和 CTR 都可以通過曝光的樣本進(jìn)行訓(xùn)練,而 CVR 作為中間變量可以由 CTR 和 CTCVR 估算得到。因此,通過這種方法算出的 CVR 也適用于整個樣本空間(與線上分布一致),這便解決了 SSB 問題。此外,CVR 和 CTR 共享網(wǎng)絡(luò)表征,由于后者的訓(xùn)練樣本更多,所以也可以減輕 DS 問題。
ESMM
接下來,我們來看 ESMM 的具體做法。
我們將上面的式子寫具體,對于給定的曝光樣本 x,我們可以得到 CTCVR 的概率:
基于這種關(guān)系,我們聯(lián)合 Embedding 和 MLP 網(wǎng)絡(luò)設(shè)計了 ESMM 架構(gòu):
ESMM 借鑒多任務(wù)學(xué)習(xí)的思想,將模型分為左右兩個模塊,左邊是我們需要的 CVR 模塊,右邊是 CTR 和 CTCVR 輔助訓(xùn)練模塊,恰當(dāng)?shù)囊肓擞脩舨僮鞯捻樞蛐裕瑫r消除了 CVR 建模出現(xiàn)的兩個問題。
值得注意的是,CVR 和 CTR 任務(wù)采用相同的特征輸入并共享 Embedding Layer,CTR 任務(wù)中由于具有大量訓(xùn)練樣本,可以對模型進(jìn)行充分訓(xùn)練,這種參數(shù)共享的方式,可以降低數(shù)據(jù)稀疏帶來的影響。
另外,pCVR 只是一個中間變量,受到上面公式的約束,而 pCTR 和 pCTCVR 才是 ESMM 中實際訓(xùn)練的主要因素。(可以這樣理解,CVR 模型是沒有監(jiān)督信號的,而 CTR 和 CTCVR 都是有監(jiān)督信號的,最后利用公式約束得到 CVR 模型。)
所以,對于給定曝光的樣本,我們同時可以得到 CVR、CTR 和 CTCVR。
可能有同學(xué)會有疑問,為什么要通過公式進(jìn)行約束,而不直接通過 pCTCVR/pCTR 來得到 pCVR。作者也做了這樣的實驗,但是結(jié)果并不好,主要原因在于 pCTR 通常非常小,除以一個非常小的數(shù)會引起數(shù)值不穩(wěn)定,所以 ESMM 采用了乘法公式進(jìn)行約束,而不是直接通過除法得到結(jié)果。
我們來看下 ESMM 的損失函數(shù),由具有監(jiān)督信息的 CVR 和 CTCVR 任務(wù)組成:
其中, 和 分別是 CTR 和 CVR 網(wǎng)絡(luò)的參數(shù); 為交叉熵?fù)p失函數(shù)。
Experiments
來看一下實驗部分:
所有數(shù)據(jù)集是從淘寶日志中整理抽取出來的生產(chǎn)環(huán)境的數(shù)據(jù)集(Product Dataset),并且從中進(jìn)行隨機(jī)采樣(1%)作為公共數(shù)據(jù)集(Public Dataset),同時也開源了這部分公共數(shù)據(jù)集。兩個數(shù)據(jù)集的信息如下所示:
下圖為不同模型在公共數(shù)據(jù)集中的表現(xiàn):
其中 ESMM-NS 為 ESMM 的精簡版,沒有 Embedding Layer 的參數(shù)共享。
可以看到兩個版本的 ESMM 在不同任務(wù)下的效果都取得了 SOTA 的成績。
再看一下不同模型在生產(chǎn)數(shù)據(jù)集上的表現(xiàn):
ESMM 模型在不同大小的數(shù)據(jù)集上都是處于領(lǐng)先地位的。
Code
放上 ESMM 的核心代碼:
1#-*-coding:UTF-8-*- 2importtensorflowastf 3fromtensorflow.python.estimator.cannedimportheadashead_lib 4fromtensorflow.python.ops.lossesimportlosses 5 6defbuild_deep_layers(net,params): 7#構(gòu)建隱藏層 8fornum_hidden_unitsinparams['hidden_units']: 9net=tf.layers.dense(net,units=num_hidden_units,activation=tf.nn.relu, 10kernel_initializer=tf.glorot_uniform_initializer()) 11returnnet 12 13defesmm_model_fn(features,labels,mode,params): 14net=tf.feature_column.input_layer(features,params['feature_columns']) 15last_ctr_layer=build_deep_layers(net,params) 16last_cvr_layer=build_deep_layers(net,params) 17 18head=head_lib._binary_logistic_or_multi_class_head( 19n_classes=2,weight_column=None,label_vocabulary=None,loss_reduction=losses.Reduction.SUM) 20ctr_logits=tf.layers.dense(last_ctr_layer,units=head.logits_dimension, 21kernel_initializer=tf.glorot_uniform_initializer()) 22cvr_logits=tf.layers.dense(last_cvr_layer,units=head.logits_dimension, 23kernel_initializer=tf.glorot_uniform_initializer()) 24#核心思想在這里: 25ctr_preds=tf.sigmoid(ctr_logits) 26cvr_preds=tf.sigmoid(cvr_logits) 27ctcvr_preds=tf.multiply(ctr_preds,cvr_preds) 28optimizer=tf.train.AdagradOptimizer(learning_rate=params['learning_rate']) 29ctr_label=labels['ctr_label'] 30cvr_label=labels['cvr_label'] 31 32user_id=features['user_id'] 33click_label=features['label'] 34conversion_label=features['is_conversion'] 35 36 37ifmode==tf.estimator.ModeKeys.PREDICT: 38predictions={ 39'ctr_preds':ctr_preds, 40'cvr_preds':cvr_preds, 41'ctcvr_preds':ctcvr_preds, 42'user_id':user_id, 43'click_label':click_label, 44'conversion_label':conversion_label 45} 46export_outputs={ 47'regression':tf.estimator.export.RegressionOutput(predictions['cvr_preds']) 48} 49returntf.estimator.EstimatorSpec(mode,predictions=predictions,export_outputs=export_outputs) 50 51else: 52ctr_loss=tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(labels=ctr_label,logits=ctr_logits)) 53ctcvr_loss=tf.reduce_sum(tf.losses.log_loss(labels=cvr_label,predictions=ctcvr_preds)) 54loss=ctr_loss+ctcvr_loss#loss這兒可以加一個參數(shù),參考multi-task損失的方法 55 56train_op=optimizer.minimize(loss,global_step=tf.train.get_global_step()) 57returntf.estimator.EstimatorSpec(mode,loss=loss,train_op=train_op)
Conclusion
一句話總結(jié):作者提出了一種用于 CVR 建模的多任務(wù)聯(lián)合訓(xùn)練方法——ESMM,其充分利用了用戶點擊、轉(zhuǎn)換的順序性,并借助 CTR 和 CTCVR 兩個輔助任務(wù)來訓(xùn)練 ESMM 模型,并通過三者的關(guān)系約束得到 CVR 模型。ESMM 模型可以很好的解決傳統(tǒng) CVR 建模中出現(xiàn)的樣本選擇偏差和數(shù)據(jù)稀疏的兩大難題,并在真實數(shù)據(jù)集中取得 SOTA 的優(yōu)秀表現(xiàn)。
此外,ESMM 模型中子網(wǎng)絡(luò)也可以替換成其他更先進(jìn)的模型,從而吸收其他模型的優(yōu)勢,進(jìn)一步提升學(xué)習(xí)效果。
Reference
Ma X, Zhao L, Huang G, et al. Entire space multi-task model: An effective approach for estimating post-click conversion rate[C]//The 41st International ACM SIGIR Conference on Research & Development in Information Retrieval. 2018: 1137-1140.
github:x-deeplearning
-
多任務(wù)
+關(guān)注
關(guān)注
0文章
18瀏覽量
9049 -
CVR
+關(guān)注
關(guān)注
0文章
3瀏覽量
6469 -
CTR
+關(guān)注
關(guān)注
0文章
36瀏覽量
14072 -
ESMM
+關(guān)注
關(guān)注
0文章
2瀏覽量
890
原文標(biāo)題:【CTR】ESMM:多任務(wù)聯(lián)合學(xué)習(xí)
文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論