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

推荐系统实战第六章-粗排和重排(上)粗排

粗排是介于召回和精排之间的,由于多路召回筛选得到物料库量级仍然很大,无法满足在线实时训练的要求。并且如果召回后直接精排,可能对推荐系统精度无法保证。

一、模型结构

(一)粗排双塔和召回双塔的异同

1、相同点

  • 用户塔和物料塔相互独立,独立解耦建模,不允许交叉。
  • 用户向量通过在线计算得到,物料向量可以提前离线计算好缓存起来。

2、不同处

① 部署时物料向量的存储方式
  • 召回:召回面对的候选物料集量级过大,因此离线计算好物料向量后缓存到faiss这样的向量数据库,并建立索引。
  • 粗排:粗排面对的候选物料集量级没有那么大,因此离线计算好的物料向量后缓存到内存中,item是键,物料向量是value。面对新物料,可以由物料塔实时在线生成,并缓存起来。
②负样本选择
  • 召回负样本主要采用随机采样选择。
  • 粗排负样本主要采用曝光但未点击作为筛选指标,但是由于存在样本选择偏差SSB,因此纠正SSB也是业界优化的方向。
③损失函数的设计
  • 召回的损失函数主要采用In-batch-sampled softmax loss,正样本t_i是与用户u_i交互过的物料,负样本t_j主要是通过随机采样得到的。loss的目标是正样本与用户匹配的概率尽量大。负样本t_j只在分母中,没有直接受约束。另外,用户u_i需要与batch内所有物料都计算一遍点积。
  • 粗排的损失函数主要采用BCE loss。一个batch由(u_i,t_i,y_i)组成,y_i的值是0或1,表示来自于用户的真实反馈。另外,用户u_i只需要与t_i计算一遍点积。
④用户向量和物料向量的交互方式
  • 召回中,采用ANN最近邻搜素,需要用户向量和物料向量进行点积操作。
  • 粗排中,可以采用做点积的方式,也可以将用户向量和物料向量喂给DNN进行更复杂的交叉。

(二)双塔改进的技术主线

双塔模型的缺点就在于用户向量和物料向量的交叉太晚了,交叉的向量被高度压缩了,一些细粒度的信息损失了,因此改进的技术主线主要在于如何在用户向量和物料向量中保留更多的信息。

(三)双塔改进:SENet

为了在用户向量和物料向量中保留更多细粒度的信息,可以在源头就减少噪声的输入,可以通过SENet来动态调整输入信息,核心是得到各特征的动态重要性

SENet是squeeze-and-excitation network的缩写。假设某一侧的信息在喂入塔之前一共由f个field组成,其中第i个field的embedding是e_i。SENet由三个步骤组成:

SENet流程示意

1、Squeeze/压缩

将f个feature filed的embedding通过某种方式压缩成一个代表数字。可以通过average pooling把embedding中每一位相加取平均值,这个代表数字就反映了这个field embedding的全部信息。最后可以得到一个由f个field代表数字组成的向量Z。

2、Excitation

将上一步得到的向量Z喂给一个小网络,最终得到一个向量A,A中每个元素反映了不同field的重要性。

3、Reweight

上一步得到的A与最初各field的embedding相乘,得到新的embedding输入到上层网络中,通过这种方式对feature field按照重要性进行加权和降权,去弱化甚至过滤噪声信息。

在Excitation中,最后通过函数重新映射成长度为f的向量A。如果这个函数采用RELU,那么对于不重要的特征,重要性A[i]可能直接被压缩成0。

(三)细粒度信息抄近路

在双塔之前插入SENet
ResNet结构示意

1、抄近路思路

x_0直接到达最后一层与塔本来的输出融合,得到最后的输出x_1。融合方式可以有按位相加等等。这样输出不仅有高度压缩后的信息,还包含了更细粒度的信息。

2、抄近路方法

(1)方法1:把每个中间隐藏层的输出和最后一层的输出拼接到一起,再经过一个FC层压缩成最后输出的向量。

(2)方法2:将关键信息不仅插入最后一层,还插入中间的每一层。

 

3、抄近路的缺点

将关键信息引入中间层,会导致中间层的训练参数量增大,给存储等带来巨大压力。因此应当筛选出较为重要的信息再引入。

(四)改造双塔

1、改造双塔的思路

①思路1:信息流动

  • 筛:将不重要的噪声弱化或者过滤掉。
  • 疏:不同信息沿着不同塔进行流动,最后拼接成一个embedding。

②思路2:多个信息通道

不再执着于DNN这一个信息通道,而是信息在多个信息通道流动后得到的embedding再进行聚合。

2、双塔+FM模型

(1)FM辅助双塔的学习

FM辅助双塔粗排最终的结果得分来源于两个部分:一个部分是logit_tower,来自于经过双塔得到的用户向量与物料向量的点积结果;另外一个部分是logit_FM,实现了用户历史行为序列和候选物料之间的交叉。最后将两部分线性组合而成最终打分公式,权重需要学习。为了方便在线预测,需要拆解成向量点积的形式,最后表示为:logit=UE\cdot TE

“双塔+FM”的并联结构

3、Meta的Attention Fussion

将多个信息通道得到的embedding进行简单拼接再通过一层FC压缩,是一种比较常见的做法。而Meta的Attention Fussion相比于“先拼接再映射”取得了更好的结果。

使用Attention Fusion的案例
(1)主要思路

通过N个信息通道得到N个embedding,拼接成一个大向量以后映射得到每个通道的权重,塔最终的输出结果是各个通道embedding的加权和。

(2)Document Tower举例

将文章标题和文章简介喂入XLM Encoder获得表示文本内容的embedding;再将title、文章简介分别以3字符一组拆解成词袋,喂给模型输出分别表示title和文章简介的embedding;再将文章图片通过CNN得到表示文章图片的embedding,最后进行simple attention fusion得到一个embedding。

为了防止有些通道质量不佳的情况,Facebook使用用户某个通道输出的向量与物料最终向量点积得到一个向量,作为辅助目标与主目标一起优化。

二、知识蒸馏

(一)知识蒸馏简介

1、知识蒸馏的组成

知识蒸馏涉及两个模型:teacher模型和student模型。知识蒸馏的意义在于取长补短。

teacher模型,相对来说比较复杂,喂入了更多特征,表达能力更强。

student模型,相对来说比较简单,loss主要由两部分组成:①拟合真实目标y。②拟合teacher模型的输出。最后优化目标是,两部分loss通过加权平均后的结果最小。

2、训练完毕的部署

训练完毕,只将Student部署,因为相比teacher,student模型比较简单,便于上线。

(二)知识蒸馏用于粗排

知识蒸馏用于粗排,可以让精排去当teacher,粗排作为student来向精排和真实反馈学习。主要的优点有如下两个:①粗排可以借助于精排复杂的交叉结构和交叉特征知识来增强模型的表达能力。②粗排和精排的一致性可以增强。

1、联合训练粗排和精排模型

  • 训练初期,不蒸馏,因为此时精排模型还没训练好,没有指导意义。
  • 精排训练一段时间后进行蒸馏。
  • 蒸馏损失不会更新精排模型的参数。

2、两阶段蒸馏

由于联合训练粗排和精排模型参数量很大,并且耦合在一起维护不方便,因此大厂实际更多采用两阶段蒸馏的方法。

两阶段蒸馏是利用的线上运行精排模型得到的得分被记录在日志中,可以直接从日志中提取,再让粗排模型去拟合。因此两阶段蒸馏的loss主要来源于两部分,一部分去拟合用户真实体验,一部分去拟合线上精排得分,batch中样本表示为(输入特征,真实反馈,精排打分)。拟合精排得分可以采用MSE,也可以采用BCE。

两阶段蒸馏粗排

三、纠正数据曝光偏差

(一)样本选择偏差SSB问题

出现样本选择偏差的根本原因是正负样本都来自于曝光的数据,负样本的样本质量没有那么差。

(二)纠正方式

纠正方式是选择那些被精排排在后面,但是没有曝光机会的那部分样本作为粗排的负样本。步骤主要如下:

  • 精排排序后,获得排在前面的物料集合S_top和排在后面的物料S_bottom,与当前用户u组成一个三元组T。
  • 由于排在后面的物料S_bottom没有机会曝光,因此采用Learning-to-rank(LTR)建模,建模目标是排在前面物料被点击的概率要远大于排在后面物料被点击的概率。pairwise loss可以采用BPR等。

实践中的做法:对S_top中的物料的用户真实反馈进行预测,额外添加一项BCE loss。

也有的做法是将精排排序后的物料划分多个档位,任意两个档位的物料组成pair进行pairwise loss。优点是更多档位对精排排序刻画地更加细致,缺点是未曝光物料集规模非常庞大。

利用未曝光数据纠偏的粗排模型

四、模型:轻量级全连接

去双塔,将用户特征与物料特征从底层就开始交叉。阿里巴巴的COLD从如下几个方面来简化粗排模型:

  1. 筛选出重要特征,通过SENet等模型来给出特征重要性。
  2. 削减全连接层的规模,层数削减。
  3. 底层框架的一些工程优化,比如说重新实现一些TensorFlow算子优化效率。
  4. 缓存起来一些高频使用的用户行为序列embedding和物料特征embedding。

优点是物料特征和用户特征在底层就开始交叉,模型的表达能力大大增强。

缺点是需要离线反复实验,模型投入大,可扩展性比较差。

COLD插入SENet获取特征重要性

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2000-2022年 中国31个省农村用电量
  • kali 中文输入
  • 统一身份认证服务(CAS)系统实现SSO认识
  • Xshell 连接 Ubuntu 服务器失败问题(Connection failed)
  • 【红队技巧】.Net免杀 绕过主流杀软
  • 打卡55天------图论(并查集)
  • 微信小程序flex-grow无效
  • 智领云开源KDP:深度剖析其与主流数据平台的性能与特性对比
  • 大语言模型之Qwen2技术报告阅读笔记
  • 3D环绕音效增强软件 Boom3D for Mac v2.0.2 中文破解版下载
  • 编程语言中的特殊类的设计
  • hyperf注解,自定义注解
  • 【第54课】XSS跨站Cookie盗取表单劫持网络钓鱼溯源分析项目平台框架
  • AList嵌入动态验证码实现动态校验
  • LaViT:Less-Attention Vision Transformer的特性与优点
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 0x05 Python数据分析,Anaconda八斩刀
  • const let
  • es6要点
  • HTTP 简介
  • java取消线程实例
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • node学习系列之简单文件上传
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 笨办法学C 练习34:动态数组
  • 初识 webpack
  • 关于使用markdown的方法(引自CSDN教程)
  • 前端设计模式
  • 浅谈web中前端模板引擎的使用
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 入手阿里云新服务器的部署NODE
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 首页查询功能的一次实现过程
  • 我的面试准备过程--容器(更新中)
  • 我感觉这是史上最牛的防sql注入方法类
  • 鱼骨图 - 如何绘制?
  • 云大使推广中的常见热门问题
  • NLPIR智能语义技术让大数据挖掘更简单
  • Prometheus VS InfluxDB
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #if等命令的学习
  • #nginx配置案例
  • #QT 笔记一
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1)svelte 教程:hello world
  • (2)(2.10) LTM telemetry
  • (7) cmake 编译C++程序(二)
  • (C语言)球球大作战
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...