最近 “TikTok 难民”涌入小红书,“小红书霸榜苹果 App Store” 等话题受到广泛关注,字节跳动的 Lemon8 也不相上下。当然,作为一个技术公众号,我们这里并不是要讨论这一现象,而是要介绍小红书的 NoteLLM,其主要用于小红书中的笔记推荐和标签生成。
对应的论文为:[2403.01744] NoteLLM: A Retrievable Large Language Model for Note Recommendation [1]
有关 LLM 在搜广推场景的应用落地也可以参考我们之前的文章:
- 字节 HLLM:大模型与推荐系统结合的新范式
- Meta HSTU:统一的生成式推荐
随着社交媒体平台如小红书和 Lemon8(字节) 的流行,用户生成内容(UGC)中的 Note 分享变得越来越普遍。这些平台鼓励用户分享产品评价、旅行博客和生活经历等,Note 推荐因此成为提升用户参与度的关键部分。
现有的 Online 方法仅将 Note 输入基于 BERT 的模型以生成 Note Embedding 来评估相似性。然而,这些方法可能未能充分利用一些重要线索,例如话题标签(Hashtag)或类别(Category)。实际上,学习生成 Hashtag/Category 有可能增强 Note Embedding,因为两者都将关键 Note 信息压缩至有限内容中。此外,LLM 在理解自然语言方面已显著超越 BERT,将 LLM 引入 Note 推荐具有广阔前景。
本文中,作者提出 NoteLLM,该框架利用 LLM 解决 Item-to-Item(I2I)Note 推荐问题。具体而言,作者采用 Note 压缩提示将 Note 压缩为单一特殊 Token,并通过对比学习方法进一步学习潜在相关 Note 的 Embedding。此外,可以通过指令微调,运用 NoteLLM 自动总结 Note 并生成 Hashtag/Category。大量真实场景实验表明,与 Online 基线相比,提出的方法有效提升了小红书推荐系统的性能。
PS:其实小红书中很多 Note 包含图片,也就需要多模态场景的推荐,本文中并未涉及图片信息,相关工作我们后续介绍。
文中作者主要关注两个任务:I2I Note 推荐任务和 Hashtag/Category 生成任务。
- 对于I2I Note 推荐任务
给定一个目标 Note,从大规模 Note Pool 中推荐一个排序的 Note 列表。本文中作者主要聚焦在基于文本的 I2I 推荐,并且将 LLM 引入进来。
Note Pool 为 N={n1, n2, …, nm},其中 m 表示 Note 数量。每条 Note 包含:标题(title)、标签(Hashtag)、类别(Category)和内容(Content)。ni=(ti, tpi, ci, cti) 表示第 i 条 Note。该任务目标是从 N 中选出与该 Note 相似的前 k 条 Note。
- 对于Hashtag/Category 生成任务
- 作为社交媒体上的标签机制,Hashtag 与 Category 简化了特定主题信息的识别过程,有助于用户发现相关内容。本任务指的是依据输入文本生成 Hashtag 和 Category。
- 在Hashtag 生成任务中,LLM 根据 ti 和 cti 生成 Hashtag tpi。
- 在Category 生成任务中,LLM 根据 ti,tpi 和 cti 生成 Category ci。
以经典的 SimCLR([2002.05709] A Simple Framework for Contrastive Learning of Visual Representations [2])中的对比学习为例,其核心思想是同一图片进行不同的数据增强后应具备一定的不变性。如下图所示,将不同的图片(N 个)输入 CNN 模型提取 Representation,每幅图片都会经过两个不同的预处理,生成两个不同的 Representation。对比损失的目标就是:使同一幅图生成的两个 Representation 尽可能相似,而与其他图生成的 Representation 应该尽可能不相似。
对于一个 Batch 的 N 个样本,总共可以生成 2N 个 Representation。这里并没有显式抽取负样本,相反地,给定一个正样本对(i, j),将 Batch 中剩下的 2(N-1) 个 Representation 视为负样本。对于正对 i 和 j 的对比损失函数可以表示如下,其中 sim(u, b) 表示 u 和 v 的相似性:
其中,1[k ≠ i] 是一个指示函数,若 k ≠ i 则为1,否则为 0,τ 是温度参数。最终的损失在 Batch 的所有正样本对(包括(i, j) 和 (j, i))上进行计算。分子可以理解为正样本对的相似性,分母可以理解为负样本对的相似性,通过这种方式,试图学习如何使正样本对的相似度更大,负样本对的相似度更小。
NoteLLM 框架由三个关键组件构成
- Note 压缩提示构建(Note Compression Prompt Construction):通过构建统一的 Note 压缩 Prompt,将 Note 内容压缩成一个特殊 Token,同时生成 Hashtag/Category。
- 生成-对比学习(Generative-Contrastive Learning, GCL):GCL 利用用户行为数据中的共现机制构建相关 Note 对,通过对比学习训练 LLM 识别相关 Note,从而获取协同信号。
- 协同监督微调(Collaborative Supervised Fine-Tuning, CSFT):CSFT 利用 Note 的语义内容和压缩 Token 中的协同信号生成 Hashtag/Category。通过这种方式,NoteLLM 能够在保持生成能力的同时,利用 Note 的语义和协同信息生成 Hashtag 和 Category,增强推荐 Embedding。
作者采用同样的 Note Compression Prompt 来促进 I2I 推荐和生成任务。为了利用 LLM 的 I2I 推荐生成能力,目标是将 Note 内容压缩为一个单一的特殊 Token,这一 Token 随后通过 GCL 获取协同知识。接着,利用这一知识,通过 CSFT 生成 Hashtag/Category。
具体而言,作者使用以下 Prompt 模板,用于通用 Note 压缩及 Hashtag/Category 生成:
在此模板中,[BOS]、[EMB] 及 [EOS] 为特殊 Token 符号,而 <Instruction>,<Input Note>, <Output Guidance> 和 <Output> 都是占位符,需替换为具体内容。
Hashtag 生成的具体内容定义如下:
Category 生成的具体内容定义如下:
鉴于用户生成 Hashtag 数量的不可预测性,作者随机选取一部分原始 Hashtag 作为 Hashtag 生成的输出目标,以最大限度地减少对 LLM 可能产生的误导。随机选择的 Hashtag 数量,记作 <j>,被整合进 <Instruction> 和 <Output Gudance> 两部分中。一旦 Prompt 构建完成,它们将经过 Tokenizer 并输入至 LLM。随后,LLM 提炼协作信号与关键语义信息至压缩 Token 中,并依据 Note 的核心思想生成 Hashtag/Category。
预训练的 LLM 通常通过指令微调或 RlHF 来学习新知识。这些方法主要侧重于利用语义信息来增加 LLM 的有效性和安全性。然而,推荐任务中仅依赖 LLM 的语义信息是不够的。协作信号在 LLM 中是缺失的,而这些信号在识别用户特别感兴趣的 Note 方面起着至关重要的作用。因此,作者提出了 GCL 来增强 LLM 捕获协同信号的能力。与从特定答案或奖励模型不同,GCL 采用对比学习(Contrastive Learning),从整体视角学习 Note 之间的关系临近性。
作者采用共现(co-occurrence)机制基于用户行为构建相关 Note 对。该机制基于一个假设:经常一起阅读的 Note 可能是相关的。因此,作者收集了一周内的用户行为数据以计算共现次数。具体来说,作者统计了用户查看 Note nA 后点击 Note nB 的次数。同时,为了区分不同用户共现的贡献,为不同的点击分配了不同的权重。具体的计算方式如下所示:
其中 SnA -> nB 表示从 Note nA 到 Note nB 的共现得分,U 是用户数,Ni 表示第 i 个用户点击的 Note 集合的数量。归一化可以防止活跃用户可能的无差别点击而导致的误导。在计算完所有的 Note 对共现得分后,就可以构成共现得分集合 Sni:
随后,从集合 Sni 中过滤掉得分超过上限