fix ch6
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
# DQN
|
# DQN
|
||||||
|
传统的强化学习算法会使用表格的形式存储状态值函数 $V(s)$ 或状态动作值函数 $Q(s,a)$,但是这样的方法存在很大的局限性。例如:现实中的强化学习任务所面临的状态空间往往是连续的,存在无穷多个状态,在这种情况下,就不能再使用表格对值函数进行存储。值函数近似利用函数直接拟合状态值函数或状态动作值函数,减少了对存储空间的要求,有效地解决了这个问题。
|
||||||
|
|
||||||
为了在连续的状态和动作空间中计算值函数 $Q^{\pi}(s,a)$,我们可以用一个函数 $Q_{\phi}(\boldsymbol{s},\boldsymbol{a})$ 来表示近似计算,称为`价值函数近似(Value Function Approximation)`。
|
为了在连续的状态和动作空间中计算值函数 $Q^{\pi}(s,a)$,我们可以用一个函数 $Q_{\phi}(\boldsymbol{s},\boldsymbol{a})$ 来表示近似计算,称为`价值函数近似(Value Function Approximation)`。
|
||||||
$$
|
$$
|
||||||
Q_{\phi}(\boldsymbol{s}, \boldsymbol{a}) \approx Q^{\pi}(s, a)
|
Q_{\phi}(\boldsymbol{s}, \boldsymbol{a}) \approx Q^{\pi}(s, a)
|
||||||
@@ -103,7 +105,7 @@ $$
|
|||||||
|
|
||||||
用 MC 跟 TD 估出来的结果很有可能是不一样的。就算评论家观察到一样的训练数据,它最后估出来的结果也不一定是一样的。为什么会这样呢?你可能问说,哪一个结果比较对呢?其实就都对。
|
用 MC 跟 TD 估出来的结果很有可能是不一样的。就算评论家观察到一样的训练数据,它最后估出来的结果也不一定是一样的。为什么会这样呢?你可能问说,哪一个结果比较对呢?其实就都对。
|
||||||
|
|
||||||
因为在第一个 trajectory, $s_a$ 得到奖励 0 以后,再跳到 $s_b$ 也得到奖励 0。这边有两个可能。
|
因为在第一个轨迹, $s_a$ 得到奖励 0 以后,再跳到 $s_b$ 也得到奖励 0。这边有两个可能。
|
||||||
|
|
||||||
* 一个可能是: $s_a$ 是一个标志性的状态,只要看到 $s_a$ 以后,$s_b$ 就会拿不到奖励,$s_a$ 可能影响了 $s_b$。如果是用 MC 的算法的话,它会把 $s_a$ 影响 $s_b$ 这件事考虑进去。所以看到 $s_a$ 以后,接下来 $s_b$ 就得不到奖励,$s_b$ 期望的奖励是 0。
|
* 一个可能是: $s_a$ 是一个标志性的状态,只要看到 $s_a$ 以后,$s_b$ 就会拿不到奖励,$s_a$ 可能影响了 $s_b$。如果是用 MC 的算法的话,它会把 $s_a$ 影响 $s_b$ 这件事考虑进去。所以看到 $s_a$ 以后,接下来 $s_b$ 就得不到奖励,$s_b$ 期望的奖励是 0。
|
||||||
|
|
||||||
@@ -312,7 +314,7 @@ A: 因为 Q 值是有正有负的,所以可以它弄成一个概率,你先
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
**第三个 tip 是 `Experience Replay(经验回放)`。** Experience Replay 会构建一个 `Replay Buffer`,Replay Buffer 又被称为 `Replay Memory`。Replay Buffer 是说现在会有某一个策略$\pi$ 去跟环境做互动,然后它会去收集数据。我们会把所有的数据 放到一个 buffer 里面,buffer 里面就存了很多数据。比如说 buffer 是 5 万,这样它里面可以存 5 万笔资料,每一笔资料就是记得说,我们之前在某一个状态 $s_t$,采取某一个动作 $a_t$,得到了奖励 $r_t$。然后跳到状态 $s_{t+1}$。那你用 $\pi$ 去跟环境互动很多次,把收集到的资料都放到这个 replay buffer 里面。
|
**第三个 tip 是 `Experience Replay(经验回放)`。** Experience Replay 会构建一个 `Replay Buffer`,Replay Buffer 又被称为 `Replay Memory`。Replay Buffer 是说现在会有某一个策略$\pi$ 去跟环境做互动,然后它会去收集数据。我们会把所有的数据放到一个 buffer 里面,buffer 里面就存了很多数据。比如说 buffer 是 5 万,这样它里面可以存 5 万笔资料,每一笔资料就是记得说,我们之前在某一个状态 $s_t$,采取某一个动作 $a_t$,得到了奖励 $r_t$。然后跳到状态 $s_{t+1}$。那你用 $\pi$ 去跟环境互动很多次,把收集到的资料都放到这个 replay buffer 里面。
|
||||||
|
|
||||||
这边要注意是 replay buffer 里面的经验可能是来自于不同的策略,你每次拿 $\pi$ 去跟环境互动的时候,你可能只互动 10000 次,然后接下来你就更新你的 $\pi$ 了。但是这个 buffer 里面可以放 5 万笔资料,所以 5 万笔资料可能是来自于不同的策略。Buffer 只有在它装满的时候,才会把旧的资料丢掉。所以这个 buffer 里面它其实装了很多不同的策略的经验。
|
这边要注意是 replay buffer 里面的经验可能是来自于不同的策略,你每次拿 $\pi$ 去跟环境互动的时候,你可能只互动 10000 次,然后接下来你就更新你的 $\pi$ 了。但是这个 buffer 里面可以放 5 万笔资料,所以 5 万笔资料可能是来自于不同的策略。Buffer 只有在它装满的时候,才会把旧的资料丢掉。所以这个 buffer 里面它其实装了很多不同的策略的经验。
|
||||||
|
|
||||||
@@ -320,26 +322,30 @@ A: 因为 Q 值是有正有负的,所以可以它弄成一个概率,你先
|
|||||||
|
|
||||||
有了 buffer 以后,你是怎么训练 Q 的模型呢,怎么估 Q-function?你的做法是这样:你会迭代地去训练这个 Q-function,在每次迭代里面,你从这个 buffer 里面随机挑一个 batch 出来,就跟一般的网络训练一样,你从那个训练集里面,去挑一个 batch 出来。你去采样一个 batch 出来,里面有一把的经验,根据这把经验去更新你的 Q-function。就跟 TD learning 要有一个目标网络是一样的。你去采样一堆 batch,采样一个 batch 的数据,采样一堆经验,然后再去更新你的 Q-function。
|
有了 buffer 以后,你是怎么训练 Q 的模型呢,怎么估 Q-function?你的做法是这样:你会迭代地去训练这个 Q-function,在每次迭代里面,你从这个 buffer 里面随机挑一个 batch 出来,就跟一般的网络训练一样,你从那个训练集里面,去挑一个 batch 出来。你去采样一个 batch 出来,里面有一把的经验,根据这把经验去更新你的 Q-function。就跟 TD learning 要有一个目标网络是一样的。你去采样一堆 batch,采样一个 batch 的数据,采样一堆经验,然后再去更新你的 Q-function。
|
||||||
|
|
||||||
当我们这么做的时候, 它变成了一个 `off-policy` 的做法。因为本来我们的 Q 是要观察 $\pi$ 的经验,但实际上存在你的 replay buffer 里面的这些经验不是通通来自于 $\pi$,有些是过去其他的 $\pi$ 所遗留下来的经验。因为你不会拿某一个 $\pi$ 就把整个 buffer 装满,然后拿去测 Q-function,这个 $\pi$ 只是采样一些数据塞到那个 buffer 里面去,然后接下来就让 Q 去训练。所以 Q 在采样的时候, 它会采样到过去的一些资料。
|
当我们这么做的时候, 它变成了一个 `off-policy` 的做法。因为本来我们的 Q 是要观察 $\pi$ 的经验,但实际上 replay buffer 里面的这些经验不是通通来自于 $\pi$,有些是过去其他的 $\pi$ 所遗留下来的经验。因为你不会拿某一个 $\pi$ 就把整个 buffer 装满,然后拿去测 Q-function,这个 $\pi$ 只是采样一些数据塞到那个 buffer 里面去,然后接下来就让 Q 去训练。所以 Q 在采样的时候, 它会采样到过去的一些资料。
|
||||||
|
|
||||||
这么做有两个好处。
|
这么做有两个好处:
|
||||||
|
|
||||||
* 第一个好处,其实在做强化学习的时候, 往往最花时间的步骤是在跟环境做互动,训练网络反而是比较快的。因为你用 GPU 训练其实很快, 真正花时间的往往是在跟环境做互动。用 replay buffer 可以减少跟环境做互动的次数,因为在做训练的时候,你的经验不需要通通来自于某一个策略。一些过去的策略所得到的经验可以放在 buffer 里面被使用很多次,被反复的再利用,这样让你的采样到经验的利用是比较高效的。
|
* 其实在做强化学习的时候, 往往最花时间的步骤是在跟环境做互动,训练网络反而是比较快的。因为用 GPU 训练其实很快, 真正花时间的往往是在跟环境做互动。用 replay buffer 可以减少跟环境做互动的次数,因为在做训练的时候,你的经验不需要通通来自于某一个策略。一些过去的策略所得到的经验可以放在 buffer 里面被使用很多次,被反复的再利用,这样让采样到经验的利用是比较高效的。
|
||||||
|
|
||||||
* 第二个好处,在训练网络的时候,其实我们希望一个 batch 里面的数据越多样(diverse)越好。如果你的 batch 里面的数据都是同样性质的,你训练下去是容易坏掉的。如果 batch 里面都是一样的数据,你训练的时候,performance 会比较差。我们希望 batch 的数据越多样越好。那如果 buffer 里面的那些经验通通来自于不同的策略,那你采样到的一个 batch 里面的数据会是比较多样的。
|
* 在训练网络的时候,其实我们希望一个 batch 里面的数据越多样(diverse)越好。如果 batch 里面的数据都是同样性质的,训练下去是容易坏掉的。如果 batch 里面都是一样的数据,训练的时候,performance 会比较差。我们希望 batch 的数据越多样越好。那如果 buffer 里面的那些经验通通来自于不同的策略,那采样到的一个 batch 里面的数据会是比较多样的。
|
||||||
|
|
||||||
Q:我们明明是要观察 $\pi$ 的值,里面混杂了一些不是 $\pi$ 的经验,这有没有关系?
|
Q:我们明明是要观察 $\pi$ 的值,里面混杂了一些不是 $\pi$ 的经验,这有没有关系?
|
||||||
|
|
||||||
A:没关系。这并不是因为过去的 $\pi$ 跟现在的 $\pi$ 很像, 就算过去的 $\pi$ 没有很像,其实也是没有关系的。主要的原因是因为, 我们并不是去采样一个 trajectory,我们只采样了一笔经验,所以跟是不是 off-policy 这件事是没有关系的。就算是 off-policy,就算是这些经验不是来自于 $\pi$,我们其实还是可以拿这些经验来估测 $Q^{\pi}(s,a)$。这件事有点难解释,不过你就记得说 Experience Replay 在理论上也是没有问题的。
|
A:没关系。这并不是因为过去的 $\pi$ 跟现在的 $\pi$ 很像, 就算过去的 $\pi$ 没有很像,其实也是没有关系的。主要的原因是因为, 我们并不是去采样一个轨迹,我们只采样了一笔经验,所以跟是不是 off-policy 这件事是没有关系的。就算是 off-policy,就算是这些经验不是来自于 $\pi$,我们其实还是可以拿这些经验来估测 $Q^{\pi}(s,a)$。这件事有点难解释,不过你就记得说 Experience Replay 在理论上也是没有问题的。
|
||||||
|
|
||||||
## DQN
|
## DQN
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
DQN 使用深度卷积神经网络近似拟合状态动作值函数 $Q(s,a)$,其网络结构如上图所示。DQN 模型的输入是距离当前时刻最近的 4 帧图像,该输入经过 3 个卷积层和 2 个全连接层的非线性变化后,最终在输出层输出每个动作对应的 Q 值。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
上图就是一般的 `Deep Q-network(DQN)` 的算法。
|
上图就是一般的 `Deep Q-network(DQN)` 的算法。
|
||||||
|
|
||||||
这个算法是这样的。初始化的时候,你初始化 2 个网络:Q 和 $\hat{Q}$,其实 $\hat{Q}$ 就等于 Q。一开始这个目标 Q 网络,跟你原来的 Q 网络是一样的。在每一个 episode,你拿你的演员去跟环境做互动,在每一次互动的过程中,你都会得到一个状态 $s_t$,那你会采取某一个动作 $a_t$。怎么知道采取哪一个动作 $a_t$ 呢?你就根据你现在的 Q-function。但是你要有探索的机制。比如说你用 Boltzmann 探索或是 Epsilon Greedy 的探索。那接下来你得到奖励 $r_t$,然后跳到状态 $s_{t+1}$。所以现在收集到一笔数据,这笔数据是 ($s_t$, $a_t$ ,$r_t$, $s_{t+1}$)。这笔数据就塞到你的 buffer 里面去。如果 buffer 满的话, 你就再把一些旧的资料丢掉。接下来你就从你的 buffer 里面去采样数据,那你采样到的是 $(s_{i}, a_{i}, r_{i}, s_{i+1})$。这笔数据跟你刚放进去的不一定是同一笔,你可能抽到一个旧的。要注意的是,其实你采样出来不是一笔数据,你采样出来的是一个 batch 的数据,你采样一个 batch 出来,采样一把经验出来。接下来就是计算你的目标。假设你采样出这么一笔数据。根据这笔数据去算你的目标。你的目标是什么呢?目标记得要用目标网络 $\hat{Q}$ 来算。目标是:
|
这个算法是这样的。初始化的时候,你初始化 2 个网络:Q 和 $\hat{Q}$,其实 $\hat{Q}$ 就等于 Q。一开始这个目标 Q 网络,跟你原来的 Q 网络是一样的。在每一个 episode,你拿你的演员去跟环境做互动,在每一次互动的过程中,你都会得到一个状态 $s_t$,那你会采取某一个动作 $a_t$。怎么知道采取哪一个动作 $a_t$ 呢?你就根据你现在的 Q-function。但是你要有探索的机制。比如说你用 Boltzmann 探索或是 Epsilon Greedy 的探索。那接下来你得到奖励 $r_t$,然后跳到状态 $s_{t+1}$。所以现在收集到一笔数据,这笔数据是 ($s_t$, $a_t$ ,$r_t$, $s_{t+1}$)。这笔数据就塞到你的 buffer 里面去。如果 buffer 满的话, 你就再把一些旧的资料丢掉。接下来你就从你的 buffer 里面去采样数据,那你采样到的是 $(s_{i}, a_{i}, r_{i}, s_{i+1})$。这笔数据跟你刚放进去的不一定是同一笔,你可能抽到一个旧的。要注意的是,其实你采样出来不是一笔数据,你采样出来的是一个 batch 的数据,你采样一个 batch 出来,采样一把经验出来。接下来就是计算你的目标。假设采样出这么一笔数据。根据这笔数据去算你的目标。你的目标是什么呢?目标记得要用目标网络 $\hat{Q}$ 来算。目标是:
|
||||||
|
|
||||||
$$
|
$$
|
||||||
y=r_{i}+\max _{a} \hat{Q}\left(s_{i+1}, a\right)
|
y=r_{i}+\max _{a} \hat{Q}\left(s_{i+1}, a\right)
|
||||||
@@ -359,6 +365,7 @@ A: 整体来说,DQN 与 Q-learning 的目标价值以及价值的更新方式
|
|||||||
* [神经网络与深度学习](https://nndl.github.io/)
|
* [神经网络与深度学习](https://nndl.github.io/)
|
||||||
* [强化学习基础 David Silver 笔记](https://zhuanlan.zhihu.com/c_135909947)
|
* [强化学习基础 David Silver 笔记](https://zhuanlan.zhihu.com/c_135909947)
|
||||||
* [百面深度学习](https://book.douban.com/subject/35043939/)
|
* [百面深度学习](https://book.douban.com/subject/35043939/)
|
||||||
|
* 苗光辉. 面向部分可观测环境的值迭代深度网络模型研究[D].北京理工大学,2018.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
docs/chapter6/img/dqn.png
Normal file
BIN
docs/chapter6/img/dqn.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 251 KiB |
Reference in New Issue
Block a user