ClassDef IntrinsicSimulatedEnv

IntrinsicSimulatedEnv: IntrinsicSimulatedEnv类的功能是在模拟环境中加入内在奖励机制,以增强模型的探索性和多样性。

属性:

  • ensemble_models: 用于评估的模型集合。
  • env_task_class: 环境任务的类。
  • task_env_param: 任务环境参数,为字典格式。
  • task_name: 任务名称。
  • predicted_mat: 预测矩阵,用于预测奖励。
  • item_similarity: 物品相似度矩阵。
  • item_popularity: 物品流行度。
  • lambda_diversity: 多样性权重。
  • lambda_novelty: 新颖性权重。

代码描述: IntrinsicSimulatedEnv类继承自BaseSimulatedEnv类,通过添加内在奖励机制(包括多样性和新颖性奖励)来增强模型的探索性和多样性。在初始化方法中,除了从BaseSimulatedEnv继承的参数外,还接受物品相似度矩阵、物品流行度、多样性权重和新颖性权重作为输入,用于计算内在奖励。_compute_pred_reward方法用于计算预测奖励,并结合内在奖励计算最终奖励。_cal_diversity_cal_novelty方法分别用于计算动作的多样性奖励和新颖性奖励。

在项目中,IntrinsicSimulatedEnv类通过prepare_train_envs_local函数被实例化,并用于训练环境的构建。该类利用物品相似度和流行度信息,通过调整多样性和新颖性权重来控制内在奖励的影响,从而促进模型在探索过程中考虑到物品的多样性和新颖性,提高推荐系统的整体性能。

注意:

  • 使用IntrinsicSimulatedEnv类时,需要确保传入的物品相似度矩阵和物品流行度数据准确无误。
  • 多样性权重和新颖性权重的设置应根据具体任务和数据集进行调整,以达到最佳效果。

输出示例: 调用_compute_pred_reward方法可能返回的示例输出为:

final_reward = 5.2

其中final_reward表示考虑内在奖励后的最终奖励值。

FunctionDef init(self, ensemble_models, env_task_class, task_env_param, task_name, predicted_mat, item_similarity, item_popularity, lambda_diversity, lambda_novelty)

init: 此函数用于初始化IntrinsicSimulatedEnv类的实例。

参数:

  • ensemble_models: 用于模拟环境的模型集合。
  • env_task_class: 环境任务的类。
  • task_env_param: 任务环境参数,以字典形式提供。
  • task_name: 任务的名称,以字符串形式提供。
  • predicted_mat: 预测矩阵,默认为None。
  • item_similarity: 物品相似度,默认为None。
  • item_popularity: 物品流行度,默认为None。
  • lambda_diversity: 多样性的权重系数,默认为0.1。
  • lambda_novelty: 新颖性的权重系数,默认为0.1。

代码描述: 此函数是IntrinsicSimulatedEnv类的构造函数,负责初始化类的实例。它首先调用父类的构造函数来初始化继承自父类的属性,包括模型集合、环境任务类、任务环境参数和任务名称以及预测矩阵。接着,它设置了几个与推荐系统内在特性相关的属性,包括物品相似度(item_similarity)、物品流行度(item_popularity)、多样性权重(lambda_diversity)和新颖性权重(lambda_novelty)。这些属性用于后续在模拟环境中评估推荐系统的性能时,考虑推荐列表的多样性和新颖性。

注意:

  • predicted_mat参数是可选的,如果在实例化时未提供,将默认为None。这个参数通常用于提供预测的用户-物品评分矩阵。
  • item_similarityitem_popularity也是可选参数,它们分别用于描述物品之间的相似度和物品的流行度,这对于评估推荐列表的多样性和新颖性非常重要。
  • lambda_diversitylambda_novelty是权重系数,用于调整多样性和新颖性在推荐系统性能评估中的重要性。这两个参数的默认值是0.1,但可以根据具体需求进行调整。

FunctionDef _compute_pred_reward(self, action)

_compute_pred_reward: 该函数用于计算给定动作的预测奖励,并结合内在奖励(多样性和新颖性)以及最小奖励值来计算最终奖励。

参数:

  • action: 执行的动作,其类型和具体含义根据环境的不同而有所差异。

代码描述: _compute_pred_reward 函数首先根据环境名称(env_name)判断当前环境,并据此采取不同的策略来计算预测奖励(pred_reward)。如果环境为 "VirtualTB-v0",则会根据当前用户状态、奖励、总轮数和动作等信息构造特征,通过用户模型预测出奖励值。预测奖励值会被限制在0到10之间。对于其他环境(例如 "KuaiEnv-v0"),预测奖励可能直接从某个预先计算的矩阵中获取。

接下来,函数调用 _cal_diversity_cal_novelty 函数分别计算给定动作的多样性奖励(div_reward)和新颖性奖励(nov_reward)。这两个函数分别评估动作的多样性和新颖性,并返回相应的得分。内在奖励是通过将多样性奖励和新颖性奖励与各自的权重(lambda_diversity 和 lambda_novelty)相乘并相加得到的。

最终奖励(final_reward)是通过将预测奖励、内在奖励和最小奖励值(MIN_R)相加得到的。这样的设计旨在综合考虑预测奖励和内在奖励(多样性和新颖性),以促进探索和利用之间的平衡。

注意:

  • 预测奖励的计算可能依赖于特定的用户模型和环境设置,需要根据实际情况进行适配。
  • 多样性和新颖性奖励的权重(lambda_diversity 和 lambda_novelty)是影响最终奖励计算的关键参数,应根据任务目标进行调整。
  • 最小奖励值(MIN_R)用于调整奖励的基线,可能需要根据不同的环境和任务进行调整。

输出示例: 假设预测奖励为5,多样性奖励为0.3,新颖性奖励为0.5,lambda_diversity为0.2,lambda_novelty为0.3,MIN_R为1,则最终奖励的计算过程如下: intrinsic_reward = 0.2 0.3 + 0.3 0.5 = 0.21 final_reward = 5 + 0.21 - 1 = 4.21 因此,该函数返回的最终奖励为4.21。


FunctionDef _cal_diversity(self, action)

_cal_diversity: 该函数用于计算动作的多样性得分。

参数:

  • action: 执行的动作,其类型和具体含义根据环境的不同而有所差异。

代码描述: _cal_diversity 函数旨在评估给定动作与历史动作集合的多样性。首先,如果环境任务(env_task)具有属性 lbe_item,则使用该属性的 inverse_transform 方法将动作转换为其原始表示(即 p_id)。如果没有 lbe_item 属性,动作本身即作为其原始表示。接下来,函数计算当前动作与历史动作之间的多样性得分。如果历史动作的数量小于或等于1,多样性得分直接返回0.0。否则,对于历史动作中的每一个动作,如果存在 lbe_item 属性,同样使用 inverse_transform 方法获取其原始表示(即 q_id),然后计算当前动作与该历史动作的相似度差(1 - 相似度),并累加。最后,将累加的总和除以历史动作数量减1,得到平均多样性得分,并返回该得分。

在项目中,_cal_diversity 函数被 _compute_pred_reward 函数调用,用于计算给定动作的内在奖励中的多样性部分。这是通过将动作的多样性得分与预设的多样性权重(lambda_diversity)相乘,然后与其他内在奖励(如新颖性奖励)相加,最终与预测奖励相加,从而影响最终的奖励值。

注意:

  • 该函数假设 item_similarity 是一个可访问的属性,其中包含了不同动作之间相似度的信息。
  • 动作的原始表示(p_id 或 q_id)的获取方式可能因环境的不同而有所变化,这需要在实际使用时根据环境特性进行适配。

输出示例: 假设历史动作集合中有3个动作,与当前动作的相似度分别为0.9, 0.8, 0.7,则多样性得分计算如下: div = (1 - 0.9) + (1 - 0.8) + (1 - 0.7) = 0.1 + 0.2 + 0.3 = 0.6 div /= 3 - 1 = 0.6 / 2 = 0.3 因此,该函数返回的多样性得分为0.3。


FunctionDef _cal_novelty(self, action)

_cal_novelty: 该函数的功能是计算给定动作的新颖性分数。

参数:

  • action: 执行的动作,可以是一个整数或其他形式,具体取决于环境任务的配置。

代码描述: 函数_cal_novelty旨在计算并返回一个给定动作的新颖性分数。它首先检查环境任务(self.env_task)是否具有lbe_item属性。如果有,这意味着动作需要通过lbe_iteminverse_transform方法转换为对应的项目ID(p_id)。如果没有lbe_item属性,动作本身被视为项目ID。接下来,通过项目ID索引到self.item_popularity字典中获取该项目的流行度(item_pop)。新颖性分数(nov)是通过对项目流行度加上一个非常小的数(1e-10)取负对数得到的。这样做是为了避免对数运算时分母为零的情况,并且通过取负对数,确保了流行度越低的项目,其新颖性分数越高。

在项目中,_cal_novelty函数被_compute_pred_reward函数调用,用于计算给定动作的内在奖励中的新颖性成分。_compute_pred_reward函数结合预测奖励、多样性奖励和新颖性奖励来计算最终的奖励值,其中新颖性奖励是通过调用_cal_novelty函数获得的。

注意:

  • 在使用_cal_novelty函数时,需要确保self.item_popularity已经被正确初始化,且包含了所有可能动作的流行度信息。
  • 该函数假设较低的项目流行度对应较高的新颖性,这一点在设计奖励机制时需要考虑。

输出示例: 假设某个动作对应的项目流行度为0.0001,那么_cal_novelty函数的返回值大约为9.2103。这个值是通过计算-np.log(0.0001 + 1e-10)得到的。


results matching ""

    No results matching ""