引言

在推荐系统领域,我们正见证一场范式转变。该领域正从传统的基于分类的方法——即从巨大的固定池中选择最佳物品——转向生成式推荐 (Generative Recommendation, GR) 。 受 GPT 等大语言模型 (LLM) 成功的启发,GR 模型将用户行为视为一种语言。它们对用户动作进行“分词 (Tokenize)”,并训练模型以自回归的方式预测序列中的下一个 Token

然而,在这个新范式中存在一个显著的“翻译”问题。在语言中,原子单位是单词或子词,它们在句子中自然流畅地衔接。在推荐中,原子单位是用户动作 (通常是与物品的交互) 。目前的 GR 模型通常独立地对这些动作进行分词。例如,无论你是在购买燕尾服还是篮球服之后购买了一双特定的袜子,模型都会为这双袜子分配固定的 Token 模式。

这种方法忽略了上下文 。 就像单词 “bank” 出现在 “river” (河岸) 或 “money” (银行) 附近时含义不同一样,购物历史中的物品根据其相邻物品的不同,也承载着不同的意图。

在这篇文章中,我们将深入探讨一篇题为**“ActionPiece: Contextually Tokenizing Action Sequences for Generative Recommendation”**的研究论文。该论文提出了一种新颖的用户动作分词方法,它不仅捕捉物品是什么,还捕捉它与前后物品如何关联。通过将物品视为无序的特征集合并根据共现关系进行合并,ActionPiece 将现代 NLP 中复杂的上下文感知能力带入了推荐系统。

背景: 生成式推荐的现状

要理解为什么 ActionPiece 是必要的,我们必须先了解生成式推荐目前是如何工作的,以及它的不足之处。

从 ID 到 Token

传统的序列推荐器 (如 SASRec 或 BERT4Rec) 使用唯一的 ID 来表示物品。如果平台有 1000 万个物品,模型就需要一个包含 1000 万个条目的嵌入表。这非常消耗内存,并且难以处理“冷启动”问题 (即没有历史记录的新物品) 。

生成式推荐通过将物品分解为 Token 来解决这个问题。一个物品不再由唯一的 ID 表示,而是由来自共享词表的短 Token 序列表示。这个词表比物品总数小得多,使得模型更具可扩展性。

然而,现有的分词策略存在局限性。如下表所示,像乘积量化 (VQ-Rec) 或层次聚类 (P5-CID) 这样的方法创建的是静态表示。

Table 1. Comparison of different action tokenization methods.

需要注意的一列是 “Contextual” (上下文相关性) 。 在 ActionPiece 之前,答案总是“否”。现有方法是孤立地对每个动作进行分词。它们将物品替换为 Token 模式 (例如,Item_A 变为 Token_1, Token_2) ,但无论用户之前的历史如何,Item_A 总是翻译为 Token_1, Token_2

灵感来源: NLP 中的 BPE

作者与自然语言处理 (NLP) 进行了强有力的类比。早期的 NLP 使用词级分词,但这很死板。现代 LLM 使用 字节对编码 (BPE) 或 Unigram 分词。这些方法从单个字符开始,迭代合并频繁出现的对。至关重要的是,它们允许同一个词根根据其后缀或前缀被分词为不同的 Token。

ActionPiece 旨在成为“推荐系统界的 BPE”。它寻求学习一个词表,其中的 Token 代表有意义的特征模式 , 这些模式可能跨越用户历史中的多个物品。

ActionPiece 方法

ActionPiece 的核心创新在于它如何表示数据以及如何构建词表。它摆脱了“物品 ID”的概念,转而拥抱“动作特征集合”的概念。

1. 将动作表示为无序特征集合

在现实世界中,一个“动作” (如购买产品) 由产品的属性定义: 品牌、类别、价格、颜色等。ActionPiece 将用户序列中的每个动作表示为一组特征集合

关键在于,集合是无序的 。 “耐克红色 T 恤”和“红色耐克 T 恤”是一样的。单个物品内的特征顺序并不重要,但时间维度的动作顺序 (先买衬衫,再买袜子) 很重要。

Figure 1. Illustration of the tokenization process of ActionPiece.

图 1 完美地展示了这一概念。

  1. 顶层: 我们看到一系列物品: T 恤、袜子、短裤和篮球。
  2. 特征集合: 每个物品被分解为数值特征 (例如,T 恤是 {245, 284, 747, 923}) 。
  3. 分段: 模型不仅仅是一个接一个地输出特征。它将它们分组为 Token (即“Token Sequence”行中的数字) 。

注意“Segment 2”中的重要细节: Token 8316 可能结合了来自 T 恤的一个特征来自袜子的一个特征。这就是上下文分词 。 T 恤的表示实际上渗透到了袜子的表示中,将它们融合为一个捕捉转换关系的单一 Token。

2. 词表构建

我们如何决定将哪些特征组合成一个 Token?作者使用了一种类似于 BPE 的自底向上的方法,但针对集合序列进行了调整。

初始化

过程始于一个基础词表,包含数据集中发现的每一个唯一特征。如果我们有特征“颜色: 红色”和“品牌: 耐克”,这些就是我们的初始原子 Token。

加权共现计数

算法迭代地将最频繁出现的 Token 对合并为新的、复杂的 Token。在文本处理中,计数很简单: 只需统计 A 紧邻 B 的次数。但在 ActionPiece 中,我们要处理的是集合

我们需要统计两种类型的关系:

  1. 集合内 (Intra-set): 同一个物品内出现的两个特征 (例如,“耐克”和“红色”) 。
  2. 集合间 (Inter-set): 一个物品中的特征与下一个物品中的特征相邻出现 (例如,在动作 \(t\) 中的“篮球”和在动作 \(t+1\) 中的“打气筒”) 。

由于集合大小不同,我们不能简单地统计原始频率。作者引入了一种概率加权方案来归一化这些计数。

如果我们想象将集合扁平化为一个随机序列,两个 Token 相邻的概率决定了它们的权重。

对于同一集合中的 Token: 权重取决于集合的大小 \(|\mathcal{A}_i|\)。较小的集合意味着特征之间的联系更紧密。

Equation 1

对于相邻集合中的 Token: 权重取决于两个集合的大小。这捕捉了序列转换关系。

Equation 2

这种加权确保了模型不会严重偏向巨大的特征集合,也不会忽略物品之间的联系。

Figure 2. Illustration of co-occurrence weights.

如图 2 所示,算法计算每一对的权重。它可能会发现对 \(<\bigcirc, \square>\) (一个跨物品对) 得分很高,表明这两个动作之间存在很强的上下文联系。

使用中间节点更新语料库

一旦识别出“最佳”对,算法就会将它们合并为一个新 Token。这里的数据结构设计非常巧妙。

合并同一物品内的两个特征很简单: 直接替换即可。但合并两个物品的特征则很复杂。你不能随意把新 Token 放在物品 A 或物品 B 中。

为了解决这个问题,作者使用了双向链表并引入了中间节点 (Intermediate Nodes)

Figure 3. Illustration of linked list updates.

看图 3,我们可以看到三种合并场景:

  1. 同一节点: 一个物品内的两个 Token 合并。集合变小。
  2. 相邻节点: 物品 A 的 Token 与物品 B 的 Token 合并。在它们之间创建一个新的中间节点 (虚线框) 来容纳这个新的“转换 Token”。
  3. 动作 + 中间节点: 一个物品的 Token 与现有的中间 Token 合并。这允许上下文增长,捕捉复杂的行为链。

这种高效的更新机制使 ActionPiece 能够构建包含单个特征、整个物品以及跨物品模式的词表。

3. 通过集合排列正则化 (SPR) 进行分段

构建词表后,我们需要对实际的用户序列进行分词以进行训练。朴素的方法是贪婪地应用合并规则。然而,集合是无序的。如果我们强制固定顺序,就会引入人为偏差。

作者提出了集合排列正则化 (Set Permutation Regularization, SPR)

这个想法简单而强大:

  1. 获取物品的无序特征集合。
  2. 随机打乱 (排列) 它们。
  3. 将此打乱后的版本视为序列并应用合并规则。

由于顺序是随机的,生成的 Token 会有所不同。一种排列可能会先合并“红色”和“耐克”。另一种可能会将“耐克”与下一个动作中的“袜子”合并。

这为同一个底层用户历史生成了多个有效的 Token 序列 。 这有两个目的:

  1. 数据增强: 在训练期间,模型看到同一动作序列的不同“视图”,防止过拟合并不助其学习特征的鲁棒语义。
  2. 推理集成: 在预测期间,我们可以生成用户历史的多种分词方式,分别预测下一个物品,然后平均结果。

实验与结果

上下文感知分词真的能带来更好的推荐吗?作者在三个亚马逊评论数据集上测试了 ActionPiece: SportsBeautyCDs

性能对比

他们将 ActionPiece 与各种基线方法进行了比较,包括:

  • 基于 ID 的方法: BERT4Rec, SASRec。
  • 特征增强方法: FDSA, VQ-Rec。
  • 生成式方法: TIGER, HSTU, SPM-SID。

结果是决定性的。

Table 4. Performance comparison on Amazon Reviews.

如表 4 所示,ActionPiece (最底行) 在所有数据集和指标 (Recall@K 和 NDCG@K) 上都取得了最佳性能。

  • 它以显著优势超过了 TIGER (一种流行的生成模型) 。
  • 它击败了 SPM-SID , 后者虽然使用了 SentencePiece,但缺乏 ActionPiece 的无序集合处理和跨动作上下文能力。
  • CDs 数据集上的提升最为显著,该数据集更大且序列更长,表明 ActionPiece 具有良好的扩展性并能捕捉丰富的序列依赖关系。

为什么它有效?

研究人员进行了消融实验,以查明这些收益的来源。

1. SPR 的力量 (Token 利用率) 一个假设是,集合排列正则化 (SPR) 迫使模型使用更多的词表,而不是依赖少数频繁出现的 Token。

Figure 5. Analysis of token utilization rate.

图 5 证实了这一点。使用“朴素 (Naive)”分段 (固定顺序) ,模型仅使用了大约 57% 的可用 Token。使用 SPR 后,利用率在 5 个 Epoch 内跃升至 95% 以上。通过打乱特征,模型学会了识别和使用词表中的几乎所有模式,使其表达能力大大增强。

2. 推理集成 我们前面提到 SPR 允许在推理过程中进行集成。这真的有帮助吗?

Figure 6. Analysis of performance w.r.t. ensemble segments.

图 6 显示了随着推理集成数量 (\(q\)) 增加时的 NDCG@10 得分。有一个明显的上升趋势。仅使用一个分段 (\(q=1\)) 效果不错,但平均 5 或 7 个不同排列的预测结果会产生更高的准确性。这证实了分词的多样性提供了互补信息。

3. 词表大小的权衡 作者还分析了词表大小如何影响系统。

Figure 4. Analysis of recommendation performance and sequence length.

在图 4 中,我们可以看到两条线:

  • 橙色 (NDCG): 随着词表大小增加通常会提高 (直到某一点,大约 40k) 。
  • 青色 (序列长度 - NSL): 随着词表大小增加而减少。

这在直观上讲得通。较大的词表允许模型创建代表复杂概念 (如“耐克红色衬衫”) 的“密集”Token。这缩短了模型必须处理的序列 (较低的 NSL) ,使其更高效,同时捕捉更好的语义 (较高的 NDCG) 。

计算效率

你可能会担心计算所有这些共现关系会很慢。作者通过使用倒排索引带有延迟更新的最大堆来解决这个问题。

Figure 7. Pseudocode for efficient vocabulary construction.

正如伪代码 (图 7) 中概述的那样,他们不是每次迭代都从头开始重新计数 (那将非常慢) ,而是仅更新受合并影响的语料库部分。这显著降低了时间复杂度,使算法在大型数据集上切实可行。

结论

ActionPiece 代表了生成式推荐向前迈出的重要一步。通过承认用户动作是上下文相关的且由无序特征组成,它摆脱了僵化的基于 ID 或独立 Token 系统的局限性。

主要收获如下:

  1. 上下文为王: 跨相邻物品合并 Token 在 Token 词表中明确捕捉了序列行为。
  2. 集合,而非序列: 将物品特征视为无序集合比任意的特征列表更能反映现实。
  3. 随机性即鲁棒性: 集合排列正则化充当了一种强大的数据增强技术,迫使模型学习更深层的语义连接。

随着推荐系统继续与生成式 AI 融合,像 ActionPiece 这样将数据表示 (动作) 与建模范式 (下一个 Token 预测) 对齐的技术,对于构建下一代智能发现引擎将至关重要。