update chapters

This commit is contained in:
qiwang067
2020-07-19 20:51:05 +08:00
parent 58c4797676
commit 0c726c7b71
3 changed files with 47 additions and 43 deletions

View File

@@ -7,6 +7,10 @@
Q-learning 是 `value-based` 的方法。在 value based 的方法里面,我们 learn 的不是 policy我们要 learn 的是一个 `critic`。Critic 并不直接采取行为,它想要做的事情是评价现在的行为有多好或是有多不好。假设有一个 actor $\pi$ critic 的工作就是来评价这个 actor 的 policy $\pi$ 好还是不好,即 `Policy Evaluation(策略评估)`
> 注:李宏毅深度强化学习课程提到的 Q-learning其实是 DQN。
>
> DQN 是指基于深度学习的 Q-learning 算法,主要结合了`价值函数近似(Value Function Approximation)`与神经网络技术,并采用了目标网络和经历回放的方法进行网络的训练。
>
> 在 Q-learning 中,我们使用表格来存储每个状态 s 下采取动作 a 获得的奖励,即状态-动作值函数 $Q(s,a)$。然而这种方法在状态量巨大甚至是连续的任务中会遇到维度灾难问题往往是不可行的。因此DQN 采用了价值函数近似的表示方法。
举例来说,有一种 critic 叫做 `state value function`。State value function 的意思就是说,假设 actor 叫做 $\pi$,拿 $\pi$ 跟环境去做互动。假设 $\pi$ 看到了某一个state s如果在玩 Atari 游戏的话state s 是某一个画面,看到某一个画面的时候,接下来一直玩到游戏结束,累积的 reward 的期望值有多大。所以 $V^{\pi}$ 是一个function这个 function input 一个 state然后它会 output 一个 scalar。这个 scalar 代表说,$\pi$ 这个 actor 看到 state s 的时候,接下来预期到游戏结束的时候,它可以得到多大的 value。
@@ -112,7 +116,7 @@ $$
* state value function 的 input 是一个 state它是根据 state 去计算出看到这个state 以后的 expected accumulated reward 是多少。
* state-action value function 的 input 是一个 state 跟 action 的 pair它的意思是说在某一个 state 采取某一个action假设我们都使用 actor $\pi$ ,得到的 accumulated reward 的期望值有多大。
Q-function 有一个需要注意的问题是,这个 actor $\pi$,在看到 state s 的时候,它采取的 action 不一定是 a。Q-function 假设在 state s 强制采取 action a。不管你现在考虑的这个actor $\pi$ 它会不会采取action a这不重要。在state s 强制采取 action a。接下来都用 actor $\pi$ 继续玩下去,就只有在 state s我们才强制一定要采取action a接下来就进入自动模式让actor $\pi$ 继续玩下去,得到的 expected reward 才是$Q^{\pi}(s,a)$。
Q-function 有一个需要注意的问题是,这个 actor $\pi$,在看到 state s 的时候,它采取的 action 不一定是 a。Q-function 假设在 state s 强制采取 action a。不管你现在考虑的这个 actor $\pi$ 它会不会采取 action a这不重要。在state s 强制采取 action a。接下来都用 actor $\pi$ 继续玩下去,就只有在 state s我们才强制一定要采取 action a接下来就进入自动模式让actor $\pi$ 继续玩下去,得到的 expected reward 才是$Q^{\pi}(s,a)$
Q-function 有两种写法:
@@ -161,9 +165,9 @@ $$
![](img/5.11.png)
上图想要跟大家讲的是说,为什么用 $Q^{\pi}(s,a)$ 这个 Q-function 所决定出来的 $\pi'$,一定会比 $\pi$ 还要好。
上图想要跟大家讲的是说,为什么用 $Q^{\pi}(s,a)$ 这个 Q-function 所决定出来的 $\pi'$,一定会比 $\pi$ 还要好。
假设有一个policy 叫做 $\pi'$,它是由 $Q^{\pi}$ 决定的。我们要证对所有的 state s 而言,$V^{\pi^{\prime}}(s) \geq V^{\pi}(s)$。怎么证呢?我们先把$V^{\pi^{\prime}}(s)$写出来:
假设有一个policy 叫做 $\pi'$,它是由 $Q^{\pi}$ 决定的。我们要证对所有的 state s 而言,$V^{\pi^{\prime}}(s) \geq V^{\pi}(s)$。怎么证呢?我们先把$V^{\pi^{\prime}}(s)$写出来:
$$
V^{\pi}(s)=Q^{\pi}(s, \pi(s))
$$
@@ -175,7 +179,7 @@ $$
Q^{\pi}(s, \pi(s)) \le \max _{a} Q^{\pi}(s, a)
$$
因为这边是所有action 里面可以让 Q 最大的那个action所以今天这一项一定会比它大。那我们知道说这一项是什么这一项就是$Q^{\pi}(s, a)$$a$ 就是 $\pi'(s)$。因为$\pi'(s)$ output 的 a 就是可以让$Q^\pi(s,a)$ 最大的那一个。所以我们得到了下面的式子:
因为这边是所有action 里面可以让 Q 最大的那个action所以今天这一项一定会比它大。那我们知道说这一项是什么这一项就是$Q^{\pi}(s, a)$$a$ 就是 $\pi'(s)$。因为$\pi'(s)$ output 的 a 就是可以让 $Q^\pi(s,a)$ 最大的那一个。所以我们得到了下面的式子:
$$
\max _{a} Q^{\pi}(s, a)=Q^{\pi}\left(s, \pi^{\prime}(s)\right)
$$
@@ -191,13 +195,12 @@ $$
Q^{\pi}\left(s, \pi^{\prime}(s) \right) \le V^{\pi'}(s)
$$
也就是说只有一步之差你会得到比较大的reward。但假设每步都是不一样的 每步都是 follow $\pi'$ 而不是$\pi$ 的话那你得到的reward 一定会更大。如果你要用数学式把它写出来的话,你可以这样写
也就是说只有一步之差你会得到比较大的reward。但假设每步都是不一样的 每步都是 follow $\pi'$ 而不是$\pi$ 的话那你得到的reward 一定会更大。如果你要用数学式把它写出来的话,你可以这样写 $Q^{\pi}\left(s, \pi^{\prime}(s)\right)$ 这个式子它的意思就是说我们在state $s_t$ 采取 action $a_t$,得到 reward $r_{t+1}$然后跳到state $s_{t+1}$,即如下式所示:
$Q^{\pi}\left(s, \pi^{\prime}(s)\right)$这个式子它的意思就是说我们在state $s_t$ 采取 action $a_t$,得到 reward $r_{t+1}$然后跳到state $s_{t+1}$,即如下式所示:
$$
Q^{\pi}\left(s, \pi^{\prime}(s)\right)=E\left[r_{t+1}+V^{\pi}\left(s_{t+1}\right) \mid s_{t}=s, a_{t}=\pi^{\prime}\left(s_{t}\right)\right]
$$
这边有一个地方写得不太好,这边应该写成$r_t$ 跟之前的notation 比较一致,但这边写成了$r_{t+1}$,其实这都是可以的。在文献上有时候有人会说 在state $s_t$ 采取action $a_t$ 得到reward $r_{t+1}$ 有人会写成$r_t$但意思其实都是一样的。在state s按照$\pi'$ 采取某一个action $a_t$ 得到reward $r_{t+1}$然后跳到state $s_{t+1}$$V^{\pi}\left(s_{t+1}\right)$是state $s_{t+1}$,根据$\pi$ 这个actor 所估出来的value。这边要取一个期望值因为在同样的state 采取同样的action你得到的reward还有会跳到的 state 不一定是一样, 所以这边需要取一个期望值。
这边有一个地方写得不太好,这边应该写成$r_t$ 跟之前的notation 比较一致,但这边写成了$r_{t+1}$,其实这都是可以的。在文献上有时候有人会说 在state $s_t$ 采取action $a_t$ 得到reward $r_{t+1}$ 有人会写成$r_t$但意思其实都是一样的。在state s按照$\pi'$ 采取某一个action $a_t$ ,得到 reward $r_{t+1}$然后跳到state $s_{t+1}$$V^{\pi}\left(s_{t+1}\right)$是state $s_{t+1}$,根据$\pi$ 这个actor 所估出来的value。这边要取一个期望值因为在同样的state 采取同样的action你得到的reward还有会跳到的 state 不一定是一样, 所以这边需要取一个期望值。
接下来我们会得到如下的式子:
$$
@@ -247,13 +250,13 @@ $$
![](img/5.12.png)
接下来讲一下在 Q-learning 里你一定会用到的 tip。第一个是 `target network`,什么意思呢?我们在 learn Q-function 的时候,也会用到 TD 的概念。那怎么用 TD你现在收集到一个 data 是说在state $s_t$你采取action $a_t$ 以后你得到reward $r_t$ 然后跳到state $s_{t+1}$。然后根据这个Q-function你会知道说
接下来讲一下在 DQN 里你一定会用到的 tip。第一个是 `target network`,什么意思呢?我们在 learn Q-function 的时候,也会用到 TD 的概念。那怎么用 TD你现在收集到一个 data 是说在state $s_t$你采取action $a_t$ 以后你得到reward $r_t$ 然后跳到state $s_{t+1}$。然后根据这个Q-function你会知道说
$$
\mathrm{Q}^{\pi}\left(s_{t}, a_{t}\right)
=r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)
$$
所以你在 learn 的时候,你会说我们有 Q-functioninput $s_t$, $a_t$ 得到的 value跟 input $s_{t+1}$, $\pi (s_{t+1})$ 得到的 value 中间,我们希望它差了一个$r_t$ 这跟刚才讲的TD 的概念是一样的。
所以你在 learn 的时候,你会说我们有 Q-functioninput $s_t$, $a_t$ 得到的 value跟 input $s_{t+1}$, $\pi (s_{t+1})$ 得到的 value 中间,我们希望它差了一个$r_t$ 这跟刚才讲的 TD 的概念是一样的。
但是实际上在 learn 的时候你会发现这样的一个function 并不好 learn因为假设这是一个 regression problem$\mathrm{Q}^{\pi}\left(s_{t}, a_{t}\right) $ 是 network 的 output$r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)$是 target你会发现 target 是会动的。当然你要 implement 这样的 training其实也没有问题就是你在做 backpropagation 的时候, $Q^{\pi}$ 的参数会被 update你会把两个 update 的结果加在一起。因为它们是同一个 model $Q^{\pi}$ 所以两个 update 的结果会加在一起。但这样会导致 training 变得不太稳定。因为假设你把 $\mathrm{Q}^{\pi}\left(s_{t}, a_{t}\right) $ 当作你model 的output $r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)$ 当作 target 的话。你要去 fit 的 target 是一直在变的,这种一直在变的 target 的 training 是不太好 train 的。所以你会把其中一个 Q-network通常是你会把右边这个 Q-network 固定住。也就是说你在 training 的时候,你只 update 左边这个 Q-network 的参数,而右边这个 Q-network 的参数会被固定住。因为右边的 Q-network 负责产生 target所以叫做 `target network`。因为 target network 是固定的,所以你现在得到的 target $r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)$ 的值也是固定的。因为 target network 是固定的,我们只调左边 network 的参数,它就变成是一个 regression problem。我们希望 model 的 output 的值跟目标越接近越好,你会 minimize 它的 mean square error。
@@ -289,7 +292,7 @@ $$
但是假设你在state s你 sample 过某一个action $a_{2}$ ,它得到的值是 positive 的 reward。那 $Q(s, a_2)$ 就会比其他的action 都要好。在采取action 的时候, 就看说谁的Q value 最大就采取谁,所以之后你永远都只会 sample 到 $a_{2}$其他的action 就再也不会被做了,所以就会有问题。就好像说你进去一个餐厅吃饭,其实你都很难选。你今天点了某一个东西以后,假说点了某一样东西, 比如说椒麻鸡,你觉得还可以。接下来你每次去就都会点椒麻鸡,再也不会点别的东西了,那你就不知道说别的东西是不是会比椒麻鸡好吃,这个是一样的问题。
如果你没有好的 exploration 的话, 你在training 的时候就会遇到这种问题。举一个实际的例子, 假设你今天是用 Q-learning 来玩比如说`slither.io`。在玩`slither.io` 你会有一个蛇,然后它在环境里面就走来走去, 然后就吃到星星它就加分。假设这个游戏一开始它采取往上走然后就吃到那个星星它就得到分数它就知道说往上走是positive。接下来它就再也不会采取往上走以外的action 了所以接下来就会变成每次游戏一开始它就往上冲然后就死掉再也做不了别的事。所以今天需要有exploration 的机制,需要让 machine 知道说虽然根据之前sample 的结果,$a_2$ 好像是不错的,但你至少偶尔也试一下$a_{1}$ 跟$a_{3}$,搞不好他们更好也说不定。
如果你没有好的 exploration 的话, 你在training 的时候就会遇到这种问题。举一个实际的例子, 假设你今天是用 DQN 来玩比如说`slither.io`。在玩`slither.io` 你会有一个蛇,然后它在环境里面就走来走去, 然后就吃到星星它就加分。假设这个游戏一开始它采取往上走然后就吃到那个星星它就得到分数它就知道说往上走是positive。接下来它就再也不会采取往上走以外的action 了所以接下来就会变成每次游戏一开始它就往上冲然后就死掉再也做不了别的事。所以今天需要有exploration 的机制,需要让 machine 知道说虽然根据之前sample 的结果,$a_2$ 好像是不错的,但你至少偶尔也试一下$a_{1}$ 跟$a_{3}$,搞不好他们更好也说不定。
这个问题其实就是`探索-利用窘境(Exploration-Exploitation dilemma)`问题。