• ESMM全空间多任务模型解读与试验


    emm,我是卖东西的,我不要ctr,我要销售额/uv高,更直接的是销售净额/曝光uv,这个值越高越好,说明推的好,用户都喜欢下单。至于CTR,点不点我根本不CARE,只要销售净额/曝光uv 足够高,CTR=0也可以(当然不现实哈,不点击咋可能购买呢??)

    For Recommendation in Deep learning QQ Group 277356808

    For deep learning QQ Second Group 629530787 

    I'm here waiting for you

    难分真与假,人面多险诈。原文地址

    1-引子:提出问题,样本选择偏差(Sample Selection Bias)。

    常见的CVR模型是对点击后的样本进行训练(即点击后转化的为正样本,只点击不转化的为负样本),而inference是在整个样本空间,这就存在一个样本偏差。另外也存在一个数据稀疏(data sparsity)问题,毕竟点击的样本很少,工业界更少了,有10%?甚至更少吧,电商估计最多也就2%吧,我猜的。(现在我打开淘宝就是瞎点,他就是猜不到我想要啥,要么就是点了不买,我要气死它,然后它还给我推相似的,我肯定不买的,哈哈)

    impression->click->conversion,这是自然的,也就是展示(曝光)->点击->转化(比如购买)

    为此作者提出了ESMM模型,能够同时消除上面两个问题(SSB和ds),1,对CVR进行全空间建模,2,采用一个特征表达迁移学习的策略(feature representation transfer learning strategy,emm鬼知道是啥玩意,且看如下)。并且提供了点击和转换的数据(89亿样本,一共大约10G左右,包括label,下载需要注册)

    2-ESMM总述,方法论。

    引入post-view CTR及 post-view CTCVR(即点击后又转化),ESMM将pCVR视为中间变量,如下公式:

                                               pCTCVR=pCTR*pCVR

    pCTCVR和pCTR都是通过全空间曝光的样本来估计的,因此pCVR也是全空间的。因此SSB问题没有了,另外,CVR的特征表达参数与CTR是共享的,而CTR训练样本充足。因此,这样的迁移学习也会缓和ds问题(这算迁移学习???仅仅共享个参数??emm,我不确定)

    3-模型结构

    base model是CVR模型,如下图左边,auxiliary是辅助的意思,为啥说CTR模型是辅助呢?因为是要提高CVR,主要目的也是训练CVR,所以CVR是主要任务,而CTR是辅助任务。

     由上面的公式可知,要得到pCVR只需相除即可,但由于pCTR是小数,可能会引发数字不稳定。因此ESMM采取相乘的方式避免(就是把pCVR当成中间值,不再管这个参数了,就是这个意思)

    损失函数,就是CTR和CTCVR交叉熵的和。

    4-试验,数据处理

    4.1负采样,AMAN分别采用了10%,20%,50%,100%的负样本;OVERSAMPLING将正样本复制多份以减少训练稀疏数据的困难,分别是2,3,5,10倍的正样本;

    4.2两个任务决定AUC,一个是主-任务,计算CVR的AUC,(预测是在点击的数据上进行);一个是辅助任务,计算CTCVR的AUC,这个预测是在所有数据上。后者中pCTCVR是采用最上面的公式计算的。

    5,我的应用试验

    按照paper中的做法,需要有CTR的label及CVR的label,所以label是两列,由于官方数据md5解码及数据解析存在困难,所以用自己的数据,由于存在某些技术困难(群里可说),这里将某些视为cvr数据(即点击后的转化),且看如下esmm过程,(没有考虑user_id,因为购买的用户太少了,加上这个训练可能更难,这就潜在要求:特征务尽,能够刻画某一类用户,不加这个似乎还可以解决冷用户的排序问题,这个用户都没买过,你咋给他排序呢?)

    Saving dict for global step 5000: auc_ctcvr = 0.90099823, auc_ctr = 0.904977, auc_cvr_masked = 0.62655663, global_step = 5000, loss = 790.64355, loss/loss/total_loss = 790.64355, loss/loss/weighted_cross_entropy_loss_ctr = 409.83682, loss/loss/weighted_cross_entropy_loss_cvr = 380.80707

    我咋感觉不靠谱呢??数据有问题吧,,,,

    ctr,ctcvr很高,cvr有点低啊,另外,cvr是去掉曝光后的。

    docker部署可查看此博文

    docker run -p 8501:8501 --mount type=bind,source=/Rec/esmm/ckpt/export/final/,target=/models/myesmm2 -e MODEL_NAME=myesmm2 -t tensorflow/serving &

    requests请求参考dssm部署 ,cvr,ctr,ctcvr都有输出。可选择其一作为排序标准。

    1. saved_model_cli show --dir 1656405675/ --tag_set serve --signature_def serving_default
    2. The given SavedModel SignatureDef contains the following input(s):
    3. inputs['baby_num'] tensor_info:
    4. dtype: DT_INT32
    5. shape: (-1)
    6. name: input_3:0
    7. inputs['brand'] tensor_info:
    8. dtype: DT_INT32
    9. shape: (-1)
    10. name: input_8:0
    11. inputs['cate1'] tensor_info:
    12. dtype: DT_INT32
    13. shape: (-1)
    14. name: input_9:0
    15. inputs['cate2'] tensor_info:
    16. dtype: DT_INT32
    17. shape: (-1)
    18. name: input_10:0
    19. inputs['pmonth'] tensor_info:
    20. dtype: DT_INT32
    21. shape: (-1)
    22. name: input_5:0
    23. inputs['province_name'] tensor_info:
    24. dtype: DT_INT32
    25. shape: (-1)
    26. name: input_4:0
    27. inputs['swpu'] tensor_info:
    28. dtype: DT_INT32
    29. shape: (-1)
    30. name: input_7:0
    31. inputs['user_status'] tensor_info:
    32. dtype: DT_INT32
    33. shape: (-1)
    34. name: input_6:0
    35. inputs['user_gender'] tensor_info:
    36. dtype: DT_INT32
    37. shape: (-1)
    38. name: input_2:0
    39. The given SavedModel SignatureDef contains the following output(s):
    40. outputs['logits_ctr'] tensor_info:
    41. dtype: DT_FLOAT
    42. shape: (-1)
    43. name: Squeeze_1:0
    44. outputs['logits_cvr'] tensor_info:
    45. dtype: DT_FLOAT
    46. shape: (-1)
    47. name: Squeeze:0
    48. outputs['probs_ctcvr'] tensor_info:
    49. dtype: DT_FLOAT
    50. shape: (-1)
    51. name: Mul:0
    52. outputs['probs_ctr'] tensor_info:
    53. dtype: DT_FLOAT
    54. shape: (-1)
    55. name: Sigmoid_1:0
    56. outputs['probs_cvr'] tensor_info:
    57. dtype: DT_FLOAT
    58. shape: (-1)
    59. name: Sigmoid:0
    60. Method name is: tensorflow/serving/predict

    curl请求

    curl -d '{"insances":[{"baby_num":[1],"brand_id":[2],"category_lvl1_id":[3],"category_lvl2_id":[1],"pregnancy_month":[1],"province_name":[12],"spu":[1232],"user_baby_status":[4],"user_gender":[1]}]}' -X POST http://localhost:8501/v1/models/myesmm2:predict -H "Content-type: application/json" -v
    1. < HTTP/1.1 200 OK
    2. < Content-Type: application/json
    3. < Date: Tue, 28 Jun 2022 12:28:21 GMT
    4. < Content-Length: 244
    5. <
    6. {
    7. "predictions": [
    8. {
    9. "logits_cvr": 1.48903823,
    10. "probs_cvr": 0.815933883,
    11. "logits_ctr": -4.08784962,
    12. "probs_ctr": 0.0164985061,
    13. "probs_ctcvr": 0.0134616904
    14. }
    15. ]
    16. * Connection #0 to host localhost left intact

    建议按照cvr排序。

    愿我们终有重逢之时,

    而你还记得我们曾经讨论的话题。

  • 相关阅读:
    虚拟机无法启动提示give root password for maintenance的多种解决方法
    Go:交互式提示工具go-prompt简介
    将python脚本打包为exe可执行文件
    Oracle数据库体系结构(四)_存储参数
    JAVA计算机毕业设计学校食堂管理Mybatis+源码+数据库+lw文档+系统+调试部署
    【JS学习】--深拷贝与浅拷贝
    人家不卡学历,是自己真的没能力
    node.js 用 xml2js.Parser 读 Freeplane.mm文件,生成测试用例.csv文件
    【系统设计与实现】智慧教室在线监考系统,实时视频推理(vue前端+java管理后台+cpp深度学习算法后台)
    服务器数据恢复—误还原虚拟机快照后如何恢复之前的数据?
  • 原文地址:https://blog.csdn.net/SPESEG/article/details/125406104