文章目录

  • 1. 背景与问题
  • 2. 方法
    • 2.1 多视图 sid
    • 2.2 Code-Guided Semantic Fusion
      • 核心创新:
      • 常规操作:
    • 2.3 Enhanced Representation Learning via Code Masking
      • 2.3.1 Masked Code Modeling (MCM)
      • 2.3.2 Masked Sequence Alignment (MSA)
    • 2.4 复杂度分析
      • 2.4.1 训练阶段(Training)
        • SFM部分
        • SR部分
        • 总体训练复杂度
      • 2.4.2 部署阶段(Deployment)
  • 3. 实验
    • 3.1 主实验
    • 3.2 消融实验
    • 3.3 codebook 层数
    • 3.4 不同 sid
    • 3.5 加 item id
  • 4. 总结

这里记录一下人民大学高瓴学院-KDD2025的一篇关于语义与协同对齐的文章:《Bridging Textual-Collaborative Gap through Semantic Codes for Sequential Recommendation》

论文链接:https://arxiv.org/abs/2503.12183

代码链接:https://github.com/RUCAIBox/CCFRec?tab=readme-ov-file

1. 背景与问题

序列推荐任务下,主流做法都是侧重于 ID 协同过滤(只看用户和商品的 ID,忽略内容),可以很好的捕捉用户和商品间的互动关系,但现代平台的商品文本内容(标题、品牌、描述)极为丰富,这些信息能更精准刻画商品本身,也有助于解决冷启动问题。

近年来有一些方法把文本信息和 ID 信息拼接或加权,但常常导致两种信息融合不自然,要么太依赖文本,忽略协同关系,要么文本利用不足,丢失语义信息。

在这里插入图片描述

本文关注如何在序列推荐任务中,通过更智能的语义融合机制,把商品文本信息和用户行为序列的信息深度结合起来,让推荐系统既懂“内容”又懂“行为”。

本文提出 CCFRec 通过 sid(semantic id)作为桥梁,sid 有两个重要特征

  1. 可以理解为特殊 id,每个 id 有自己的可学习 embedding,可以像传统 id 那样建模协同语义。
  2. 每个 item 可以有多组 sid(每个 item 多个特征如:标题、品牌、类别,每个特征一组 sid,代码中搞了 5 套),能反应不同层次的内容语义,让相似内容的 item 自动贴近(同 RPG 文章中提到的,如果有几位相同的 sid 这两个 item 就比较相似)。

本两个创新目标

  1. 用 sid 指导模型,灵活地从文本信息中抽取对推荐有用的部分,不会死板地全部用文本。
  2. 让商品的最终表示既有内容信息,又有协同信息,让推荐系统更精确。

2. 方法

在这里插入图片描述

2.1 多视图 sid

这里思想特别简单(有点大力出奇迹的意思),就是将每个 item 的多种属性,论文代码中是 5 种(title,brand,features,categories,description),经过 embedding model 得到对应的 embedding,然后搞多套 sid

对比之前的方法都是将每个 item 的所有属性拼成一句话经过 embedding model,这样更细致了。最后将每个属性的 sid 拼在一起,组层一个大 sid 表。(每个属性 20 层 pq/rq 的 codebook,拼在一起 100 层)

每个商品有多个文本属性(如title、brand、features、categories、description):

  • Step 1:文本编码
    用预训练模型分别将每个属性编码为文本embedding向量:
    zit=PLM(ai),i∈{1,...,m}z_i^t = \text{PLM}(a_i), i \in \{1,...,m\} zit=PLM(ai),i{1,...,m}

  • Step 2:向量量化成sid
    对每个属性的文本embedding,用向量量化技术(PQ或RQ)转为多层语义码sid
    zit→(c1i,...,cki)z_i^t \rightarrow (c_1^i,...,c_k^i) zit(c1i,...,cki)
    比如用了5个属性,每个属性20个sid,则每个商品就有5×20=100个sid。

2.2 Code-Guided Semantic Fusion

在这里插入图片描述

核心创新:

这是其实比较新颖的一个点就是将经过 embedding model 得到的 embedding 作为 K/V 去增强 embedding 质量。

这个模块是本文最核心的创新

输入两类embedding:

  • 属性embedding Zt=[z1t,...,zmt]Z^t=[z_1^t,...,z_m^t]Zt=[z1t,...,zmt](内容信息)
  • 语义码embedding Zc=[z1c,...,zncc]Z^c=[z_1^c,...,z_{n_c}^c]Zc=[z1c,...,zncc](协同信息)

这个模块由多层Transformer-like结构组成,每层包括:

  • Self-Attention层
    语义码之间相互融合:
    H~l=MHA(Hl−1,Hl−1,Hl−1)\tilde{H}^l = \text{MHA}(H^{l-1},H^{l-1},H^{l-1}) H~l=MHA(Hl1,Hl1,Hl1)

  • Cross-Attention层
    以语义码embedding 为 query,以文本属性 embedding 为 key 和 value,主动抽取有用的文本信息:
    Hl=FFN(MHA(H~l,Zt,Zt))H^l = \text{FFN}\left(\text{MHA}\left(\tilde{H}^l,Z^t,Z^t\right)\right) Hl=FFN(MHA(H~l,Zt,Zt))

  • 最终得到商品融合表示:

    • 先池化获得整体表示:e=Pool(H)e=\text{Pool}(H)e=Pool(H)

    • 再加一个残差连接保留原始sid信息:
      e~=e+Pool(Zc)\tilde{e}=e+\text{Pool}(Z^c) e~=e+Pool(Zc)

通过上述模块,每个商品得到了高质量的语义融合向量 e~\tilde{e}e~

常规操作:

  • 将用户历史序列商品的融合embedding拼成序列,加位置编码,输入Transformer网络:
    h^i0=e~i+pi\hat{h}_i^0=\tilde{e}_i+p_i h^i0=e~i+pi

  • Transformer多层建模序列行为关系,得到最后一层隐藏状态:
    H^l=FFN(MHA(H^l−1,H^l−1,H^l−1))\hat{H}^l=\text{FFN}\left(\text{MHA}\left(\hat{H}^{l-1},\hat{H}^{l-1},\hat{H}^{l-1}\right)\right) H^l=FFN(MHA(H^l1,H^l1,H^l1))

  • 最后一个位置的隐藏向量表示用户当前兴趣:
    r=H^L[−1]r=\hat{H}^L[-1] r=H^L[1]

损失

用户表示 rrr 与下一个点击商品embedding e~n+1\tilde{e}_{n+1}e~n+1 相似度最大,负样本相似度最小。 用Cross-Entropy损失:
LCE=−log⁡exp⁡(g(r,e~n+1)/τ)∑j∈Bexp⁡(g(r,e~j)/τ)\mathcal{L}_{CE}=-\log\frac{\exp\left(g(r,\tilde{e}_{n+1})/\tau\right)}{\sum_{j\in\mathcal{B}}\exp\left(g(r,\tilde{e}_j)/\tau\right)} LCE=logjBexp(g(r,e~j)/τ)exp(g(r,e~n+1)/τ)

  • 其中,B\mathcal{B}B是正负样本集合,τ\tauτ是温度系数,ggg是余弦相似度。

2.3 Enhanced Representation Learning via Code Masking

作者提出通过额外的两个训练任务(基于掩码策略)增强模型的表示学习能力,分别是:

  • Masked Code Modeling (MCM, 掩码语义码建模)
  • Masked Sequence Alignment (MSA, 掩码序列对齐)

在这里插入图片描述

2.3.1 Masked Code Modeling (MCM)

  1. 核心思想

受自然语言处理中 BERT 模型的启发(通过掩码语言建模MLM学习文本表示),这里对语义码序列进行随机掩码,训练模型去恢复被掩盖的语义码,以促进语义码和文本信息更好地融合

  1. 具体做法
  • 每个商品拥有一个语义码序列:
    sc=(c1,c2,...,cnc)s^c = (c_1, c_2, ..., c_{n_c}) sc=(c1,c2,...,cnc)

  • 随机将一定比例 ρ\rhoρ 的语义码掩盖 (如 [MASK][MASK][MASK] ),得到掩盖后的序列:
    s^c=(c1,...,[MASK],...,cnc)\hat{s}^c = (c_1, ..., [MASK], ..., c_{n_c}) s^c=(c1,...,[MASK],...,cnc)

  • 语义融合模块(SFM)接收到这个掩盖序列,要利用文本embedding和未掩盖的码,推测出被掩盖的码。

  1. 损失函数

预测的目标是让模型给掩盖位置预测正确的语义码:
LMCM=1∣Mc∣∑x∈Mc−log⁡exp⁡(g(h^x,zxc)/τ)∑j∈Cexp⁡(g(h^x,zjc)/τ)\mathcal{L}_{\text{MCM}} = \frac{1}{|\mathcal{M}^c|}\sum_{x\in\mathcal{M}^c}-\log\frac{\exp(g(\hat{h}_x,z_x^c)/\tau)}{\sum_{j\in C}\exp(g(\hat{h}_x,z_j^c)/\tau)} LMCM=Mc1xMclogjCexp(g(h^x,zjc)/τ)exp(g(h^x,zxc)/τ)

  • 其中:
    • Mc\mathcal{M}^cMc 为掩盖位置的集合。
    • g(h^x,zxc)g(\hat{h}_x,z_x^c)g(h^x,zxc) 为预测表示(通过融合模块输出的隐藏向量h^x\hat{h}_xh^x)和真实码embedding zxcz_x^czxc 的余弦相似度。
    • 分母上的集合 CCC 表示所有语义码集合,作为分类的类别。
    • τ\tauτ 是温度系数,用于softmax平滑。
  1. 作用与优势
  • 增强语义码之间的关联性
  • 提高文本embedding与语义码之间的对齐能力。

2.3.2 Masked Sequence Alignment (MSA)

  1. 核心思想

这个任务用来增强推荐主干网络的序列建模能力,通过掩盖部分语义码产生数据增强(data augmentation),再进行对比学习(Contrastive Learning),提升模型对于序列建模的稳健性

  1. 具体做法
  • 同样对输入商品序列的语义码随机掩盖部分码,获得掩盖后的序列。
  • 掩盖序列经过语义融合模块(SFM)得到增强版的商品表示(augmented item representation)。
  • 将增强版的序列与原始序列分别输入到推荐主干网络,得到两种用户序列表示:
    • 原始表示 rrr(未掩盖序列)
    • 增强表示 r^\hat{r}r^(掩盖序列)
  • 希望相同序列的原始和增强版表示更相似,不同序列的表示更不同。
  1. 损失函数(公式7、8):

采用 InfoNCE 对比损失:
LMSA=12(InfoNCE(r^,r,Br)+InfoNCE(r,r^,Br^))\mathcal{L}_{\text{MSA}} = \frac{1}{2}\bigl(\text{InfoNCE}(\hat{r}, r, \mathcal{B}_r) + \text{InfoNCE}(r, \hat{r}, \mathcal{B}_{\hat{r}})\bigr) LMSA=21(InfoNCE(r^,r,Br)+InfoNCE(r,r^,Br^))
其中 InfoNCE定义为:
InfoNCE(x,y+,Ry)=−log⁡exp⁡(g(x,y+)/τ)∑y∈Ryexp⁡(g(x,y)/τ)\text{InfoNCE}(x, y^+, \mathcal{R}_y) = -\log\frac{\exp(g(x,y^+)/\tau)}{\sum_{y\in\mathcal{R}_y}\exp(g(x,y)/\tau)} InfoNCE(x,y+,Ry)=logyRyexp(g(x,y)/τ)exp(g(x,y+)/τ)

  • (x,y+)(x,y^+)(x,y+) 表示一对正样本(即来自同一用户序列的原始表示与增强表示)。
  • 集合 Ry\mathcal{R}_yRy 包含了正样本和批次内其他序列(负样本)的表示。
  • 目的是拉近同序列表示(正样本),拉开不同序列表示(负样本)。
  1. 作用与优势:
  • 增加训练数据多样性,有效提升模型对用户序列的泛化能力和稳健性。

最后,综合起来三个优化目标(推荐预测损失、掩码语义码损失、掩码序列对齐损失),整体训练目标为:
L=LCE+αLMCM+βLMSA\mathcal{L} = \mathcal{L}_{CE} + \alpha\mathcal{L}_{MCM} + \beta\mathcal{L}_{MSA} L=LCE+αLMCM+βLMSA

  • LCE\mathcal{L}_{CE}LCE:推荐任务损失(预测下一个商品)。
  • LMCM\mathcal{L}_{MCM}LMCM:掩码语义码建模损失,优化SFM语义融合效果。
  • LMSA\mathcal{L}_{MSA}LMSA:掩码序列对齐损失,优化序列建模的稳健性。
  • α,β\alpha,\betaα,β 为超参数,调节不同任务的比重。

2.4 复杂度分析

2.4.1 训练阶段(Training)

CCFRec有两个关键模块:

  1. 语义融合模块(SFM, Semantic-Fusion Module)
  2. 序列推荐主干(SR, Sequential Recommendation backbone),比如SASRec那样的Transformer结构。
SFM部分
  • 在SFM中,主要有三种操作:自注意力层(Self-Attention)、跨融合层(Cross-Fusion)、前馈网络(Feed-Forward)。
  • 对于单个item,计算复杂度分别是:
    • 自注意力层:O(M²d)
    • 跨融合层:O(MKd)
    • 前馈网络:O(Md²)
  • 其中:
    • d 是模型的表示维度(embedding维度)
    • M 是语义code序列的长度
    • K 是属性序列的长度
  • **综合起来,得到一个item的SFM输出的总体复杂度:**O(M²d + MKd + Md²)
SR部分
  • 主干SR一般用的是SASRec那种Transformer结构,主要消耗在自注意力层和前馈层。
  • 假设用户行为序列长度为N,则总复杂度为:O(N²d + Nd²)
总体训练复杂度
  • 将SFM和SR加在一起,并考虑 batch(多个item同时训练),总训练复杂度为:O(N²d + Nd² + NM²d + NMKd + NMd²)
  • 这里N是用户序列的长度,M和K是item属性和code数量,d是embedding维度。
  • 重点:实际应用中,M 和 K 远小于 N(通常N>50,M、K一般不超过20),所以额外的开销是可以接受的

(代码中我看到 M=100,K=20,额。。。不过工业界数据上确实也是 K 会更大)

2.4.2 部署阶段(Deployment)

  • 部署时,为了提高效率,SFM模块可以被去掉,因为训练好的语义融合表示(item embedding)是固定的
  • 我们可以提前离线计算每个item的最终embedding(用SFM提前处理好,存下来),只用主干SR进行推理。
  • 这样,线上推理时的复杂度与SASRec等主流序列推荐模型完全一样,都是 O(N²d + Nd²)
  • 也就是说,部署阶段CCFRec的推理速度不会比常见的序列推荐模型慢。

这里倒是没问题。

3. 实验

3.1 主实验

在这里插入图片描述

3.2 消融实验

感觉这些消融有点没到点上,看不出来那些是本文最重要的组件。也没有整个去掉(1)(2)的,都是去掉很小的东西,然后微降效果

在这里插入图片描述

3.3 codebook 层数

层数增加效果提升,这里还是有点 scaling-law 的意义:

在这里插入图片描述

3.4 不同 sid

在这里插入图片描述

这里得到比较有趣的现象:

Random code是无用但无害:模型会“忽略”它,不依赖它。

SASRec code是冗余且有害:模型会“重复利用”协同信息,导致空间浪费,降低性能。

3.5 加 item id

论文采取了一种 参数高效(parameter-efficient) 的方式,简单来说就是在保持原有文本-语义表示的基础上,再加上一份独立的 item ID embedding,并且只训练这部分参数,步骤如下:

  1. 先用原始的 CCFRec 进行预训练,学习出每个物品的语义融合表示(只用文本+code)。
  2. 引入 item ID embedding lookup table:对每个物品,分配一个随机初始化的可训练 embedding(通常与语义表征等长,比如128维)。
  3. 冻结原有 CCFRec 所有参数,只训练 ID embedding,即其他部分参数都不动,只让 ID embedding 随训练迭代更新。
  4. 最终物品表示为
    • 最终表示 = 语义融合表示 + ID embedding
    • 两者直接相加后,作为输入传递给序列推荐器(如 Transformer/SASRec 等)。
  5. 继续用推荐损失(如交叉熵)finetune,直到收敛。

原本 CCFRec 只用文本和对应的 semantic code(语义码)来表达物品,不用传统的 item ID embedding。这样做的好处是更关注于文本的内容表达,便于泛化和冷启动,但有个明显的短板:无法表达“物品之间纯 collaborative(协同过滤)信息”,即没法捕捉到只有 ID 层面才有的微小区分。

在这里插入图片描述

4. 总结

主要是对 item embedding 与 text embedding 融合的工作,感觉设计的十分复杂(复现的时候训练相比于其他模型时间多太多),实验整体感觉差点意思,消融做的没看出哪些最关键组件,不过对于部署阶段的复杂度分析倒是感觉算是合理,相当于增加了训练阶段的算力以及存储,换准确度?

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python深入 Tkinter 模块

目录 一、为什么要写 Tkinter 二、最小可运行示例:Hello World 不是终点,而是起点 三、布局三板斧:pack、grid、place 四、事件与回调:让按钮“响”起来 五、实战案例:秒表 文件批量重命名器 六、样式进阶&…

LeetCode 面试经典 150_数组/字符串_删除有序数组中的重复项(3_26_C++_简单)

LeetCode 面试经典 150_删除有序数组中的重复项(3_26_C_简单)题目描述:输入输出样例:题解:解题思路:思路一(双指针):代码实现代码实现(思路一(双指…

架构篇(一):告别MVC/MVP,为何“组件化”是现代前端的唯一答案?

架构篇(一):告别MVC/MVP,为何“组件化”是现代前端的唯一答案? 引子:一个困扰前端工程师的“幽灵” 在上一章《序章:抛弃UI,我们来构建一个“看不见”的前端应用》中,我们从零开始构建了一个纯…

数组内存学习

一、内存简介:1.内存分为5块:a.栈(Stack)主要运行方法,方法的运行都会进入栈内存运行,云南行完毕之后,需要“弹栈”,为了腾空间。b.堆(Heap)保存的是对象&…

验证 GitHub Pages 的自定义域(Windows)

验证 GitHub Pages 的自定义域 您可以通过验证您的域来提高自定义域的安全性并避免接管攻击。 谁可以使用此功能? GitHub Pages 在公共存储库中提供 GitHub Free 和 GitHub Free for organizations,在公共和私有存储库中提供 GitHub Pro、GitHub Team、GitHub Enterprise Cl…

数字化转型 - 企业数字化建设的几点思考

关于企业数字化建设的几点思考工业软件领军人才的培训课中,如上的一个PPT,给人以许多反思。一是看企业成功的数字化案例时,也许只看到别人面上的东西,可能还有面下很多看不到的东西支撑着,因此可能只看到或学到别人的皮…

深入解析Java内存模型:原理与并发优化实践

深入解析Java内存模型:原理与并发优化实践 技术背景与应用场景 随着多核处理器的普及,Java并发编程已成为后端系统提升吞吐量与响应性能的必备手段。然而,在多线程环境下,不同线程对共享变量的可见性、指令重排以及内存屏障控制都…

《设计模式之禅》笔记摘录 - 9.责任链模式

责任链模式的定义责任链模式定义如下:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.…

05-ES6

数据解构SetES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值Set 本身是一个构造函数,用来生成 Set 数据结构//set集合,成员是唯一的,添加过程中会替换相同的元素。这里相同的标准是const s new S…

正则表达式 \b:单词边界

下面举例说明 \b 用法。\b(?:https?://)(\S)\b各部分功能:\b:单词边界,确保匹配的 URL 是独立的单词,不会与其他字符粘连。(?:https?://):非捕获组,匹配 http:// 或 https://(s? 表示 s 可…

从8h到40min的极致并行优化:Spark小数据集UDTF处理的深度实践与原理剖析

在大数据领域,Spark以其卓越的并行处理能力著称。但面对小数据集的极致并行需求时,默认优化策略往往成为瓶颈。本文将深入剖析如何通过精准控制分区策略,将仅170条数据的表拆分成170个独立Task并行执行,实现100%的并行度&#xff…

JAVA算法题练习day1

开始前: 选择leetcode-hot100。要求每日1道,并且需要亲自二刷昨天的题目(每一种解法),要做解题笔记并发布CSDN,做完立刻二刷。做题时间为每日12:50起,不拖延,这是学习成…

【Word Press进阶】自定义区块的行为与样式

前两篇 【Word Press基础】创建自定义区块【Word Press基础】创建一个动态的自定义区块 说明白了怎么创建一个简单的静态区块。但实在是太丑了。这里再进行一个优化,让咱们的区块好看又好用。 一个合格的区块应当有着好看的外表,完整的功能&#xff0…

Pygame模块化实战:火星救援游戏开发指南

Pygame模块化实战:火星救援游戏开发指南用Python打造太空探险游戏,掌握模块化开发核心技巧一、火星救援:模块化开发的完美场景​​想象这样的场景​​: 你是一名宇航员,被困在火星表面,需要收集资源、修复飞…

三维图像识别中OpenCV、PCL和Open3D结合的主要技术概念、部分示例

文章目录1. 三维点云基础概念点云(Point Cloud)深度图像(Depth Image)体素(Voxel)2. 点云预处理技术去噪滤波(Noise Filtering)降采样(Downsampling)3. 特征提取与描述法向量估计(Normal Estimation)关键点检测(Keypoint Detection)特征描述子(Feature Descriptor)4. 点云配准(…

7.23数据结构——单链表

文章目录一、思维导图二、单链表代码head.htext.cmain.c现象一、思维导图 二、单链表代码 head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdlib.h> #include <stdio.h> #include <string.h>enum A {FAULSE-1,//失败返回SUCCESS//成功返回};//给…

某种物联网SIM卡流量查询方法

说起流量卡,很多人可能还停留在营业厅办理的常规套餐里。但其实在 2016 年,三大运营商就推出了一种资费更为划算的正规流量卡 —— 物联卡。当年,当不少人还在用 50 元 1G 的流量时,第一批体验物联卡的用户已经享受到了 53 元 6G 的全国流量,彻底摆脱了流量焦虑。不过,至…

XTTS实现语音克隆:精确控制音频格式与生成流程【TTS的实战指南】

言简意赅的讲解XTTS解决的痛点 &#x1f4ce; 前置操作&#xff1a;如何使用 OBS Studio 录制高质量 WAV 语音&#xff08;建议先阅读并准备录音样本&#xff09; 本教程介绍如何使用 Coqui TTS 的 XTTS v2 模型 实现中文语音克隆&#xff0c;支持直接传入 .wav 文件&#xff0…

C/C++中常量放置在比较操作符左侧

目录 介绍 原因详解 避免误用赋值运算符 示例对比 结论 介绍 在编程中&#xff0c;将常量放在比较操作符&#xff08;如 或 !&#xff09;的左侧&#xff08;例如 if (42 value)&#xff09;&#xff0c;是一种被称为 "Yoda 条件"&#xff08;Yoda Conditions…

Node.js 模拟 Linux 环境

&#x1f9e9; 项目介绍 该项目使用 Node.js 实现了一个模拟的 Linux 终端环境&#xff0c;支持多种常见的 Linux 命令&#xff08;如 ls, cd, cat, mkdir, rm 等&#xff09;&#xff0c;所有文件操作都在内存中进行&#xff0c;并持久化到本地文件系统中。适合用于学习 Shel…