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

推荐系统-基于特征掩码的自适应特征建模: AdaF^2M^2(DASFAA‘2025)

AdaF2M2: Comprehensive Learning and Responsive Leveraging Features in Recommendation System

DASFAA’2025:https://arxiv.org/abs/2501.15816

1. 概要

特征建模在推荐系统中扮演者一个关键的角色,包括特征表征学习(feature representation learning)和特征表征利用(feature representation leveraging)。但是,在真实的生产场景中,存在着以下这几种问题:

  1. 由于流行度偏差,数据分布一般是高度有偏的长尾分布(5%的用户贡献了80%的样本),这很容易导致对ID特征的过度依赖,比如user/item IDs或者ID序列交互。因为user/item ID是最细粒度的特征,并且对于有着大量行为数据的用户是最有用的特征,所以模型会趋向于将更多的知识归因于IDs
  2. 这种过度依赖会**限制了模型对特征的利用能力,泛化性变得较差,并且对噪声很敏感。**比如,一个用户可能会跳过他最喜欢的视频仅仅是因为此时来了一个电话,但这样的噪声被当做样本,被用户ID错误拟合。
  3. 另外,这种过度依赖还会限制了对那些无IDs的元特征的学习(比如user/item属性特征),在user/item冷启动阶段,会导致较差的效果,比如,推荐一个新的视频往往更依赖于其属性特征,如主题和分类

然而,目前的大部分研究都专注于特征提取和交互:

  • 特征表征学习:目的在于捕获不同特征的交互,生产出更多有价值的特征组合。但是,忽略了对不同状态的users/items进行高效的特征表征学习的重要性,以及缺乏额外的监督信号
  • 特征表征利用:目的在于通过模型训练(比如注意力机制),识别出有用的特征交互。但是,这些方法检测有用的特征是通过对特征自身的学习,这会存在被头部users/items主导的问题,基于ID的特征会被赋予较高的权重。

因此,它们难以应用这种长尾分布带来的问题。为了在真实场景中取得更好的特征表征学习和利用,论文提出了一种模型无关的框架: A d a F 2 M 2 AdaF^2M^2 AdaF2M2(Adaptive Feature Modeling with Feature Mask):

  • 通过特征mask机制生成多个增强样本,能够帮助更全面地学习特征,通过对这些样本进行任务导向的multi-forward训练
  • 为了能够自适应地对不同状态的user/item进行建模,论文提出了一种状态相关的适配器,采用状态信号作为输入,来对不同user/item状态的特征应用动态的权重
  • 并且它可以更方便地应用到不同的基础推荐模型

2. 推荐任务设定

推荐系统的CTR预估是一个二分类任务,每一个样本包括原始的输入特征 x = { x 1 , . . . , x n } x=\{x_1,...,x_n\} x={x1,...,xn}和标签 y ∈ { 0 , 1 } y\in\{0,1\} y{0,1},表示用户是否产生正反馈(点击、转化等),而推荐模型便是在输入 x x x下,去逼近样本的这个正反馈概率 y ^ = P ( y = 1 ∣ x ) \hat{y}=P(y=1|x) y^=P(y=1∣x)

常规的推荐模型会包括一个embedding层、一个特征交互层和一个深度网络层:

  • embedding层是将原始的特征 x = { x 1 , . . . , x n } x=\{x_1,...,x_n\} x={x1,...,xn}转换为低维的表征,称之为特征embeddings [ v 1 , . . . , v n ] [v_1,...,v_n] [v1,...,vn]
  • 特征交互层是将特征embeddings作为输入,去生成高阶的交叉特征表征,目前许多方法都专注于这一层
  • 深度网络层则接收交叉特征表征去计算最后的预估

该篇论文聚焦于提升embedding层的表征。特征交互和深度网络层记为 g ( ⋅ ) g(\cdot) g(),那么推荐模型的预估则表示为下式:

y ^ = g ( [ v 1 , . . . , v n ] ) \hat{y}=g([v_1,...,v_n]) y^=g([v1,...,vn])

使用交叉熵loss来优化训练推荐模型的二分类预估:

论文提及的使用特征也比较常规,包括以下三组:

  1. 用户特征:用户ID,年龄,性别,城市,操作系统,App版本,活跃等级,行为ID序列(点击、完播、评论、分享、点赞、收藏)等
  2. Item特征:item ID,作者ID,描述,标签,类型,主题等
  3. 上下文特征:时间,场景等

3. 整体框架

AdaF2M2架构

4. 特征掩码

如上述提到,论文提出了特征掩码机制,通过使用增强样本的任务导向的multi-forward训练,来增强特征表征,从而实现更全面的特征学习。其中,关键的点便是通过随机mask掉特征(所有特征)的一部分,来消除对重要特征的过度依赖:使用特征掩码来构造多个增强样本,然后使用任务导向的loss来训练这些样本。这些增强样本可以强制模型使用多种特征组合来作出预估,从而让所有特征都能被较好地学习

4.1 掩码机制

具体的做法分为两个阶段。第一个阶段的步骤如下:

  1. 对于每一个样本,会从 [ β , γ ] [\beta,\gamma] [β,γ]的概率区间随机采样k次,得到k个值(论文设置 β = 0.1 , γ = 0.5 \beta=0.1,\gamma=0.5 β=0.1,γ=0.5
  2. 每一个值 p p p表示替换一个embedding v v v为默认的mask embedding [ M A S K ] [MASK] [MASK]。需要注意,每一个特征域的mask embedding是不同的
  3. 对于一个给定的概率 p p p,随机mask一些特征embeddings,即使用对应的默认mask embedding来替换它们,从而来产生增强样本
  4. 这样,k次随机的特征掩码,便从原始的样本得到k个增强样本

  • [ M A S K ] i [MASK]_i [MASK]i为第i个特征的默认mask embedding

4.2 增强样本训练

在NLP和CV领域,使用增强样本来自监督学习的方法十分常见,但这些方法的主要思路是让同一个样本的增强数据能够与其他样本的区分开来,从而来提升对users/items表征的区分度。但是推荐系统不同于NLP和CV:

  • NLP和CV任务往往缺少标注样本,存在许多未标注样本;然而推荐系统每天都会产生海量的标注数据(用户的反馈)
  • NLP和CV任务一般是去理解内容(文本或图像),所以它们需要去辨别不同的样本/内容;但是,推荐系统的目标是作出正确的预估,而不是去区分不同的users/items

沿着这个方向,论文提出了使用任务导向优化过程的multi-forward训练,来学习这些增强样本。具体地:

  • 一个增强样本的embeddings进行拼接,输入到特征交互和深度网络层 g ( ⋅ ) g(\cdot) g()来生成预估结果:

  • 这样,k个增强样本便会得到k个预估 y ^ m a s k \hat{y}_{mask} y^mask,然后采用任务导向的优化过程(也即交叉熵),将额外的监督应用到这些增强样本的预估上:

4.3 优势

这种特征掩码机制之所以能够帮助更全面的特征学习,是由于其存在着两个主要的有点:

  • 在真实的推荐系统,一个样本的一部分特征是缺失或者未标注是十分常见的情况,增强样本正是用来模拟这种噪声条件,来提升模型的鲁棒性和泛化性;
  • 使用这种掩码机制,任何特征都是可能被mask的,包括个性化的ID特征。将没有ID特征的输入喂给模型的深度网络层,可以让模型强制去关注剩余的非ID元特征,比如年龄和性别等。因为采用的是任务导向的优化,模型使用这些没有掩码的特征直接去作出预估,这能让这些特征被学习得更好。

5. 自适应特征建模

自适应特征建模的做法其实也比较常见,其目的是为不同的特征自适应地生成不同的权重,如下式:

  • h ( ⋅ ) h(\cdot) h()表示权重生成器,为每一个特征embeddings v v v生成对应的权重,权重可以表示用来特征的重要性
  • 然后特征embeddings v v v乘上对应的权重再输入到特征交互和深度网络层 g ( ⋅ ) g(\cdot) g()来生成预估结果

5.1 存在问题

但是,目前主流的方法都是使用这些特征自身来生成权重,这会产生一些问题:

  • 整个特征学习过程会被头部users/items主导,权重生成器会偏向于为对于头部users/items而言比较重要的特征生成更高的权重,比如上述一直提到到个性化的ID特征或者ID序列特征
  • 然后,使用梯度下降来会导致这些低权重的特征也只能得到对应较低的梯度(梯度消失),如下式:

这样,最终会影响到整个特征学习的优化过程。那些对于长尾users/items而言比较重要的非ID元特征,在大多数样本(头部users/items)的学习中被赋予了较低的权重和梯度,因此,模型很难从这些头部users/items很好地学习这些特征,但同时那些长尾users/items占据的样本又非常少(即使这些样本能够较好地学习这些非ID元特征)

5.2 state-aware adapter

为了解决这些问题,论文提出了一种状态感知的适配器,能够根据users/items的状态来更好地为不同的特征自适应分配权重。

为了这个适配器可以感知不同的状态,论文使用了4种不同的状态信号

  1. 活跃天数 r a c t i v e r_{active} ractive:用户在最近7/30天内打开App的天数,可以来区分低/中/高活跃用户
  2. ID embedding r I D r_{ID} rID:因为ID embedding含有有效地个性化信息,因此适配器仍然需要它来为头部users/items提供个性化预估,具体是user,item和作品ID embeddings的拼接
  3. ID embedding的模(norm) r n o r m r_{norm} rnorm:通常,ID embedding的模可以用来衡量其质量,比如老用户的ID embedding的模会比新用户的大,因此它可以用来区分新老用户,热门和长尾items。并且还会使用不同的非线性函数(log, sqrt, square)来增强norm的表征能力
  4. 交互次数 r c o u n t r_{count} rcount:交互次数是一个用来区分users/items状态的强信号。比如,低活跃的用户(长尾的items)会比高活跃的用户(热门的items)有着更低的交互。具体是使用users/items的曝光、评论和点赞次数

适配器会将这些状态embeddings拼接起来作为输入,来为不同状态的users/items生成生成自适应地权重:

  • σ ( ⋅ ) \sigma(\cdot) σ()是Sigmoid函数
  • 有了这些强经验信号,能够让适配器为不同状态的users/items生成更合适的权重分布。

然后,特征embeddings v v v乘上适配器计算的自适应权重,再输入到特征交互和深度网络层 g ( ⋅ ) g(\cdot) g()来生成预估结果:

另外,由于这个适配器和特征掩码机制是分开训练的,具体地,自适应权重不会对特征掩码的任务导向优化过程的multi-forward训练有任何影响,因此特征掩码机制仍然能够保证全面的特征学习,同时,适配器只会在自适应特征利用的过程生效,这可以大大缓解了梯度消失的问题。

6. 训练&推理

AdaF2M2架构

正如 A d a F 2 M 2 AdaF^2M^2 AdaF2M2框架图所示,它是包含的训练和推理服务两个阶段的。

训练阶段会同时计算特征掩码机制和状态感知的适配器的预估,以及使用两者的交叉熵结合来优化整个训练过程,如下式:

  • α \alpha α是一个超参数,论文设置了0.2

但是,状态感知的适配器是整个模型的主体部分,适配器计算出来的预估,会作为线上推理服务的最终预估,也即推理阶段,并不会使用到特征掩码。

另外,对于排序任务(CTR预估), A d a F 2 M 2 AdaF^2M^2 AdaF2M2框架是完全与上图完全一致的。但对于召回任务的双塔模型,user和item塔可以使用不同的对应的适配器,适配器也只接收对应的users/items的状态embeddings作为输入。

7. 实验结果

排序任务效果

召回任务效果

冷启动item效果

从上述实验结果来看,可以发现:

  1. A d a F 2 M 2 AdaF^2M^2 AdaF2M2框架不仅可以应用到排序任务(CTR预估),也可以套用到召回任务模型,并且带来效果的提升,基本上算是即插即用的。
  2. 另外,对于新用户(长尾/冷启动的items)和老用户(热门的items)都能收益,得到推荐效果的提升,并且新用户(长尾/冷启动的items)提升更为显著,也算是一种冷启动的应对方法。

8. 代码实现

tensorflow 2.x:recsys/rank/adaf2m2.py

tensorflow 1.x:recommendation/rank/adaf2m2.py

http://www.xdnf.cn/news/5916.html

相关文章:

  • 【GNSS硬件接收机】【非公开文章】GNSS硬件接收机设计目录
  • JavaScript 模块封装函数
  • 函数加密(Functional Encryption)简介
  • 信奥赛-刷题笔记-队列篇-T2-P1540机器翻译和P2952Cow Line S
  • 抗菌肽Tet-213,1260528-09-3
  • Java并发编程-线程池(二)
  • 今日行情明日机会——20250513
  • 期货反向跟单软件—持仓上限控制功能
  • gcc和g++
  • 闭包原理与常见陷阱
  • 装饰器在Python中的作用及在PyTorchMMDetection中的实战应用
  • Python -将MP4文件转为GIF图片
  • MyBatis 批量新增与删除功能完整教程
  • SpringBoot的外部化配置
  • 软件测试(1) 软件测试概述
  • 【Qt开发】信号与槽
  • 【技术追踪】InverseSR:使用潜在扩散模型进行三维脑部 MRI 超分辨率重建(MICCAI-2023)
  • Ansible安装与核心模块实战指南
  • 如何正确地写出单例模式
  • 嵌入式软件--stm32 DAY7 I2C通讯上
  • 码蹄集——分解、数组最大公约数、孪生质数、卡罗尔数、阶乘数
  • PY32系列单片机离线烧录器,可配置选项字节和上机台批量烧录
  • The Deep Learning Compiler: A Comprehensive Survey (深度学习编译器:全面调查)
  • milvus+flask山寨《从零构建向量数据库》第7章case2
  • FPGA图像处理(六)------ 图像腐蚀and图像膨胀
  • 【图像处理基石】遥感图像分析入门
  • stm32f103rct6中使用串口1 DMA通信程序含异常处理
  • 数据验证库pydantic的用法
  • 力扣热题——统计平衡排列的数目
  • 进程间通信分类