《Alleviating Matthew Effect of Offline Reinforcement Learningin Interactive Recommendation》笔记3.0

目录

一、论文解析(源于机器翻译)

4. 关于强化学习(Reinforcement Learning,RL)的基础知识

4.1强化学习基础

4.2基于模型的离线RL框架

5. 方法

5.1解决方案:推荐中基于模型的强化学习

5.2马太效应

5.3 解决方案:重新设计惩罚项

5.4 DORL方法

6. 实验

6.1 实验设置

6.1.1 推荐环境。

6.1.2 基线。

6.2 整体性能比较(RQ1)

6.3 减轻马太效应的结果(RQ2)

6.4 不同环境的结果(RQ3)

7 结论

致谢

二、代码阅读

2.1  run_worldModel_ensemble.py

2.1.1单步调试

2.1.2对获取训练数据集的步骤描述(第二步)

 2.1.3对获取的数据的描述(第二步)

① df_train(由df_data返回)

② list_feat

③df_feat(后与df_data连接)

④ **df_user**​​​​​​​

⑤ **df_item**

⑥ **x_columns**

⑦ **ab_columns**

⑧ **y_columns**

⑨ **dataset_train**(由dataset返回得到)

①① **df_val**(由df_data返回得到)

②② **list_feat**

③③ **df_user_val**(由df_user返回得到)

④④ **df_item_val**(由df_item返回得到)

⑤⑤ **dataset_val**

三、一点小ps

3.1df_user变空了

3.2 对2.1.3⑨中负采样的进一步描述

3.3 手写笔记


一、论文解析(源于机器翻译)

序号与论文的序号关系一致
请注意:该处为机器翻译的,准确性和正确性很低,仅为本文作者参考使用

4. 关于强化学习(Reinforcement Learning,RL)的基础知识

4.1强化学习基础

1. Reinforcement learning (RL) is the science of decision making.

强化学习是关于决策制定的科学。
   - 强化学习是一种机器学习方法,旨在通过智能体(agent)与环境的交互学习来做出最优决策。

2. We usually formulate the problem as a Markov decision process (MDP): 𝑀 = (S, A,𝑇 , 𝑟,𝛾), where S and A represent the state space and action space, 𝑇 (𝑠, 𝑎, 𝑠′) = 𝑃(𝑠𝑡+1 = 𝑠′|𝑠𝑡 = 𝑠, 𝑎𝑡 = 𝑎) is the transition probability from (𝑠, 𝑎) to 𝑠′, 𝑟(𝑠, 𝑎) is the reward of taking action 𝑎 at state 𝑠, and 𝛾 is the discount factor.

我们通常将问题表述为马尔可夫决策过程(Markov Decision Process,MDP):𝑀 = (S, A,𝑇 , 𝑟,𝛾),其中 S 和 A 表示状态空间和动作空间,𝑇 (𝑠, 𝑎, 𝑠′) = 𝑃(𝑠𝑡+1 = 𝑠′|𝑠𝑡 = 𝑠, 𝑎𝑡 = 𝑎) 是从状态 (𝑠, 𝑎) 转移到 𝑠′ 的转移概率,𝑟(𝑠, 𝑎) 是在状态 𝑠 采取动作 𝑎 的奖励,𝛾 是折扣因子。
   - MDP 是一种数学框架,用于描述强化学习中的决策问题。它包含了状态空间、动作空间、状态转移概率、奖励函数以及折扣因子。

3. Accordingly, the offline MDP can be denoted as 𝑀b = (S, A, b𝑇 , ˆ𝑟,𝛾), where 𝑇b and 𝑟ˆ are the transition probability and reward function predicted by an offline model.

因此,离线 MDP 可以表示为 𝑀b = (S, A, b𝑇 , ˆ𝑟,𝛾),其中 𝑇b 和 𝑟ˆ 是由离线模型预测的转移概率和奖励函数。
   - 这里提到了离线 MDP,指的是在离线数据集上进行强化学习训练的情况。离线模型通过预测转移概率和奖励函数来构建离线 MDP。

4. In offline RL, the policy is trained on an offline dataset D which was collected by a behavior policy 𝜋𝛽 running in online environment 𝑀.

在离线强化学习中,策略是在离线数据集 D 上进行训练的,该数据集由在线环境 𝑀 中运行的行为策略 𝜋𝛽 收集而来。
   - 离线强化学习是指在事先收集好的数据集上进行强化学习的方法,而不是在与环境的实时交互中进行学习。

5. By modifying the offline MDP 𝑀b to be conservative for overcoming the value overestimation issue, we will derive a modified MDP 𝑀e = (S, A, b𝑇 ,e𝑟,𝛾), where the modified reward e𝑟 is modified from the predicted reward 𝑟ˆ.

通过修改离线 MDP 𝑀b 来保守地解决值函数过高估计的问题,我们可以得到一个修正后的 MDP 𝑀e = (S, A, b𝑇 ,e𝑟,𝛾),其中修正后的奖励 e𝑟 是根据预测奖励 𝑟ˆ 进行修正的。
   - 这里提到了修正后的 MDP,目的是解决在离线强化学习中值函数过高估计的问题。修正后的奖励会对预测奖励进行修正,以更准确地估计累积奖励。

6. Since RL considers long-term utility, we can define the value function as 𝑉𝜋𝑀(𝑠) = E𝜋,𝑇 [Σ𝑡=0 ∞ 𝛾^𝑡 𝑟(𝑠𝑡, 𝑎𝑡)|𝑠0 = 𝑠], denoting the cumulative reward gain by policy 𝜋 after state 𝑠 in MDP 𝑀.

由于强化学习考虑了长期效用,我们可以将值函数定义为 𝑉𝜋𝑀(𝑠) = E𝜋,𝑇 [Σ𝑡=0 ∞ 𝛾^𝑡 𝑟(𝑠𝑡, 𝑎𝑡)|𝑠0 = 𝑠],表示在 MDP 𝑀 中状态 𝑠 后策略 𝜋 获得的累积奖励。
   - 值函数用于评估在给定策略下,从某个状态开始的累积奖励。通过将每个时间步的奖励乘以折扣因子的幂次,可以考虑未来奖励的衰减。

7. Let 𝑃𝜋𝑇,𝑡 be the probability of the agent's being in state 𝑠 at time 𝑡, if the agent uses policy 𝜋 and transits with 𝑇. Defining 𝜌𝑇𝜋(𝑠, 𝑎) = (1 − 𝛾)𝜋(𝑎|𝑠) Σ𝑡=0 ∞ 𝛾^𝑡𝑃𝜋𝑇,𝑡 (𝑠) as the discounted distribution of state-action pair (𝑠, 𝑎) for policy 𝜋 over 𝑇, we can derive another form of the policy's accumulated reward as 𝜂𝑀(𝜋) = E(𝑠,𝑎)∼𝜌𝑇𝜋 [𝑟(𝑠, 𝑎)].

让 𝑃𝜋𝑇,𝑡 表示在代理使用策略 𝜋 并且使用 𝑇 进行转移时,代理在时间 𝑡 处于状态 𝑠 的概率。定义 𝜌𝑇𝜋(𝑠, 𝑎) = (1 − 𝛾)𝜋(𝑎|𝑠) Σ𝑡=0 ∞ 𝛾^𝑡𝑃𝜋𝑇,𝑡 (𝑠) 作为策略 𝜋 在 𝑇 上的状态-动作对 (𝑠, 𝑎) 的折扣分布,我们可以推导出策略累积奖励的另一种形式,即 𝜂𝑀(𝜋) = E(𝑠,𝑎)∼𝜌𝑇𝜋 [𝑟(𝑠, 𝑎)]。
   - 这里介绍了另一种表达策略累积奖励的方式。通过计算策略 𝜋 在 MDP 𝑀 中的状态-动作对 (𝑠, 𝑎) 的折扣分布 𝜌𝑇𝜋(𝑠, 𝑎),可以计算策略累积奖励 𝜂𝑀= E(𝑠,𝑎)∼𝜌𝑇𝜋 [𝑟(𝑠, 𝑎)]。

4.2基于模型的离线RL框架

在本文中,我们采用了最先进的基于模型的离线策略优化框架MOPO3 [55]。基本思想是学习一个动力学模型 𝑇b,它捕捉环境中的状态转移 (𝑠, 𝑎) → 𝑠',并估计给定状态 𝑠 和动作 𝑎 的奖励 𝑟ˆ(𝑠, 𝑎)。为了解决价值函数 𝑉𝜋b𝑀(𝑠) 通常过于乐观估计的分布偏移问题,MOPO引入了一个惩罚函数𝑝(𝑠, 𝑎),作用于估计的奖励 𝑟ˆ(𝑠, 𝑎),形式为:
𝑟˜(𝑠, 𝑎) = 𝑟ˆ(𝑠, 𝑎) − 𝜆𝑝(𝑠, 𝑎)。 (1)
在修改后的奖励函数𝑟˜(𝑠, 𝑎)上,离线MDP 𝑀b 将被修改为保守的MDP:𝑀e = (S, A, b𝑇, ˜𝑟,𝛾)。MOPO在这个MDP 𝑀e 中学习其策略。通过定义𝜖𝑝 (𝜋) = E(𝑠,𝑎)∼𝜌𝜋b𝑇[𝑝(𝑠, 𝑎)],MOPO有以下理论保证:
定理 4.1. 如果惩罚函数 𝑝(𝑠, 𝑎) 满足:
𝜆E(𝑠,𝑎)∼𝜌𝜋b𝑇[𝑝(𝑠, 𝑎)] ≥ |𝜂 b𝑀(𝜋) − 𝜂𝑀(𝜋)|, (2)
那么在 𝑀e 中训练得到的最佳离线策略 ˆ𝜋 满足:
𝜂𝑀(ˆ𝜋) ≥ sup𝜋{𝜂𝑀(𝜋) − 2𝜆𝜖𝑝(𝜋)}。 (3)

证明可以在[55]中找到。方程(2)要求惩罚函数是离线和在线策略不匹配的度量,因此𝜖𝑝(𝜋)可以解释为策略 𝜋 受离线外推误差影响的程度。方程(3)被认为是基于模型的离线强化学习中奖励惩罚的理论保证。例如,𝜋∗ 表示在线MDP 𝑀 中的最优策略,我们有 𝜂𝑀(ˆ𝜋) ≥ 𝜂𝑀(𝜋∗) − 2𝜆𝜖𝑝(𝜋∗)。
备注:通过在保守的MDP 𝑀e 中离线学习 ˆ𝜋,使用方程(1),我们可以得到的结果不会与在真实MDP 𝑀 中在线学习最优策略 𝜋∗ 的结果相差太大。该偏差不会超过 2𝜆𝜖𝑝(𝜋∗)。然而,尚未对如何正确选择惩罚项 𝑝(𝑠, 𝑎) 进行充分的分析。接下来,我们将介绍如何将这个框架适应推荐系统,并根据推荐场景的特点重新定义 𝑝(𝑠, 𝑎)。

5. 方法

我们在推荐系统中实现了基于模型的离线强化学习框架,并对惩罚项进行了重新设计,以减轻伴随的马太效应。然后,我们介绍了提出的DORL模型。

5.1解决方案:推荐中基于模型的强化学习

在推荐系统中,我们无法直接从环境中获取状态,而是通过捕捉交互上下文和用户的情绪来建模状态。通常,状态 𝑠 ∈ S 被定义为从用户先前交互的物品和相应反馈中提取的向量。当系统推荐一个项目作为行动 𝑎 ∈ A 时,用户会给出反馈作为一个刻度奖励信号 𝑟 B 𝑅(𝑠, 𝑎)。例如,𝑟 ∈ {0, 1} 表示用户是否点击了该物品,或者𝑟 ∈ R+ 反映了用户观看视频的时间。状态转移函数(即状态编码器)𝑇可以写成 𝑠′ B 𝑓𝜔(𝑠, 𝑎, 𝑟),其中 𝑓𝜔(𝑠, 𝑎, 𝑟) 自回归地输出下一个状态 𝑠′,可以实现为任何顺序模型。

在离线学习中,我们无法获得不在离线数据集中的物品的用户反应。为了解决这个问题,我们使用一个用户模型(或奖励模型)𝑅b(𝑠, 𝑎) 来学习用户的静态兴趣。这个模型可以实现为任何先进的推荐器,如 DeepFM [19]。用户模型将生成一个估计的奖励 𝑟ˆ = 𝑅b(𝑠, 𝑎),表示用户对物品的内在兴趣。转移函数 𝑇b 将被写成 𝑠′ B 𝑓𝜔(𝑠, 𝑎,𝑟ˆ)。离线 MDP 被定义为 𝑀b = (S, A, b𝑇 , ˆ𝑟,𝛾)。由于估计奖励 𝑟ˆ 可能偏离实际值 𝑟,我们遵循 MOPO 的方法使用方程式 (1) 来得到修改后的奖励 𝑟˜(𝑠, 𝑎) = 𝑟ˆ(𝑠, 𝑎) − 𝜆𝑝(𝑠, 𝑎)。然后,我们可以使用修改后的奖励 𝑟˜ 来训练推荐策略,将用户模型视为模拟用户。

现在,问题变成了设计惩罚项 𝑝(𝑠, 𝑎)。首先,我们扩展了[37, 55]中的不匹配函数。我们使用 𝑅 和 𝑅b 来简写 𝑅(𝑠, 𝑎) 和 𝑅b(𝑠, 𝑎)。引理 5.1 定义了一个策略 𝜋 在真实 MDP 𝑀 和估计 MDP 𝑀b 上的不匹配函数 𝐺𝜋b𝑀(𝑠, 𝑎):

𝐺𝜋b𝑀(𝑠, 𝑎) = E𝑠ˆ′∼b𝑇,𝑟ˆ∼𝑅b[𝛾𝑉𝜋𝑀(𝑠ˆ′) + 𝑟ˆ] - E𝑠′∼𝑇,𝑟∼𝑅[𝛾𝑉𝜋𝑀(𝑠′) + 𝑟]. (4)

这个函数衡量了策略 𝜋 在真实 MDP 和估计 MDP 上的不匹配程度。

公式(5)可以表示为:

E(𝑠,𝑎)∼𝜌𝜋𝑇b[𝐺𝜋b𝑀(𝑠, 𝑎)] = 𝜂b𝑀(𝜋) − 𝜂𝑀(𝜋)                (5)

在这个公式中,我们有以下符号的含义:
- E(𝑠,𝑎)表示在状态-动作对(𝑠,𝑎)上的期望值。
- 𝜌表示状态-动作对的分布。
- 𝜋表示推荐系统的策略。
- 𝑇b表示基于𝑏的状态转移概率。
- 𝐺𝜋b𝑀(𝑠, 𝑎)是不匹配函数,衡量了在𝑠状态下采取动作𝑎时的不匹配程度。
- 𝜂b𝑀(𝜋)是在保守策略𝜋下的最大回报。
- 𝜂𝑀(𝜋)是在最优策略下的最大回报。

公式的含义是,在保守型马尔可夫决策过程中,基于策略𝜋的状态-动作对的期望回报等于在𝜋下的最大回报与保守策略𝜋下的最大回报之差。这个公式表明了策略𝜋的性能与最优策略之间的差距,以及保守策略的影响。

首先,等式(5)表明了在保守型马尔可夫决策过程中,期望回报的估计值与真实回报的差异。这个等式的左边表示在保守策略下,从状态𝑠经过动作𝑎的转移的预期回报,右边表示在最优策略下的最大回报与当前策略的回报之差。

不匹配函数𝐺𝜋b𝑀(𝑠, 𝑎)扩展了之前文献[55]中的定义,将状态转移函数分成了状态𝑠和奖励𝑟两部分。这是因为在推荐系统的背景下,状态的随机性仅来自与奖励信号𝑟相关的随机性。因此,在整合状态转移时,明确表达奖励𝑟的影响是必要的。引理5.1的证明可以从文献[37]中的"telescoping lemma"的证明过程进行改编。

根据保守性的理念,我们根据不匹配函数𝐺𝜋b𝑀(𝑠, 𝑎)添加了一个惩罚项𝑝(𝑠, 𝑎),假设满足以下条件:

𝜆𝑝(𝑠, 𝑎) ≥ |𝐺𝜋b𝑀(𝑠, 𝑎)|,                (6)

结合等式(5)和等式(6),满足等式(2)的条件,为保守型马尔可夫决策过程中学习的推荐策略𝜋提供了理论保证。

值得注意的是,引理5.1为设计满足定理4.1中的理论保证的惩罚项𝑝(𝑠, 𝑎)提供了一种视角。根据等式(6),定义𝑝(𝑠, 𝑎)的问题转化为分析𝐺𝜋b𝑀(𝑠, 𝑎),这将在第5.3节中描述。

原始的MOPO模型将动力学模型的不确定性𝑃𝑈作为惩罚项,即𝑝(𝑠, 𝑎) = 𝑃𝑈。然而,惩罚不确定性会导致模型更关注经常推荐的项目,而忽视很少被推荐的项目。这将加速马太效应的发生。

5.2马太效应


为了量化推荐结果中的马太效应,我们使用了一个指标:主导类别占比(Majority Category Domination,MCD),其定义为在训练数据中被标记为主导类别的推荐项目所占的百分比。

我们通过调整公式(1)中的系数𝜆来展示MOPO的保守性效果。在KuaiRec数据集上的结果如图3所示。随着𝜆的增加,模型获得了更高的单轮奖励(蓝线),这意味着策略更准确地捕捉了用户的兴趣。另一方面,主导类别占比也增加了(红色柱状图),这意味着推荐的项目倾向于是训练数据中最流行的类别(覆盖了80%的项目)。也就是说,策略越保守,马太效应就越明显。

当结果局限于这些类别时,用户的满意度会受到影响,交互过程会提前终止,从而导致交互序列中的累积奖励较低。更多细节将在第6节中描述。

5.3 解决方案:重新设计惩罚项

为了解决这个问题,我们考虑以更复杂的方式设计公式(1)中的惩罚项𝑝(𝑠, 𝑎)。我们将公式(4)中的不匹配函数进行拆解,得到如下形式:
|𝐺𝜋b𝑀(𝑠, 𝑎)| ≤𝛾 |E𝑟ˆ∼𝑅b[𝑉𝜋𝑀(𝑓𝜔(𝑠, 𝑎,𝑟ˆ))] − E𝑟∼𝑅[𝑉𝜋𝑀(𝑓𝜔(𝑠, 𝑎, 𝑟))]|
+ |E𝑟ˆ∼𝑅b𝑟 − E𝑟∼𝑅𝑟| B 𝛾𝑑𝑉(b𝑅, 𝑅) + 𝑑1(b𝑅, 𝑅) (7)
其中,𝑑1(b𝑅, 𝑅)表示估计奖励𝑅b与真实奖励𝑅之间的偏差,𝑑𝑉(b𝑅, 𝑅)衡量了离线计算的下一个状态的值函数𝑉𝜋𝑀(通过𝑅b进行计算)与在线计算的值函数𝑉𝜋𝑀(通过𝑅进行计算)之间的差异。这两个值可以看作是衡量𝑅b和𝑅之间距离的具体指标。虽然𝑑1(b𝑅, 𝑅)比较直观,但𝑑𝑉(b𝑅, 𝑅)考虑了离线学习的长期效果,难以估计。根据前面的分析,MOPO中的悲观奖励模型𝑅b会放大马太效应,降低长期满意度,从而导致较大的𝑑𝑉(b𝑅, 𝑅)。

解决这个困境的一种直观方法是在具有高熵的日志策略状态上引入探索。由于无法获取在线用户反馈,我们只能在离线数据中进行反事实探索。

• 一个说明性例子。为了说明这个想法,我们在图4中给出了一个例子。目标是根据由行为策略引发的日志数据估计用户的偏好。在现实中,日志数据的分布取决于先前推荐系统的策略。为了方便起见,我们在图4(a)中使用了一个高斯分布作为行为策略。由于先前的推荐系统无法准确反映用户的真实偏好,行为策略(红线)与用户的真实偏好(蓝线)之间总是存在偏差。

此外,由于项目在行为策略中的曝光不均匀,对于那些很少出现的项目估计会存在较高的不确定性(如填充区域所示)。离线强化学习方法强调在估计中的保守性,并对不确定的样本进行惩罚,导致偏好被限制在这些主导项目上(绿线)。这就是马太效应的产生方式。

相比之下,使用均匀分布来收集数据可以防止偏见并减少不确定性(图4(b))。理想情况下,在足够的均匀采集的数据上学习的策略可以捕捉到无偏的用户偏好,并产生没有马太效应的推荐,即𝛾𝑑𝑉(b𝑅, 𝑅) + 𝑑1(b𝑅, 𝑅)可以减少到0。因此,一种直观的设计惩罚项𝑝(𝑠, 𝑎)的方法是添加一个项:均匀分布𝜋𝑢(·|𝑠)和行为策略𝜋𝛽(·|𝑠)在给定状态𝑠下的行为差异。

我们使用Kullback-Leibler散度𝐷𝐾𝐿(𝜋𝛽(·|𝑠)||𝜋𝑢(·|𝑠))来衡量这个差距,可以写成:
𝑃𝐸 := − 𝐷𝐾𝐿(𝜋𝛽(·|𝑠)||𝜋𝑢(·|𝑠))
= − E𝑎∼𝜋𝛽 (· |𝑠) [log(𝜋𝛽(𝑎|𝑠)) − log(𝜋𝑢(𝑎|𝑠))]
= H(𝜋𝛽(·|𝑠)) − log(|A|),

其中|A|是表示项目数量的常数。因此,项𝑃𝐸取决于给定状态𝑠下行为策略𝜋𝛽(·|𝑠)的熵。修改后的惩罚项可以写为𝑝(𝑠, 𝑎) = 𝑃𝑈 + 𝑃𝐸,修改后的奖励模型将被定义为:
𝑟˜(𝑠, 𝑎) = 𝑟ˆ(𝑠, 𝑎) − 𝜆1𝑃𝑈 + 𝜆2𝑃𝐸。

除了惩罚高度不确定的区域外,新模型还惩罚在状态𝑠下熵较低的策略。直观来说,如果行为策略𝜋𝛽(·|𝑠)只推荐了少数项目,那么在状态𝑠下真实的用户偏好可能没有被揭示出来。在这种情况下,熵项H(𝜋𝛽(·|𝑠))较低,因此我们通过较大的𝑃𝐸惩罚估计的奖励𝑟ˆ(𝑠, 𝑎)。

熵惩罚项不依赖于选择的动作,而只依赖于代理所处的状态。这意味着这种惩罚的效果将是间接的,并惩罚导致较少多样状态的动作,因为考虑了长期优化。因此,学习到的策略在离线数据中实现了反事实的探索,从而抵消了离线强化学习中的马太效应。

5.4 DORL方法

现在,我们提供了一个实际的实现,这是基于上述分析而提出的模型称为偏置模型离线强化学习(DORL)模型,其框架如图6所示。
• 熵惩罚。我们介绍如何在熵惩罚模块中计算PE。图5显示了交互过程的轨迹,其中时间t的当前动作是推荐物品8。我们在公式(9)中定义PE为k阶熵(k = 1, 2, · · · )的总和。例如,当k = 3时,我们搜索所有用户的推荐日志,收集具有模式[{3, 7, 8}, ?]的所有连续子序列,其中"?"可以匹配任何物品,{3, 7, 8}是一个排序集合,可以包括它的所有枚举,例如[8, 3, 7]或[7, 3, 8]。在这些子序列上,我们可以计算动作"?"的频率,从而估计给定前三个推荐物品的行为策略𝜋𝛽的熵。为了不失一般性,我们将熵归一化到(0,1]范围内。
• 不确定性惩罚。我们对奖励模型的认知不确定性和离线数据的遗漏不确定性进行惩罚。我们使用K个集成奖励模型{𝑅b𝜃𝑘,𝑘 = 1, 2, · · ·,𝐾}的方差来捕捉认知不确定性,这通常用于捕捉离线RL模型的不确定性[33]。遗漏不确定性是数据相关的[26]。通过将用户模型定义为高斯概率模型(GPM),我们可以直接预测奖励的方差,并将此预测方差作为遗漏不确定性。对于第k个模型𝑅b𝜃𝑘,损失函数为:
L (𝜃𝑘) = 1𝑁∑︁𝑁𝑖=1 12𝜎𝜃2𝑘(𝑥𝑖)∥𝑦𝑖 − 𝑓𝜃𝑘(𝑥𝑖)∥2 + 12log 𝜎𝜃2𝑘(𝑥𝑖)(10)
这里𝑁是样本数,𝑓𝜃𝑘(𝑥𝑖)和𝜎𝜃2𝑘(𝑥𝑖)分别是样本𝑥𝑖的预测均值和方差。通过结合认知不确定性和遗漏不确定性,我们将不确定性惩罚𝑃𝑈在公式(9)中定义为:𝑃𝑈 := max𝑘 ∈ {1, 2, · · · , 𝐾} 𝜎𝜃2𝑘。
我们将拟合的奖励𝑟ˆ定义为K个集成模型的均值:𝑟ˆ(𝑠, 𝑎) = 1𝐾∑︁Í 𝑘 𝑓𝜃𝑘(𝑠, 𝑎)。最终修改后的奖励𝑟˜(𝑠, 𝑎)将通过公式(9)计算。
所提出的DORL模型的框架如图6所示。为了不失一般性,我们使用DeepFM [19]作为用户模型的基础,并使用Actor-Critic方法[28]作为RL策略。
状态跟踪器𝑓𝜔(𝑠, 𝑎, 𝑟)是一个模拟转移函数𝑇(𝑠, 𝑎, 𝑠′) = 𝑃(𝑠𝑡+1 = 𝑠′|𝑠𝑡 = 𝑠, 𝑎𝑡 = 𝑎)的网络模型。它可以实现为任何顺序模型,如基于循环神经网络(RNN)的模型[44]、卷积模型[40, 56]或基于Transformer的方法[12, 25, 51]。Huang等人[22]研究了RL推荐系统中不同状态编码器的性能。我们使用一个简单的平均层作为状态跟踪器,因为它需要最少的训练时间,但仍然胜过许多复杂的编码器[22]。它可以表示为:
𝑠®𝑡+1 B1𝑁𝑡∑︁𝑛=𝑡−𝑁 +1[®𝑒𝑎𝑛 ⊕ 𝑟˜𝑛](11)
这里⊕是连接符号,𝑠®𝑡+1是表示时间𝑡+1的状态向量,𝑒®𝑎𝑛是动作𝑎𝑛的嵌入向量,𝑟˜𝑛是由公式(9)计算得到的奖励值,我们在这里将其归一化到(0,1]范围内,𝑁是反映计算多少个先前的物品-奖励对的窗口大小。

6. 实验

我们介绍了如何在交互式推荐设置中评估提出的DORL模型。我们希望调查以下问题:
• (RQ1)与最先进的离线强化学习方法相比,DORL在交互式推荐设置中的表现如何?
• (RQ2)DORL在多大程度上能够缓解马太效应并追求长期用户体验?
• (RQ3)DORL在具有不同用户对重复内容的容忍度的不同环境中的表现如何?

6.1 实验设置

我们介绍了与环境和最先进的离线强化学习方法相关的实验设置。

6.1.1 推荐环境。

如第2.2节所述,在交互式推荐设置中,我们关注的是用户的长期满意度,而不是用户的拟合能力[8]。传统的推荐数据集过于稀疏或缺乏必要的信息(例如时间戳、显式反馈、物品类别),无法评估交互式推荐系统。我们在两个最近提出的数据集KuaiRec和KuaiRand-Pure上创建了两个推荐环境,这两个数据集包含高质量的日志数据。
KuaiRec [14]是一个视频数据集,其中包含一个完全观察到的用户-物品交互矩阵,其中1411个用户观看了3327个视频并留下了反馈。通过将完全观察到的矩阵视为用户的真实兴趣,我们可以为模型的每个推荐给出一个奖励(与其他数据集不同,没有缺失条目)。我们使用归一化的观看时间(即观看时间与视频长度的比值)作为在线奖励。
KuaiRand-Pure [15]是一个视频数据集,将1186059个随机推荐插入到27285个用户的标准推荐流中,涉及7583个物品。这些随机曝光的数据可以反映用户的无偏好好,我们可以通过这些数据完成矩阵,以模拟KuaiRec中的完全观察矩阵。这是评估基于强化学习的推荐系统的有效方法[22,23]。我们使用“is_click”信号来表示用户的真实兴趣,即作为在线奖励。
在第3节中,我们已经展示了用户的体验可能会受到马太效应的影响。为了让环境反映这一现象,我们按照[12,52]的方法引入了一个退出机制:当模型在前N轮中推荐了超过M个相同类别的物品时,交互终止。注意,同一物品不会在一个交互序列中被推荐两次。由于我们通过交互轨迹上的累积奖励Í 𝑡 𝑟𝑡来评估模型,因此由于马太效应而提前退出将导致性能下降。目前,这两个环境可以起到与在线用户相同的作用。因此,我们可以像图1(b)所示的过程中评估模型。
评估环境用于评估模型,训练阶段不可用。为了训练目的,KuaiRec和KuaiRand提供了额外的推荐日志。训练数据的统计数据如表1所示。

6.1.2 基线。

基线方法。在评估中,我们选择了两种天真的基于多臂赌博机的算法、四种model-free 的离线强化学习方法和四种model-based 的离线强化学习方法(包括我们的方法)。我们在这两种基于多臂赌博机的方法和四种基于模型的方法中使用DeepFM模型[19]作为基础模型。这些基线方法包括:

• 𝜖-贪心(𝜖-greedy):一种天真的基于多臂赌博机的策略,以概率𝜖输出随机结果,以概率1-𝜖输出DeepFM的确定性结果。
• UCB:一种天真的基于多臂赌博机的策略,为每个物品维护一个上限置信区间,并在面对不确定性时遵循乐观的原则。
• SQN(Self-Supervised Q-learning)[50]:包含两个输出层(头部)的方法:一个用于交叉熵损失,另一个用于强化学习。我们使用强化学习头部生成最终的推荐结果。
• BCQ(Batch-Constrained deep Q-learning)[11]:将传统的深度Q-learning方法适应于批强化学习。我们使用离散动作版本[10],其核心思想是拒绝这些不确定的数据,并仅使用高置信度数据来更新策略。
• CQL(Conservative Q-Learning)[31]:一种基于模型的离线强化学习方法,在演员-评论家策略之上添加了Q值正则化器。
• CRR(Critic Regularized Regression)[46]:一种基于模型的离线强化学习方法,通过避免超出分布(OOD)的动作来学习策略。
• MBPO(Model-Based Policy Optimization):一种基本的基于模型的策略优化方法,使用DeepFM作为用户模型来训练演员-评论家策略。
• IPS(Inverse Propensity Scoring)[39]:一种著名的统计技术,通过重新加权收集数据中的每个样本来调整目标分布。我们在基于DeepFM的用户模型中实现了IPS,然后使用演员-评论家方法来学习策略。
• MOPO(Model-Based Offline Policy Optimization)[55]:一种基于模型的离线策略优化方法,对基于DeepFM的用户模型的不确定性进行惩罚,然后学习演员-评论家策略。

这些基线方法将与我们的DORL模型进行比较,以评估其在交互式推荐设置中的性能。评估的重点将是衡量该模型与最先进的离线强化学习方法相比的表现,以及其缓解马太效应并追求长期用户体验的能力,以及在具有不同用户对重复内容容忍度的不同环境中的表现。

6.2 整体性能比较(RQ1)

我们在两个环境中评估了所有方法。对于四种基于模型的强化学习方法(MBPO、IPS、MOPO和我们的DORL),我们使用相同的DeepFM模型作为用户模型,并固定其参数,以确保差异仅来自策略。我们使用网格搜索技术来调整两个环境中所有方法的关键参数。对于DORL,我们搜索方程(9)中两个关键参数𝜆1和𝜆2的组合。它们都在{0.001、0.005、0.01、0.05、0.1、0.5、1.0、5、10、50、100}中进行搜索。我们报告了在KuaiRand环境下𝜆1 = 0.01,𝜆2 = 0.05和在KuaiRec环境下𝜆1 = 0.05,𝜆2 = 5的结果。两个环境中的所有方法都使用相同的退出参数进行评估:𝑀 = 0,𝑁 = 4,并将最大轮数设置为30。结果是100个交互轨迹的平均指标。
结果显示在图7中,其中所有策略都是在进行了200个周期的学习后得到的。在每个周期的学习之后,我们将在两个交互环境中使用100个剧集(即交互轨迹)对所有方法进行评估。第一行显示的是累积奖励,直接反映了我们交互式推荐设置中的长期满意度。第二行和第三行将累积奖励分解为两部分:交互轨迹的长度和单轮奖励。为了更好地比较,我们对200个周期的结果进行平均,并在表2中显示。除了这三个指标,我们还报告了主要类别占优(MCD)的结果。
从结果中,我们观察到四种基于模型的强化学习方法(MBPO、IPS、MOPO和DORL)在交互轨迹长度和累积奖励方面明显优于四种基于模型的强化学习方法(SQN、CRR、CQL和BCQ)。这是因为基于模型的强化学习比基于模型的强化学习更加高效。在推荐中,训练数据非常稀疏。基于模型的强化学习直接从我们根据上述退出规则拆分成不同序列的推荐日志中进行学习。然而,从稀疏的日志中捕捉退出机制是非常困难的。相比之下,基于模型的强化学习可以利用用户模型在训练过程中构建尽可能多的交互序列,这保证了策略可以从有限的离线样本中提取有用的知识。这就是为什么我们在推荐中采用基于模型的强化学习的原因。

对于基于模型的强化学习方法,MOPO在单轮奖励方面相对于传统方法MBPO表现出明显的改进。这是因为MBPO在离线数据中没有考虑到OOD(Out-of-Distribution)动作,这会导致策略在推理过程中产生外推错误。而MOPO引入了不确定性惩罚项,使策略更加关注高置信度的样本,从而更准确地捕捉用户的兴趣。然而,MOPO牺牲了许多不受欢迎的物品,因为它们出现的频率较低,被认为是不确定的样本。因此,平均长度减小,从而降低了累积奖励。我们的方法DORL克服了这个问题。从图7中,我们观察到DORL在KuaiRec和KuaiRand两个环境中经过几个周期后达到了最大的平均累积奖励,这是因为它达到了最长的交互长度。与MOPO和MBPO相比,DORL由于其反事实探索理念,在单轮奖励方面稍微有所牺牲,同时,这极大地改善了多样性并增加了交互的长度。因此,它实现了最大化用户长期体验的目标。在将传统的MBPO与IPS技术相结合后,学习到的用户模型通过重新加权所有物品来调整训练数据的分布。IPS在KuaiRec中取得了令人满意的性能,但在KuaiRand中表现不佳。这是由于其众所周知的高方差问题可能导致估计误差。与IPS的硬偏置机制相比,DORL的软偏置方法更适合推荐中的基于模型的强化学习。

对于free模型的强化学习方法,正如上文所讨论的,由于离线样本有限,四种基于模型的方法在两个数据集中表现不佳。尽管它们可以通过返回高单轮奖励(例如KuaiRec中的SQN和CRR,以及KuaiRand中的BCQ)来捕捉用户的兴趣,但它们无法保持较长的交互轨迹。例如,BCQ仅在具有高置信度的样本上更新其策略,这导致推荐结果中出现严重的马太效应(通过高MCD和短长度反映出来)。SQN的性能波动幅度最大,因为它的网络通过两个头进行更新。强化学习头充当自监督头的正则化器。当两个头的目标相互冲突时,性能变得不稳定。因此,这些方法不适用于离线数据稀疏的推荐场景。

至于朴素的强盗方法UCB和𝜖-贪心,它们设计用于探索和开发独立同分布(IID)数据的最优动作。它们甚至没有优化长期奖励的能力。因此,当模型完成对离线数据的探索时,它们倾向于推荐相同的物品,这导致MCD较高并且交互长度较短。这些朴素策略不适合追求推荐中的长期用户体验。

6.3 减轻马太效应的结果(RQ2)

我们在图3中展示了惩罚不确定性会导致推荐中的马太效应。具体来说,增加𝜆1会使得推荐的物品成为训练集中最主导的物品,从而导致较高的MCD值。在这里,我们展示了引入的“反事实”探索机制如何帮助减轻这种效应。我们进行了不同组合的实验(𝜆1,𝜆2),然后在𝜆1上进行结果平均,以展示𝜆2单独的影响。

结果如图8所示。显然,增加𝜆2可以延长交互过程并减少大多数类别的主导。也就是说,当我们强烈惩罚行为策略的熵时,(1)推荐系统不会重复相同类别的物品;(2)推荐结果将是多样化的,而不是聚焦在主导物品上。结果显示,在减轻马太效应方面,DORL中惩罚熵的有效性。

6.4 不同环境的结果(RQ3)

为了验证DORL在不同环境设置下的稳健性,我们变化退出机制中的窗口大小𝑁,并在评估过程中固定𝑀 = 10. 结果如图9所示。我们只展示了最重要的指标:累积奖励。

当𝑁较小(𝑁 = 1)时,其他基于模型的方法可能超过我们的DORL。当𝑁变大(𝑁 > 3)时,用户对相似内容(即具有相同类别的物品)的容忍度降低,交互过程更容易终止。在这种情况下,DORL优于所有其他策略,这证明了DORL在不同环境中的稳健性。

7 结论

我们指出,在离线强化学习中的保守性可能会导致推荐中的马太效应。我们进行了研究,展示了马太效应对音乐和视频数据集中用户的长期体验的伤害。通过对基于模型的强化学习框架的理论分析,我们发现放大马太效应的原因是抑制不确定样本的理念。这启发我们添加一个惩罚项,使策略强调由具有高熵的行为策略引起的数据。这将重新引入被保守性抑制的探索机制,从而减轻马太效应。

在未来,当适应用户兴趣不再是瓶颈时,研究人员可以考虑更高级的目标,比如追求用户的长期满意度[57]或优化社会效用[17]。随着高质量离线数据的增加,我们相信离线强化学习可以更好地适应推荐系统,实现这些目标。在这个过程中,将提出许多有趣但具有挑战性的问题(例如本文中的马太效应)。解决这些问题之后,我们可以创建更智能的推荐系统,造福社会。

致谢

本工作得到了中国国家重点研发计划(2021YFF0901603)、国家自然科学基金(61972372、U19A2079、62121002)和中国文化和旅游部CCCD重点实验室的支持。

二、代码阅读

2.1  run_worldModel_ensemble.py

请注意:此处2.1.1和2.1.2多为过程的记录且十分繁琐,不必去看,重点去看2.1.3及以后

2.1.1单步调试

python run_worldModel_ensemble.py --env KuaiEnv-v0  --cuda 0 --epoch 5 --loss "pointneg" --message "pointneg" &

 

2.1.2对获取训练数据集的步骤描述(第二步)

main() -> prepare_dataset() -> load_dataset() -> get_training_data() -> KuaiEnv.get_df_kuairec() -> load_category() -> 

首先进入到了主函数的第二步

进入 prepare_dataset() 函数中

 接着进入 load_dataset_train()函数中

进入 get_training_data()函数中

继续进入 get_df_kuaire()函数中

再次进入 load_category()函数中,

该函数对 item_categories.csv 文件的内容进行了处理,将他们都变成了4列,索引为item_id,这四列代表了这个视频所属的类别,也就是说一个视频可以同时被划分为4个类别中,但是因为有的视频并不能被划分为4个类别,可能只能被划分为1个,那么剩下的NAN就会被处理掉,变成-1,然而-1是负数,为保证特征值非负,将4个可所属元素都加1。也就是说第一行的【9 0 0 0】代表了 item_id为0的视频,所属类别为类别 8 这与 item_categories.csv 文件的内容是对齐的

 返回上一级get_df_kuaire()函数,继续进入 load_user_feat()函数

该函数选取了user_features.csv文件中的26列并稍微处理了一下,组成了df_user 其形状为:(7176,26),返回df_user

 跳出load_user_feat()函数,返回上一级get_df_kuaire()函数,继续进入 load_item_feat()函数

 进入后,先进入load_category()函数,获取和之前一样的df_feat以及list_feat,进入load_video_duration()函数

完成,返回 load_item_feat()函数, load_item_feat()函数也执行结束,返回 df_item ,他是由df_feat和video_mean_duration通过左连接成的

返回get_df_kuaire()函数

返回df_data, df_user, df_item, list_feat

跳出get_df_kuaire()回到 get_training_data

返回 df_train, df_user, df_item, list_feat

跳出 get_training_data()回到 load_dataset_train()

经过 get_xy_columns()函数后得到 x_columns, y_columns, ab_columns,

 接着进入 negative_sampling()函数进行负采样

negative_sampling()完成后返回正负样本给 load_dataset_train(),对正负样本进行处理,

提取正负样本中的 user_features + item_features列生成新的正负样本,一家有7个元素

拼接后稍微处理一下,赋值给 df_x_all,再经过以下三行代码后就华丽变身为dataset了

返回以dataset为首的几个数据给 prepare_dataset()里的几个变量,其中dataset赋值给了 dataset_train

 结束prepare_dataset()

基础数据准备完毕

 2.1.3对获取的数据的描述(第二步)

①~⑨为获取dataset_train, df_user, df_item, x_columns, y_columns, ab_columns所使用的关键变量。①①~⑤⑤为获取dataset_val, df_user_val, df_item_val所使用的关键变量。其中,**xx**表示最终返回并使用的数据。

① df_train(由df_data返回)

生成方式简要描述:

首先,从big_matrix_processed.csv中提取以下五列

['user_id'  'item_id'  'timestamp'  'watch_ratio_normed'  'duration_normed']

 对应关系如下:

此时 df_data = {DataFrame:(12530806,5)}

后再次和df_feat通过item_id进行左连接

结果及描述:

df_data = {DataFrame:(12530806,9)} 

第一行

表示0号用户在1593878903.43800这个时间戳下(2020-07-05 00:08:23.438000),观看了3649号视频。该视频的标准化时长为-0.11252,标准化观看率为0.40106,并且该视频属于类别9。

② list_feat

生成方式简要描述:

从item_catagories.csv中提取全部数据并变成list

结果及描述:

list_feat= {list:(10728)}

第一个数据[8]表示0号视频属于类别8

③df_feat(后与df_data连接)

生成方式简要描述:

将 list_feat 经过处理后(创建一个新的DataFrame df_feat,其中的列名为 ['feat0', 'feat1', 'feat2', 'feat3'],并将索引命名为 "item_id",将缺失值赋值为-1,并将全部的值+1)生成 df_feat

结果及描述:

df_feat= {DataFrame:(10728,4)}

第一行

表示0号视频属于类别8

④ **df_user**

生成方式简要描述:

首先,从user_features.csv中提取以下26列

对下面的列进行了如下操作

处理方式如下:

以user_id为索引后,剩余25列

结果及描述:

df_user= {DataFrame:(7176,25)}

第一行

表示 0号用户的活跃程度为高度活跃,并且该用户不是直播主播也不是视频作者。该用户关注用户数量范围为1(此处经过编码后可理解为xxx程度),粉丝用户数量范围为1,好友用户数量范围为1,注册天数范围为5.经过独热编码(One-Hot Encoding)处理的特征列onehot_feat 数据分别为……(此处onehot_feat 列所代表的具体含义不明)

注意:最后的最后返回的df_user为 {DataFrame:(7176,0)},仅有索引表示用户id

⑤ **df_item**

生成方式简要描述:

video_mean_duration是从video_duration_normed.csv文件中提取的

df_item是将df_feat和video_mean_duration通过item_id进行左连接成的,其中df_feat= {DataFrame:(10728,4)}、video_mean_duration = {Series:(10728,)}

结果及描述:

df_item= {DataFrame:(10728,5)}

第一行

表示0号视频属于类别8,其标准化的时长为-0.42551

⑥ **x_columns**

生成方式简要描述:

首先,将用户 ID 列构建为稀疏特征列,并将其添加到 x_columns 列表中。df_data['user_id'].max() + 1 计算了用户 ID 列的最大值,并加一作为嵌入维度。

然后,根据 user_features 列表中的用户特征列,依次创建稀疏特征列,并将它们添加到 x_columns 列表中。每个特征列的嵌入维度为 feature_dim,并且使用 df_user[col].max() + 1 计算了对应特征列的最大值,并加一作为嵌入维度。

接着,将物品 ID 列构建为稀疏特征列,并将其添加到 x_columns 列表中。嵌入维度为 entity_dim,并使用 df_data['item_id'].max() + 1 计算了物品 ID 列的最大值,并加一作为嵌入维度。

再然后,根据上面定义的 feat 列表,依次创建稀疏特征列,并将它们添加到 x_columns 列表中。这些特征列用于处理 df_item 数据框中以 "feat" 开头的列。每个特征列的嵌入维度为 feature_dim,并使用 df_item[feat].max().max() + 1 计算了所有特征列的最大值,并加一作为嵌入维度。这些特征列共享相同的特征嵌入,并使用填充索引为 0。

最后,创建了一个密集特征列,用于处理名为 "duration_normed" 的特征列。这个特征列的维度为 1。

结果及描述:

x_columns= {list:(7)} 

第一行

[SparseFeatP(name='user_id', vocabulary_size=7176, embedding_dim=8, use_hash=False, dtype='int32', embedding_name='user_id', group_name='default_group')

表示一个稀疏特征列的配置,代表了用户ID特征,在模型中使用了固定大小的嵌入表示,嵌入维度为8。它不使用哈希技术进行编码,并且在模型中被分配了唯一的嵌入名称和组名。在模型中,该特征列表示输入特征列。并且,这些参数描述了特征列的各个属性,包括名称、取值范围、嵌入维度等,便于正确地处理和表示模型的输入数据。

具体来说:

name='user_id':特征列的名称为'user_id',表示该特征列对应于用户ID。
vocabulary_size=7176:该特征列的词汇表大小为7176,表示该特征可能的取值数量,意味着用户ID的取值范围是0到7175。
embedding_dim=8:该特征列的嵌入维度为8,表示用户ID在模型中的嵌入表示将具有8维。
use_hash=False:表示不使用哈希技术对用户ID进行编码。如果为True,则会使用哈希技术将用户ID映射到固定长度的整数,否则将使用原始的整数编码。
dtype='int32':表示用户ID的数据类型为32位整数。
embedding_name='user_id':指定该特征列的嵌入名称为'user_id',这个名称将用于在模型中唯一标识该特征列的嵌入层。
group_name='default_group':指定该特征列所属的组名为'default_group',用于在定义模型结构时对特征列进行分组。

⑦ **ab_columns**

生成方式简要描述:

 结果及描述:

ab_columns= {list:(2)} 

第一行

[SparseFeatP(name='alpha_u', vocabulary_size=7176, embedding_dim=1, use_hash=False, dtype='int32', embedding_name='alpha_u', group_name='default_group')

表示一个稀疏特征列的配置,代表了辅助变量alpha_u,在模型中使用了1维的固定大小的嵌入表示。它不使用哈希技术进行编码,并且在模型中被分配了唯一的嵌入名称和组名。在模型中,该特征列表示辅助特征列

具体来说:

name='alpha_u':特征列的名称为'alpha_u',表示该特征列对应于辅助变量alpha_u。
vocabulary_size=7176:该特征列的词汇表大小为7176,意味着alpha_u的取值范围是0到7175。
embedding_dim=1:该特征列的嵌入维度为1,表示alpha_u在模型中的嵌入表示将具有1维。
use_hash=False:表示不使用哈希技术对alpha_u进行编码。如果为True,则会使用哈希技术将alpha_u映射到固定长度的整数,否则将使用原始的整数编码。
dtype='int32':表示alpha_u的数据类型为32位整数。
embedding_name='alpha_u':指定该特征列的嵌入名称为'alpha_u',这个名称将用于在模型中唯一标识该特征列的嵌入层。
group_name='default_group':指定该特征列所属的组名为'default_group',用于在定义模型结构时对特征列进行分组。

注意:最后的最后,因为args.is_ab = false 所以又将ab_columns 设置为 None

⑧ **y_columns**

生成方式简要描述:

 结果及描述:

y_columns= {list:(1)} 

第一行

DenseFeat(name='y', dimension=1, dtype='float32')

表示一个密集特征列的配置,代表了目标变量y,它是一个维度为1的浮点数。在模型中,该特征列表示输出特征列

具体来说:

name='y':特征列的名称为'y',表示该特征列对应于目标变量。
dimension=1:该特征列的维度为1,表示目标变量y是一个标量值。
dtype='float32':表示目标变量y的数据类型为32位浮点数。

⑨ **dataset_train**(由dataset返回得到)

生成方式简要描述:

首先,使用df_train并经过负采样生成正样本数据集df_pos和负样本数据集df_neg

获得df_pos(37592418,9)和df_neg(37592418,8),df_pos的9列分别为['user_id'  'item_id'  'timestamp'  'duration_normed' 'feat0~3'  'watch_ratio_normed' ],df_neg比df_pos少了'timestamp'。

df_x是从从正样本数据集 df_pos 中选择用户特征和物品特征列作为输入数据,也就是选取了user_features和item_features。其中user_features为{list:(1)} 'user_id' ,item_features为{list:(6)} 'item_id'   'feat0~3'   'duration_normed'。df_x(37592418,7)

df_neg同理,不过将列名都加了_neg后缀。df_neg(37592418,7)

然后,将df_x和df_neg水平拼接得到df_x_all {DataFrame:(37592418,14)} 

此处tau = 0,所以   exposure_pos = np.zeros([len(df_x_all), 1])

得到正样本数据集的暴露效应exposure_pos为一个全0数组 {ndarry:(37592418,1)} 

最后,利用将x_columns, y_columns组成StaticDatasetl类型的dataset,并利用compile_dataset方法编译df_x_all, df_y, exposure_pos,构成dataset

此处更为详细的描述请查看2.1.2

 结果及描述:

dataset = {StaticDataset:37592418}

x_numpy第一行

表示0号用户观看了3649号视频,该视频属于类别9。并且该视频的标准化时长为-0.11252。与其对应的负样本表示2860号用户观看了7905号视频,该视频属于类别3。并且该视频的标准化时长为-0.11123。

y_numpy第一行

表示0号用户观看该视频的标准化观看率 ('watch_ratio_normed')为0.40106

在生成val时各数据与之前的获取数据方式基本一致,但略有不同


①① **df_val**(由df_data返回得到)

生成方式简要描述:

此处的df_data是从small_matrix_processed.csv中提取的,后与df_feat连接(df_feat与前述的df_feat完全一致)

 结果及描述:

此处的df_data 与①相似,不多赘述。

df_data = {DataFrame:(4676570,9)}

②② **list_feat**

生成方式简要描述:

此处的list_feat与前述的list_feat完全一致

 结果及描述:

list_feat= {list:(10728)}

③③ **df_user_val**(由df_user返回得到)

生成方式简要描述:

df_user因为此处的only_small为true(生成⑤时only_small为false)

所以在load_user_feat()中选择了if分支

因此此处并不再返回完整的df_user,而是对他进行了处理(经过编码后提取了部分数据)

 结果及描述:

此处的df_user与④相似,不多赘述。

df_user= {DataFrame:(1411,25)}

④④ **df_item_val**(由df_item返回得到)

生成方式简要描述:

df_item因为此处的only_small为true,(生成⑥时only_small为false)

所以在load_item_feat()中选择了if分支 

因此此处并不再返回完整的df_item,而是对他进行了处理(经过编码后提取了部分数据)

 结果及描述:

此处的df_item与⑤相似,不多赘述。

df_item= {DataFrame:(3327,5)}

⑤⑤ **dataset_val**

生成方式简要描述:

dataset_val的处理方式与⑨dataset相似,不过这里的df_x是抽取的df_val的7列,其形状为:

{DataFrame:(4676570,7)}

其余的x_columns、y_columns与之前完全一致,df_y仅行数不同{DataFrame:(4676570,1)}

并且,后续又将df_item_valdf_user_val设置为了dataset_val的属性以方便后续的使用

 结果及描述:

dataset_val = {StaticDataset:4676570}

x_numpy第一行

表示14号用户观看了148号视频,该视频属于类别12、28、19。并且该视频的标准化时长为-0.41918。

y_numpy第一行

表示0号用户观看该视频的标准化观看率 ('watch_ratio_normed')为-0.33872


第二步:准备数据,至此已全部完成。


三、一点小ps

3.1df_user变空了

在2.1.3④获取df_user时,发现后面df_user置为空了,仅有索引表示用户id

是错误,还是故意的? 

答:故意的,后面进行负样本采样的时候要进行左连接user_id

3.2 对2.1.3⑨中负采样的进一步描述

首先进入了 negative_sampling()函数中,该函数的输入为 “ df_train, df_item, df_user, reward_features[0], is_rand=True, neg_in_train=neg_in_train, neg_K=args.neg_K ”

此处 neg_in_train 为false所以进入else分支

首先,将训练数据集转换为稀疏矩阵mat_train,其中行索引为用户ID,列索引为物品ID,值为目标变量'watch_ratio_normed'。得到mat_train为{ndarray:(7176,10728)}
然后,获取df_train中的user_id和iten_id并转换为 NumPy 数组user_ids{ndarray:(12530806,)}和item_ids{ndarray:(12530806,)}。
创建一个空的DataFrame df_negative,用于存储负样本。列名分别为"user_id", "item_id", watch_ratio_normed

对于负采样的次数neg_K(此处为3):
创建一个形状为(len(df_train), 3)的零数组array_k(12530806,3)用以存储负样本。
随机生成长度为len(user_ids) * num_break的负样本候选列表neg_u_listneg_i_list。其中,num_break==3,随机数的上限为user_ids和items_ids的最大值+1。neg_u_list和neg_i_list均为{ndarray:(37592418,)}
接着,调用find_negative函数,根据负样本候选列表生成负样本,并将结果存储到array_k中。

is_rand为true进入if分支,使用随机采样策略:
对于每个正样本(以用户为索引),根据 neg_u_list 中的随机用户ID和 neg_i_list 中的随机物品ID寻找负样本。
初始化 num_try 为 0,表示尝试次数。
获取当前正样本的用户ID和物品ID,以及对应的值 value(目标变量值)。
进入循环,直到找到合适的负样本或达到尝试次数上限(num_break):
从 neg_u_list 中获取负样本候选用户ID neg_u 和 neg_i_list 中获取负样本候选物品ID neg_i。
根据 neg_u 和 neg_i 获取对应的值 neg_v。
更新 ind 的值,使其指向 neg_u_list 中下一个负样本候选用户ID。
如果 neg_v 小于 value 或达到尝试次数上限,则结束循环。
将找到的负样本的用户ID、物品ID和值分别存储到 df_negative 的对应位置。

随机得到用户u和视频i的组合,如果u观看i的watch_ratio_normed为0的话即为负样本。但是可以看出,如果u观看i的watch_ratio_normed相对于当前正样本中的value更小但是不为0的话也可能归为负样本,但是这种情况概率很小。

也就是说,所谓的负样本就是用户u和其未观看的视频i加上对应的watch_ratio_normed以及i所属的类别构成的一条数据。此处,正样本直接选取了前述获取的df_train.


将array_k转换为DataFrame df_k,列名为["user_id", "item_id", y_name"]。
将df_k添加到df_negative中。
将df_negative与df_item和df_user根据"item_id"和"user_id"进行连接,添加附加信息。
调用align_pos_neg函数将正负样本对齐,得到df_pos和df_neg。

3.3 手写笔记

此处为复现2.1 run_worldModel_ensemble.py的步骤2(获取训练数据)的笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值