Empowering Long-tail Item Recommendation through Cross Decoupling Network (CDN)

news2025/1/23 15:02:23

Empowering Long-tail Item Recommendation through Cross Decoupling Network (CDN)

来源:

  • KDD’2023
  • Google Research

文章目录

  • Empowering Long-tail Item Recommendation through Cross Decoupling Network (CDN)
    • 长尾问题分析
    • CDN
      • Item Memorization and Generalization Decoupling
        • 记忆特征(Memorization features)
        • 泛化特征(Generalization features)
        • 物品表征学习
      • User Sample Decoupling
      • Cross Learning
    • 总结
    • 参考

长尾问题是个老大难问题了。

在推荐中可以是用户/物料冷启动,在搜索中可以是中低频query、文档,在分类问题中可以是类别不均衡。长尾数据就像机器学习领域的一朵乌云,飘到哪哪里就阴暗一片。今天就介绍来自Google的一篇解决长尾物品推荐的论文。

真实推荐场景下,大部分物品都是长尾物品,即小部分物品占据了绝大部分的交互,大部分物品的交互次数很少。人们一直都致力解决这个问题,但往往不能在真实环境下部署,要么对整体的效果大打折扣。在这篇论文里,作者致力于维持整体效果、保成本的条件下提高长尾物品的推荐效果(是否需要专门评估在长尾物品上的推荐效果?)。为了达到这个目标,作者设计了Cross Decoupling Network (CDN)。

CDN借鉴了计算机视觉里的一个想法1(借鉴的这篇论文也是研究长尾问题的,感觉值得阅读一下),该方法的核心思想是两阶段的学习策略:第一阶段在长尾分布的数据集上学习物品表征,第二阶段在平衡的数据集上训练预测器(如分类器)。但是这种方法在推荐场景中,这种方法会导致严重的遗忘问题,即第一阶段学到的知识会在第二阶段遗忘。并且两阶段训练比联合训练的成本更高。而CDN则兼顾了解耦(decoupling)的思想,并克服了遗忘问题。

长尾问题分析

长尾问题的本质是什么呢?

先来抛个砖:个人认为长尾物品推荐效果不好的本质原因是否是因为物品的特征计算不准确,由于交互较少,按照正常的计算逻辑得到的结果是有偏(biased)的。感觉现在推荐里卷来卷去,如何去偏慢慢得到大家的重视了。

论文中,作者理论上分析(有点意思,具体分析可以参考论文,但是感觉有点牵强)得到长尾问题不利于整体效果的原因是因为对用户偏好的预测是有偏的,这个偏差又来自两部分(这里借鉴石塔西大佬的解释和观点2):

  • 物品本身特征学习的质量与其分布有关。对于热门物品,是那些容易记忆的特征发挥作用,比如item id embedding,如果学好了,是最个性化的特征。但是对于长尾物品,恰恰是在模型看重这些特征上都没有学习好(因为缺少训练数据,不可能将长尾item id embedding学好)。
  • 用户对物品的偏好不容易学好。训练集中正样本以热门物品居多,从而让user embedding也向那些高热物品靠拢,而忽视长尾物品。

对于第一种偏差,要解决模型对那些冷启友好特征不重视的问题。对于冷启,单单增加一些对冷启友好的特征是没用的,因为模型已经被老用户、老物料绑架了。以物料冷启为例,模型看重的item id embedding这些最个性化的物料特征,但是恰恰是长尾物品没有学好的。长尾物品希望模型多看重一些可扩展性好的特征,比如tag / category,但是模型却不看重

CDN从以下两个方面解决长尾问题:

  • 物品侧,解耦头部和尾部物品的表征的学习,即记忆(memorization)和泛化(generalization)解耦。具体做法是把记忆相关的特征和泛化相关的特征分别喂进两个MOE中,让这两个MOE分别专注于记忆和泛化,然后通过门控机制对二者的输出进行加权。
  • 用户侧,通过正则化的双边分支网络(regularized bilateral branch network3)解耦用户的采样策略。该网络分成有两个分支,一个分支在全局数据上学习用户偏好,另一个分支在相对平衡的数据上学习。

CDN

Cross Decoupling Network (CDN).

CDN的整体结构如上图所示,左右两边分别对应物品侧和用户侧。

Item Memorization and Generalization Decoupling

既然要通过划分记忆和繁华特征来解耦,那么怎么划分输入的特征呢?

记忆特征(Memorization features)

记忆特征使模型能够记住数据集中出现频繁的模式,通常是满足以下性质的类别特征:

  • Uniqueness。对于特征空间 V \mathcal{V} V,存在单射函数 f i n :   I → V f_{in}:\ \mathcal{I} \rightarrow \mathcal{V} fin: IV
  • Independence,即特征空间的任意两个元素之间是独立的,互不影响的。

对于记忆特征的embedding,其一般只会被指定的物品更新(uniqueness),并且不同物品的记忆特征一般不同(independence)。因此,记忆特征一般只记住与物特定品相关的信息。物品ID就是一种很强的记忆特征(还有哪些记忆特征呢?)。

泛化特征(Generalization features)

泛化特征通常是那些能学习到用户偏好和物品之间关系的特征,这些特征通常是物品间共享的特征,如物品的类别、标签等。

物品表征学习

作者采用基于频率的门控的MoE(Mixture of Expert)来解耦记忆和泛化。

对于一个训练样本 ( u , i ) (u, i) (u,i),物品表征表示如下(方便起见,向量没有用黑体):
y = ∑ k = 1 n 1 G ( i ) k E k m m ( i m m ) + ∑ k = n 1 + 1 n 1 + n 2 G ( i ) k E k g e n ( i g e n ) y = \sum_{k=1}^{n_1} G(i)_k E_k^{mm}(i_{mm}) + \sum_{k=n_1 + 1}^{n_1 + n_2} G(i)_k E_k^{gen}(i_{gen}) y=k=1n1G(i)kEkmm(imm)+k=n1+1n1+n2G(i)kEkgen(igen)
其中 E k m m ( ⋅ ) E_k^{mm}(\cdot) Ekmm()表示专注于记忆的第 k k k个专家网络,输入为记忆特征 i m m i_{mm} imm E k g e n ( ⋅ ) E_k^{gen}(\cdot) Ekgen()表示专注于泛化的第 k k k个专家网络,输入为泛化特征 i g e n i_{gen} igen。注意,这些特征一般是把对应特征的嵌入拼接起来。 G ( ⋅ ) G(\cdot) G()为门控函数(输出为向量), G ( i ) k G(i)_{k} G(i)k表示门控输出的第 k k k个元素,且 ∑ k = 1 n 1 + n 2 G ( i ) = 1 \sum_{k=1}^{n_1 + n_2} G(i) = 1 k=1n1+n2G(i)=1。简单的理解,就是门控的输出对记忆和泛化网络的输出进行动态加权。此处的动态加权即是关键,即根据物品的热度动态调整记忆和泛化的比例。作者建议用物品频率作为门控的输入,即 g ( i ) = s o f t m a x ( W i f r e q ) g(i) = softmax(W i_{freq}) g(i)=softmax(Wifreq)

记忆和泛化解耦后,泛化的专家网络的更新将主要来自于长尾物品,而不会损害记忆专家网络从而导致整体性能的下降。

User Sample Decoupling

这一部分解耦的是用户的交互,提出了正则化的双边网络(Regularized Bilateral Branch Network):

  • main分支在原始数据 Ω m \Omega_m Ωm上训练。显然这个数据集中物品的交互是有偏的,这对用户在长尾物品上的偏好的学习是有偏的;
  • regularizer分支在均衡后的数据上 Ω r \Omega_r Ωr训练,即对热门物品的交互进行降采样。显然,用户对长尾物品的偏好学习被提权了。

这两个分支有一个共享的基座(User Tower),以及各自一个分支特定的网络。在训练阶段,对于 ( u m , i m ) ∈ Ω m (u_m, i_m) \in \Omega_m (um,im)Ωm ( u r , i r ) ∈ Ω r (u_r, i_r) \in \Omega_r (ur,ir)Ωr分别进入main和regularizer分支,不同分支计算出来的用户表示为:
x m = h m ( f ( u m ) ) ,   x r = h r ( f ( u r ) ) x_m = h_m(f(u_m)),\ x_r = h_r(f(u_r)) xm=hm(f(um)), xr=hr(f(ur))
其中 f ( ⋅ ) f(\cdot) f()就是两个分支共享的基座, h m ( ⋅ ) , h r ( ⋅ ) h_m(\cdot), h_r(\cdot) hm(),hr()分别是两个分支特有的。main和regularizer可以同时训练,但是在推理时只使用main分支。

Cross Learning

最终物品和用户的表征通过一个 γ \gamma γ-adapter来融合,并控制训练过程中模型的注意力转移到长尾物品上。训练时的logit计算方式为:
s ( i m , i r ) = α t y m T x m + ( 1 − α t ) y r T x r s(i_m, i_r) = \alpha_t y_m^T x_m + (1 - \alpha_t) y_r^T x_r s(im,ir)=αtymTxm+(1αt)yrTxr
其中 α t \alpha_t αt就是 γ \gamma γ-adapter,它是训练轮数的函数:
α t = 1 − ( t γ × T ) 2 ,   γ > 1 \alpha_t = 1 - (\frac{t}{\gamma \times T})^2,\ \gamma > 1 αt=1(γ×Tt)2, γ>1
其中 T T T是总的训练轮数, t t t是当前轮数, γ \gamma γ是正则化率,对于越不平衡的数据集, γ \gamma γ的取值一般越大。得到 s ( i m , i r ) s(i_m, i_r) s(im,ir)后,用户对物品的偏好通过以下方式计算:
p ( i ∣ u ) = e s ( i m , i r ) ∑ j ∈ I e s ( j m , j r ) p(i | u) = \frac{e^{s(i_m, i_r)}} {\sum_{j \in \mathcal{I}} e^{s(j_m, j_r)}} p(iu)=jIes(jm,jr)es(im,ir)
损失函数为:
L = − ∑ u ∈ U , i ∈ I α t   d ^ ( u m , i m )   l o g p ( i ∣ u ) + ( 1 − α t )   d ^ ( u r , i r )   l o g p ( i ∣ u ) = − ∑ u ∈ U , i ∈ I l o g p ( i ∣ u )   [ α t   d ^ ( u m , i m ) + ( 1 − α t )   d ^ ( u r , i r ) ] \begin{align} L &= - \sum_{u \in \mathcal{U}, i \in \mathcal{I}} \alpha_t\ \hat{d}(u_m, i_m)\ log p(i | u) + (1 - \alpha_t)\ \hat{d}(u_r, i_r)\ log p(i | u) \\ &= - \sum_{u \in \mathcal{U}, i \in \mathcal{I}} log p(i | u)\ [\alpha_t\ \hat{d}(u_m, i_m) + (1 - \alpha_t)\ \hat{d}(u_r, i_r)] \end{align} L=uU,iIαt d^(um,im) logp(iu)+(1αt) d^(ur,ir) logp(iu)=uU,iIlogp(iu) [αt d^(um,im)+(1αt) d^(ur,ir)]
其中 d ^ ( u m , i m ) , d ^ ( u r , i r ) ∈ { 0 , 1 } \hat{d}(u_m, i_m), \hat{d}(u_r, i_r) \in \{0, 1\} d^(um,im),d^(ur,ir){0,1}分别表示 Ω m , Ω r \Omega_m, \Omega_r Ωm,Ωr中的用户偏好(这里论文描述的不是很清楚)。

吐槽以下:论文在训练数据构造和训练过程讲的都不是很清楚。比如同时训练main和regularizer,输入的样本分别是什么, u m , u r u_m, u_r um,ur是同一个用户吗, i m , i r i_m, i_r im,ir是用一个物品吗?还有就是 s ( i m , i r ) s(i_m, i_r) s(im,ir)计算结果是什么含义?

总结

总体来说,这篇论文对长尾问题的认识还是很深的,也确实让人有所启发。特别关于特征解耦的那一部分,感觉以后可以实践一下。但是在后续的两个分支部分语焉不详,且缺乏相关的实现细节,或许是本人公里不够,一些细节错过了。还请路过的大佬指正。

参考


  1. Decoupling representation and classifier for long-tailed recognition, ICLR 2020. ↩︎

  2. https://zhuanlan.zhihu.com/p/651731184:似曾相识:谈Google CDN长尾物料推荐. ↩︎

  3. BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition, CVPR 2020. ↩︎

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

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

相关文章

【算法】leetcode 105 从前序与中序遍历序列构造二叉树

题目 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7] Output: [3,9,20,null,null,15,7]示例 2: Input: pr…

可控生成之GLIGEN原理

🤗关注公众号 funNLPer 快乐白嫖🤗 论文:GLIGEN: Open-Set Grounded Text-to-Image Generation 代码:gligen/GLIGEN 项目地址:GLIGEN demo地址:gligen demo 文章目录 1. 动机2. 模型结构及原理2.1 输入处理2.1.1 Caption Tokens2.1.2 Grounding Tokens2.2 Gated Sel…

应急三维电子沙盘数字孪生系统

一、简介应急三维电子沙盘数字孪生系统是一种基于虚拟现实技术和数字孪生技术的应急管理工具。它通过将真实世界的地理环境与虚拟世界的模拟环境相结合,实现了对应急场景的模拟、分析和决策支持。该系统主要由三维电子沙盘和数字孪生模型两部分组成。三维电子沙盘是…

ROS-5.自定义topic消息格式

自定义topic消息格式 1. 定义消息1.1. 定义msg文件1.2. 在package.xml中添加功能包依赖1.3. 在CMakeList.txt添加编译选项1.4. 编译 2.定义发布者和订阅者2.1 定义发布者2.2. 定义订阅者2.3. 修改CMakeList.txt2.4 编译 3. 使用消息3.1 启动ros主程序3.2. 启动发布者3.3 启动订…

处理时延降低24倍,联通云粒数据引擎优化实践

*作者:郑扬勇,云粒星河数据中台产品负责人 云粒智慧科技有限公司成立于 2018 年 6 月,是中国联通集团混改以来成立的首家合资公司,是中国智慧城市数智化建设者。一直以来,云粒智慧以数字化、智能化、集约化产品为核心&…

[杂谈]-2023年实现M2M的技术有哪些?

2023年实现M2M的技术有哪些? 文章目录 2023年实现M2M的技术有哪些?1、寻找连接2、M2M与IoT3、流行的 M2M 协议 在当今的数字世界中,机器对机器 (M2M) 正在迅速成为标准。 M2M 包括使联网设备能够交换数据或信息的任何技术。 它可以是有线或无…

关于已经安装了TorchCRF,导入时却提示“ModuleNotFoundError: No module named ‘torchcrf‘”的解决办法

应用python时,想导入torchcrf库 from torchcrf import CRF 但系统提示:ModuleNotFoundError: No module named torchcrf 在命令提示符里输入“pip list”检查已安装库,发现torchcrf已经安装 搞了半天,发现是大小写的问题&#x…

2023.9 - java - 浅拷贝

与 js的浅拷贝不同: 在 JavaScript 中, Object.assign() 或 spread 运算符等方法可以实现浅拷贝,但只针对对象的第一层属性进行复制。如果一个对象只包含基本数据类型的属性,那么对浅拷贝出来的对象进行修改不会影响原始对象&…

Spring IOC的理解

总: 控制反转(IOC):理论思想,传统java开发模式,对象是由使用者来进行管理,有了spring后,可以交给spring来帮我们进行管理。依赖注入(DI):把对应的…

React笔记(四)类组件(2)

一、类组件的props属性 组件中的数据,除了组件内部的状态使用state之外,状态也可以来自组件的外部,外部的状态使用类组件实例上另外一个属性来表示props 1、基本的使用 在components下创建UserInfo组件 import React, { Component } from…

OpenCV基本操(IO操作,读取、显示、保存)

图像的IO操作,读取和保存方法 1.1 API cv.imread()参数: 要读取的图像 读取图像的方式: cv.IMREAD*COLOR:以彩色模式加载图像,任何图像的图像的透明度都将被忽略。这是默认参数 标志: 1 cv.IMREAD*GRAYSCALE :以…

【进阶之路】pytest自动化测试框架从0-1精通实战

前言 1、运行方式 命令行模式: pytest -s login.py主函数模式: if __name__ __main__:pytest.main(["-s", "login.py"])pytest.ini运行: 在 pytest.ini 文件中配置 pytest 的运行参数。 注意点: 位置&…

车载监管模块项目需求分析报告

目录 1 文档说明.......................................................................................... 4 2 参考文件.......................................................................................... 4 3 概述.......................................…

真机安装Linux Centos7

准备工具: 8G左右U盘最新版UltraISOCentOS7光盘镜像 操作步骤 下载镜像 地址:http://isoredirect.centos.org/centos/7/isos/x86_64/ 安装刻录工具UltraISO,刻录镜像到U盘 ① 选择ISO镜像文件 ② 写入磁盘镜像,在这里选择你的U盘…

NLP(六十七)BERT模型训练后动态量化(PTDQ)

本文将会介绍BERT模型训练后动态量化(Post Training Dynamic Quantization,PTDQ)。 量化 在深度学习中,量化(Quantization)指的是使用更少的bit来存储原本以浮点数存储的tensor,以及使用更少的…

C#知识点、常见面试题

相关源码 https://github.com/JackYan666/CSharpCode/blob/main/CSharpCode.cs 0.简要概括 1.删除集合元素 1.For循环删除集合元素:从后面往前删除 从前往后删,有可能不能完全删除 #region 01.For循环删除集合元素void Test01_ForDelListElement(){//错误代码 虽然可以跑…

说说你了解的 Nginx

分析&回答 nginx性能数据 高并发连接: 官方称单节点支持5万并发连接数,实际生产环境能够承受2-3万并发。内存消耗少: 在3万并发连接下,开启10个nginx进程仅消耗150M内存 (15M10150M) 1. 正向、反向代理 所谓“代理”,是指在内网边缘 …

Dump文件的生成以及使用WinDbg静态分析

前言 本文章主要介绍了如何生成Dump文件,包括两种方式,通过代码生成和通过注册表生成。并且介绍了WinDbg工具的下载和使用,以及如何使用WinDbg工具去静态分析Dump文件,从而找到程序的崩溃位置。 生成Dump文件 通过调用WinAPI生成…

WGCNA分析教程 | 代码四

写在前面 WGCNA的教程,我们在前期的推文中已经退出好久了。今天在结合前期的教程的进行优化一下。只是在现有的教程基础上,进行修改。其他的其他并无改变。 前期WGCNA教程 WGCNA分析 | 全流程分析代码 | 代码一 WGCNA分析 | 全流程分析代码 | 代码二 …

论文阅读_扩散模型_DDPM

英文名称: Denoising Diffusion Probabilistic Models 中文名称: 去噪扩散概率模型 论文地址: http://arxiv.org/abs/2006.11239 代码地址1: https://github.com/hojonathanho/diffusion (论文对应代码 tensorflow) 代码地址2: https://github.com/AUTOM…