推荐系统中的两塔网络和负采样
美妆时尚界的两大网络推荐系统和负采样技术' (The Two Towers Network and Negative Sampling in the Beauty and Fashion Industry's Recommendation Systems)
了解驱动先进推荐引擎的关键元素
目前,推荐系统中最重要的模型类型之一是两塔神经网络。它们的结构如下:神经网络的一部分(塔)处理有关查询(用户、上下文)的所有信息,而另一部分处理有关对象的信息。这些塔的输出是嵌入向量,然后乘以这些嵌入向量(根据之前讨论的内容,可以是点积或余弦)得到推荐结果。关于这种网络在推荐中应用的最早提及可以在一篇非常好的关于YouTube的论文中找到。顺便说一下,我现在会把这篇文章称为经典文章,非常适合初次涉足推荐领域。

这样的网络有什么特点呢?它们与矩阵分解非常相似,实际上可以看作是矩阵分解的特例,只接受用户ID和物品ID作为输入。然而,与任意网络相比,两塔网络的限制(不允许不同塔的输入在最后阶段融合)使得它们在应用中非常高效。为了为单个用户建立推荐,我们只需要计算查询塔一次,然后将该嵌入向量与通常预先计算的文档嵌入向量相乘。这个过程非常快速。此外,这些预先计算的文档嵌入向量可以组织成一个ANN索引(例如HNSW),以便快速找到好的候选项,而无需遍历整个数据库。
相似性搜索,第四部分:分层可导航小世界(HNSW)
分层可导航小世界(HNSW)是一种用于近似搜索最近邻的先进算法…
towardsdatascience.com
- 来自微软研究院和清华大学的研究人员提出了“思维骨架(SoT):一种新的人工智能方法,加速LLMs的生成”
- 这项人工智能研究提出了可驾驶的三维高斯头像(D3GA):首个使用高斯喷点渲染人体的可控三维模型
- NVIDIA AI研究人员提出了Tied-Lora:一种新的人工智能方法,旨在提高低秩适应(LoRA)方法的参数效率
我们可以通过不为每个查询都计算用户部分,而是异步地按照一定规律计算来提高效率。然而,这意味着要舍弃对实时历史和上下文的考虑。
这些塔本身可以相当复杂。例如,在用户部分,我们可以使用自注意机制来处理历史,这将产生一个用于个性化的Transformer。但是,晚期交叉的限制会带来什么代价呢?自然地,它会影响质量。在同样的注意机制中,我们不能使用当前希望推荐的物品。理想情况下,我们希望聚焦于用户历史中的相似物品。因此,晚期交叉的网络通常在排名的后期阶段使用,当只剩下几十个或几百个候选项时,而晚期交叉(两塔网络)则在早期阶段和候选项生成中使用。
(然而,纯理论上有一种观点认为,通过具有足够维度的嵌入向量,可以编码不同查询的任何合理的文档排名。此外,NLP中的解码器实际上也是遵循相同原理,只是对每个标记重新计算查询塔。)
损失函数和负采样
特别值得关注的是训练两塔网络时使用的损失函数。原则上,它们可以使用任何损失函数进行训练,以实现不同的结果,甚至为不同的头部(每个塔中的不同嵌入向量)使用多个不同的损失函数。然而,一种有趣的变体是使用批内负采样的softmax损失进行训练。对于数据集中的每个查询-文档对,同一小批次中的其他文档与相同查询一起用作softmax损失中的负样本。这种方法是一种高效的负样本挖掘形式。
但是重要的是考虑到这样的损失函数的概率解释,并不总是被充分理解的。在经过训练的网络中,

分数的指数不仅仅与给定查询的文档的先验概率成正比,还与查询相关的 PMI (点互信息)成正比。更受欢迎的文档不一定会在这种模型中更频繁地被推荐,因为在训练过程中,它们以负面的形式出现的次数相对较多。将分数作为一个特征可能是有益的,但是对于最终的排序和候选生成来说,这可能导致非常具体但质量较差的文档。
谷歌在一篇论文中建议通过在训练过程中进行对数修正来解决这个问题。而我们通常是在应用阶段解决这个问题,而不是在训练过程中,只需简单地将其乘以文档的先验概率 P(d)。然而,我们从未比较过这些方法,这确实是一个有趣的比较。
隐式正则化:连接ALS和现代神经网络
有一个被称为隐式ALS(IALS)的协同过滤算法。我之前已经提到过它。在神经网络之前的时代,它可以说是最流行的算法之一。它的特点是有效地“挖掘”负样本:没有互动历史的所有用户-对象对都被视为负样本(虽然比实际互动的权重小)。此外,与实际挖掘不同的是,这些负样本不是被抽样的,而是在每次迭代中被完整地使用。这种方法被称为隐式正则化。
这是如何可能的呢?在合理的任务规模(用户数和对象数)下,负样本应该非常多,以至于列举它们所需的时间比整个训练过程还长。该算法的优点在于,通过使用均方误差(MSE)损失和最小二乘法,可以在每次完整迭代之前为所有用户和所有对象单独预先计算某些元素,并且这足以执行隐式正则化。这样,算法避免了二次大小的问题。(更多细节,请参阅我从那个时期非常喜欢的一篇论文)。
几年前,我思考过是否可能将这种隐式正则化的精彩思想与更先进的两塔神经网络技术结合起来。这是一个复杂的问题,因为有随机优化而不是完整批处理,并且不愿意回到均方误差损失(至少对于整个任务来说;对于正则化来说,可能还可以)因为它往往产生次优结果。
我仔细思考了很久,最后想出了一个解决方案!有几个星期,我都很兴奋,迫不及待地期待着我们将如何尝试用它来取代批内负样本。
当然,然后(在这种情况下经常发生),我在一篇论文中读到,三年前已经有人想到了一切。而且,这是谷歌。后来,在同一篇关于logQ修正的论文中,他们证明了在批内负样本下使用softmax损失比隐式正则化更好。
这就是我们能够节省时间并不测试这个想法的原因 🙂
推荐模型是否真的需要负采样?
毕竟,我们有真实的推荐印象例子,如果用户没有与之交互,这些可以作为强烈的负样本。(这并不考虑推荐服务本身尚未启动并且尚无印象的情况。)
对于这个问题的答案并不是那么简单,它取决于我们如何精确地应用训练好的模型:是用于最终排名,候选人生成,还是仅作为其他模型的输入特征。
当我们只训练模型在实际展示中的数据时,会出现一种相当强烈的选择偏差,模型只学会在那个特定上下文中展示出来的那些文档进行良好的区分,对于未展示的文档(或者更准确地说,查询-文档对),模型表现得更差:它可能对一些文档过度预测,对其他文档过度低估。当然,通过应用排名中的探索,可以缓解这种效应,但通常这只是一个部分解决方案。
如果候选人生成器是以这种方式训练的,它可能会对于某个查询生成大量文档,这些文档在此上下文中从未出现过,并且它过高估计了这些候选文档的预测结果。在这些文档中,往往包含了完全没有价值的垃圾信息。如果最终的排名模型足够好,它会过滤掉这些文档,不会向用户展示。然而,我们仍然不必要地浪费了候选文档名额(可能根本没有合适的文档剩余)。因此,候选人生成器应该在训练过程中理解大多数文档基础质量较差,不应该被推荐(提名为候选人)。对于这一点,负采样是一个好的方法。
与候选人生成类似,最终排名模型在这方面也非常相似,但有一个重要区别:它们从错误中学习。当模型对某些文档的预测过高时,这些文档会展示给用户,然后可能被包含在下一轮训练数据集中。我们可以在这个新数据集上重新训练模型,并再次向用户推出。新的假阳性将会出现。数据集收集和重新训练过程可以重复进行,形成一种主动学习的过程。实际上,只需进行几次迭代的重新训练,过程就会收敛,模型将停止推荐无意义的内容。当然,需要权衡随机推荐造成的伤害,有时值得采取额外的预防措施。但总体而言,在这里并不需要负采样。相反,它可能损害探索,导致系统停留在局部最优解。
如果模型用作另一个模型的输入特征,那么相同的逻辑也适用,但是对于对于随机候选文档的预测过高所造成的伤害更加不重要,因为其他特征可以帮助调整最终的预测结果。(如果一个文档甚至没有进入候选列表,我们将不会为其计算特征。)
有一次,我们直接进行了测试发现,作为特征时,标准ALS比IALS效果更好,但不应该用于候选人生成。
总结来说,我们的探索强调了排名中的双塔网络的有效性,考察了损失函数和负采样对模型准确性的重要性,通过隐式正则化弥合了与经典协同过滤之间的差距,并对推荐系统中负采样的重要作用进行了讨论。这个讨论凸显了推荐系统技术的不断复杂和精妙。



