【推荐算法】CTR中embedding层的学习和训练

news2025/2/26 3:37:47

note

  • 连续特征处理:facebook DLRM模型,对连续值的处理方式是把所有的连续值输入到一个神经网络,然后通过神经网络把它压缩到一个embedding维度大小的一个向量上,然后将Embedding和其他离散特征Embedding Concat起来,再做后面根据它的模型去做不同的计算;同时离散化(转为类别变量)然后送入embedding是常见操作。
  • 分布式并行训练:数据并行;多卡切分;CPU的内存来存embedding,然后用GPU来存MLP等。
  • 本文概况:
    • 怎样去结合数据设计更好的模型,让模型更有针对性。
    • 如何进一步提升训练效率,包括怎样去利用更多的数据,以及增快模型迭代效率。
    • 怎样去增强数据处理、选择、模型调优的自动化的程度,从而解放业务或者算法同学,更多地去关注模型数据、算法和策略。

文章目录

  • note
  • 一、CTR模型
    • 1.1 用户行为挖掘
    • 1.2 组合特征挖掘
    • 1.3 高效利用数据
    • 1.4 处理大embedding
  • 二、连续值处理(Continuous Feature)
  • 三、交叉特征建模(Interaction Modelling)
  • 四、大Embedding模型训练(Distributed Training)
  • Reference

一、CTR模型

推广搜领域中CTR点击率预估模型的发展历史如下图,逐渐从人工经验向自动化,深度学习模型的归一化,业界期望用自适应模型解决业务问题。
在这里插入图片描述
2021年IJCAI一篇综述,张伟楠和华为诺亚方舟实验室的论文,将深度学习CTR模型分类:

  • 基于组合特征挖掘的模型;
  • 针对用户行为的模型;
  • 自动架构搜索的模型。

1.1 用户行为挖掘

在这里插入图片描述

  • 阿里妈妈17年的DIN,用dnn里的pooling将用户历史行为建模
  • 19年阿里妈妈在DIN上增加RNN形成DIEN,规避了DIN这种将过去历史行为都等同看待的劣势,拟合序列关系
  • 19年阿里BST加入transformer

1.2 组合特征挖掘

在这里插入图片描述

  • wide&deep的wide特征之间笛卡尔积相乘后构建出新特征,加入到线性部分;当下次组合特征出现时,直接把它的权重取出做预测
  • deepfm这种双塔范式,后面也衍生DCN、xDeepFM等,建模特征之间的组合关系
  • PNN网络,利用分解模式构建组合特征后,还会把输出喂入MLP,拟合特征之间关系

1.3 高效利用数据

在这里插入图片描述

  • 组合特征建模:
    • 显式的交互特征喂入深度模型可以带来提升(CAN)
    • 模型需要筛选交叉特征重要性(华为诺亚方舟2020年发的AutoFIS,针对交叉特征加了一组参数,用来自动去学哪些特征重要,哪些特征不重要。通过第一阶段的搜索,筛选出重要特征,把不重要的去掉,再重新输入到模型,这样做效果有明显提升。)
  • 用户行为建模:
    • 针对行为数据加入检索模块SIM或者UBR
    • 如上图所示,用户的行为进来之后,通过一个行为建模的模块,比如RNN或者是transformer,就会得到一个用户的embedding,再和其他的特征一起注入到模型去做预测。这里的检索基于一个target,即预测目标,去对用户的行为做了一个筛选或者加权。基于这样的操作,模型会有很明显的提升。

在这里插入图片描述

1.4 处理大embedding

  • 思路一:怎样把embedding变小,也就是将embedding压缩;
    • twitter在Recsys2021发表的double hash,把特征分为高频和低频,因为高频特征相对占比娇小,给每个高频特征分配一个独立的embedding(所占空间不大),对于低频特征使用double hash压缩,减少冲突
    • 百度在sigmod2021基于int16训练embedding参数,即基于低比特参数模型训练
    • 探索类工作:谷歌在kdd2021上发的DHE模型, 去掉了embedding table
  • 思路二:怎么用更新的分布式架构去更高效更低成本的去训练大embedding。
    • 用的最多,基于GPU这种Horovod去数据同步
    • 腾讯发表于SIGIR2020的DES通过模型结合硬件设计了一个分布式的方案。英伟达提出基于cude直接写了一个HugeCTR。

二、连续值处理(Continuous Feature)

在这里插入图片描述

  • 第一种方法,No Embedding。
    • 第一个是wide&Deep,在它的介绍里面,使用的是原始值,
    • 另外一个是谷歌的YouTubeNet,它会对原始值做平方开根号这些变换。
    • 另一个是facebook DLRM模型,对连续值的处理方式是把所有的连续值输入到一个神经网络,然后通过神经网络把它压缩到一个embedding维度大小的一个向量上,然后将Embedding和其他离散特征Embedding Concat起来,再做后面根据它的模型去做不同的计算。
    • 京东的DMT模型,他们的网络是使用了归一化的输出,这种方法表示能力比较弱,因为它这里其实没有对原始的延续特征做一个很好的表示。
  • 第二种处理连续值的方法是Field Embedding;
    • 每个域有一个Embedding。某个域的Embedding是该域的一个连续值,乘上它的域的Embedding。这类方法的问题是表示能力比较弱,然后不同值之间是一个线性的关系。
  • 第三类的方法就是离散化。离散化可以有很多方法,比方说等频、等距和取log,或者基于树的模型去做一个预训练。但这类方法有两个问题:
    • 首先,就是它是两阶段的,离散化的过程不能端到端优化;
    • 另外,有一些边界的问题,如下图所示的例子,一个年龄特征,假设我们按40,41来分,40以下的我们称之为青年,41以上的成为中年,其实40和41,它们是很接近的年龄,但是因为我们的离散化的方法,把它分到两个不同的桶里面,可能学到的Embedding是差异比较大的Embedding。

更多参考:华为提出的一个连续值Embedding的方法AutoDis。看线上效果,在点击率及eCPM这两个指标上都是有一个百分位的提升。

三、交叉特征建模(Interaction Modelling)

在这里插入图片描述

  • 第一类像FNN模型,即不建模,每个特征有一个embedding,所有的特征embedding后concat拼接输入网络,后面网络自己去学,想学到什么就是什么。
  • 第二类像wide&deep模型,这里统称为基于记忆的方法,就是去显示的构造组合特征,特征做交叉做笛卡尔积,然后把新构造的特征输入模型。模型就会记住这个特征,这个信号就比较强。
  • 第三类方法就是基于分解的方法,例如IPNN模型,对不同的域之间的交叉关系,通过乘法的方式去做建模,得到的乘法结果会和原始embedding一起喂入到后面的MLP,然后来再次去做一个组合。不同的特征之间是不是都应该组合,或者说怎么去组合,如果我们去试的话,需要去做很多实验,能不能自动判断特征是不是要组合,以及它们之间应该用哪种组合这种关系去学到呢。

更多参考:华为提出的OptInter交叉特征建模。在Criteo、Avazu、iPinYou等经典CTR数据集效果不错。

四、大Embedding模型训练(Distributed Training)

在这里插入图片描述
推荐模型一般两部分:参数embedding(参数量大,计算量较少,但是GPU显存一般存不下,如上面有的模型几百个G,V100有32个G,土豪忽略);MLP参数量较少,计算量较大。
在这里插入图片描述

高维稀疏特征导致embedding较大。较常用的并行训练方法:

  • 第一类是数据并行,例如基于all-reduce的Horovod,这种方式在每个GPU卡中存一份完整的模型副本,需要把模型都能存得下,我们模型如果变得大,GPU显存不足以存下完整模型,即使模型可以存得下,比方说有十几G几十G,基于这样一个大小的模型,它在做通信的时候,它的通信的时延很可能比它计算带来的时间的减少还要来得多,也就是说你增加节点不一定带来性能的一个提升。
  • 第二类是NVIDIA提出的,之前他们的方案还是一个多卡切分的方案,但现在已经支持了一个CPU的embedding的一个存储,他们这个方法把embedding切成多份,然后在每个卡的显存里面存一部分,MLP在每个节点都存一个完整的模型。embeding通过一个all to all的通信, MLP通过all-reduce通信,这个方案有一个问题就是当它的模型很大时需要的GPU卡很多,从而它的成本也会很高。
  • 第三类方法是使用CPU的内存来存embedding,然后用GPU来存MLP。CPU负责存储,MLP来负责前项以及反向的梯度的计算。对于这种方法,如果我们采用同步训练的话,它有一个问题就是因为embedding是存在CPU侧的,需要从CPU去传输到GPU,梯度需要从GPU回传到CPU,他们之间通信的时延是很高的。

Reference

[1] 郭慧丰博士. 华为技术分享.点击率预测模型Embedding层的学习和训练

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/427461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot-分页功能

1.分页功能的作用 分页功能作为各类网站和系统不可或缺的部分(例如百度搜索结果的分页等) ,当一个页面数据量大的时候分页作用就体现出来的,其作用有以下5个。 (1)减少系统资源的消耗 (2&#…

redis设计与实现读书笔记

这里主要记录一下在阅读redis设计与实现中碰到的一些没有记录过的知识。 引用计数技术 Redis的对象系统实现了基于引用计数技术的内存回收机制,当程序不再使用某个对象的时候,这个对象所占用的内存就会被自动释放;另外,Redis还通过引用计数…

低调且强大--iVX低代码平台

iVX目录前言一、低代码那么多 为什么选择iVX?二、“拼”出来的低代码平台,真的好用吗?三、iVX与其他低代码有啥可比性?前言 首先我们应该明白自动编程突破可能是:领域内Mini LLM 现在的思路都是搞LLM,几乎像…

通俗举例讲解动态链接、静态链接

参考动态链接 - 知乎 加上我自己的理解,比较好懂,但可能在细节方面有偏差,但总体是一致的 静态链接的背景 静态链接使得不同的程序开发者和部门能够相对独立的开发和测试自己的程序模块,从某种意义上来讲大大促进了程序开发的效率&#xf…

NPC 也有了生命?当 ChatGPT 注入游戏你能想象吗

🍎道阻且长,行则将至。🍓 目录引言:西部世界元宇宙,还记得吗ChatGPT 的世界?下图就是一个 ChatGPT 小镇: 引言:西部世界 《西部世界》以一个虚构的游戏般的“西部世界”为背景&am…

springboot验证码生成及验证功能

1.easy-captcha工具包 生成验证码的方式有许多种,这里选择的是easy-captcha工具包。 github开原地址为:easy-captcha工具包 其支持Java图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目。 2添加依赖 首先需…

SQL Server的死锁说明

死锁指南一、了解死锁二、检测并结束死锁2.1、可能死锁的资源三、处理死锁四、最大限度地减少死锁4.1、以相同的顺序访问对象4.2、避免事务中的用户交互4.3、保持交易简短且在一个批次中4.4、使用较低的隔离级别4.5、使用基于行版本控制的隔离级别4.6、使用绑定连接4.7、停止事…

【云原生|Docker】04-docker的资源限制

目录 前言 容器的生命周期 1. 容器的启动过程 2. 容器的生命周期 ​编辑 内存限制 1. 内存限制的相关参数 2. 内存限制方式 2.1 设置-m,--memory,不设置--memory-swap 2.2 设置-m,--memorya,--memory-swapb,且b >a 2.…

本地从0搭建Stable Diffusion WebUI及错误记录

从0开始搭建本地Stable Diffusion WebUI环境 一.环境配置 1.使用的电脑配置 系统Windows10处理器英特尔 i7内存24GB显卡NVIDIA GTX 1060(6GB) 2.镜像源 阿里云 清华大学 中国科技大学 3.电脑环境变量配置 我的电脑–属性–高级系统设置–系统属性(高级)–环境变量 新建…

spring框架注解

3.Spring有哪些常用注解呢? Spring常用注解 Web: Controller:组合注解(组合了Component注解),应用在MVC层(控制层)。 RestController:该注解为一个组合注解,相当于Con…

首个ChatGPT开发的应用上线;ChatMind思维导图工具;中文提示词大全;Copilot平替 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 『一本与众不同的AI绘本』ChatGPT 编写故事 Midjourney 绘制插图 作者的女儿特别喜欢迪士尼动画《海洋奇缘》里的主人公莫阿娜&#…

Mybatis分解式查询

目录 一、Mybatis一对多分解式查询 1. 新增持久层接口方法 2. 新增映射文件对应的标签 3. 新增测试方法 4. 运行效果 二、Mybatis一对一分解式查询 1. 新增持久层接口方法 2. 新增映射文件对应的标签 3. 新增测试方法 4. 运行效果 三、Mybatis延迟加载 1. 开启延迟加…

超实用的十个超级实用事半功倍的Python自动化脚本

一淘模板 56admin.com在日常的工作学习当中,我们总会遇到各式各样的问题,其中不少的问题都是一遍又一遍简单重复的操作,不妨直接用Python脚本来自动化处理,今天小编就给大家分享十个Python高级脚本,帮助我们减少无谓的…

【数据结构与算法】栈的实现(附源码)

目录 一.栈的概念和结构 二.接口实现 A.初始化 Stackinit 销毁 Stackdestroy 1.Stackinit 2.Stackdestroy B.插入 Stackpush 删除 Stackpop 1.Stackpush 2.Stackpop C.出栈 Stacktop D. 栈的有效元素 Stacksize 判空 Stackempty 1.Stacksize 2.Stackempty …

Flink进阶篇-CDC 原理、实践和优化采集到Doris中

简介 基于doris官方用doris构建实时仓库的思路,从flinkcdc到doris实时数仓的实践。 原文 Apache Flink X Apache Doris 构建极速易用的实时数仓架构 (qq.com) 前提-Flink CDC 原理、实践和优化 CDC 是什么 CDC 是变更数据捕获(Change Data Captur…

Spring《三》DI依赖注入

🍎道阻且长,行则将至。🍓 上一篇:Spring《二》bean的实例化与生命周期 下一篇:敬请期待 目录一、setter注入🍉1.注入引用数据类型2.注入简单数据类型二、构造器注入🍊1.注入引用数据类型2.简单数…

数据挖掘(2.3)--数据预处理

目录 三、数据集成和转换 1.数据集成 2.数据冗余性 2.1 皮尔森相关系数 2.2卡方检验 3.数据转换 四、数据的规约和变换 1.数据归约 2数据离散化 三、数据集成和转换 1.数据集成 数据集成是将不同来源的数据整合并一致地存储起来的过程。 不同来源的数据可能有不同…

Qt优秀开源项目之十七:QtPromise

QtPromise是Promises/A规范的Qt/C实现。该规范的译文见附录。 QtPromise基于Qt5.6及以上版本,当然也包括Qt6。 github地址:https://github.com/simonbrunel/qtpromise 新手导航:Getting Started | QtPromise API手册:API Referenc…

详解Spring、SpringBoot、SpringCloud三者的联系与区别

一、Spring二、Spring Boot三、Spring Cloud四、三者的关系一、Spring Spring 是一个轻量级的Java 开发框架,主要依存于SSM 框架,即Spring MVC Spring Mybatis,定位很明确,Spring MVC主要负责view 层的显示,Spring …

Scala 一文搞定

第一节:概述为什么学习Scala ?Apache Spark 是专为大规模数据快速实时处理的计算引擎/内存级大数据计算框架。Apache Spark 是由Scala 语言编写。Scala 与Java 关系总结三点:java 编译器与Scala 编译器可以相互使用。Java SDK 的类库可以被Scala使用,Sc…