【思考与讨论】Top-K推荐中两种考虑问题的方式

本文探讨了Top-K推荐中两种不同的处理方式:二分类问题和N分类问题。在二分类问题中,模型以二元交叉熵为代价函数,处理正负样本。而在N分类问题中,模型输出所有物品的交互概率,采用softmax函数。测试阶段,二分类通常采样负样本,而N分类则考虑所有物品。文章讨论了两种方法在模型训练、测试和实际应用中的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在Top-K推荐,或者说召回中,似乎并没有统一的标准,例如K的选择、评价指标(HR、NDCG、MRR、MAP等)的选择,甚至是将其看作一个什么样的问题都有两种思考的角度,这对我的理解造成了不小的困扰(因为并没有接触过工业上真正的流程)。本文是我对上述问题的自己的讨论与理解,肯定有很多有错的地方,请多多指教。
本文约2k字,预计阅读10分钟。

正文

看过不少关于Top-K推荐(召回)的文章,最终目标都是得到Top-K个推荐物品,但是模型训练的过程中,看待问题却又两种方式:

  1. 模型的输入样本包含正样本、负样本,输出是用户与候选物品交互的概率(与CTR预测一样,看作一个「二分类问题」),一般采用二元交叉熵(Binary CrossEntropy)作为代价函数;

  2. 「模型的输入并没有候选物品」,只有描述用户的信息特征。以序列推荐为例,最简单的话输入只包含了用户历史发生交互的物品。经过若干层,最终通过softmax函数,输出得到用户与整个物品池的交互概率。可以把这个过程看作一个 分类问题」 代表物品集的总数),只是与图像分类问题不同,这里 特别大,因此代价函数并不是简单的分类交叉熵(Categorical Crossentropy);

接下来详细的描述在论文中两种方式的模型训练、测试。

二分类问题

将整个推荐问题看作二分类问题其实与CTR预估一模一样,不同的是在召回中的候选物品池比CTR预估要大得多。我以NCF、SASRec、attRec模型为例进行讨论。

模型训练

以下三个模型的最终输出都是对当前候选物品,用户是否交互的概率。NCF为经典的神经网络模型,SASRec、attRec为序列推荐模型。

「NCF」

NCF模型的结构如下:

模型输入:

  • 用户(id);

  • 目标物品(id),正样本或负样本;

经过用户embedding和物品embedding的交互(神经网络层),最终得到用户对当前物品 交互的概率。由于物品 可能是正样本,也可能是负样本,所以最终整个模型的损失函数(二元交叉熵)为:

其中 是正样本的集合, 是负样本的集合。对于负样本的采样,一般会随机选取用户未交互的物品,正负样本的比例为1:1。

「SASRec」

SASRec是一个序列推荐模型,模型结构为:

模型输入:

  • 用户的历史交互物品;

  • 目标物品(id);

与NCF唯一不同的是,SASRec通过用户的历史交互物品信息来抽象表示为用户的信息。抽象得到的用户信息与物品embedding进过交互(内积),得到对目标物品是否交互的概率,损失函数与上述相同:

正负样本的比例一般为1:1。

「attRec」

attRec也是一个序列推荐模型,模型结构如下:

模型输入:

  • 用户的历史交互物品;

  • 用户(id);

  • 目标物品(id);

序列embedding信息通过自注意力模块,得到用户短期兴趣的抽象表示,用户embedding信息作为用户的长期偏好表示,分别与物品embedding信息进行交互(内积),加权得到最终用户对目标物品是否交互的概率。

与SASRec模型不同的是,attRec采用对排序方法来学习模型参数,因此损失函数为:

模型测试

对于将推荐问题看作是二分类的模型,测试方法如出一辙,都是对于一个测试的正样本,然后随机选择100个负样本,通过模型预测,得到每个样本的交互概率进行排序,最终获得Top-K物品列表,选择HR、NDCG等指标衡量模型的性能。以下是SASRec论文的阐述:

To avoid heavy computation on all user-item pairs, we followed the strategy in [14], [48]. For each user u, we randomly sample 100 negative items, and rank these items with the ground-truth item.

对于选择100个负样本给出了解释---计算所有的用户-物品对,计算量太大。举例来说,对于

DeepSeek 和 VLLM 是两种不同的大模型框架,它们各自提供了灵活的功能来控制推理过程。以下是关于如何禁用这些框架中的推理功能的信息。 ### 关于 DeepSeek 的推理关闭方法 DeepSeek 提供了一种简单的方式来管理其推理行为。通过设置特定参数可以有效地停止模型的进一步推断操作。通常情况下,在调用 `generate` 方法时传递配置选项即可实现这一目标: ```python from deepseek import DeepSeekModel model = DeepSeekModel.load("path_to_model") # 配置生成器以完全阻止任何输出 stop_config = { "max_new_tokens": 0, # 不允许生成新的标记 "do_sample": False, # 禁止采样 } result = model.generate(input_text="Your input here", **stop_config) print(result) # 输出应为空字符串或者原始输入[^2] ``` 上述代码片段展示了如何利用零令牌限制 (`max_new_tokens`) 来防止新文本被创建出来,从而达到关闭“思考”的目的。 ### 对于 VLLM 模型的行为调整 VLLM 同样支持多种方式来自定义其工作流程。如果希望暂停某个实例上的预测活动,则可以通过修改请求头数据结构内的字段完成此任务。例如下面的例子说明了怎样构建一个不会触发实际计算的有效载荷: ```json { "prompt": "", "n": 0, "best_of": 1, "logprobs": null, "echo": false, "stop_sequences": [], "presence_penalty": 0, "frequency_penalty": 0, "temperature": 0.7, "top_p": 1, "top_k": 50, "stream": false, "seed": -1, "truncate_length": 0 } ``` 在这个 JSON 请求体中,“n”设为了零意味着不返回候选答案;同时保持提示串为空也减少了不必要的处理步骤[^3]。 另外值得注意的是,虽然这里讨论的技术手段能够抑制显式的响应生成动作,但从严格意义上讲并不能彻底消除内部机制可能涉及的一切形式的数据变换运算——即所谓的“思维”。因此对于某些应用场景而言或许还需要更深入的研究探索其他可能性。 ### 结论 综上所述,无论是采用 DeepSeek 还是 VLLM 解决方案,都可以借助合理设定相关参数的方法有效遏制外部可见层面下的智能化表现特征。然而需要注意的是这并不等于真正意义上的终止所有后台逻辑演算进程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值