当前位置: 首页 > news >正文

【推荐】排序模型的调优

【推荐】排序模型的调优

  • 排序模型的选择
  • 排序模型常见的训练方式
  • 样本类别不均衡处理尝试
  • 欠拟合
  • 过拟合
  • 其他问题

排序模型的选择

  LR,GBDT,LR+GBDT,FM/FFM, 深度模型(wide & deep,DeepFM,DCN等等 )

排序模型常见的训练方式

方法
方法1:T+1训练(固定时间滑窗内的全量数据来训练)
方法2:每天增量训练
方法3:综合方法1和方法2 即当天内做增量训练(比如小时级别的增量训练),当天结束的时候做T+1全量训练。

样本类别不均衡处理尝试

  对于搜推广领域的排序任务数据集,正负样本严重的类别不均衡,也就是说负样本数量经常是正样本数量的几百倍或者几千倍。对于这么严重的样本类别不均衡,如果不采取任何方案来缓解这个问题,对于模型学习知识是很困难的。对于排序任务来说,常见的缓解类别不均衡的方法如下:

  · 对负样本降采样: 目的是通过某种方法从海量的负样本中采样一些负样本出来,从而让负样本的比例减少。对负样本进行采样后,在计算广告领域的排序任务中,需要在最后计算排序公式的时候进行校准(校准发生在线上推理的时候,离线训练的时候不用考虑校准)。对于个性化搜索和推荐系统来说,他们只关注打分概率的相对顺序,而采样前后的打分概率的相对顺序不会改变,所以不需要校准。

  对负样本进行采样,会浪费掉很多负样本。

  · 对正样本过采样: 目的是通过某种方法把正样本的数量变多。如果把正样本过采样到和负样本差不多的量级,会导致总体训练样本量太大,训练时间相对于正样本过采样前的时间变长很多。对正样本如果进行了采样,在计算广告的排序任务中也需要对打分概率做校准,而个性化搜索和推荐系统中的排序任务不需要对打分概率做校准。

  通过简单复制正样本把正样本数量变成与负样本差不多的样本量,模型的离线效果还不错,就是训练时间相对长,比如一个epoch单机跑都要4,5个小时。正因为这个原因,我们最终没有使用这个方案。

  · 每个epoch对负样本采样出和正样本1:1的数量: 这样就不浪费负样本,epoch的数量可以根据负样本数量和训练时间来权衡。

  做法是这样的,使用tf.keras + tf.data.experimental.sample_from_datasets API 从大量的负样本采样,并与正样本拼接为最终的训练集,结果发现每个epoch后的验证集的AUC不变化。如果说模型已经充分收敛也就是loss基本不变了从而模型参数基本不变化,这个时候验证集的AUC不变化是有可能的,但是模型在刚开始的那些epoch都应该能看到不同的负样本,应该会继续学习而不会收敛,因此在开始的几个epoch验证集AUC应该是变化的。推断可能是Tensorflow/TF的坑,可能每个epoch都拟合了一样的负样本并且基本上在第一个epoch以后模型就基本收敛了。

  · 使用class weight或者sample weight: 目的是通过设置权重来让模型更关注正样本。这个方法在很多项目中都会使用,实际效果也是很不错。

  · 使用Focal loss: Focal loss可以做困难样本学习和缓解类别样本不均衡。由于时间关系,这个项目没有尝试这个方案。

欠拟合

  对于欠拟合,简单来说就是模型学习的不够充分。常见的处理方法如下:

  用更多和更好的特征:

  连续特征的特征缩放处理(深度模型对于连续特征的幅度变化很敏感,所以用深度模型建模的话一定要对连续特征做特征缩放处理)。特征缩放的方法有很多,常见的比如Z-score标准化,MinMax归一化,取log,平滑方法(比如贝叶斯平滑)等等。对于历史ctr这样的比率特征,在排序任务中经常会考虑对该特征做平滑,目的是为了让那些历史ctr相等但是曝光次数多且点击次数也多的item经过平滑后得到的值与那些长尾的item区别开来(比如7天内点击1次,曝光2次的item与7天内点击50次,曝光100次的item,虽然他们的点击率相同,但是他们的受欢迎度差别很大,因此这个时候直接用7天内的ctr作为特征对他们来说没有辨识度,这个时候做ctr平滑就很有意义)。

  还可以根据业务语义逐渐加入更多的设备侧和广告侧的交叉特征。在项目中我们也尝试了这个方法,欠拟合得到进一步的缓解。

  增加模型复杂度/容量:

  在当前使用的wide & deep排序模型的情况下,增加模型容量可以通过下面两种方式,方法1是把全连接层层数变多或者每层的神经元数量变多,方法2是把embedding向量的长度变大。业界一般做排序模型用到的全连接层常见都是3层,这个项目也是用的3层,我们尝试了把每层的神经元变多。另外,看到很多文章对于排序模型中用到的itemid/usrid embedding table的embedding向量的维度一般都是设置为8或者10(算是一个经验值)。

  除了上面提到的这些缓解欠拟合的方法,调整学习率和batch size大小,以及样本类别不均衡的处理方法都可能缓解欠拟合。因此可以看到,缓解欠拟合的组合因素有很多。建议的方式是每次调试只是改变一个因素来进行训练后效果对比。特征缩放肯定是要先做的,除了学习率,batch size以及样本类别不均衡处理这三个因素外,我们可以循序渐进的尝试下面的方法来缓解欠拟合:挖掘一些好的特征(不包含交叉特征,比如一些历史统计特征),接着增加模型复杂度(主要是增加层数或者神经元个数),最后逐渐增加有意义的交叉特征。

过拟合

  过拟合指的是模型在训练集上的效果/表现不错,但是在验证集上的表现与训练集上的差距很大。在实际生产项目中,我们更关心模型在训练集上效果不错,在验证集上的效果也不错,在这样的情况下即使过拟合我们也不关心,比如训练集上的AUC是0.95,验证集上的AUC是0.8,那这种情况是属于过拟合了,但是验证集的AUC也足够高了,所以这个情况我们能接受;如果是训练集上的AUC是0.95,验证集上的AUC是0.6,这种过拟合就是我们需要关心的了。欠拟合到过拟合,有时候就是一瞬间的事情(比如特征一下子加多了就容易从欠拟合变成过拟合)。对于使用深度模型做排序任务的场景,过拟合常见的处理方式如下:

  收集更多的数据 : 目的是让模型能更多的见到不同的数据分布,从而学习到不同的知识。比如T+1训练中的T常见的是7天的数据作为训练集(当然这个T取多少和训练集中的正样本量有多少有很大关系),在我们这个项目中,T取的是30天的数据,因此能获得更多的样本尤其是正样本。

  减少模型复杂度/容量: 也就是使用小一点的神经网络,包括小一点的embedding table,目的是让神经网络和embedding table的容量变小。在实际的项目中,见到过把itemid/userid embedding table的embedding向量的长度设置为几百几千的,不建议这样,太容易过拟合了,就像前面提到的,设置为8左右就是一个不错的起点。注意这里的embedding指的是input embedding,而关于output embedding以及文本embedding向量长度的选择可以参考我的github中的文章推荐系统概览。

  使用BatchNormalization (简称BN,本质是对神经元的激活值进行整形,它在Deep Learning中非常有用,建议尽量用):使用BN的话,batch size不能太小,而batch size的调整一般伴随着同方向的learning rate的调整(也就是把batch size调大的话,learning rate可以适当调大一点点)。虽然BN主要是在CNN卷积层用的比较多,但是MLP层也可以用,RNN的话要用LayerNormalization(简称LN)。在当前项目中,使用BN后的离线效果提升很明显。

  使用Early stopping早停: 监控模型在验证集的metric,并early stopping早停。Early stopping并不是必须的,如果设定模型固定跑的epoch数量,之后选择一个表现最好的epoch的checkpoint也是可以的,这个情况下就不需要early stopping。

  正则化方法: 在深度学习中,常用的正则化方法是Dropout,L1/L2正则,Label标签平滑等。当前项目使用了dropout和L1/L2正则。Dropout的比率以及L1/L2正则的超参数在调试的时候,都要小步调整,大幅调整很容易一下子就从过拟合到了欠拟合了。

  使用更少的特征: 在这个项目中,一下子增加了几种交叉特征后,模型从欠拟合到了过拟合。然后在去掉了几个交叉特征之后,过拟合得到缓解。因此加入新的特征要一点点加,小步走。

  在使用深度模型发生过拟合的时候,首先要检查验证集的数据分布(比如每个连续特征的统计分布,每个离散特征的覆盖度,和训练集中的数据分布做一下对比)。如果训练集和验证集的数据分布相差很多,考虑如何重新构造训练集和验证集;否则,建议尝试按照如下的顺序来缓解(每做完一步就训练看效果,如果验证集的效果能接受了,就先打住;否则继续下一步):使用BN(基本上是标配)——使用更少的特征(如果特征本身就不多,可以跳过;主要关注交叉特征是否很多)——收集更多的数据(如果正样本量已经足够多,可以跳过这步)——使用正则化方法——减少模型复杂度/容量(尤其要注意embedding table中embedding向量的长度)

其他问题

  数据集变了,模型的离线评估AUC变化很大:

  数据集变大可能会导致容量小的模型效果变差,发生欠拟合。对于CTR/CVR任务,训练流程跑通以后,用固定滑窗的数据集来训练调试模型;而一般固定滑窗内的数据集的量级差不多。数据集的清洗和预处理每天都要保证一致性的行为,否则出问题调试很花时间。

  要尽量保证特征的线上线下一致性。

  同样的数据集和同样的模型,两个实验对比,发现对验证集的评估指标AUC有差别:

  ML带入的随机性很多,所以最好在上下文尽量一致的情况下对比,包括超参数的设置,训练任务的相关参数和随机种子fix(这个非常重要,包括python random seed和tensorflow.random rseed都需要fix)。

  经常发现在分布式训练中模型的评估指标比单机训练的评估指标要差:

  这个是很常见的。使用分布式训练甚至只是单机多卡的时候,学习率可能不适合还用单机单卡训练的学习率,适当需要调整。对于horovod分布式训练方式,一般来说,把学习率变大一点就好,不能完全按照horovod官网建议的那样即用worker数量乘以之前单机单卡的学习率作为调整后的学习率(这个可能会得到很大的学习率,从而导致模型学习效果不好)。对于parameter server分布式训练的异步梯度更新方式,可能需要把学习率调小,为了让最慢那个stale model replica的更新对整体的影响小一些。

  特征的覆盖度问题:

  如果某些离散特征的特征值的样本出现频率很低比如少于10次,那么可以考虑特征向上合并或者把那些小类别统一归并为”Other”。

相关文章:

【推荐】排序模型的调优

【推荐】排序模型的调优 排序模型的选择 排序模型常见的训练方式 样本类别不均衡处理尝试 欠拟合 过拟合 其他问题 排序模型的选择 LR,GBDT,LRGBDT,FM/FFM, 深度模型(wide & deep,DeepFM&#x…...

负载均衡安装配置详解

负载均衡(Load Balancing)是一种将网络流量分布到多个服务器上的技术,以提高系统的性能、可靠性和可扩展性。 在负载均衡中,有一个负载均衡器(Load Balancer),它充当了传入请求的前置接收器。当…...

Java-逻辑控制

目录 一、顺序结构 二、分支结构 1.if语句 2.swich语句 三、循环结构 1.while循环 2.break 3.continue 4.for循环 5.do while循环 四、输入输出 1.输出到控制台 2.从键盘输入 一、顺序结构 按照代码的书写结构一行一行执行。 System.out.println("aaa"); …...

UE 透明渲染次序

附加顺序 用最外面的球, 依次附加里面的球 最后附加的物体优先级最高 附加顺序 用最里面的球, 依次附加外面的球 这样渲染顺序就对了...

【C++】多态原理剖析,Visual Studio开发人员工具使用查看类结构cl /d1 reportSingleClassLayout

author:&Carlton tag:C topic:【C】多态原理剖析,Visual Studio开发人员工具使用查看类结构cl /d1 reportSingleClassLayout website:黑马程序员C tool:Visual Studio 2019 date:2023年7月24日 目…...

vue实现flv格式视频播放

公司项目需要实现摄像头实时视频播放,flv格式的视频。先百度使用flv.js插件实现,但是两个摄像头一个能放一个不能放,没有找到原因。(开始两个都能放,后端更改地址后不有一个不能放)但是在另一个系统上是可以…...

iptables安全技术和防火墙

防火墙:隔离功能 位置:部署在网络边缘或主机边缘,在工作中,防火墙的主要作用是决定哪些数据可以被外网访问以及哪些数据可以进入内网访问,主要在网络层工作 其他类型的安全技术:1、入侵检测系统 2、入侵…...

微信小程序开发5

一、自定义组件-插槽 1.1、什么是插槽 在自定义组件的wxml结构中&#xff0c;可以提供一个<slot>节点(插槽)&#xff0c;用于承载组件使用者提供的wxml结构 1.2、单个插槽 在小程序中&#xff0c;默认每个自定义组件中允许使用一个<slot>进行占位&#xff0c;这种…...

【算法题】2681. 英雄的力量

题目&#xff1a; 给你一个下标从 0 开始的整数数组 nums &#xff0c;它表示英雄的能力值。如果我们选出一部分英雄&#xff0c;这组英雄的 力量 定义为&#xff1a; i0 &#xff0c;i1 &#xff0c;… ik 表示这组英雄在数组中的下标。那么这组英雄的力量为 max(nums[i0],n…...

fastutil简单测试下性能

前言 简单测试一下fastutil的实现和Java类库实现的速率。 使用jmh进行测试。 简单解释一下&#xff0c;每轮测试预热2次&#xff0c;每次1s&#xff1b;实测2次&#xff0c;每次1秒。 进行5轮测试。数组大小3种。 package fastutil;import it.unimi.dsi.fastutil.ints.IntArr…...

【FAQ】关于无法判断和区分用户与地图交互手势类型的解决办法

一&#xff0e; 问题描述 当用户通过缩放手势、平移手势、倾斜手势和旋转手势与地图交互&#xff0c;控制地图移动改变其可见区域时&#xff0c;华为地图SDK没有提供直接获取用户手势类型的API。 二&#xff0e; 解决方案 华为地图SDK的地图相机有提供CameraPosition类&…...

腾讯云裸金属服务器CPU型号处理器主频说明

腾讯云裸金属服务器CPU型号是什么&#xff1f;标准型BMSA2裸金属服务器CPU采用AMD EPYC ROME处理器&#xff0c;BMS5实例CPU采用Intel Xeon Cooper Lake处理器&#xff0c;腾讯云服务器网分享落进书房武器CPU型号、处理器主频说明&#xff1a; 裸金属服务器CPU处理器说明 腾讯…...

工程安全监测无线振弦采集仪在建筑物中的应用

工程安全监测无线振弦采集仪在建筑物中的应用 工程安全监测无线振弦采集仪是一种用于建筑物结构安全监测的设备&#xff0c;它采用了无线传输技术&#xff0c;具有实时性强、数据精度高等优点&#xff0c;被广泛应用于建筑物结构的实时监测和预警。下面将从设备的特点、应用场…...

【iOS】isKindOfClass和isMemberOfClass方法

前言 这个归根结底还是在考察我们对isa走向图和类的继承的理解&#xff0c;也就是苹果官方这幅图&#xff1a; 接下来的函数调用流程请参考这张图。 1 isKindOfClass方法 1.1 objc_opt_isKindOfClass C函数 查看源码可发现&#xff0c;无论是谁调用isKindOfClass方法都会…...

李飞飞「具身智能」VoxPoser:0预训练完成复杂指令

机器人接入大模型听懂人话 论文地址&#xff1a; https://voxposer.github.io/voxposer.pdf 项目主页&#xff1a; https://voxposer.github.io/ 参考链接&#xff1a; [1]https://twitter.com/wenlong_huang/status/1677375515811016704 [1]https://www.amacad.org/publicatio…...

前端八股文

info 毕业设计(课题、方向 本科毕业设计&#xff1a;家庭医生签约管理系统后台开发(微信小程序) 硕士课题&#xff1a;医学图像分割(婴儿脑分割) 51062319991129351X 邮编 重庆市南岸区 400000 13183849783 // 18728097929 // 13158442955 中国广电四川网络股份有限公司中江…...

前端年度工作述职报告优秀

前端年度工作述职报告优秀篇1 尊敬的各位领导、各位同仁&#xff1a; 大家好!按照20__年度我公司就职人员工作评估的安排和要求&#xff0c;我认真剖析、总结了自己的工作情况&#xff0c;现将本人工作开展情况向各位领导、同仁做以汇报&#xff0c;有不妥之处&#xff0c;希…...

【MyBatis 学习一】认识MyBatis 第一个MyBatis查询

目录 一、认识MyBatis 1、MyBatis是什么&#xff1f; 2、为什么要学习MyBatis? 二、配置MyBatis环境 1、建库与建表 2、创建新项目 3、xml文件配置 &#xff08;1&#xff09;配置数据库连接 &#xff08;2&#xff09;配置 MyBatis 中的 XML 路径 三、测试&#x…...

TCP 和 UDP

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; 是面向连接的协议&#xff0c;即在收发数据前&#xff0c;必须和对方建立可靠的连接&#xff0c;TCP的头部为20个字节。 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协…...

springboot配置自定义数据源(Druid德鲁伊)的步骤。

今天和大家分享下在Springboot中配置自定义数据源Druid的两种方法及步骤。 方法一&#xff1a; 1.在pom.xml配置依赖(注释里面的内容) 2.配置自己的数据源设置&#xff0c;我是在yaml文件中配置的&#xff0c;顺便提醒一下&#xff0c;在配置yaml文件的时候缩进问题一定要注意…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...