NCR介绍&演示2021-10-02
作者:互联网
关于 NCR 的小介绍
受神经符号机器学习最新进展的启发,作者提出了神经协同推理 (NCR),这是一种将嵌入学习和逻辑推理的力量集成到推荐任务中的框架。事实上,作为一种认知而不是感知任务,推荐不仅需要模式学习和匹配的能力,还需要认知推理的能力,因为用户未来的行为可能不是简单地由其与用户之前行为的相似性驱动的,而是由用户关于下一步做什么的认知推理过程。例如,如果用户之前购买过膝上型电脑,这不会导致用户将来购买类似的膝上型电脑,而是期望用户购买更多设备,例如膝上型电脑包。这样的推理过程可能表现出一定的逻辑结构,例如(a ∨ b) ∧ ¬c → v,这意味着如果用户喜欢a或b,而不喜欢c,那么他/她将喜欢v的概率。如作为具有代表性的认知推理任务,智能推荐系统应该能够发现和利用数据中的逻辑关系,从而对数据进行推理以预测用户未来的行为。为了实现这一目标,研究人员提出了 NCR,将推荐问题定义为基于群体智慧(即协作)的可微分(即神经)逻辑推理问题。特别地,每个用户的行为记录被认为是一个逻辑蕴涵规则,例如 (a ∨ b) ∧ ¬c → v,这意味着用户喜欢项目 v 给定他/她之前对 a、b 和 c 的偏好。在这个意义上,
更具体地说,他们提出了一个基于模块化逻辑神经网络 (MLNN) 的神经逻辑推荐 (NLR) 框架,该框架将嵌入学习和逻辑推理的力量集成在一个共享架构中。该模型将 AND (∧)、OR (∨) 和 NOT (¬) 等每个基本逻辑运算作为基于逻辑正则化器的神经模块进行学习。通过这种方式,推荐问题可以被形式化为在给定用户之前的行为的情况下估计未来行为 v 为真的概率,例如 (a ∨ b) ∧ ¬c → v。基于物质蕴涵 (→) 的定义,这简化为 ¬((a ∨ b) ∧ ¬c) ∨ v 的 T/F 评估,它只包括基本的逻辑运算。因此,逻辑表达式可以同样转化为基于逻辑神经模块的神经架构,如下图所示,这最终决定了表达式的 T/F 值。通过这种方式,可微神经网络和符号推理在共享架构中桥接以进行优化和推理。
在这里插入图片描述
NCR 工作流程
- 数据集预处理和逻辑表达式构建;
- NCR 逻辑架构和培训;
- NCR 评估。
数据集预处理
在这项工作中,作者选择了三个数据集:
- MovieLens 100k:包含电影评分的基准数据集;
- Amazon Movies and TV:包含电影和电视评级的亚马逊数据集;
- Amazon Electronics:亚马逊数据集,包含有关电子产品(例如智能手机、Ipad 等)的评级。
这些数据集是根据用户和项目的密度和数量选择的。此选择允许在推荐项目时可能出现的三种不同设置上测试模型性能。可以观察到,随着用户和项目数量的增加,数据集的稀疏性也增加了。因此,随着基数的增加,任务变得更具挑战性。
下表包含有关这些数据集的信息。
数据集预处理由以下重要步骤组成:
- 评级从 1-5 级转换为 0-1 级。等于或高于 4 的评分转换为正反馈 (1),而低于 4 的评分转换为负反馈
(0)。因此,作者假设评分至少为 4,我们确定用户喜欢特定项目,而评分为 3
或更低,我们确定用户不喜欢特定项目。这是一个强有力的假设,因为评级对用户来说是主观的,但在他们的推荐设置中是有意义的。事实上,作者决定使用命题逻辑将推荐问题形式化为逻辑推理问题。由于命题变量是布尔变量,我们需要在
0-1 范围内缩放与项目相关的评分。这样,一个命题变量 x 的意思是“用户 u 喜欢物品 x”,而 ¬x 表示“用户 u 不喜欢项目
x”。最后,重要的是要注意评级信息没有像其他推荐工作中经常发生的那样被过滤以减少稀疏性。相反,这里保留所有评分信息以训练模型。 - 评级按用户分组并按时间戳排序。我们需要按时间戳对评分进行排序,因为我们想学习用户历史信息中的因果关系。例如,我们想了解过去购买一组特定商品会导致购买新的特定商品的事实。换句话说,我们想要学习用户根据他过去的购买历史来决定购买什么的逻辑推理过程。这个逻辑推理过程是通过前面提到的表达式形式的命题逻辑表达式形式化的
((a ∨ b) ∧ ¬c → v)。 - 对于每个用户:
- 前 5个正评级保留在训练集中,以减少冷启动问题。当推荐系统没有足够的正面反馈向特定用户推荐新项目时,就会出现冷启动问题。这意味着它没有足够的信息来了解用户喜欢什么以及应该向他推荐什么。这通常发生在系统中添加新用户时;
- 测试集的最后一个正面评级被保留(留一); 为验证集保留倒数第二个正面评级。
- 请注意,如果用户的正面评分少于 5 个,则所有评分都保留在训练集中。如果用户只有 6 个正面评价,则
将 5 个保留在训练集中,最后一个用于测试集。如果用户的正面评价超过 6 个,则使用上述过程。
1.我们为每个用户构建他的训练、验证和测试逻辑表达式。然后使用这些逻辑表达式来训 练和测试 NCR 模型。逻辑表达式构建如下:
- 对于用户历史信息中的每个正项,我们选择紧邻该特定项之前的 5 个最近的项作为逻辑表达式的历史集;
- 然后,我们使用此模板构建逻辑表达式:(历史集中项目的连接)-> 选定的正项目。
请注意,对于用户历史信息的第一次评分,不可能有以 5 个项目为前提的逻辑表达式。例如,如果我们有历史记录 1、2、3、4、5,并且所有这些项目都被用户评为正面项目,那么对于项目 2,我们之前只有项目 1,因此以 5 个项目为前提的逻辑表达式可以在这种情况下不会被构建。出于这个原因,作者决定在这些特殊情况下允许少于 5 个项目的前提。因此,对于示例的历史,我们将有以下逻辑表达式:
1 -> 2;
1 ∧ 2 -> 3;
1 ∧ 2 ∧ 3 -> 4;
1 ∧ 2 ∧ 3 ∧ 4 -> 5。
以5项为前提的逻辑表达式示例:
假设我们有用户 u 的以下历史记录:12, 34, 32, ¬4, 3, 7。这里,我们可以使用 12, 34, 32, ¬4, 3 作为历史集,7 作为正项我们想要预测用户评分。因此,我们构建以下表达式:12 ∧ 34 ∧ 32 ∧ ¬4 ∧ 3 -> 7。这里,12 是“用户 u 喜欢物品 12”的命题变量,而 ¬4 是“the用户 u 不喜欢项目 4"。这个公式编码了我们想用 NCR 学习的逻辑推理过程。特别是,我们有兴趣了解购买 12、34、32、¬4、3 导致购买 7 的事实。
通过示例了解 NCR 预处理
此示例基于来自 MovieLens 100k 数据集的真实用户。用户在他的历史信息中有以下评级:
在第一步中,用户评分以 0-1 的比例转换:
然后,我们按时间戳对用户评分进行排序:
现在,我们执行训练、验证和测试拆分。拆分如下。
训练集:
验证集:
测试集:
请注意,验证和测试集中具有负面反馈的项目不会作为逻辑表达式的结果使用。请参阅下面的示例以了解模型准确构造了哪些表达式。
- 最后,我们为用户构造逻辑表达式:
训练逻辑表达式:
- 318 -> 886
- 318 ∧ 886 ∧ ¬312 -> 257
- ¬312 ∧ 257 ∧ ¬287 ∧ ¬267 ∧ ¬293 -> 309
- 257 ∧ ¬287 ∧ ¬267 ∧ ¬293 ∧ 309 -> 324
- ¬287 ∧ ¬267 ∧ ¬293 ∧ 309 ∧ 324 -> 7
- ¬267 ∧ ¬293 ∧ 309 ∧ 324 ∧ 7 -> 201
- 324 ∧ 7 ∧ 201 ∧ ¬654 ∧ ¬200 -> 3
- 7 ∧ 201 ∧ ¬654 ∧ ¬200 ∧ 3 -> 152
验证逻辑表达式: ¬654 ∧ ¬200 ∧ 3 ∧ 152 ∧ ¬209 -> 210
测试逻辑表达式:3 ∧ 152 ∧ ¬209 ∧ 210 ∧ ¬381 -> 434
NCR 逻辑架构和训练
NCR 的思想是将逻辑表达式和逻辑命题变量嵌入到一个逻辑潜在空间中,然后在该空间上进行逻辑推理,以提供基于逻辑推理的准确推荐。因此,每个命题变量和逻辑表达式都有一个向量表示,由 NCR 学习。此外,在训练期间对逻辑潜在空间进行正则化,以确保神经模块表现出预期行为。
这个复杂的模型是如何工作的?
假设我们有用户 u 的以下历史记录:v1、v2、v3、v4。例如,我们需要构建以下逻辑表达式:v1 ∧ v2 ∧ v3 -> v4。为了获得这个逻辑表达式的潜在表示,我们必须将它提供给 NCR 网络。NCR 架构是动态的,因为它会根据给定的逻辑表达式进行更改。对于这个特定的例子,网络将用户 u 的嵌入和项目 v1、v2、v3、v4 的嵌入作为输入,并构造逻辑表达式: ¬ e u 1 ∨ ¬ e u 2 ∨ ¬ e u 3 ∨ e u 4 ¬e_u^1∨¬e_u^2∨¬e_u^3∨e_u^4 ¬eu1∨¬eu2∨¬eu3∨eu4, 在哪里 和你一世和一世你是所谓的事件向量,编码器网络输出的向量表示,将用户 u 和项目 i 相关联。请注意,此逻辑表达式等效于: e u 1 ∧ e u 2 ∧ e u 3 ⟹ e u 4 e_u^1∧e_u^2∧e_u^3⟹e_u^4 eu1∧eu2∧eu3⟹eu4. 应用德摩根定律和物质蕴涵得到最终表达式。请注意,鉴于逻辑表达式仅包含 OR 和 NOT 运算符这一事实,我们只能学习这两个神经模块,而不必学习 AND 模块。作者实验,学习最少数量的神经模块可以提高模型性能。
具体来说,为了得到逻辑表达式的表示,首先使用编码器将用户嵌入与项目嵌入关联起来,得到用户-项目对的所谓事件向量。这个过程是为每个用户-项目对完成的。
之后,我们使用计算出的事件向量来构建逻辑表达式。在架构中:
- OR 是一个神经模块,用于计算逻辑潜在空间中两个输入事件向量的逻辑 OR 运算符。该模块输出一个新的事件向量,该向量是潜在空间中两个输入事件向量之间逻辑或的结果;
- NOT 类似于 OR 模块,但它在逻辑潜在空间中执行输入事件向量的逻辑否定;
- TRUE 是一个固定的潜在向量,代表 TRUE 逻辑常数。用作锚向量来学习用户和项目嵌入;
- 相似度是输入逻辑表达式的事件向量与 TRUE 向量之间的余弦相似度。如果输出高,则表示可以向用户 u 推荐 v4 项,如果输出低,则表示不应向用户 u 推荐 v4 项。
培训如何进行?
NCR 使用成对学习程序。简而言之,对于训练集中的每个逻辑表达式,我们生成一个负逻辑表达式。负逻辑表达式等于原始表达式,但不是将目标项目放在蕴涵的右侧,而是从用户从未与之交互的项目集中随机采样的项目。在训练期间,我们强制原始(正)逻辑表达式尽可能靠近潜在空间中的 TRUE 向量,而我们强制负表达式尽可能远离潜在空间中的 TRUE 向量。这是通过梯度下降最小化以下损失函数来实现的:
逻辑正则化器
在训练期间,NCR 模型为上面报告的损失函数添加了一个额外的正则化项。该术语用于在逻辑潜在空间上执行逻辑正则化。由于不确定神经模块的行为是否像逻辑运算符,因此这些正则化器用于强制模块正确运行,即让它们按预期工作。例如,我们要确保 OR 神经模块返回一个事件向量,它是逻辑潜在空间中两个输入事件向量的逻辑 OR。下表列出了逻辑正则化器。
NCR 评估
NCR 模型使用一加随机评估程序进行验证和测试。简而言之,对于测试集中的每个逻辑表达式,我们随机生成 100 个负逻辑表达式,如前所述。然后,我们使用网络来获取这 101 个表达式与逻辑潜在空间中的 TRUE 向量之间的相似度。基于这些相似性,我们建立了一个分数排名。与潜在空间中 TRUE 向量的相似度越高,项目在排名中的位置就越高。在我们产生这个排名之后,我们根据目标项目的位置与 100 个负面项目的位置来计算测试指标。对测试/验证集中的每个逻辑表达式重复此过程。之后,将这些评价的结果一起平均。
标签:02,10,逻辑,项目,NCR,用户,向量,表达式 来源: https://blog.csdn.net/m0_56689123/article/details/120586630