本文主要内容来源于 Berkeley CS285 Deep Reinforcement Learning
前情回顾:
深度强化学习(9)Fitted Q-iteration
深度强化学习(10)Q-Learning
前两章, 介绍了Iteration Q-Learning, 本章更近一步, 讨论 DQN, 这是经常会使用到的一种 Deep RL 算法。
Fitted Q Iteration & Q-LearningIteration Q-Learning 的问题
之前我们介绍的 Iteration Q-Learning 其实存在2个问题:
- 不是真正的 Gradient Descent
- 样本非独立
Gradient Descent 问题
我们把Iteration Q-Learning 第2个步骤带入第3步以后, 会得到下面的方程:
Iteration Q-Learning问题出在红圈画出来的部分:训练神经网络的 Lable 中,不应该包含网络自身。
样本非独立性问题
在第1步, 我们进行采样的时候,我们是利用 env 进行连续采样。
transations = []
# 重置环境,获得初始state
state_t0 = env.reset()
# Sample
for i in range(sample_size):
# 根据一些policy,获得 action
action = some_policy(state_t0)
# 利用环境,获得state 和 reward
state_t1, reward = env.step(state, action)
# 保存获取到的样本
transations.append((state_t0, action, state_t1, reward))
# 更新state
state_t0 = state_t1
这样就造成一个问题: 得到的样本并不独立,如下图所示。 原因是获取样本在时间上是连续的序列。 而训练神经网络的时候,我们对样本的假设是,他们必须独立同分布(i.i.d 假设) 。
样本非独立样本独立性的一个解决办法
我们可以借助多个worker 的方法,在一定程度上解决样本独立性的问题。办法就是把相关的样本分散到多个worker 上去。 这样每个worker 拿到的数据就不是连续的了。
image.pngReplay Buffer
Replay Buffer 也是用于解决样本独立性的办法, 因为它的用法非常广泛, 所以我们单独拿出来介绍这个方法。
Replay Buffer 的想法借鉴了 Supervise Learning, 希望事先准备一堆数据, 而这些数据最好是 i.i.d. (独立同分布)的, 这样, 就可以解决问题了:
Q-Learning with Replay Buffer在第1步,直接从 Replay Buffer 获取训练数据。
# Sample replay buffer
replay_data = self.replay_buffer.sample(batch_size, env=self._vec_normalize_env) 。
Replay Buffer
构建Replay Buffer 中的样本
构建 Replay Buffer 的过程,和本文开头的代码类似, 也是连续的从 env 中获取 transition。这些transition被散放在 Replay Buffer , 等待抽样。
Build Replay Buffer
上文代码中有一段:
# 根据一些policy,获得 action
action = some_policy(state_t0)
在 Q Learning 中, 一般使用 方法。
Put It Together
把 Replay Buffer 和 Q-Learning 结合在一起以后,得到新的 Q Learning 算法:
image.png
网友评论