LLM4Rec:小红书NoteLLM
背景
为了解决推荐中的物品冷启动问题,在召回阶段中往往会增加一路使用内容多模态表征的i2i召回,这路召回由于只使用了纯内容的特征,和老物品便可以公平比较,不会产生因为新物品后验行为少而导致无法被召回的问题。在现有的多模态i2i召回方法在文本侧一般都是用一个BERT经过预训练后生成embedding然后基于embedding的相似度来进行召回,但是这样可能也会存在一些问题:
1. BERT表征能力不足。相较于BERT,可以选用参数量更大的LLM模型来生成embedding
2. 直接用BERT/LLM模型生成embedding只表达了比较广泛的文本语义信息,和下游推荐系统的任务目标不一致
因此论文选用了LLaMA2作为backbone,并且使用了推荐系统中的协同过滤信号来微调,得到了符合该推荐场景需求的多模态item embedding表示
方法介绍
论文方法主要包含3个部分:
1. 笔记压缩prompt:如何构建prompt得到笔记的压缩表示、标签、类别
2. 生成式对比学习(GCL):利用协同信息微调模型
3. 协同监督微调(CSFT):利用标签和类别信息微调模型
笔记压缩prompt
用于生成note的压缩表示、标签、类别的prompt模版如下所示:

其中, [BOS], [EMB]和[EOS]为特殊token, 而<Instruction>, <Input Note>, <Output Guidance>和<Output>为占位符, 对于不同的任务会使用不同特定的内容来替换。
这里补充一个问题,如何让LLM模型一段文本压缩成一个embedding呢?
论文采用了特殊token [EMB] 前一层权重(LLM在预估时一般采用全连接+softmax预估next token概率)
类别生成任务的模版如下所示:

标签生成任务的模版如下所示:

考虑到用户生成的主题标签数量的不可预测性,作者随机选取原始主题标签的t个标签作为主题标签任务生成的输出目标,以最小化对LLM的潜在错误指导
生成式对比学习(GCL)
直接通过LLM和上面的prompt已经可以得到一篇笔记的压缩embedding表示了,但是这样只利用到了LLM的文本理解能力,没法利用到小红书的用户行为信息,因此论文提出了使用对比学习的方法来优化LLM对笔记的embedding表示
首先统计一周时间窗口内每个用户点击笔记A后再点击笔记B的次数,然后算出一个共现分数,作为协同过滤的信号,计算两篇笔记共现分数的公式如下:
\[ s_{n_A \to n_B} = \sum_{i = 1}^{U} \frac{1}{N_i} \]
其中 U 是点击了笔记A然后点击了笔记B得用户数目,Ni 表示用户总的点击笔记的次数(实际上就是对活跃用户降权,防止某些用户什么笔记都点导致共现分手计算不准确)
对于一个笔记,我们选取共线分最高的k个笔记作为正样本,负样本来自于inbatch采样,损失函数采用了对比学习的InfoNCE loss:
\[ L_{cl} = - \frac{1}{2B} \sum_{i = 1}^{2B} \log \frac{e^{sim(\boldsymbol{n}_i, \boldsymbol{n}_i^+)} \cdot e^{\tau}}{\sum_{j \in [2B] \setminus \{i\}} e^{sim(\boldsymbol{n}_i, \boldsymbol{n}_j)} \cdot e^{\tau}}, \]
ni 是第i个笔记的embedding表示(对于每个笔记,都使用[EMB]这个特殊token前一个token的隐含层权重作为文本表征向量ni )
问题:
1. 为什么要计算点击笔记A然后点击B得共现分,而不是同时点击了笔记A和笔记B的共现分?这样会导致B是A的正样本,A不是B的正样本,怎么构建的训练样本?
协同监督微调(CSFT)
论文提到,在做类别/标签生成任务预测的时候也相当于是在压缩表示一篇笔记,因为做类别/标签生成任务的预测有助于得到更好的笔记embedding表示
\[ L_{gen} = - \frac{1}{T} \sum_{i = 1}^{T} \log (p(o_i | o_{<i}, i)) \]
实践中,在每个batch中选取了40%样本用户标签生成任务,60%样本用于类别生成任务
最终训练loss
\[ L = \frac{L_{cl} + \alpha L_{gen}}{1 + \alpha} \]
参考资料
https://zhuanlan.zhihu.com/p/698568773
https://zhuanlan.zhihu.com/p/698416915

浙公网安备 33010602011771号