<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          多任務(wù)學(xué)習(xí)模型ESMM原理與實現(xiàn)(附代碼)

          共 7469字,需瀏覽 15分鐘

           ·

          2022-05-18 23:39


          來源DataFunTalk

          本文約2500,建議閱讀5分鐘

          文章基于 Multi-Task Learning (MTL) 的思路,提出一種名為ESMM的CVR預(yù)估模型。


          [ 導(dǎo)讀 ]?本文介紹的是阿里巴巴團隊發(fā)表在 SIGIR’2018 的論文《Entire Space Multi-Task Model: An E?ective Approach for Estimating Post-Click Conversion Rate》。文章基于 Multi-Task Learning (MTL) 的思路,提出一種名為ESMM的CVR預(yù)估模型,有效解決了真實場景中CVR預(yù)估面臨的數(shù)據(jù)稀疏以及樣本選擇偏差這兩個關(guān)鍵問題。后續(xù)還會陸續(xù)介紹MMoE,PLE,DBMTL等多任務(wù)學(xué)習(xí)模型。

          1、多任務(wù)學(xué)習(xí)背景

          目前工業(yè)中使用的推薦算法已不只局限在單目標(biāo)(ctr)任務(wù)上,還需要關(guān)注后續(xù)的轉(zhuǎn)換鏈路,如是否評論、收藏、加購、購買、觀看時長等目標(biāo)。

          本文介紹的是阿里巴巴團隊發(fā)表在 SIGIR’2018 的論文:

          《Entire Space Multi-Task Model: An E?ective Approach for Estimating Post-Click Conversion Rate》

          鏈接:https://arxiv.org/abs/1804.07931


          文章基于 Multi-Task Learning (MTL) 的思路,提出一種名為ESMM的CVR預(yù)估模型,有效解決了真實場景中CVR預(yù)估面臨的數(shù)據(jù)稀疏以及樣本選擇偏差這兩個關(guān)鍵問題。后續(xù)還會陸續(xù)介紹MMoE,PLE,DBMTL等多任務(wù)學(xué)習(xí)模型。

          2、論文介紹

          CVR預(yù)估面臨兩個關(guān)鍵問題:

          1. Sample Selection Bias (SSB)

          轉(zhuǎn)化是在點擊之后才“有可能”發(fā)生的動作,傳統(tǒng)CVR模型通常以點擊數(shù)據(jù)為訓(xùn)練集,其中點擊未轉(zhuǎn)化為負例,點擊并轉(zhuǎn)化為正例。但是訓(xùn)練好的模型實際使用時,則是對整個空間的樣本進行預(yù)估,而非只對點擊樣本進行預(yù)估。即訓(xùn)練數(shù)據(jù)與實際要預(yù)測的數(shù)據(jù)來自不同分布,這個偏差對模型的泛化能力構(gòu)成了很大挑戰(zhàn),導(dǎo)致模型上線后,線上業(yè)務(wù)效果往往一般。



          2. Data Sparsity (DS)


          CVR預(yù)估任務(wù)的使用的訓(xùn)練數(shù)據(jù)(即點擊樣本)遠小于CTR預(yù)估訓(xùn)練使用的曝光樣本。僅使用數(shù)量較小的樣本進行訓(xùn)練,會導(dǎo)致深度模型擬合困難。

          一些策略可以緩解這兩個問題,例如從曝光集中對unclicked樣本抽樣做負例緩解SSB,對轉(zhuǎn)化樣本過采樣緩解DS等。但無論哪種方法,都沒有從實質(zhì)上解決上面任一個問題。

          由于點擊=>轉(zhuǎn)化,本身是兩個強相關(guān)的連續(xù)行為,作者希望在模型結(jié)構(gòu)中顯示考慮這種“行為鏈關(guān)系”,從而可以在整個空間上進行訓(xùn)練及預(yù)測。這涉及到CTR與CVR兩個任務(wù),因此使用多任務(wù)學(xué)習(xí)(MTL)是一個自然的選擇,論文的關(guān)鍵亮點正在于“如何搭建”這個MTL。

          首先需要重點區(qū)分下,CVR預(yù)估任務(wù)與CTCVR預(yù)估任務(wù)。

          • CVR = 轉(zhuǎn)化數(shù)/點擊數(shù)。是預(yù)測“假設(shè)item被點擊,那么它被轉(zhuǎn)化”的概率。CVR預(yù)估任務(wù),與CTR沒有絕對的關(guān)系。一個item的ctr高,cvr不一定同樣會高,如標(biāo)題黨文章的瀏覽時長往往較低。這也是不能直接使用全部樣本訓(xùn)練CVR模型的原因,因為無法確定那些曝光未點擊的樣本,假設(shè)他們被點擊了,是否會被轉(zhuǎn)化。如果直接使用0作為它們的label,會很大程度上誤導(dǎo)CVR模型的學(xué)習(xí)。
          • CTCVR = 轉(zhuǎn)換數(shù)/曝光數(shù)。是預(yù)測“item被點擊,然后被轉(zhuǎn)化”的概率。



          其中x,y,z分別表示曝光,點擊,轉(zhuǎn)換。注意到,在全部樣本空間中,CTR對應(yīng)的label為click,而CTCVR對應(yīng)的label為click & conversion,這兩個任務(wù)是可以使用全部樣本的。因此,ESMM通過學(xué)習(xí)CTR,CTCVR兩個任務(wù),再根據(jù)上式隱式地學(xué)習(xí)CVR任務(wù)。具體結(jié)構(gòu)如下:


          網(wǎng)絡(luò)結(jié)構(gòu)上有兩點值得強調(diào):

          • 共享Embedding。CVR-task和CTR-task使用相同的特征和特征embedding,即兩者從Concatenate之后才學(xué)習(xí)各自獨享的參數(shù);
          • 隱式學(xué)習(xí)pCVR。這里pCVR 僅是網(wǎng)絡(luò)中的一個variable,沒有顯示的監(jiān)督信號。

          具體地,反映在目標(biāo)函數(shù)中:


          3、代碼實現(xiàn)

          基于EasyRec推薦算法框架,我們實現(xiàn)了ESMM算法,具體實現(xiàn)可移步至github:EasyRec-ESMM。

          EasyRec 鏈接:

          https://github.com/Alibaba/EasyRec

          EasyRec-ESMM鏈接:

          https://github.com/alibaba/EasyRec/blob/master/easy_rec/python/model/esmm.py


          EasyRec介紹:EasyRec是阿里云計算平臺機器學(xué)習(xí)PAI團隊開源的大規(guī)模分布式推薦算法框架,EasyRec 正如其名字一樣,簡單易用,集成了諸多優(yōu)秀前沿的推薦系統(tǒng)論文思想,并且有在實際工業(yè)落地中取得優(yōu)良效果的特征工程方法,集成訓(xùn)練、評估、部署,與阿里云產(chǎn)品無縫銜接,可以借助 EasyRec 在短時間內(nèi)搭建起一套前沿的推薦系統(tǒng)。作為阿里云的拳頭產(chǎn)品,現(xiàn)已穩(wěn)定服務(wù)于數(shù)百個企業(yè)客戶。

          4、模型前饋網(wǎng)絡(luò)


          def build_predict_graph(self): """Forward function.
          Returns: self._prediction_dict: Prediction result of two tasks. """ # 此處從Concatenate后的tensor(all_fea)開始,省略其生成邏輯
          cvr_tower_name = self._cvr_tower_cfg.tower_name dnn_model = dnn.DNN( self._cvr_tower_cfg.dnn, self._l2_reg, name=cvr_tower_name, is_training=self._is_training) cvr_tower_output = dnn_model(all_fea) cvr_tower_output = tf.layers.dense( inputs=cvr_tower_output, units=1, kernel_regularizer=self._l2_reg, name='%s/dnn_output' % cvr_tower_name)
          ctr_tower_name = self._ctr_tower_cfg.tower_name dnn_model = dnn.DNN( self._ctr_tower_cfg.dnn, self._l2_reg, name=ctr_tower_name, is_training=self._is_training) ctr_tower_output = dnn_model(all_fea) ctr_tower_output = tf.layers.dense( inputs=ctr_tower_output, units=1, kernel_regularizer=self._l2_reg, name='%s/dnn_output' % ctr_tower_name)
          tower_outputs = { cvr_tower_name: cvr_tower_output, ctr_tower_name: ctr_tower_output } self._add_to_prediction_dict(tower_outputs) return self._prediction_dict


          1. loss計算


          注意:計算CVR的指標(biāo)時需要mask掉曝光數(shù)據(jù)。



          def build_loss_graph(self): """Build loss graph.
          Returns: self._loss_dict: Weighted loss of ctr and cvr. """ cvr_tower_name = self._cvr_tower_cfg.tower_name ctr_tower_name = self._ctr_tower_cfg.tower_name cvr_label_name = self._label_name_dict[cvr_tower_name] ctr_label_name = self._label_name_dict[ctr_tower_name]
          ctcvr_label = tf.cast( self._labels[cvr_label_name] * self._labels[ctr_label_name], tf.float32) cvr_loss = tf.keras.backend.binary_crossentropy( ctcvr_label, self._prediction_dict['probs_ctcvr']) cvr_loss = tf.reduce_sum(cvr_losses, name="ctcvr_loss")
          # The weight defaults to 1. self._loss_dict['weighted_cross_entropy_loss_%s' % cvr_tower_name] = self._cvr_tower_cfg.weight * cvr_loss
          ctr_loss = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits( labels=tf.cast(self._labels[ctr_label_name], tf.float32), logits=self._prediction_dict['logits_%s' % ctr_tower_name] ), name="ctr_loss")
          self._loss_dict['weighted_cross_entropy_loss_%s' % ctr_tower_name] = self._ctr_tower_cfg.weight * ctr_loss return self._loss_dict

          note: 這里loss是 weighted_cross_entropy_loss_ctr + weighted_cross_entropy_loss_cvr, EasyRec框架會自動對self._loss_dict中的內(nèi)容進行加和。

          2. metric計算

          注意:計算CVR的指標(biāo)時需要mask掉曝光數(shù)據(jù)。


          def build_metric_graph(self, eval_config): """Build metric graph.
          Args: eval_config: Evaluation configuration.
          Returns: metric_dict: Calculate AUC of ctr, cvr and ctrvr. """ metric_dict = {}
          cvr_tower_name = self._cvr_tower_cfg.tower_name ctr_tower_name = self._ctr_tower_cfg.tower_name cvr_label_name = self._label_name_dict[cvr_tower_name] ctr_label_name = self._label_name_dict[ctr_tower_name] for metric in self._cvr_tower_cfg.metrics_set: # CTCVR metric ctcvr_label_name = cvr_label_name + '_ctcvr' cvr_dtype = self._labels[cvr_label_name].dtype self._labels[ctcvr_label_name] = self._labels[cvr_label_name] * tf.cast( self._labels[ctr_label_name], cvr_dtype) metric_dict.update( self._build_metric_impl( metric, loss_type=self._cvr_tower_cfg.loss_type, label_name=ctcvr_label_name, num_class=self._cvr_tower_cfg.num_class, suffix='_ctcvr'))
          # CVR metric cvr_label_masked_name = cvr_label_name + '_masked' ctr_mask = self._labels[ctr_label_name] > 0 self._labels[cvr_label_masked_name] = tf.boolean_mask( self._labels[cvr_label_name], ctr_mask) pred_prefix = 'probs' if self._cvr_tower_cfg.loss_type == LossType.CLASSIFICATION else 'y' pred_name = '%s_%s' % (pred_prefix, cvr_tower_name) self._prediction_dict[pred_name + '_masked'] = tf.boolean_mask( self._prediction_dict[pred_name], ctr_mask) metric_dict.update( self._build_metric_impl( metric, loss_type=self._cvr_tower_cfg.loss_type, label_name=cvr_label_masked_name, num_class=self._cvr_tower_cfg.num_class, suffix='_%s_masked' % cvr_tower_name))
          for metric in self._ctr_tower_cfg.metrics_set: # CTR metric metric_dict.update( self._build_metric_impl( metric, loss_type=self._ctr_tower_cfg.loss_type, label_name=ctr_label_name, num_class=self._ctr_tower_cfg.num_class, suffix='_%s' % ctr_tower_name)) return metric_dict

          5、經(jīng)驗及不足

          我們基于開源AliCCP數(shù)據(jù),進行了大量實驗,實驗部分請期待下一篇文章。實驗發(fā)現(xiàn),ESMM的蹺蹺板現(xiàn)象較為明顯,CTR與CVR任務(wù)的效果較難同時提升。

          鏈接:

          https://tianchi.aliyun.com/dataset/dataDetail?dataId=408&userId=1


          6、參考文獻

          1. Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate

          https://arxiv.org/abs/1804.07931

          2. 阿里CVR預(yù)估模型之ESMM

          https://easyrec.readthedocs.io/en/latest/models/esmm.html

          3. EasyRec-ESMM使用介紹多任務(wù)學(xué)習(xí)模型之ESMM介紹與實現(xiàn)

          https://easyrec.readthedocs.io/en/latest/models/esmm.html

          注:本文圖片及公示均引用自論文:Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate。

          https://arxiv.org/abs/1804.07931

          編輯:于騰凱



          瀏覽 30
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  先锋影音av资源网 | 台湾成人综合 | 色综合激情视频 | www婷婷成年人基地网 | 69超碰青青草 |