我正在考虑如何在我的 RL 问题中定义动作空间。目标是尝试许多不同的 RL 算法(基于价值、基于策略和混合),以便在问题的不同变体中比较它们的性能。
环境包含物品。每一项都是一段文字。现有/可能项目的数量是infinite。可以消耗物品。任务是偶发的。在每一集中,智能体都会收到一份已消费物品列表
s_t
,以及一组候选物品C_t
。 C_t
是一组有限的项目,但基数因剧集而异。在每个时间步长 t
,代理从 i_t
中选择一个项目 C_t
作为要约。环境要么消耗要么留下i_t
。在这两种情况下,i_t
都从 C_t+1
中删除。如果i_t
被消耗,它被附加到s_t
。如果物品被消耗(左),则奖励为 1 (0)。当C_t
为空时,剧集结束。这意味着环境最终会消耗掉所有好的物品,但是由于打折,代理应该先提供好的物品。
s_t
,以及新项目的候选集C_t
.每个项目
i
(一段文本)都可以表示为n维嵌入向量v_i = [v_1, v_2, ..., v_n]
,其中v_j
是实数,-1 ≤ v_j ≤ 1
代表j = 1, 2, ..., n
.
状态是实数的m维向量
s_emb
,由s_t
中的项目的嵌入向量构成。
我正在尝试找到动作空间的良好表示。
我想到了以下3种方法:
1.) 动作表示是所提供项目
v_i
的嵌入向量i
。在 value-based 方法中,可以将 s_emb
和 v_i
作为 DQN 的输入,并对 C_t
中的每个项目执行此操作。它效率低下,因为我们不能一次为所有项目发出 Q 值,但它有效。在基于策略的方法中,这种方法很棘手。像 REINFORCE 这样的算法会输出一个嵌入向量v'
(或者据我所知,向量中每个元素的均值和方差?)。要找到要提供的项目,v'
必须与 C_t
中项目的所有嵌入向量进行比较。我是否正确认为这适用于 PPO 或 REINFORCE 等 基于策略的 方法? 缺点:v'
是在不知道C_t
的情况下产生的,因为C_t
不在状态表示中。
2.) 从C_t
中随机抽取一块大小为
k的块。在每个时间步,智能体都会提供块中的一个项目,并且块中会重新填充剩余
C_t
中的一个项目。这将允许将块中项目的嵌入向量附加到状态(这在方法 1 中是不可能的,因为 C_t
的大小会变化,因此如果不先嵌入 C_t
就无法构建 NN以固定大小表示)。这将问题从连续的动作空间转移到离散的动作空间。在每个时间步,都有 k 可用的操作,“提供项目 1”,“提供项目 2”,...。现在,如果我是正确的,则可以毫无问题地使用 REINFORCE 或 PPO。 缺点:智能体在每个时间步只有 k 个项目可供选择,这可能不会导致最优订单。
3.) 锦标赛风格系统:
C_t
中的所有项目都被放入比赛的锦标赛支架中。在每场比赛中,i
和j
两个项目竞争,所以状态是s_emb
,v_i
和v_j
的串联。该动作是一个离散的二元动作,表示是否提供 i
或 j
。在实际向环境提供相应的项目之前,代理将遍历整个组别并确定锦标赛的获胜者。我不确定这种方法是否可以用 REINFORCE 或 PPO 执行。
我正在寻找有关所列方法的反馈。我错了,还是完全误解了什么?还有哪些适合的方法?是否有处理类似 RL 问题的文献或现有项目?