通过 numpy 对循环进行矢量化,以实现 qlearner/dyna-q

Vectorizing a loop via numpy for qlearner/dyna-q implementation

提问人:accordion1234 提问时间:11/8/2023 最后编辑:accordion1234 更新时间:11/8/2023 访问量:29

问:

我有一个 100 x 4 大小的 2d numpy 数组 A(q 表)和另一个数组 B(体验表),它不断更新一个 4 元素元组(代表状态、操作、state_prime、奖励)。我需要从数组 B 中随机选择一行,提取 4 个元素,然后运行一个函数 update(s, a, s', r),以 4 个元素作为参数更新数组 A。我需要这样做 x 次。

我目前的实现涉及 for 循环和 python 列表:

array B = []
given s, a, s', r
B.append(s, a, s', r)
for i in range x:
  r = random.choice(B)
  update(r[0], r[1], r[2], r[3])

我想摆脱 for 循环并矢量化解决方案,但前提是它比使用 python 列表更快。我尝试为 B 创建一个空的 np.array([]),创建一个 (0, 4) 大小的 np 数组和 vstacking、shuffling 等。但是我目前使用 python 列表的方式是迄今为止最快的。

编辑1:我不知道将B的行初始化为什么,因此我不能使用索引来写入元组。

NUMPY 向量化 Q-学习

评论

0赞 hpaulj 11/8/2023
不要像使用列表一样使用数组。这很慢。
0赞 hpaulj 11/8/2023
你不能做吗?这当然比重复堆叠要好。但真正的诀窍是一次对所有行执行。Bnp.zeros((100,4))empty({})update
0赞 Jérôme Richard 11/8/2023
我怀疑该函数是否可以矢量化。矢量化通常意味着对独立的项目进行操作(至少在 Numpy 中)。这里,迭代调用 update 函数来更新 Q 表。此外,我希望更新功能是瓶颈,而不是循环本身。即使有可能,但事实并非如此,矢量化也无法在黑盒函数上有效地完成。该函数需要重写(如果使用基于编译器的解决方案,则需要对其进行调整)。update
0赞 accordion1234 11/9/2023
更新函数是 SARSA 强化学习算法,不可重写。

答: 暂无答案