Meta工业级生成式推荐新架构HSTU——从零开始的推荐系统学习番外(二)


这里是 从零开始的推荐系统学习番外篇的第二篇,正如番外篇第一篇所说,番外篇的作用在于用尽可能通俗易懂的语言聊一聊比较热点的,常规链路之外的生成式推荐(Gen-Rec)。这一篇我们来研究研究GR的开山之作,Meta的HSTU: Actions Speak Louder than Words: Trillion-Parameter Sequential Transducers for Generative Recommendations

前言

对于用户行为序列,也就是Meta说的Actions,研究其实有很多。如果你看过这个专栏中其它的文章,你应该了解比如在此之前的DIN,SIM,DSIN等等。他们都注意到用户最近行为序列应该作为用户兴趣的重要特征之一,但是他们都没有摆脱传统DLRMs(Deep learning Rec Models)的框架,仅仅只是把序列作为一种特征,提取出特征向量和其他用户特征一起输入MLP并预估相应的指标。

GR则完全对应LLM的思路,Meta认为Actions就是Language。用户的每一次点击、每一次滑动、每一次购买,都可以被视为一种特殊的单词,而用户长期的行为轨迹则构成了一句复杂的句子。借用LLM的思想,就可以根据用户行为序列来预测下一个用户行为是什么(当然还是可以引入用户画像等特征)。

image-20251218144315176

Pipeline

为了便于理解,我们从数据的输入流来逐步讲解Meta提出的这个架构在干什么。HSTU的输入是用户的行为序列,这里所谓的行为序列与DIN中的近期交互物品序列有所不同,一个完整的用户交互不再仅仅是一个物品ID,而是被拆解为两个Token:Item和Action。比方说我刷视频,对第一个视频 I 1 I_1 I1,执行了操作 A 1 A_1 A1跳过;对视频 I 2 I_2 I2,执行了操作 A 2 A_2 A2点赞。也就是如下格式的序列:
S e q u e n c e = [ I t e m 1 , A c t i o n 1 , I t e m 2 , A c t i o n 2 , . . . , I t e m n , A c t i o n n ] Sequence = [Item_1, Action_1, Item_2, Action_2,..., Item_n, Action_n] Sequence=[Item1,Action1,Item2,Action2,...,Itemn,Actionn]
上述为主时间序列,Meta提出可以将部分稀疏类别特征也编码成Token插入,这里用到时间压缩的方法,由于部分特征在很长一段序列中大概率都是一样的,如果全部插入序列很容易导致序列长度爆炸,于是只在特征起始的时间节点插入Token。

当然Item进入HSTU层之前,需要经过一个Embedding层,也就是说整个的流程是这样的,从数据库中拿到用户交互序列(Token格式),从Embedding Table中找到对应的Item Embedding输入HSTU层,HSTU根据推荐环节的不同(Retrieval和Ranking)进行不同的推理方式,输出格式也不尽相同。

Retrieval

和上面的图不同,我们知道检索(召回)阶段的任务是从大量的候选项中高效粗略的选出用户可能感兴趣的Item。也就是说此时HSTU的输出不再是上面那张图里的内容,没有必要预估User对Item的动作了,所以这里只是单纯的生成一个Item向量代表用户的兴趣,然后通过这个向量去Embedding Table中做最近邻查找,找出最相近的TopK个Item作为召回结果。

同时在训练的时候,召回与传统的自回归生成也有所不同,对于INPUT的完整用户交互序列来说,肯定存在负面反应的Token,例如用户在信息流中明确不喜欢的Item;同时还包括上面所说的类别Token。因此在训练时,只有当下一个交互是正向反馈时,对应的物品才会被当作监督信号。 如果用户对 Item 的反应是负面的,或者下一个 Token 只是一个属性,那么该位置的训练目标被定义为 ∅ \emptyset (undefined) 。在计算 Loss 时,模型会对这些 ∅ \emptyset 位置进行 **Masking(掩码)**处理。也就是说,模型虽然“读”到了负反馈,但不会计算预测负反馈物品的 Loss,只会计算预测下一个正向交互物品的Loss。

【疑问】不过根据Meta公开的代码,他们在做Retrieval的时候根本就没有用到actions 的输入,所以某种程度上这不就是SASRec?

Ranking

排序阶段的目的是给候选物品进行打分,预估用户对候选物品会有多大的兴趣。HSTU的思路简单来说就是,把候选物品放在用户序列(假设长度为n)后面构成一个(长度为n+1)新序列,对这个新序列做attention,预测下一个action,也就是所谓的Target-Aware(目标感知)。这样的目的很符合我们的直觉,本质就是在思考,在用户已经看了前面这一堆东西的情况下,对候选物品还会不会有兴趣?

这样的话,假如推荐系统需要给一个用户同时给 1000 个候选商品打分。 理论上我们需要把 User History 和这 1000 个商品分别拼成 1000 条序列,这太慢了。 HSTU 的做法是把这 1000 个商品拼在同一个 Batch 的尾部,一次性算完。

序列长这样: [用户历史 H, 候选商品 A, 候选商品 B, 候选商品 C ...]

而我们知道传统decoder的Mask在做生成任务时,假如商品 B 在序列里排在 A 后面,Mask 允许 B 看前面的所有 Token,这就导致估算B 的兴趣时还能看到候选物品 A 和对 A 的预估!也就是说候选商品之间发生了交互,这是绝对不允许的,因为我们需要独立给每个商品打分。所以这里的细节是在推理阶段需要把前面的候选商品也Mask掉。
在这里插入图片描述

HSTU层

这一节我们具体来看看HSTU层里面的结构是怎样的。一个HSTU块大概长下面这样:

在这里插入图片描述

传统的Transformer块大概是这样的结构Multi-Attention -> Add&Norm -> Feed-Forward Network (FFN) -> Add&Norm,简单来讲,attention负责学习序列中token之间的关系,本质还是线性变换;FFN(前馈神经网络)在融合了上下文后学习每个token各自的信息。Add&Norm就是残差连接加上归一化。

HSTU块对传统Transformer块进行了改造。不同于LLM模型,推荐系统需要非常大的Batch Size来保证训练的效率和稳定性。也就是说除了模型参数,还需要巨大的内存来存储中间的激活值。也就是说,FFN的计算开销对于工业推荐系统太大了,也就训练不出更深的网络。出于这种考虑,HSTU删除了FFN,取而代之的是门控注意力。

首先,输入张量 X X X 通过一个线性层,经过激活函数(SiLU)输出被切分(Split)为四个部分: Q , K , V , U Q, K, V, U Q,K,V,U。其中 U ( X ) U(X) U(X) (Gate):就是 FFN 的替补。传统的Transformer注意力计算公式为:
Attention ( Q , K , V ) = Softmax ( Q K T d ) V \text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d}}\right)V Attention(Q,K,V)=Softmax(d QKT)V
不同之处在于HSTU这里没用Softmax,直接使用SiLU激活
A ( X ) = SiLU ( Q K T + rab p , t ) \text{A}(X) = \text{SiLU}\left( QK^T + \text{rab}_{p,t} \right) A(X)=SiLU(QKT+rabp,t)
这里引入了一个新的可学习参数 rab p , t \text{rab}_{p,t} rabp,t(相对注意力偏置),这是一个可学习的偏置项,主要目的是引入了
相对位置
相对时间的信息。

用户序列常常有这样一种特征,用户的兴趣常常是随时间衰减变化的。 rab \text{rab} rab 让模型知道“这个行为是5分钟前发生的”还是“5个月前发生的”。

不使用Softmax这一点其实和DIN的想法是一样的:希望保留用户原始的兴趣强度。

以防大家没有看过我之前的文章,这里举个例子讲讲为什么要这样做:

  • 场景A:用户刚购买了一台相机,此时他对“镜头”、“三脚架”、“相机包”等多个物品都有极强的购买意向。
  • 场景B:用户只是漫无目的地浏览,对当前展示的任何物品都没有明确兴趣。

如果使用Softmax,无论场景A还是场景B,注意力权重的总和都被强制归一化为1。这意味着场景A中强烈的多兴趣信号会被稀释,而场景B中微弱的信号会被放大。Softmax无法区分“对某些物品非常感兴趣”和“对所有物品都一般感兴趣”。

(PS:仔细想想的话抛弃Softmax还能允许Embedding Table动态增长,新物品的 ID 可以直接插入并开始训练)

最后阶段是聚合后的特征与第一阶段生成的门控张量 U U U 进行结合:
Y ( X ) = f 2 ( LayerNorm ( A ( X ) V ( X ) ) ⊙ U ( X ) ) Y(X) = f_2 \left( \text{LayerNorm}(A(X)V(X)) \odot U(X) \right) Y(X)=f2(LayerNorm(A(X)V(X))U(X))
这里的Layernorm主要是为了解决去除Softmax后,注意力值可能出现的数值不稳定性 。

FFN 的核心作用是引入非线性表征能力。而HSTU 通过 SiLU 激活函数引入了非线性。公式中的 ⊙ \odot 是逐元素乘法 。 U ( X ) U(X) U(X) 作为门控,如果 U ( X ) U(X) U(X) 的某个位置是 0,那么 Attention 聚合来的对应信息就会被“关在门外”(变成 0);如果 U ( X ) U(X) U(X) 的某个位置是高值,信息就被放大通过。在这里,门控 U U U 起到了类似 FFN 的作用,它决定了 Attention 提取的信息保留多少、如何变换。最后通过输出线性层 f 2 f_2 f2 输出。这种机制让模型能够基于输入 X X X 动态地决定保留哪些特征,这正是 FFN 中的 MLP 试图做的事情。

经过这样一系列操作,HSTU移除了FFN,显著降低了内存压力,让网络能够做的更大更深更快。Meta的实验结果也证明HSTU在核心业务指标上能够实现显著的提升 。


思考

来看下面这张插图:

在这里插入图片描述

Meta把GR模型用到的所有离散特征统一成一个 categorical token space,序列中 token 包括:

  • 用户行为序列里的 Item Φᵢ
  • 用户对 item 的 action aᵢ
  • 其他 slowly-changing categorical features(图中的 G i H i G_i H_i GiHi,主要包括用户语言、地理位置这种变化缓慢的特征)

问题在于这里的 Item Φᵢ的Embedding是怎么来的,原文中没有明确说,但根据后续的实验大概可以看出,主要还是来自Item ID直接做Embedding,可能会有一些Side Information作为添头来改善新物品冷启动的情况。也就是说这里没有用一些很复杂的人工挖掘的Feature做concat来丰富Item Side的表征,那么自然而然的想法是如果给Item Token加上内容理解来作为Embedding结果会不会更好呢?

于是Meta做了这样一组对比实验,GR (content-based)只使用内容特征(类似语言模型)来做生成,GR(interactions only)只使用了用户交互的Item(类似于SASRec)。结果显示仅使用内容特征的 GR 效果大幅下降,甚至远不如传统DLRM的SoTA,而仅仅只使用交互序列的GR的效果就已经超过DLRM不少了。

这样的结果似乎在说明,我们不需要太过于关注Item本身的信息,Item的交互序列中埋藏的信息足够模型识别内在的某种模式了。内容理解生成的 Embedding 虽然在语义上很高质量,但在推荐这一特定任务中,它相对于原始交互 ID 来说是一种信息压缩和信号稀释。比如你喜欢看某几个视频并不一定代表你喜欢这个类别,内容特征(如话题、标签、文本描述)通常是对内容的降维总结,它们丢失了特定内容之间的细微差别。 在长序列上直接学习这些高基数 ID 的相互关系,其效果可能反而远好于任何人工设计的特征工程或纯内容化的语义表征。

在这里插入图片描述


总结

回过头来看这篇文章的主图,作者总结传统推荐系统三个阶段:特征提取、特征交叉和表征变换(Feature Extraction, Feature Interactions, and Transformations of Representations)。HSTU通过用户交互序列和简单的Embedding代替了复杂的数据挖掘;使用天然具有交互能力的注意力机制代替传统的FM、DCN等想法;利用门控张量来替代MoE等MLP。

说到底,Meta这篇文章的意义在于给出了一种方法——如何在工业界十亿级别item的情况下使用生成式方法来进行推荐。证明了GRs比DLRMs好,并且实验证明符合Scaling Law——可以通过简单地堆算力、堆数据来换取性能的确定性增长。

无论如何,查看今年的一些论文,确实有很多工作已经引用了HSTU,比如字节的HLLM;据内部线人情报来看,HSTU也是互联网大厂复现出来为数不多确实有效果的GR工作。接下来我可能会聊聊直接使用LLM来做推荐的工作,比如HLLM、OneRec等等;或者聊聊长序列建模方面的一些想法(从DIN->SIM->ETA/Twin等等)我们下期再见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值