update chapters
This commit is contained in:
@@ -44,12 +44,10 @@
|
|||||||
这里我给大家举一些在现实生活中强化学习的一些例子。
|
这里我给大家举一些在现实生活中强化学习的一些例子。
|
||||||
|
|
||||||
* 国际象棋其实也是一个强化学习的过程,因为这个棋手就是在做出一个选择来跟对方对战。
|
* 国际象棋其实也是一个强化学习的过程,因为这个棋手就是在做出一个选择来跟对方对战。
|
||||||
* 然后在自然界中,羚羊其实也是在做一个强化学习,它刚刚出生的时候,可能都不知道怎么站立,然后它通过 trial- and-error 的一个尝试,三十分钟过后,它就可以每个小时36公里跑到这样的速度,很快的适应了这个环境。
|
* 然后在自然界中,羚羊其实也是在做一个强化学习,它刚刚出生的时候,可能都不知道怎么站立,然后它通过 `trial- and-error` 的一个尝试,三十分钟过后,它就可以每个小时 36 公里跑到这样的速度,很快的适应了这个环境。
|
||||||
|
|
||||||
* 你也可以把股票交易看成一个强化学习的问题,就怎么去买卖去使你的收益极大化。
|
* 你也可以把股票交易看成一个强化学习的问题,就怎么去买卖去使你的收益极大化。
|
||||||
* 玩雅达利游戏或者一些电脑游戏,其实也是在一个强化学习的过程。
|
* 玩雅达利游戏或者一些电脑游戏,也是一个强化学习的过程。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -117,7 +115,7 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
这里我给大家举一些奖励的例子。不同的环境,奖励的也是不同的。
|
这里给大家举一些奖励的例子。不同的环境,奖励的也是不同的。
|
||||||
|
|
||||||
* 比如说一个下象棋的选手,它的目的其实就为了赢棋,奖励是说在最后棋局结束的时候,他知道会得到一个正奖励或者负奖励。
|
* 比如说一个下象棋的选手,它的目的其实就为了赢棋,奖励是说在最后棋局结束的时候,他知道会得到一个正奖励或者负奖励。
|
||||||
* 羚羊站立也是一个强化学习过程,那它得到的奖励就是它是否可以最后跟它妈妈一块离开或者它被吃掉。
|
* 羚羊站立也是一个强化学习过程,那它得到的奖励就是它是否可以最后跟它妈妈一块离开或者它被吃掉。
|
||||||
@@ -128,15 +126,15 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
在一个强化学习环境里面,agent 目的就是为了选取一系列的动作,从而使得它的奖励可以极大化。所以这些采取的措施必须有长期的影响,但这个过程里面它的奖励其实是被延误了。就是说你现在采取的某一步决策可能要等到时间很久过后才知道这一步到底产生了什么样的影响。这里一个示意图就是我们玩这个 Atari 的 Pong 这个游戏,你可能只有到最后游戏结束过后,你才知道这个球到底有没有击打过去。中间你采取的 up 或 down 行为,并不会直接产生奖励。
|
在一个强化学习环境里面,agent 的目的就是为了选取一系列的动作,来极大化它的奖励。所以这些采取的措施必须有长期的影响,但这个过程里面它的奖励其实是被延误了。就是说你现在采取的某一步决策可能要等到时间很久过后才知道这一步到底产生了什么样的影响。这里一个示意图就是我们玩这个 Atari 的 Pong 这个游戏,你可能只有到最后游戏结束过后,你才知道这个球到底有没有击打过去。中间你采取的 up 或 down 行为,并不会直接产生奖励。
|
||||||
|
|
||||||
强化学习里面一个重要的课题就是在近期奖励和远期奖励的一个 trade-off。怎么让 agent 的取得更多的长期奖励是强化学习的问题。
|
强化学习里面一个重要的课题就是在近期奖励和远期奖励的一个 trade-off。怎么让 agent 取得更多的长期奖励是强化学习的问题。
|
||||||
|
|
||||||

|

|
||||||
在跟环境的交互过程中,agent 其实会获得很多观测。然后在每一个观测会采取一个动作,它也会得到一个奖励。Agent在采取当前动作的时候会依赖于它之前得到的这个历史,所以你可以把整个游戏的状态看成关于这个历史的函数。
|
在跟环境的交互过程中,agent 其实会获得很多观测。然后在每一个观测会采取一个动作,它也会得到一个奖励。Agent在采取当前动作的时候会依赖于它之前得到的这个历史,所以你可以把整个游戏的状态看成关于这个历史的函数。
|
||||||
|
|
||||||
Q: 状态和观测有什么关系?
|
Q: 状态和观测有什么关系?
|
||||||
A: `状态(state)` $s$ 是对世界的完整描述,不会隐藏世界的信息。`观测(observation)` $o$ 是对状态的部分描述,可以会遗漏一些信息。
|
A: `状态(state)` $s$ 是对世界的完整描述,不会隐藏世界的信息。`观测(observation)` $o$ 是对状态的部分描述,可能会遗漏一些信息。
|
||||||
|
|
||||||
在 deep RL 中,我们几乎总是用一个 实值的向量、矩阵或者更高阶的张量来表示状态和观测。举个例子,我们可以用 RGB 像素值的矩阵来表示一个视觉的观测;我们可以用机器人关节的角度和速度来表示一个机器人的状态。
|
在 deep RL 中,我们几乎总是用一个 实值的向量、矩阵或者更高阶的张量来表示状态和观测。举个例子,我们可以用 RGB 像素值的矩阵来表示一个视觉的观测;我们可以用机器人关节的角度和速度来表示一个机器人的状态。
|
||||||
|
|
||||||
@@ -162,11 +160,13 @@ POMDP 可以用一个 7 元组描述:$(S,A,T,R,\Omega,O,\gamma)$,其中 $S$
|
|||||||
## Major Components of an RL Agent
|
## Major Components of an RL Agent
|
||||||
|
|
||||||

|

|
||||||
对于一个强化学习 agent,它有哪些组成成分,首先 agent 有一个 policy function,这个函数是会被 agent 用来选取它下一步的动作。
|
对于一个强化学习 agent,它有哪些组成成分。
|
||||||
|
|
||||||
然后它也可能生成一个价值函数(value function)。这个价值函数被 agent 用来对现在当前状态进行估价,它就是说你进入现在这个状态,到底可以对你后面的收益带来多大的影响。当这个价值函数大的时候,说明你进入这个状态越有利。
|
* 首先 agent 有一个 policy function,agent 会用这个函数来选取它下一步的动作。
|
||||||
|
|
||||||
另外一个组成成分是这个模型(model)。这里模型表示了 agent 对这个环境的状态进行了理解,它决定了这个世界是如何进行的。
|
* 然后它也可能生成一个价值函数(value function)。我们用价值函数来对当前状态进行估价,它就是说你进入现在这个状态,到底可以对你后面的收益带来多大的影响。当这个价值函数大的时候,说明你进入这个状态越有利。
|
||||||
|
|
||||||
|
* 另外一个组成成分是模型(model)。模型表示了 agent 对这个环境的状态进行了理解,它决定了这个世界是如何进行的。
|
||||||
|
|
||||||
### Policy
|
### Policy
|
||||||
|
|
||||||
@@ -179,7 +179,7 @@ Policy 就是决定了这个 agent 的行为,它其实是一个函数,把输
|
|||||||
|
|
||||||
* 一种是 `deterministic policy(确定性策略)`,就是说你这里有可能只是采取它的极大化,采取最有可能的概率。所以你现在这个概率就是事先决定好的。
|
* 一种是 `deterministic policy(确定性策略)`,就是说你这里有可能只是采取它的极大化,采取最有可能的概率。所以你现在这个概率就是事先决定好的。
|
||||||
|
|
||||||
从 Atari 游戏的来看的话,policy function 的输入就是一游戏的一帧,然后它的输出决定你是往左走或者是往右走。
|
从 Atari 游戏的来看的话,policy function 的输入就是游戏的一帧,然后它的输出决定你是往左走或者是往右走。
|
||||||
|
|
||||||
通常情况下,强化学习一般使用`随机性策略`。随机性策略有很多优点:
|
通常情况下,强化学习一般使用`随机性策略`。随机性策略有很多优点:
|
||||||
|
|
||||||
@@ -187,8 +187,6 @@ Policy 就是决定了这个 agent 的行为,它其实是一个函数,把输
|
|||||||
|
|
||||||
* 随机性策略的动作具有多样性,这一点在多个智能体博弈时也非常重要。采用确定性策略的智能体总是对同样的环境做出相同的动作,会导致它的策略很容易被对手预测。
|
* 随机性策略的动作具有多样性,这一点在多个智能体博弈时也非常重要。采用确定性策略的智能体总是对同样的环境做出相同的动作,会导致它的策略很容易被对手预测。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Value Function
|
### Value Function
|
||||||

|

|
||||||
价值函数是一个折扣的未来奖励的加和,就是你通过进行某一种行为,然后你未来得到多大的奖励。然后这个价值函数里面其实有一个 discount factor。我们希望尽可能在短的时间里面得到尽可能多的奖励。所以如果我们说十天过后我给你100块钱,跟我现在给你100块钱,你肯定更希望我现在就给你100块钱,因为你可以把这100块钱存在银行里面,你就会有一些利息。所以我们就通过把这个 discount factor 放到价值函数的定义里面。后面我们得到的奖励价值函数的定义其实是一个期望。
|
价值函数是一个折扣的未来奖励的加和,就是你通过进行某一种行为,然后你未来得到多大的奖励。然后这个价值函数里面其实有一个 discount factor。我们希望尽可能在短的时间里面得到尽可能多的奖励。所以如果我们说十天过后我给你100块钱,跟我现在给你100块钱,你肯定更希望我现在就给你100块钱,因为你可以把这100块钱存在银行里面,你就会有一些利息。所以我们就通过把这个 discount factor 放到价值函数的定义里面。后面我们得到的奖励价值函数的定义其实是一个期望。
|
||||||
@@ -287,7 +285,7 @@ A: 针对是否需要对真实环境建模,强化学习可以分为有模型
|
|||||||
|
|
||||||
* Exploitation 是说我们现在不去尝试新的东西,就采取我们已知的可以得到很大奖励的行为。
|
* Exploitation 是说我们现在不去尝试新的东西,就采取我们已知的可以得到很大奖励的行为。
|
||||||
|
|
||||||
因为在刚开始的时候这个强化学习 agent 并不知道它采取了某个行为会发生什么,所以它只能通过试错去探索。所以 Exploration 就是在试错来理解采取的这个行为到底可不可以得到好的奖励。Exploitation 是说我们直接采取已知的可以得到很好奖励的行为。所以这里就面临一个 trade-off。怎么通过牺牲一些短期的 reward 来获得行为的理解。
|
因为在刚开始的时候强化学习 agent 不知道它采取了某个行为会发生什么,所以它只能通过试错去探索。所以 Exploration 就是在试错来理解采取的这个行为到底可不可以得到好的奖励。Exploitation 是说我们直接采取已知的可以得到很好奖励的行为。所以这里就面临一个 trade-off。怎么通过牺牲一些短期的 reward 来获得行为的理解。
|
||||||
|
|
||||||

|

|
||||||
这里我给大家举一些例子来说明 Exploration 和 Exploitation 的定义。
|
这里我给大家举一些例子来说明 Exploration 和 Exploitation 的定义。
|
||||||
@@ -356,7 +354,7 @@ $python
|
|||||||
强化学习的这个交互就是由 agent 跟环境进行交互。所以我们算法的 interface 也是用这个来表示。比如说我们现在安装了 OpenAI Gym。那我们这里就可以直接调入 Taxi-v2 的环境,就建立了一个这个环境初始化这个环境过后,就可以进行交互了。Agent 得到这个观测过后,它就会输出一个 action。然后这个 action 会被这个环境拿进去执行这个step,然后环境就会往前走一步,然后返回新的 observation 和 reward 以及一个 flag variable 就决定你现在这个游戏是不是结束了。这几行代码就实现了强化学习里面的 framework。
|
强化学习的这个交互就是由 agent 跟环境进行交互。所以我们算法的 interface 也是用这个来表示。比如说我们现在安装了 OpenAI Gym。那我们这里就可以直接调入 Taxi-v2 的环境,就建立了一个这个环境初始化这个环境过后,就可以进行交互了。Agent 得到这个观测过后,它就会输出一个 action。然后这个 action 会被这个环境拿进去执行这个step,然后环境就会往前走一步,然后返回新的 observation 和 reward 以及一个 flag variable 就决定你现在这个游戏是不是结束了。这几行代码就实现了强化学习里面的 framework。
|
||||||
|
|
||||||

|

|
||||||
在OpenAI Gym 里面有很经典的控制类游戏,比如说 Acrobot,就是把这个两节铁杖,然后甩了立起来。还有 CartPole,通过控制一个平板,让这个木棍立起来。还有 MountainCar 的一个例子,就通过前后移动这个车,让它到达这个旗子的位置。大家可以去[这个链接](https://gym.openai.com/envs/#classic_control)看一看这些环境。在刚开始测试强化学习的时候,可以选择这些简单环境,因为这些环境可能是在一两分钟之内你就可以见到一个效果。
|
在 OpenAI Gym 里面有很经典的控制类游戏,比如说 Acrobot,就是把这个两节铁杖,然后甩了立起来。还有 CartPole,通过控制一个平板,让这个木棍立起来。还有 MountainCar 的一个例子,就通过前后移动这个车,让它到达这个旗子的位置。大家可以去[这个链接](https://gym.openai.com/envs/#classic_control)看一看这些环境。在刚开始测试强化学习的时候,可以选择这些简单环境,因为这些环境在一两分钟之内,你就可以见到一个效果。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@@ -8,16 +8,16 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
强化学习的三个重要的要素:状态动作和奖励。强化学习智能体跟环境是一步一步交互的,就是我先观察一下状态,然后再输入动作。再观察一下状态,再输出动作,拿到这些 reward 。它是一个跟时间相关的一个序列决策的问题。
|
强化学习的三个重要的要素:状态、动作和奖励。强化学习智能体跟环境是一步一步交互的,就是我先观察一下状态,然后再输入动作。再观察一下状态,再输出动作,拿到这些 reward 。它是一个跟时间相关的一个序列决策的问题。
|
||||||
|
|
||||||
举个例子,在 $t-1$ 时刻,我看到了熊对我招手,那我下意识的可能输出的动作就是我赶紧跑路。熊看到了有人跑了,可能就觉得发现猎物,开始发动攻击。而在 $t$ 时刻的话,我如果选择装死的动作,可能熊咬了咬我那个摔了几下就发现就觉得挺无趣的,可能会走开。那这个时候,我再跑路的话可能就跑路成功了,就是大概是这样子的一个序列决策的过程。
|
举个例子,在 $t-1$ 时刻,我看到了熊对我招手,那我下意识的可能输出的动作就是我赶紧跑路。熊看到了有人跑了,可能就觉得发现猎物,开始发动攻击。而在 $t$ 时刻的话,我如果选择装死的动作,可能熊咬了咬我那个摔了几下就发现就觉得挺无趣的,可能会走开。这个时候,我再跑路的话可能就跑路成功了,就是这样子的一个序列决策的过程。
|
||||||
|
|
||||||
当然在输出每一个动作之前,其实你都是可以选择不同的动作。比如说在 $t$ 时刻,我选择跑路的时候,熊已经追上来了,如果说 $t$ 时刻,我没有选择装死,而我是选择跑路的话,这个时候熊已经追上了,那这个时候,其实我有两种情况转移到不同的状态去,就我有一定的概率可以逃跑成功,也有很大的概率我会逃跑失败。那我们就用状态转移概率 $p\left[s_{t+1}, r_{t} \mid s_{t}, a_{t}\right]$ 来表述说在 $s_t$ 的状态选择了 $a_t$ 的动作的时候,转移到 $s_{t+1}$ ,而且拿到 $r_t$ 的概率是多少。
|
当然在输出每一个动作之前,其实你都是可以选择不同的动作。比如说在 $t$ 时刻,我选择跑路的时候,熊已经追上来了,如果说 $t$ 时刻,我没有选择装死,而我是选择跑路的话,这个时候熊已经追上了,那这个时候,其实我有两种情况转移到不同的状态去,就我有一定的概率可以逃跑成功,也有很大的概率我会逃跑失败。那我们就用状态转移概率 $p\left[s_{t+1}, r_{t} \mid s_{t}, a_{t}\right]$ 来表述说在 $s_t$ 的状态选择了 $a_t$ 的动作的时候,转移到 $s_{t+1}$ ,而且拿到 $r_t$ 的概率是多少。
|
||||||
|
|
||||||
这样子的一个状态转移概率是具有`马尔科夫性质(Markov Property)`的(系统下一时刻的状态仅由当前时刻的状态决定,不依赖于以往任何状态)。因为这个状态转移概率,它是下一时刻的状态是取决于当前的状态,它和之前的 $s_{t-1}$ 和 $s_{t-2}$ 都没有什么关系。然后再加上说这个过程也取决于智能体跟环境交互的这个$a_t$ ,所以有一个决策的一个过程在里面。我们就称这样的一个过程为`马尔可夫决策过程(MDP)`。
|
这样子的一个状态转移概率是具有`马尔可夫性质(Markov Property)`的(系统下一时刻的状态仅由当前时刻的状态决定,不依赖于以往任何状态)。因为这个状态转移概率,它是下一时刻的状态是取决于当前的状态,它和之前的 $s_{t-1}$ 和 $s_{t-2}$ 都没有什么关系。然后再加上说这个过程也取决于智能体跟环境交互的这个$a_t$ ,所以有一个决策的一个过程在里面。我们就称这样的一个过程为`马尔可夫决策过程(Markov Decision Process, MDP)`。
|
||||||
|
|
||||||
|
|
||||||
MDP 就是序列决策这样一个经典的表达方式。MDP 也是强化学习里面一个非常基本的学习框架。状态、动作、奖励和状态转移概率(S,A,P,R),这四个合集就构成了强化学习 MDP 的四元组,后面也可能会再加个衰减因子构成五元组。
|
MDP 就是序列决策这样一个经典的表达方式。MDP 也是强化学习里面一个非常基本的学习框架。状态、动作、状态转移概率和奖励 $(S,A,P,R)$,这四个合集就构成了强化学习 MDP 的四元组,后面也可能会再加个衰减因子构成五元组。
|
||||||
|
|
||||||
|
|
||||||

|

|
||||||
@@ -45,8 +45,7 @@ MDP 就是序列决策这样一个经典的表达方式。MDP 也是强化学习
|
|||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
但是有的时候你目光放的太长远不好,因为如果说事情很快就结束的话,你考虑到最后一步的收益无可厚非,。如果说是一个持续的没有尽头的任务,即`持续式任务(Continuing Task)`。你把所有未来的收益全部相加,作为当前的状态价值就很不合理。股票的例子就很典型了,我们要关注的是累积的收益。可是如果说十年之后才有一次大涨大跌,你要把十年后的收益也作为当前动作的考虑因素,显然我们不会这么做。那我们会怎么办呢,就有句俗话说得好,就对远一点的东西呢,我们就当做近视就不需要看得太清楚,我们就可以适当引入这个衰减因子 $\gamma$ 来去计算这个未来总收益。$\gamma \in [0,1]$ 。越往后 $\gamma^n$ 就会越小,也就是说越后面的收益对当前价值的影响就会越小。
|
||||||
但是有的时候你目光放的太长远不好,因为如果说事情很快就结束的话,你考虑到最后一步的收益无可厚非,可是如果说是一个持续的没有尽头的任务,你单纯的把所有未来的收益全部相加,作为当前的状态价值就很不合理。股票的例子就很典型了,我们要关注的是累积的收益。可是如果说十年之后才有一次大涨大跌,你要把十年后的收益也作为当前动作的考虑因素,显然我们不会这么做。那我们会怎么办呢,就有句俗话说得好,就对远一点的东西呢,我们就当做近视就不需要看得太清楚,我们就可以适当引入这个衰减因子 $\gamma$ 来去计算这个未来总收益。$\gamma \in [0,1]$ 。越往后 $\gamma^n$ 就会越小,也就是说越后面的收益对当前价值的影响就会越小。
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -94,7 +93,7 @@ $$
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
为了让大家更加直观感受下一个状态影响上一个状态效果,这里推荐那个斯坦福大学的一个网站:[Temporal Difference Learning Gridworld Demo](https://cs.stanford.edu/people/karpathy/reinforcejs/gridworld_td.html)。这个网站模拟了就是这种单步更新的过程中,所有格子的一个状态价值的变化过程。我们可以看到格子里面有几个 -1的 reward。只有一个 +1 reward 的那个格子。
|
为了让大家更加直观感受下一个状态影响上一个状态效果,这里推荐斯坦福大学的一个网站:[Temporal Difference Learning Gridworld Demo](https://cs.stanford.edu/people/karpathy/reinforcejs/gridworld_td.html)。这个网站模拟了就是这种单步更新的过程中,所有格子的一个状态价值的变化过程。我们可以看到格子里面有几个 -1的 reward。只有一个 +1 reward 的那个格子。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -104,17 +103,17 @@ $$
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
这种强化方式其实在数学上面一行公式就表达出来了。这种更新的方式叫做`时序差分`的一个更新的方式。这个公式它想要表达就是我可以拿下一步的 Q 值 $Q(S_{t+_1},A_{t+1})$ 来更新我这一步的 Q 值 $Q(S_t,A_t)$ 。
|
这种强化方式其实在数学上面一行公式就表达出来了。这种更新的方式叫做`时序差分(Temporal Difference)`。这个公式它想要表达就是我可以拿下一步的 Q 值 $Q(S_{t+_1},A_{t+1})$ 来更新我这一步的 Q 值 $Q(S_t,A_t)$ 。
|
||||||
|
|
||||||
为了理解这个公式,如图所示,我们先把这一块当作是一个目标值,就是 $Q(S_t,A_t)$ 想要去逼近的一个目标值。我们想要计算的就是这个 $Q(S_t,A_t)$ 。因为最开始Q值都是随机初始化,或者是初始化为零。它需要不断的去逼近它理想中真实的Q 值,我们就叫 target 。Target 就是未来收益的总和大概是有多少,而且是带衰减的那个。
|
为了理解这个公式,如图所示,我们先把 $R_{t+1}+\gamma Q\left(S_{t+1}, A_{t+1}\right.)$ 当作是一个目标值,就是 $Q(S_t,A_t)$ 想要去逼近的一个目标值。我们想要计算的就是这个 $Q(S_t,A_t)$ 。因为最开始 Q 值都是随机初始化或者是初始化为零。它需要不断的去逼近它理想中真实的Q 值,我们就叫 target 。Target 就是未来收益的总和大概有多少,而且是带衰减的那个。
|
||||||
|
|
||||||
我们用 $G_t$ 来表示未来收益总和(return),我们对 return 做一下简单的数学变化,然后我们可以知道
|
我们用 $G_t$ 来表示未来收益总和(return),我们对 return 做一下简单的数学变化,可以知道
|
||||||
$$
|
$$
|
||||||
G_t = R_{t+1}+ \gamma G_{t+1}
|
G_t = R_{t+1}+ \gamma G_{t+1}
|
||||||
$$
|
$$
|
||||||
|
|
||||||
|
|
||||||
也就是说,我们拿 $Q(S_t,A_t)$ 来逼近这个 $G_t$ , 那 $Q(S_{t+1},A_{t+1})$ 其实就是近似这个 $G_{t+1}$ ,那我们可以把 $G_{t+1}$ 放到这个目标值这里。$Q(S_t,A_t)$ 就是要逼近这个目标值,怎么去逼近了。我们用软更新的方式。
|
也就是说,我们拿 $Q(S_t,A_t)$ 来逼近这个 $G_t$ , 那 $Q(S_{t+1},A_{t+1})$ 其实就是近似这个 $G_{t+1}$ ,那我们可以把 $G_{t+1}$ 放到这个目标值这里。$Q(S_t,A_t)$ 就是要逼近这个目标值。我们用软更新的方式来逼近。
|
||||||
|
|
||||||
软更新的方式就是 $\alpha$ ,每次我只更新一点点。这个 $\alpha$ 有点类似于像学习率一样的东西。最终的话,Q 值都是可以慢慢地逼近到真实的 target 值的。这样我们的更新公式只需要用到当前时刻的 $S_{t},A_t$ ,然后还有拿到的 $R_{t+1}, S_{t+1},A_{t+1}$ 。
|
软更新的方式就是 $\alpha$ ,每次我只更新一点点。这个 $\alpha$ 有点类似于像学习率一样的东西。最终的话,Q 值都是可以慢慢地逼近到真实的 target 值的。这样我们的更新公式只需要用到当前时刻的 $S_{t},A_t$ ,然后还有拿到的 $R_{t+1}, S_{t+1},A_{t+1}$ 。
|
||||||
|
|
||||||
@@ -126,7 +125,8 @@ $$
|
|||||||
|
|
||||||
然后从环境当中拿到那 state 和 reward。Agent 主要实现两个方法,一个就是根据 Q 表格去选择动作,输出 action。另外一个就是拿到 $(S_{t}, A_{t}, R_{t+1}, S_{t+1}, A_{t+1})$ 这几个值去更新我们的 Q 表格。
|
然后从环境当中拿到那 state 和 reward。Agent 主要实现两个方法,一个就是根据 Q 表格去选择动作,输出 action。另外一个就是拿到 $(S_{t}, A_{t}, R_{t+1}, S_{t+1}, A_{t+1})$ 这几个值去更新我们的 Q 表格。
|
||||||
|
|
||||||
我们直接看这个框框里面的更新公式, 和之前的公式是一模一样的。$S'$ 就是 $S_{t+1}$ 。我们就是拿下一步的 Q 值来更新这一步的 Q 值,不断地强化每一个 Q。
|
我们直接看这个框框里面的更新公式, 和之前的公式是一模一样的。$S'$ 就是 $S_{t+1}$ 。我们就是拿下一步的 Q 值来更新这一步的 Q 值,不断地强化每一个 Q。这边我们给出 [Sarsa 的 Python 实现](https://github.com/datawhalechina/leedeeprl-notes/tree/master/docs/code/Sarsa)。
|
||||||
|
|
||||||
## Sarsa(λ)
|
## Sarsa(λ)
|
||||||
|
|
||||||
Sarsa 属于单步更新法,也就是说每执行一个动作,就会更新一次价值和策略。如果不进行单步更新,而是采取 $n$ 步更新或者回合更新,即在执行 $n$ 步之后再来更新价值和策略,这样就得到了 $n$ 步 Sarsa。具体来说,对于 Sarsa,在 $t$ 时刻其价值的计算公式为
|
Sarsa 属于单步更新法,也就是说每执行一个动作,就会更新一次价值和策略。如果不进行单步更新,而是采取 $n$ 步更新或者回合更新,即在执行 $n$ 步之后再来更新价值和策略,这样就得到了 $n$ 步 Sarsa。具体来说,对于 Sarsa,在 $t$ 时刻其价值的计算公式为
|
||||||
@@ -153,9 +153,9 @@ $$
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
Sarsa 是一种 on-policy 策略。Sarsa 优化的是它实际执行的策略。它直接拿下一步,我一定会执行的 action 来去优化我的 Q 表格,所以 on-policy 在学习的过程中,只存在一种策略,它用一种策略去做 action 的选取,也用一种策略去做优化。所以 Sarsa 知道它下一步的动作有可能会跑到悬崖那边去,所以它就会在优化它自己的策略的时候,它会尽可能的离悬崖远一点哦。那这样子就会保证说,它下一步哪怕是有随机动作,它也还是在安全区域内。
|
Sarsa 是一种 on-policy 策略。Sarsa 优化的是它实际执行的策略。它直接拿下一步会执行的 action 来去优化 Q 表格,所以 on-policy 在学习的过程中,只存在一种策略,它用一种策略去做 action 的选取,也用一种策略去做优化。所以 Sarsa 知道它下一步的动作有可能会跑到悬崖那边去,所以它就会在优化它自己的策略的时候,会尽可能的离悬崖远一点。这样子就会保证说,它下一步哪怕是有随机动作,它也还是在安全区域内。
|
||||||
|
|
||||||
而 off-policy 在学习的过程中,保留了两种不同的策略。第一个策略是我们希望学到一个最佳的目标策略,另外一个策略是探索环境的策略。它可以大胆地去探索到所有可能的轨迹,然后喂给这个目标策略去学习。而且喂给目标策略的数据中并不需要 $a_{t+1}$ 。注意,Sarsa 是有 $a_{t+1}$ 的。它喂给目标策略的数据不需要 $a_{t+1}$,比如说目标策略优化时候,它才不管你下一步去往哪里探索,会不会掉悬崖,我就只选我收益最大一个最优的策略。探索环境的策略,我们叫做 `behavior policy`,它像是一个战士,可以在环境里面探索所有的动作和轨迹和经验。然后把这些经验的交给目标策略去学习。目标策略就像是在后方指挥战术的一个军师,它可以根据自己的经验来学习最优的策略,它不需要去和环境交互。
|
而 off-policy 在学习的过程中,有两种不同的策略。第一个策略是我们希望学到一个最佳的目标策略,另外一个策略是探索环境的策略,它可以大胆地去探索到所有可能的轨迹,然后喂给这个目标策略去学习。而且喂给目标策略的数据中并不需要 $a_{t+1}$ ,而 Sarsa 是有 $a_{t+1}$ 的。比如说目标策略优化时候,Q-learning 才不管你下一步去往哪里探索,会不会掉悬崖,我就只选我收益最大一个最优的策略。探索环境的策略,我们叫做 `behavior policy(行为策略)`,它像是一个战士,可以在环境里面探索所有的动作和轨迹和经验,然后把这些经验的交给目标策略去学习。`Target policy(目标策略)`就像是在后方指挥战术的一个军师,它可以根据自己的经验来学习最优的策略,不需要去和环境交互。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -180,7 +180,7 @@ $$
|
|||||||
|
|
||||||
Sarsa 实际上都是用自己的策略产生了 S,A,R,S',A' 这一条轨迹。然后拿着 $Q(S_{t+1},A_{t+1})$ 去更新原本的Q值 $Q(S_t,A_t)$。 但是 Q-learning 并不需要知道,我实际上选择哪一个 action ,它默认下一个动作就是 Q 最大的那个动作。所以它知道实际上 behavior policy 可能会有 10% 的概率去选择别的动作,但是 Q-learning 并不担心受到探索的影响,它默认了就按照最优的策略来去优化我的目标策略,所以它可以更大胆地去寻找最优的路径,它其实会表现的比 Sarsa 大胆非常多。
|
Sarsa 实际上都是用自己的策略产生了 S,A,R,S',A' 这一条轨迹。然后拿着 $Q(S_{t+1},A_{t+1})$ 去更新原本的Q值 $Q(S_t,A_t)$。 但是 Q-learning 并不需要知道,我实际上选择哪一个 action ,它默认下一个动作就是 Q 最大的那个动作。所以它知道实际上 behavior policy 可能会有 10% 的概率去选择别的动作,但是 Q-learning 并不担心受到探索的影响,它默认了就按照最优的策略来去优化我的目标策略,所以它可以更大胆地去寻找最优的路径,它其实会表现的比 Sarsa 大胆非常多。
|
||||||
|
|
||||||
然后Q-learning 的这个逐步的一个拆解的话,跟Sarsa 唯一一点不一样就是我并不需要提前知道我 $A_2$ ,我就能更新 $Q(S_1,A_1)$ 。在训练一个 episode 这个流程图当中,Q-leanring 在 learn 之前它也不需要去拿到 next action A',它只需要前面四个 $(S,A,R,S')$也就可以了。这一点就是跟 Sarsa 有一个很明显的区别。
|
然后Q-learning 的这个逐步的一个拆解的话,跟Sarsa 唯一一点不一样就是我并不需要提前知道我 $A_2$ ,我就能更新 $Q(S_1,A_1)$ 。在训练一个 episode 这个流程图当中,Q-leanring 在 learn 之前它也不需要去拿到 next action A',它只需要前面四个 $(S,A,R,S')$也就可以了。这一点就是跟 Sarsa 有一个很明显的区别。这边我们给出[ Q-learning 的 Python实现](https://github.com/datawhalechina/leedeeprl-notes/tree/master/docs/code/Q-learning)。
|
||||||
|
|
||||||
### Q-function Bellman Equation
|
### Q-function Bellman Equation
|
||||||
|
|
||||||
@@ -218,9 +218,12 @@ $$
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
下面我讲一下 on-policy 和 off-policy 的区别。
|
下面讲一下 on-policy 和 off-policy 的区别。
|
||||||
|
|
||||||
Sarsa 就是一个典型的 on-policy 策略,它只用一个 $\pi$ ,为了兼顾探索和利用,所以它训练的时候会显得有一点点胆小怕事。它在解决悬崖问题的时候,会尽可能地离悬崖边上远远的,确保说哪怕自己不小心探索了一点了,也还是在安全区域内不不至于跳进悬崖。Q-learning 是一个比较典型的 off-policy 的策略,它有目标策略 target policy,一般用 $\pi$ 来表示。然后还有行为策略 behavior policy,用 $\mu$ 来表示。它分离了目标策略跟行为策略。Q-learning 就可以大胆的用 behavior policy 去探索得到的经验轨迹来去优化我的目标策略。这样子我更有可能去探索到最优的策略。
|
* Sarsa 就是一个典型的 on-policy 策略,它只用一个 $\pi$ ,为了兼顾探索和利用,所以它训练的时候会显得有点胆小怕事。它在解决悬崖问题的时候,会尽可能地离悬崖边上远远的,确保说哪怕自己不小心探索了一点了,也还是在安全区域内不不至于跳进悬崖。
|
||||||
|
|
||||||
|
* Q-learning 是一个比较典型的 off-policy 的策略,它有目标策略 target policy,一般用 $\pi$ 来表示。然后还有行为策略 behavior policy,用 $\mu$ 来表示。它分离了目标策略跟行为策略。Q-learning 就可以大胆地用 behavior policy 去探索得到的经验轨迹来去优化我的目标策略。这样子我更有可能去探索到最优的策略。
|
||||||
|
* 比较 Q-learning 和 Sarsa 的更新公式可以发现,Sarsa 并没有选取最大值的 max 操作。因此,Q-learning 是一个非常激进的算法,希望每一步都获得最大的利益;而 Sarsa 则相对非常保守,会选择一条相对安全的迭代路线。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@@ -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 是 `value-based` 的方法。在 value based 的方法里面,我们 learn 的不是 policy,我们要 learn 的是一个 `critic`。Critic 并不直接采取行为,它想要做的事情是评价现在的行为有多好或是有多不好。假设有一个 actor $\pi$ ,critic 的工作就是来评价这个 actor 的 policy $\pi$ 好还是不好,即 `Policy Evaluation(策略评估)`。
|
||||||
|
|
||||||
> 注:李宏毅深度强化学习课程提到的 Q-learning,其实是 DQN。
|
> 注:李宏毅深度强化学习课程提到的 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。
|
举例来说,有一种 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 value function 的 input 是一个 state,它是根据 state 去计算出,看到这个state 以后的 expected accumulated reward 是多少。
|
||||||
* state-action value function 的 input 是一个 state 跟 action 的 pair,它的意思是说,在某一个 state 采取某一个action,假设我们都使用 actor $\pi$ ,得到的 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 有两种写法:
|
Q-function 有两种写法:
|
||||||
|
|
||||||
@@ -161,9 +165,9 @@ $$
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
上图想要跟大家讲的是说,为什么用 $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))
|
V^{\pi}(s)=Q^{\pi}(s, \pi(s))
|
||||||
$$
|
$$
|
||||||
@@ -175,7 +179,7 @@ $$
|
|||||||
Q^{\pi}(s, \pi(s)) \le \max _{a} Q^{\pi}(s, a)
|
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)
|
\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)
|
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]
|
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 @@ $$
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
接下来讲一下在 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)
|
\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)
|
=r_{t}+\mathrm{Q}^{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)
|
||||||
$$
|
$$
|
||||||
|
|
||||||
所以你在 learn 的时候,你会说我们有 Q-function,input $s_t$, $a_t$ 得到的 value,跟 input $s_{t+1}$, $\pi (s_{t+1})$ 得到的 value 中间,我们希望它差了一个$r_t$, 这跟刚才讲的TD 的概念是一样的。
|
所以你在 learn 的时候,你会说我们有 Q-function,input $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。
|
但是实际上在 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 就再也不会被做了,所以就会有问题。就好像说你进去一个餐厅吃饭,其实你都很难选。你今天点了某一个东西以后,假说点了某一样东西, 比如说椒麻鸡,你觉得还可以。接下来你每次去就都会点椒麻鸡,再也不会点别的东西了,那你就不知道说别的东西是不是会比椒麻鸡好吃,这个是一样的问题。
|
但是假设你在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)`问题。
|
这个问题其实就是`探索-利用窘境(Exploration-Exploitation dilemma)`问题。
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user