emm,我是卖东西的,我不要ctr,我要销售额/uv高,更直接的是销售净额/曝光uv,这个值越高越好,说明推的好,用户都喜欢下单。至于CTR,点不点我根本不CARE,只要销售净额/曝光uv 足够高,CTR=0也可以(当然不现实哈,不点击咋可能购买呢??)
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也是全空间的。因此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 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都有输出。可选择其一作为排序标准。
- saved_model_cli show --dir 1656405675/ --tag_set serve --signature_def serving_default
- The given SavedModel SignatureDef contains the following input(s):
- inputs['baby_num'] tensor_info:
- dtype: DT_INT32
- shape: (-1)
- name: input_3:0
- inputs['brand'] tensor_info:
- dtype: DT_INT32
- shape: (-1)
- name: input_8:0
- inputs['cate1'] tensor_info:
- dtype: DT_INT32
- shape: (-1)
- name: input_9:0
- inputs['cate2'] tensor_info:
- dtype: DT_INT32
- shape: (-1)
- name: input_10:0
- inputs['pmonth'] tensor_info:
- dtype: DT_INT32
- shape: (-1)
- name: input_5:0
- inputs['province_name'] tensor_info:
- dtype: DT_INT32
- shape: (-1)
- name: input_4:0
- inputs['swpu'] tensor_info:
- dtype: DT_INT32
- shape: (-1)
- name: input_7:0
- inputs['user_status'] tensor_info:
- dtype: DT_INT32
- shape: (-1)
- name: input_6:0
- inputs['user_gender'] tensor_info:
- dtype: DT_INT32
- shape: (-1)
- name: input_2:0
- The given SavedModel SignatureDef contains the following output(s):
- outputs['logits_ctr'] tensor_info:
- dtype: DT_FLOAT
- shape: (-1)
- name: Squeeze_1:0
- outputs['logits_cvr'] tensor_info:
- dtype: DT_FLOAT
- shape: (-1)
- name: Squeeze:0
- outputs['probs_ctcvr'] tensor_info:
- dtype: DT_FLOAT
- shape: (-1)
- name: Mul:0
- outputs['probs_ctr'] tensor_info:
- dtype: DT_FLOAT
- shape: (-1)
- name: Sigmoid_1:0
- outputs['probs_cvr'] tensor_info:
- dtype: DT_FLOAT
- shape: (-1)
- name: Sigmoid:0
- 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
- < HTTP/1.1 200 OK
- < Content-Type: application/json
- < Date: Tue, 28 Jun 2022 12:28:21 GMT
- < Content-Length: 244
- <
- {
- "predictions": [
- {
- "logits_cvr": 1.48903823,
- "probs_cvr": 0.815933883,
- "logits_ctr": -4.08784962,
- "probs_ctr": 0.0164985061,
- "probs_ctcvr": 0.0134616904
- }
- ]
- * Connection #0 to host localhost left intact
建议按照cvr排序。