某场景介绍

  • 前状:三模型,权重融合
  • 解决问题:融合目标行为,充分利用样本信息,节省资源开销。

当前效果

  • 主场景人均真实曝光+0.26%,不显著;子场景人均真实曝光+0.35%,不显著

  • 千曝互动+2.65%,显著;千曝互动uv+1.80%,显著;人均互动+0.87%,不显著

  • 千曝点击+11.24%,显著;千曝点击uv+5.91%,显著;人均点击+5.08%,显著

  • 去重千曝点击+6.37%,显著;去重千曝点击uv+5.62%,显著;人均去重有效点击+0.75%,显著

  • 物料类型侧指标未见明显异常。实验符合预期,建议扩量。

  • 粗估节省线上模型服务资源约40%。


场景二:

  • 人均真实曝光-0.28%,不显著
  • 千曝互动+5.35%,显著;人均互动+3.28%,显著; 互动uv+1.83%,显著性未知
  • 千曝点击+3.79%,显著;人均点击+3.62%,显著;点击uv-0.25%,显著性未知

场景三:

ple模型:核心指标 +0.588% 显著,千曝点击 3.871% 显著

技术方案选型

核心经验(特征和权重)

  • 特征

    • 样本label
    • 特征准确度、特征覆盖度、特征相关性
  • 目标权重、目标间相互影响程度、模型会不会被带偏

    • 样本策略:六组策略,三个目标;交叉验证,20余组离线实验
    • loss不同,反向传播差异极大
    • 样本label调权
    • 打分分布、归一化保证模型真正在work
      • 离线物料打分分布、分位点;模型打分分布、分位点;
      • 策略调权
  • 底表、实时、无行为过滤样本、点击样本、点正文样本

    • 反向归因:全量样本,即便未真实曝光,因策略、模型打分排出去,也认为是负样本
  • 过滤策略:全量样本、真实阅读样本、真是阅读+位置样本

    • 真实阅读平均位置,为5.0x;
    • BEC、focalloss分别对比
    • 三目标分别对比
    • T+1验证,1、5、7、14、21天样本训练;观察auc diff。

特征

  • 特征重筛(有效性、监控、误配置引入bug反查)

    • 手动刷流,结合case系统,查样本数据;
    • 样本特征覆盖度监控
  • 相关性分析(pickup)
    • 有正相关,有负相关;认为具有相关性即可,不论正负,具体作用交由模型学习
  • 特征验证(推理性能、模型表现性能)
    • 序列特征、ID类特征
    • 剧烈影响模型推理性能,在模型表现影响不大情况下,适度删减
  • 分桶优化(调整分桶、大维度hash)
    • 全特征走hash,模型维度一度膨胀到100w亿。
    • 反向归因:因为样本不足,id类embeding学习不充分,21天样本依然效果较差。
  • 交叉特征(concathash、pickup)
  • 全流程一致性梳理

label

  • 点击指标爆炸、目标优化

    • 用了label_click。auc能学到0.9+,但上线效果极差
    • 用了label_click_valid,模型不收敛,bug修复后,恢复正常
  • 模型不收敛
    • 训练、评估使用label不匹配(点正文、混合label)
    • label 歧义
  • 物料类型分析、指标异常分析
    • 极有效的辅助观测指标,各label交叉对比,能发现80%以上的问题
  • 损失置0 (评估相关性)
    • 部分loss不进入总loss
    • loss置0
    • 梯度置0、梯度丢弃
    • stop_gradient
    • 梯度裁剪

模型结构

  • Dense层对比实验(128+32、128+64+32、256+128+64、256+128+64+32)

    • 一定程度下,模型越复杂,效果越好(离线auc,线上指标变动不显著)
  • 专家塔实验(40、64、32、20)
    • 专家塔对单目标影响不大。多目标场景下效果较为显著,但没有显著的对应关系,得试。
  • input_layer调整pooling操作,离线无显著收益。
  • 模型跳连(skip-conn)
    • 参考ResNet
  • 特征交叉(concat、pooling)
    • 参考DeepFM,最后一层与第一层进行操作
  • gradient-stop (评估梯度)
    • 在用,但效果未做对比。
  • 多共享塔
    • 同专家塔,比较玄学。个人未有显著结论。
  • 基于tensorboard,trace graph,排查代码异常
    • 极其有效的评估手段
    • graph、projector、histograms、distributions
    • 分别排查代码bug、embeding异常、训练过程异常、参数分布异常
  • savedmodel 转文本,根据op回溯图,排查异常
    • 极重要的一致性校验手段
    • 参考代码,基本能回溯全图,并且部分了解tf、framework运行机制。
  • predict score reshape导致协议不兼容
    • 上线预览时发现的问题。上线前一定要预览,必要时加白名单刷case。

优化器(差异不大,均能收敛)

  • adam
  • adagrad
  • sgd

loss

    # Note that these two expressions can be combined into the following:
# max(x, 0) - x * z + log(1 + exp(-abs(x)))
# To allow computing gradients at zero, we define custom versions of max and
# abs functions.
  • 加权交叉熵

    • tf实现,支持自定义权重
        reweight_value = 1.0
if("by_positive" == self.params['model_reweight_type'][0]):
reweight_value = float(params['model_reweight_type'][1])
tf.logging.info("suanec : real reweight value is : %d" % reweight_value)
print("suanec : real reweight value is : %d" % reweight_value)
weights = tf.where(tf.equal(labels, 1.0), tf.tile([reweight_value], tf.shape(labels)), tf.tile([1.], tf.shape(labels)))
tf.logging.info("suanec : model_func_remainder. done parse reweight_value .")
········
········
········
elif params['sample_label_column'] == "is_click":
print("params['sample_label_column'] == is_click | use click_label")
click_labels = self.click_label_cast(features=features)
labels = click_labels
loss = tf.losses.sigmoid_cross_entropy(labels, logits, weights=weights)
  • focalloss

    • 本质是加权 + 减权
    • 整体loss 值会较小,适当缩放、调大学习率、调整权重等手段规避
  • alpha-focalloss
    • 自定义,删减了难样本学习功能,减少pow操作。减少变量、降低开销(理论上)
  • loss 分析 [https://note.youdao.com/s/C5kbN5K9]
    • 根据loss值、learning_rate,评估模型收敛情况,玄学凭感觉。
  • L1、L2默认都加
    • 具体加不加,怎么加,要先说服自己

打分融合策略

  • 调和平均数(F1)

    • 参考recall/precision 评估
  • 均值
    • 多目标共现,同贡献先验
  • 乘积
    • 参考CTCVR,概率角度考虑,后续粗排可以尝试(单理论分析)
  • 固定权重
    • 引入业务先验
  • UWL
    • Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics
    • 简而言之就是:一个基于高斯分布先验的 log likelihood。
  • 策略归一化
    • 模型打分跟策略打分应该在一个维度,至少是一个量纲
  • 打分一致性校验
    • 一致性校验工具
    • tf savedmodel_cli 工具
    • 打分分位点评估

实时化

  • 特征校验、schema有略微差异
  • 评估shape不对
    • 多目标评估打分是多个tensor,stream_evaluator配置有trick
  • 模型不收敛
    • 学习率问题
    • 样本不够
    • label不对
    • loss函数 差异
  • 实施评估数据错位导致auc异常
    • 第二个目标评估数据错位,各项指标均异常。后对比离线发现,因数据错位导致。
    • 新镜像已修复

case观感

  • 视频贼少、视频贼多
  • 召回层级分析
    • 兴趣层减少
  • 图文较多但热度低
    • 互动指标加权大,导致影响较大
  • 热度较高但兴趣差
    • 筛选了行为样本,热度高物料学习充分
    • 关注策略加权较重
  • 分发控制、过已读等其他case
    • 打点case
    • 过已读case
    • 模型超时 非合理推荐case
  • 跨场景行为
    • 互动过物料曝光case
  • 样本和指标 向专业人士寻求帮助

监控数据

  • 模型服务指标

    • qps、rt、p99、参数服务p99、版本号、特征空值率
  • titan引擎指标
    • p99、错误率等
  • 基于物料类型的分析
    • 物料类型变化,及各项行为指标对比
  • 基于位置的分析
    • 同位置物料均值对比
  • 模型打分监测:均值 + 分位点
  • 一致性确认
  • 造数据离线评估打分

遗留问题

  • MTL+MDL todo
  • 模型迁移实时 doing
  • 参数预加载 doing
  • 融合权重预置方式 (纯引擎,改为模型 + 策略 + 引擎) todo

后续规划

  • pepnet + ple
  • 参考DMT,+ attention
  • UWL推理引入,配合实时训练,初版强化学习

小结

  • 不浪费每一次错误,错误要改,还要尽量多的得出新结论;pivot 枢轴法
  • 相信并依靠团队的力量
  • 多目标任务,目标融合是关键

PLE-实践小结-2308-cnblogs的更多相关文章

  1. TCP编程实践小结1

    说起TCP/IP协议,大家估计都能说出个一二,但是估计很少有人能够深入的理解这个协议,原因有这么几个: 协议本身确实复杂 入门教材没选对,太抽象了,导致大家浅尝辄止 学习过程中如果没有配合实践理解,过 ...

  2. python多线程实践小结

    参考:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html #!/usr/bin/env python import sys ...

  3. 使用puppeteer爬取网页数据实践小结

    简单介绍Puppeteer Puppeteer是一个Node库,它通过DevTools协议提供高级API来控制Chrome或Chromium.Puppeteer默认以无头方式运行,但可以配置为有头方式 ...

  4. Python原生调试工具pdb实践小结

    使用python -m pdb xxx.py进入单步调试模式,默认会在脚本的第一行可执行命令处停止.此时,通过 b function设置之后的函数断点会提示出错,从出错异常栈中可以看出,pdb是将fu ...

  5. SixLabors.ImageSharp 实践小结

    前言 之前写过一篇 Linux/Docker 中使用 System.Drawing.Common 踩坑小计, 当时主要是有一块图像处理的需要从 .net framework 迁移到 .net core ...

  6. TCP KeepAlive机制理解与实践小结

    0 前言 本文将主要通过抓包并查看报文的方式学习TCP KeepAlive机制,以此加深理解. 1 TCP KeepAlive机制简介 TCP长连接下,客户端和服务器若长时间无数据交互情况下,若一方出 ...

  7. Android MVP+Retrofit+RxJava实践小结

    关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...

  8. 82.Android之MVP+Retrofit+RxJava实践小结

    转载:http://wuxiaolong.me/2016/06/12/mvpRetrofitRxjava/ 关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛 ...

  9. 使用U盘安装Ubuntu系统的实践小结

    参考教程:http://diybbs.zol.com.cn/1/33925_1942.html   遇到的问题:安装ubuntu 12.04 64位,提示缺少“/casper/vmlinuz.efi ...

  10. Mysql表分区的选择与实践小结

    在一些系统中有时某张表会出现百万或者千万的数据量,尽管其中使用了索引,查询速度也不一定会很快.这时候可能就需要通过分库,分表,分区来解决这些性能瓶颈. 一. 选择合适的解决方法 1. 分库分表. 分库 ...

随机推荐

  1. 沁恒 CH32V208(三): CH32V208 Ubuntu22.04 Makefile VSCode环境配置

    目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置 沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟 沁恒 CH32V208 ...

  2. 基于.NetCore开发博客项目 StarBlog - (27) 使用JWT保护接口

    前言 这是StarBlog系列在2023年的第二篇更新 这几个月都在忙,更新变得很不勤快,但是拖着不更新我的心里更慌,很久没写,要开头就变得很难 说回正题,之前的文章里,我们已经把博客关键的接口都开发 ...

  3. 解决VM虚拟机中IP或域名不能ping通

    c4548abb-da65-4f7d-827f-e95dca25a13d 问题 无法ping通域名, 检查事项 确定在同一个子网,能访问DNS服务器. DNS服务器正确设置了正反向解析,且DNS服务器 ...

  4. 芯烨小票打印机PHP打印代码

    芯烨小票打印机PHP打印代码,案例中打印机为58mm打印机 58mm的机器,一行打印16个汉字,32个字母 80mm的机器,一行打印24个汉字,48个字母 本次添加了补打空格的代码,根据商品名称计算后 ...

  5. 2021-09-12:请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string

    2021-09-12:请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数).函数 myAtoi(string ...

  6. Django-账号用户密码修改

    Django账号密码修改命令: python manage.py changepassword python manage.py changepassword 实操分析: 第一次修改失败是因为违反了密 ...

  7. json函数

    Python与JSON(load.loads.dump.dumps)   1.Python中加载JSON 使用loads(string):作用将string类型转为dict字典或dict链表 # 加载 ...

  8. Element Cascader 级联选择器去除空叶子节点

    此处以后端获取部门级联List为例 以下为数据结构 { data: { children: [ 0:{childre:[ 0:{}, 1:{} ]}, 1:{}, 2:{}, 3:{}, 4:{}, ...

  9. 一天吃透Spring面试八股文

    内容摘自我的学习网站:topjavaer.cn Spring是一个轻量级的开源开发框架,主要用于管理 Java 应用程序中的组件和对象,并提供各种服务,如事务管理.安全控制.面向切面编程和远程访问等. ...

  10. 尚医通-day12【token续期和就诊人管理】(内附源码)

    页面预览 就诊人管理 就诊人列表 添加就诊人 查看就诊人 ![image-20230225060710 管理员系统用户管理 前面我们完成了用户登录.用户认证与就诊人管理,现在我们需要把这些信息在我们的 ...