fix some errors
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
* 我们告诉了这个 learner 正确的标签是什么,这样它可以通过正确的标签来修正自己的这个预测。
|
||||
|
||||

|
||||
|
||||
在强化学习里面,这两点其实都不满足。举一个 Atari Breakout 游戏的例子,这是一个打砖块的游戏,控制木板,然后把这个球反弹到上面来消除这些砖块。在游戏过程中,大家可以发现你这个 agent,你这个 learner 得到的观测其实不是个 i.i.d 的分布。就是你上一帧下一帧其实有非常强的这个连续性。另外一点,你这个玩游戏的过程中,其实并没有立刻获得这个反馈,比如你现在把这个木板往右移,那么只会使得这个球然后往上或者往左上去一点,你并不会得到立刻的反馈。所以这也是为什么强化学习这么困难,就是你没有得到很好的反馈,然后你依然希望这个 agent 在这个环境里面学习。
|
||||
|
||||

|
||||
@@ -31,7 +32,7 @@
|
||||
|
||||
通过跟监督学习比较,我们可以总结出这个强化学习的一些特征。
|
||||
|
||||
* 首先它是有这个 trial-and-error exploration,它需要通过在环境里面探索来获取对这个环境的理解。
|
||||
* 首先它是有这个 trial-and-error exploration,它需要通过探索环境来获取对这个环境的理解。
|
||||
* 第二点是这个强化学习 agent 会从环境里面获得延迟的奖励。
|
||||
* 第三点是这个强化学习的训练过程中时间非常重要,因为你得到的数据都是有这个时间关联的,而不是这个 i.i.d 分布的。大家如果做过机器学习的话就会发现,如果你的观测数据有非常强的关联,其实会使得这个训练非常不稳定。这也是为什么监督学习我们希望我们的 data 尽量是 i.i.d 了,这样就可以消除数据之间的相关性。
|
||||
* 第四点是这个 agent 的行为会影响它随后得到的数据,这一点其实也是非常重要的。就是在我们训练这个 agent 的过程中,很多时候我们也是通过正在学习的这个 agent 去跟这个环境交互得到数据。所以如果我们在训练过程中,这个 agent 的模型如果快死掉了,那么就会使得我们采集到的数据也是非常糟糕的。这样整个训练过程就失败了。所以其实在强化学习里面一个非常重要的问题就是怎么使得让这个 agent 的行为一直稳定的提升。
|
||||
@@ -106,9 +107,9 @@
|
||||
|
||||
## Introduction to Sequential Decision Making
|
||||

|
||||
接下来我们讲序列决策过程,强化学习研究的问题 是 agent 跟环境交互,这幅图左边画的是一个 agent,agent 一直在跟环境进行交互。这个agent 把它输出的动作给环境,然后环境取得这个动作过后,会进行到下一步,然后会把下一步的观测跟它上一步是否得到奖励返还给 agent。通过这样的交互过程,然后会产生很多观测,agent 的目的就是为了从这些观测之中学到能极大化奖励的策略。
|
||||
接下来我们讲`序列决策过程`,强化学习研究的问题 是 agent 跟环境交互,这幅图左边画的是一个 agent,agent 一直在跟环境进行交互。这个agent 把它输出的动作给环境,然后环境取得这个动作过后,会进行到下一步,然后会把下一步的观测跟它上一步是否得到奖励返还给 agent。通过这样的交互过程,然后会产生很多观测,agent 就是为了从这些观测之中学到能极大化奖励的策略。
|
||||
|
||||
### Rewards
|
||||
### Reward
|
||||
|
||||

|
||||
奖励是由环境给的一个反馈信号,这个信号指定了这个 agent 在某一步采取了某个策略是否得到奖励。强化学习的目的就是为了极大化 agent 可以获得的奖励,这个 agent 在这个环境里面存在的目的就是为了极大它的期望积累的奖励。
|
||||
@@ -118,7 +119,7 @@
|
||||
这里我给大家举一些奖励的例子。不同的环境,奖励的也是不同的。
|
||||
|
||||
* 比如说一个下象棋的选手,它的目的其实就为了赢棋,奖励是说在最后棋局结束的时候,他知道会得到一个正奖励或者负奖励。
|
||||
* 羚羊站立其实也是一个强化学习过程,那它得到的奖励就是它是否可以最后跟它妈妈一块离开或者它被吃掉。
|
||||
* 羚羊站立也是一个强化学习过程,那它得到的奖励就是它是否可以最后跟它妈妈一块离开或者它被吃掉。
|
||||
* 股票管理里面,奖励定义由你的股票获取的收益跟损失决定。
|
||||
* 在玩雅达利游戏的时候,奖励就是你有没有在增加游戏的分数,奖励本身的稀疏程度其实也决定了这个游戏的难度。
|
||||
|
||||
@@ -155,12 +156,18 @@
|
||||
|
||||
Policy 就是决定了这个 agent 的行为,它其实是一个函数,把输入的状态变成行为。所以这里有有两种 policy。
|
||||
|
||||
* 一种是 stochastic policy,它就是这个 $\pi$ 函数,当你输入一个状态 s 的时候,它输出其实是一个概率。这概率就是你所有行为的一个概率,然后你可以进一步对这个概率分布进行采样,然后得到真实的你采取的行为。比如说这个概率可能是有70%的概率往左,30%的概率往右,那么你通过采样就可以得到一个 action。
|
||||
* 一种是 `stochastic policy(随机性策略)`,它就是 $\pi$ 函数 $\pi(a | s)=P\left[A_{t}=a | S_{t}=s\right]$ ,当你输入一个状态 s 的时候,它输出其实是一个概率。这概率就是你所有行为的一个概率,然后你可以进一步对这个概率分布进行采样,然后得到真实的你采取的行为。比如说这个概率可能是有 70% 的概率往左,30% 的概率往右,那么你通过采样就可以得到一个 action。
|
||||
|
||||
* 另外一种是 deterministic policy,就是说你这里有可能只是采取它的极大化,采取最有可能的概率。所以你现在这个概率就是事先决定好的。
|
||||
* 一种是 `deterministic policy(确定性策略)`,就是说你这里有可能只是采取它的极大化,采取最有可能的概率。所以你现在这个概率就是事先决定好的。
|
||||
|
||||
从 Atari 游戏的来看的话,policy function 的输入就是一游戏的一帧,然后它的输出决定你是往左走或者是往右走。
|
||||
|
||||
通常情况下,强化学习一般使用`随机性策略`。随机性策略可以有很多优点:
|
||||
|
||||
* 在学习时可以通过引入一定随机性更好地探索环境;
|
||||
|
||||
* 随机性策略的动作具有多样性,这一点在多个智能体博弈时也非常重要。采用确定性策略的智能体总是对同样的环境做出相同的动作,会导致它的策略很容易被对手预测。
|
||||
|
||||
|
||||
|
||||
### Value Function
|
||||
@@ -187,8 +194,6 @@ Policy 就是决定了这个 agent 的行为,它其实是一个函数,把输
|
||||
|
||||
这里我们来看一个走迷宫的例子,这个例子是要求这个 agent 从 start 开始,然后到达 goal 的位置。我们这里设定的奖励是每走一步,你就会得到一个负的奖励,然后这里可以采取的动作是往上下左右走。然后当前状态用现在 agent 所在的位置来描述。
|
||||
|
||||
|
||||
|
||||

|
||||
我们可以用不同的强化学习算法来解这个环境,如果我们这里采取的是 Policy-based RL。当我们学习好了这个环境过后,然后在每一个状态,我们就会得到一个最佳的行为。比如说现在在第一格开始的时候,我们知道它最佳行为是往右走,然后第二格的时候,得到的最佳策略是往上走,第三格是往右走。通过这个最佳的策略,我们就可以最快地到达终点。
|
||||
|
||||
@@ -198,22 +203,31 @@ Policy 就是决定了这个 agent 的行为,它其实是一个函数,把输
|
||||
### Types of RL Agents
|
||||
|
||||

|
||||
所以根据强化学习 agent 的不同,我们可以把 agent 进行归类。
|
||||
根据强化学习 agent 的不同,我们可以把 agent 进行归类。
|
||||
|
||||
* 基于价值函数的 agent。这一类 agent 显式地学习的就是价值函数,隐式地学习了它的策略。因为这个策略是从我们学到的价值函数里面推算出来的。
|
||||
* 另外一种基于策略导向的 agent。它直接去学习 policy,就是说你直接给它一个 state,它就会输出这个动作的概率。然后在这个 policy-based agent 里面并没有去学习它的价值函数。
|
||||
|
||||
* 基于策略的 agent。它直接去学习 policy,就是说你直接给它一个 state,它就会输出这个动作的概率。然后在这个 policy-based agent 里面并没有去学习它的价值函数。
|
||||
* 然后另外还有一种 agent 是把这两者结合。把 value-based 和 policy-based 结合起来就有了 `Actor-Critic agent`。这一类 agent 就把它的策略函数和价值函数都学习了,然后通过两者的交互得到一个最佳的行为。
|
||||
|
||||
Q: 基于策略迭代和基于价值迭代的强化学习方法有什么区别?
|
||||
|
||||
A: 对于一个状态转移概率已知的马尔可夫决策过程,我们可以使用动态规划算法来求解;从决策方式来看,强化学习又可以划分为基于策略迭代的方法和基于价值迭代的方法。`决策方式`是智能体在给定状态下从动作集合中选择一个动作的依据,它是静态的,不随状态变化而变化。
|
||||
|
||||
在`基于策略迭代`的强化学习方法中,智能体会`制定一套动作策略`(确定在给定状态下需要采取何种动作),并根据这个策略进行操作。强化学习算法直接对策略进行优化,使制定的策略能够获得最大的奖励。
|
||||
|
||||
而在`基于价值迭代`的强化学习方法中,智能体不需要制定显式的策略,它`维护一个价值表格或价值函数`,并通过这个价值表格或价值函数来选取价值最大的动作。基于价值迭代的方法只能应用在不连续的、离散的环境下(如围棋或某些游戏领域),对于行为集合规模庞大、动作连续的场景(如机器人控制领域),其很难学习到较好的结果(此时基于策略迭代的方法能够根据设定的策略来选择连续的动作)。
|
||||
|
||||
基于价值迭代的强化学习算法有 Q-learning、 Sarsa 等,而基于策略迭代的强化学习算法有策略梯度算法等。此外, Actor-Critic 算法同时使用策略和价值评估来做出决策,其中,智能体会根据策略做出动作,而价值函数会对做出的动作给出价值,这样可以在原有的策略梯度算法的基础上加速学习过程,取得更好的效果。
|
||||
|
||||

|
||||
另外,我们是可以通过 agent 到底有没有学习这个环境模型来分类。
|
||||
|
||||
* 第一种是 `model-based` RL agent,它通过学习这个状态的转移来采取措施。
|
||||
* 另外一种是 ` model-free` RL agent,它没有去直接估计这个状态的转移,也没有得到环境的具体转移变量。它通过学习 value function 和 policy function 进行决策。这种 model-free 的模型里面没有一个环境转移的一个模型。
|
||||
* 第一种是 `model-based(有模型)` RL agent,它通过学习这个状态的转移来采取措施。
|
||||
* 另外一种是 ` model-free(免模型)` RL agent,它没有去直接估计这个状态的转移,也没有得到环境的具体转移变量。它通过学习 value function 和 policy function 进行决策。这种 model-free 的模型里面没有一个环境转移的一个模型。
|
||||
|
||||
Q: 有模型学习和免模型学习有什么区别?
|
||||
|
||||
针对是否需要对真实环境建模,强化学习可以分为有模型学习和免模型学习。
|
||||
A: 针对是否需要对真实环境建模,强化学习可以分为有模型学习和免模型学习。
|
||||
|
||||
* 有模型学习是指根据环境中的经验,构建一个虚拟世界,同时在真实环境和虚拟世界中学习;
|
||||
|
||||
@@ -233,7 +247,7 @@ Q: 有模型学习和免模型学习有什么区别?
|
||||
|
||||
总的来说,有模型学习相比于免模型学习仅仅多出一个步骤,即对真实环境进行建模。因此,一些有模型的强化学习方法,也可以在免模型的强化学习方法中使用。在实际应用中,如果不清楚该用有模型强化学习还是免模型强化学习,可以先思考一下,在智能体执行动作前,是否能对下一步的状态和奖励进行预测,如果可以,就能够对环境进行建模,从而采用有模型学习。
|
||||
|
||||
免模型学习通常属于数据驱动型方法,需要大量的采样来估计状态、动作及奖励函数,从而优化动作策略。例如,在 Atari 平台上的《太空侵略者》(Space Invader)游戏中,免模型的深度强化学习需要大约 2 亿帧游戏画面才能学到比较理想的效果。相比之下,有模型学习可以在一定程度上缓解训练数据匮乏的问题,因为智能体可以在虚拟世界中行训练。
|
||||
免模型学习通常属于数据驱动型方法,需要大量的采样来估计状态、动作及奖励函数,从而优化动作策略。例如,在 Atari 平台上的 Space Invader 游戏中,免模型的深度强化学习需要大约 2 亿帧游戏画面才能学到比较理想的效果。相比之下,有模型学习可以在一定程度上缓解训练数据匮乏的问题,因为智能体可以在虚拟世界中行训练。
|
||||
|
||||
免模型学习的泛化性要优于有模型学习,原因是有模型学习算需要对真实环境进行建模,并且虚拟世界与真实环境之间可能还有差异,这限制了有模型学习算法的泛化性。
|
||||
|
||||
@@ -254,9 +268,9 @@ Q: 有模型学习和免模型学习有什么区别?
|
||||

|
||||
在强化学习里面,Exploration 和 Exploitation 是两个很核心的问题。
|
||||
|
||||
* Exploration 的意思是说我们怎么去探索这个环境。通过尝试不同的行为,然后可以得到一个最佳的策略,得到最大奖励的策略。
|
||||
* Exploration 是说我们怎么去探索这个环境。通过尝试不同的行为,然后可以得到一个最佳的策略,得到最大奖励的策略。
|
||||
|
||||
* Exploitation 的意思是我们现在不去尝试新的东西,就采取我们已知的可以得到很大奖励的行为。
|
||||
* Exploitation 是说我们现在不去尝试新的东西,就采取我们已知的可以得到很大奖励的行为。
|
||||
|
||||
因为在刚开始的时候这个强化学习 agent 并不知道它采取了某个行为会发生什么,所以它只能通过试错去探索。所以 Exploration 就是在试错来理解采取的这个行为到底可不可以得到好的奖励。Exploitation 是说我们直接采取已知的可以得到很好奖励的行为。所以这里就面临一个 trade-off。怎么通过牺牲一些短期的 reward 来获得行为的理解。
|
||||
|
||||
@@ -280,7 +294,7 @@ Q: 有模型学习和免模型学习有什么区别?
|
||||
|
||||
|
||||
|
||||
### Experiment with Reinforcement Learning
|
||||
## Experiment with Reinforcement Learning
|
||||

|
||||
接下来我们会进入一个实践环节。强化学习其实是一个理论跟实践结合的一个机器学习分支,需要去推导很多算法公式。然后去理解它算法背后的一些数学原理。另外一方面,上机实践通过实现算法,然后在很多实验环境里面去真正探索这个算法是不是可以得到预期效果也是一个非常重要的一个过程。所以我希望大家把实践提到一个很高的高度,真正去实践这个强化学习的算法。
|
||||
|
||||
@@ -296,13 +310,31 @@ Q: 有模型学习和免模型学习有什么区别?
|
||||
|
||||

|
||||
|
||||
强化学习的话就不得不提 OpenAI 这家公司。OpenAI 是一个非盈利的人工智能研究公司。Open AI 公布了非常多的学习资源以及这个算法资源,他们之所以叫 Open AI,就是他们把他们所有开发的这些算法都 open source 出来。
|
||||
|
||||
强化学习的话就不得不提 [ OpenAI](https://openai.com/)。OpenAI 是一个非盈利的人工智能研究公司。Open AI 公布了非常多的学习资源以及这个算法资源,他们之所以叫 Open AI,就是他们把他们所有开发的这些算法都 open source 出来。
|
||||
|
||||
### Gym
|
||||
|
||||

|
||||
|
||||
`OpenAI Gym` 里面包含了很多现有的环境,比如说这个 Atari 游戏,然后还有一些强化学习里面比较经典的一些控制的环境。Gym Retro 是这个 gym 环境的进一步扩展,包含了更多的一些游戏。
|
||||
[OpenAI Gym](https://gym.openai.com/) 是一个环境仿真库,里面包含了很多现有的环境。针对不同的场景,我们可以选择不同的环境,
|
||||
|
||||
* 离散控制场景(输出的动作是可数的,比如 Pong 游戏中输出的向上或向下动作):一般使用 Atari 环境评估
|
||||
* 连续控制场景(输出的动作是不可数的,比如机器人走路时不仅有方向,还要角度,角度就是不可数的,是一个连续的量 ):一般使用 mujoco 环境评估
|
||||
|
||||
Gym Retro 是对 Gym 环境的进一步扩展,包含了更多的一些游戏。
|
||||
|
||||
我们可以通过 pip 来安装 Gym:
|
||||
|
||||
```bash
|
||||
pip install gym
|
||||
```
|
||||
|
||||
在 Python 环境中导入Gym,如果不报错,就可以认为 Gym 安装成功。
|
||||
|
||||
```python
|
||||
$python
|
||||
>>>import gym
|
||||
```
|
||||
|
||||

|
||||
|
||||
@@ -311,6 +343,10 @@ Q: 有模型学习和免模型学习有什么区别?
|
||||

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

|
||||
|
||||
这里我们看一下 CartPole 的这个环境。对于这个环境,有两个动作,Cart 往左移还是往右移。这里得到了观测:它这个车当前的位置,Cart 当前的往左往右移的速度,这个杆的这个角度以及它的杆的最高点的这个速度。
|
||||
@@ -328,12 +364,63 @@ observation, reward, done, info = env.step(action)
|
||||
|
||||
如果我们玩这个环境的话,就就直接可以 import gym,调入 CartPole 这个环境。然后这里就可以通过这个采样,然后来执行这个环境。
|
||||
|
||||
```python
|
||||
import gym # 导入Gym的Python接口环境包
|
||||
env = gym.make('CartPole-v0') # 构建实验环境
|
||||
env.reset() # 重置一个 episode
|
||||
for _ in range(1000):
|
||||
env.render() # 用于显示渲染的场景
|
||||
action = env.action_space.sample()
|
||||
env.step(action) # 用于提交动作,括号内是具体的动作
|
||||
env.close()
|
||||
```
|
||||
|
||||
当你执行这段代码时,可能会很失望,因为机器人就像个醉汉,完全无视那根本该立起来的杆子,驾驶着小车朝某个方向一通跑,直到不见踪影。别着急,我们还没开始训练机器人呢。
|
||||
|
||||
Gym中的小游戏,大部分都可以用一个普通的实数或者向量来充当动作。打印 `env.action_space.sample()` 的返回值,能看到输出为1或者0。
|
||||
|
||||
`env.action_space.sample()`的含义是,在该游戏的所有动作空间里随机选择一个作为输出。在这个例子中,意思就是,动作只有两个,一个是 0,另一个是 1,一左一右。
|
||||
|
||||
`env.step()`这个方法的作用不止于此,它还有四个返回值,分别是`observation`、`reward`、`done`、`info`。
|
||||
|
||||
* `observation(object)`是状态信息,是在游戏中观测到的屏幕像素值或者盘面状态描述信息。
|
||||
* `reward(float)`是奖励值,即 Action 提交以后能够获得的奖励值。这个奖励值因游戏的不同而不同,但总体原则是,对完成游戏有帮助的动作会获得比较高的奖励值。
|
||||
* `done(boolean)`表示游戏是否已经完成。如果完成了,就需要重置游戏并开始一个新的Episode。
|
||||
* `info(dict)`是一些比较原始的用于诊断和调试的信息,或许对训练有帮助。不过,OpenAI团队在评价你提交的机器人时,是不允许使用这些信息的。
|
||||
|
||||
在每个训练中都要使用的返回值有observation、reward、done。但是,observation的结构会由于游戏的不同而发生变化。以CartPole-v0小游戏为例,我们修改下代码:
|
||||
|
||||
```python
|
||||
import gym # 导入Gym的Python接口环境包
|
||||
env = gym.make('CartPole-v0') # 构建实验环境
|
||||
env.reset() # 重置一个 episode
|
||||
for _ in range(1000):
|
||||
env.render() # 用于显示渲染的场景
|
||||
action = env.action_space.sample()
|
||||
observation, reward, done, info = env.step(action)
|
||||
print(observation)
|
||||
env.close()
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```
|
||||
[ 0.01653398 0.19114579 0.02013859 -0.28050058]
|
||||
[ 0.0203569 -0.00425755 0.01452858 0.01846535]
|
||||
[ 0.02027175 -0.19958481 0.01489789 0.31569658]
|
||||
......
|
||||
```
|
||||
|
||||
从输出可以看出这是一个四维的Observation。在其他游戏中会有维度很多的情况。
|
||||
|
||||
`env.step()`完成了一个完整的 $S \to A \to R \to S'$ 过程。我们只要不断观测这样的过程,并让机器在其中用相应的算法完成训练,就能得到一个高质量的强化学习模型。
|
||||
|
||||
## References
|
||||
|
||||
* [百面深度学习](https://book.douban.com/subject/35043939/)
|
||||
* [白话强化学习与PyTorch](https://book.douban.com/subject/34809676/)
|
||||
|
||||
## To-do
|
||||
|
||||
* Gym 安装过程
|
||||
* RL例子
|
||||
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 63 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 278 KiB After Width: | Height: | Size: 173 KiB |
@@ -2,15 +2,17 @@
|
||||
|
||||
这节课我们通过最简单的`表格型的方法`来讲解如何使用 value-based 方法去求解强化学习。
|
||||
|
||||
## Sarsa
|
||||
|
||||

|
||||
|
||||
强化学习的三个重要的要素:状态动作和奖励。强化学习智能体跟环境是一步一步交互的,就是我先观察一下状态,然后再输入动作。再观察一下状态,再输出动作,拿到这些reward 。它是一个跟时间相关的一个序列决策的问题。
|
||||
强化学习的三个重要的要素:状态动作和奖励。强化学习智能体跟环境是一步一步交互的,就是我先观察一下状态,然后再输入动作。再观察一下状态,再输出动作,拿到这些 reward 。它是一个跟时间相关的一个序列决策的问题。
|
||||
|
||||
举个例子,在 $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$ 的概率是多少。
|
||||
|
||||
我们就说这样子的一个状态转移概率是符合马尔科夫的,因为这个状态转移概率,它是下一时刻的状态是取决于当前的状态,它和之前的 $s_{t-1}$ 和 $s_{t-2}$ 都没有什么关系。然后再加上说这个过程也取决于智能体跟环境交互的这个$a_t$ ,所以有一个决策的一个过程在里面。我们就称这样的一个过程为马尔可夫决策过程(MDP)。
|
||||
这样子的一个状态转移概率是具有`马尔科夫性质`的(系统下一时刻的状态仅由当前时刻的状态决定,不依赖于以往任何状态)。因为这个状态转移概率,它是下一时刻的状态是取决于当前的状态,它和之前的 $s_{t-1}$ 和 $s_{t-2}$ 都没有什么关系。然后再加上说这个过程也取决于智能体跟环境交互的这个$a_t$ ,所以有一个决策的一个过程在里面。我们就称这样的一个过程为`马尔可夫决策过程(MDP)`。
|
||||
|
||||
MDP 就是序列决策这样一个经典的表达方式。MDP 也是强化学习里面一个非常基本的学习框架。像之前的这四个状态、动作、奖励和状态转移概率,S,A,P,R,这四个合集就构成了强化学习 MDP 的四元组,那后面其实也可能会再加个衰减因子构成五元组。
|
||||
|
||||
@@ -22,18 +24,18 @@ MDP 就是序列决策这样一个经典的表达方式。MDP 也是强化学习
|
||||
|
||||
我们把这些可能的动作和可能的状态转移的关系画成这样子的一个树状图。它们之间的关系就是一个从 $s_t$ 到 $a_t$ ,再到 $s_{t+1}$ ,再到 $a_{t+1}$,再到 $s_{t+2}$ 这样子的一个过程。
|
||||
|
||||
我们去跟环境交互,我们只能走完整的一条通路。这里面产生了一系列的一个决策的过程,就是我们跟环境交互产生了一个经验。然后我们会使用 P 函数和 R 函数来去描述环境。P 函数就是状态转移的概率,R 函数就是Reward function。P函数实际上反映的是环境的一个随机性。比方说,在熊发怒的情况下,我如果选择装死,假设熊看到人装死就一定会走的话,我们就称在这里面的这个状态转移概率就是百分之百。但如果说在熊发怒的情况下,我选择跑路而导致说我有可能跑成功以及跑失败,出现这两种情况。那我们就可以用概率去表达一下说转移到其中一种情况的概率大概 10%,另外一种情况的概率大概是90%会跑失败。**如果我们知道这些状态转移概率和奖励函数的话,我们就说这个环境是已知的,因为我们是用这两个函数去描述环境的。**如果是已知的话,我们其实可以用动态规划去计算说,我如果要逃脱熊,那么能够逃脱熊概率最大的最优策略是什么。很多强化学习的经典的算法都是 model-free 的,就是环境是未知的这样子的一个情况下,我们强化学习怎么去解决。
|
||||
我们去跟环境交互,我们只能走完整的一条通路。这里面产生了一系列的一个决策的过程,就是我们跟环境交互产生了一个经验。然后我们会使用 P 函数和 R 函数来去描述环境。P 函数就是状态转移的概率,R 函数就是 Reward function。P 函数实际上反映的是环境的一个随机性。比方说,在熊发怒的情况下,我如果选择装死,假设熊看到人装死就一定会走的话,我们就称在这里面的这个状态转移概率就是百分之百。但如果说在熊发怒的情况下,我选择跑路而导致说我有可能跑成功以及跑失败,出现这两种情况。那我们就可以用概率去表达一下说转移到其中一种情况的概率大概 10%,另外一种情况的概率大概是90%会跑失败。**如果我们知道这些状态转移概率和奖励函数的话,我们就说这个环境是已知的,因为我们是用这两个函数去描述环境的。**如果是已知的话,我们其实可以用动态规划去计算说,我如果要逃脱熊,那么能够逃脱熊概率最大的最优策略是什么。很多强化学习的经典的算法都是 model-free 的,就是环境是未知的这样子的一个情况下,我们强化学习怎么去解决。
|
||||
|
||||

|
||||
因为现实世界中人类第一次遇到熊之前,我们根本不知道我们能不能跑得过熊。所以刚刚那个10%、90%的概率也就是虚构出来的概率,熊到底在什么时候会往什么方向去转变的话,我们经常是不知道的。我们是处在一个未知的环境里的,也就是这一系列的决策的 P 函数和 R 函数是未知的。这就是 model-based 跟 model-free 的一个最大的区别。强化学习就是可以用来解决用完全未知的和随机的环境。
|
||||
|
||||
强化学习要像人类一样去学习了,人类学习的话就是一条路一条路的去尝试一下,先走一条路,我看看结果到底是什么。多试几次,只要能活命的,我们其实可以慢慢的了解哪个状态会更好。我们用价值函数 $V(s)$ 来代表这个状态是好的还是坏的。然后用这个 Q 函数来判断说在什么状态下做什么动作能够拿到最大奖励,我们用Q函数来表示这个状态动作值。
|
||||
强化学习要像人类一样去学习了,人类学习的话就是一条路一条路的去尝试一下,先走一条路,我看看结果到底是什么。多试几次,只要能活命的,我们其实可以慢慢的了解哪个状态会更好。我们用价值函数 $V(s)$ 来代表这个状态是好的还是坏的。然后用这个 Q 函数来判断说在什么状态下做什么动作能够拿到最大奖励,我们用Q函数来表示这个状态-动作值。
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
接下来就会介绍 Q函数。在经过多次尝试和那个熊打交道之后,人类就可以对熊的不同的状态去做出判断,我们可以用状态动作价值的来表达说在某个状态下,为什么动作 1 会比动作 2 好。因为动作1的价值比动作2要高。这个价值就叫 Q 函数。如果说这个 Q 表格是一张已经训练好的表格的话,那这一张表格就像是我们的一本生活手册。我们就知道在熊发怒的时候,装死的价值会高一点。在熊离开的时候,我们可能偷偷逃跑的会比较容易获救。这张表格里面 Q 函数的物理意义就是我选择了这个动作之后我最后面能不能成功,就是我需要去计算我在这个状态下,我选择了这个动作,后续能够一共拿到多少总收益。如果我可以预估未来的总收益的大小,我们当然知道在当前的这个状态下选择哪个动作,价值更高。我选择某个动作是因为我未来一共可以拿到的那个价值会更高一点。所以强化学习它的目标导向性很强,环境给了这个 reward 是一个非常重要的反馈,它就是根据环境的 reward 的反馈来去做选择。
|
||||
接下来就会介绍 Q 函数。在经过多次尝试和那个熊打交道之后,人类就可以对熊的不同的状态去做出判断,我们可以用状态动作价值的来表达说在某个状态下,为什么动作 1 会比动作 2 好。因为动作 1 的价值比动作 2 要高。这个价值就叫 Q 函数。如果说这个 Q 表格是一张已经训练好的表格的话,那这一张表格就像是我们的一本生活手册。我们就知道在熊发怒的时候,装死的价值会高一点。在熊离开的时候,我们可能偷偷逃跑的会比较容易获救。这张表格里面 Q 函数的物理意义就是我选择了这个动作之后我最后面能不能成功,就是我需要去计算我在这个状态下,我选择了这个动作,后续能够一共拿到多少总收益。如果我可以预估未来的总收益的大小,我们当然知道在当前的这个状态下选择哪个动作,价值更高。我选择某个动作是因为我未来一共可以拿到的那个价值会更高一点。所以强化学习它的目标导向性很强,环境给了这个 reward 是一个非常重要的反馈,它就是根据环境的 reward 的反馈来去做选择。
|
||||
|
||||
未来的总收益是一个什么样的概念,为什么可以用这个来评价当前这个动作是好是坏。举个例子,假设说一辆车在路上,当前是红灯,我们直接走的那个收益就很低,因为违反交通规则,这是就是当前的单步收益。可是如果我们这是一辆救护车,我们正在运送病人,把病人快速送达医院的收益非常的高,而且越快你的收益越大。很可能是我们这个时候应该要闯红灯,因为未来的远期收益太高了。这也是为什么说强化学习需要去学习远期的收益,因为现实世界当中这个奖励往往是延迟的,是有delay 的。
|
||||
|
||||
@@ -87,7 +89,7 @@ $$
|
||||
|
||||

|
||||
|
||||
这种单步更新的方法是我们在强化学习里面会接触到的叫`时序差分`的更新方法。为了让大家更好理解强化学习里面时序差分的这种更新方法。我这里就找了一下它的的物理意义。我们先理解一下巴普洛夫的条件反射实验了。这个实验讲的是什么呢?就是小狗对盆里面的食物,它会产生无条件刺激分泌唾液。一开始小狗对于铃声这种中性刺激是没有反应的。可是我们把这个铃声和这个食物结合起来,每次先给它响一下铃,再给它喂食物。多次重复之后,当铃声响起的时候,小狗也会开始流口水。盆里的肉可以认为是强化学习里面最后面的那个延迟的那个 reward。声音的刺激可以认为是有 reward 的那个状态之前的一个状态。多次重复实验之后,最后的这个 reward 会强化小狗对于这个声音的条件反射,它会让小狗知道说这个声音代表着有食物,这个声音对于小狗来说也就有了价值,它听到这个声音也会也会流口水。
|
||||
这种单步更新的方法叫做`时序差分`的更新方法。为了让大家更好理解强化学习里面时序差分的这种更新方法。我这里就找了一下它的的物理意义。我们先理解一下巴普洛夫的条件反射实验了。这个实验讲的是什么呢?就是小狗对盆里面的食物,它会产生无条件刺激分泌唾液。一开始小狗对于铃声这种中性刺激是没有反应的。可是我们把这个铃声和这个食物结合起来,每次先给它响一下铃,再给它喂食物。多次重复之后,当铃声响起的时候,小狗也会开始流口水。盆里的肉可以认为是强化学习里面最后面的那个延迟的那个 reward。声音的刺激可以认为是有 reward 的那个状态之前的一个状态。多次重复实验之后,最后的这个 reward 会强化小狗对于这个声音的条件反射,它会让小狗知道说这个声音代表着有食物,这个声音对于小狗来说也就有了价值,它听到这个声音也会也会流口水。
|
||||
|
||||

|
||||
|
||||
@@ -97,16 +99,12 @@ $$
|
||||
|
||||

|
||||
|
||||
为了让大家更加直观感受一下这个下一个状态影响上一个状态效果,这里推荐那个斯坦福大学的一个网站[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 的那个格子。
|
||||
|
||||

|
||||
|
||||
玩起来是这样的,先初始化一下,然后开始时序差分的更新过程,训练的过程你会看到这个小黄球不断的在试错。但探索当中会先迅速地发现有 reward的地方。最开始的时候,只是这些有 reward 的格子 才有价值,当不断的重复走这些路线的时候,这些有价值的格子,它可以去慢慢的影响它附近的格子的价值。反复训练之后,有 reward 的这些格子周围的格子的状态就会慢慢的被强化,然后强化就是当它收敛到最后一个最优的状态了,就是把这些价值最终收敛到一个最优的情况之后,那个小黄球就会自动地知道,就是我一直往价值高的地方走,我就能够走到能够拿到 reward 的地方。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
这种强化方式其实在数学上面一行公式就表达出来了。我们也喊说这种更新的方式叫做时序差分的一个更新的方式。这个公式它想要表达就是我可以拿下一步的Q 值 $Q(S_{t+_1},A_{t+1})$ 来更新我这一步的 Q 值 $Q(S_t,A_t)$ 。
|
||||
@@ -121,19 +119,15 @@ $$
|
||||
|
||||
也就是说,我们拿 $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}$ 。
|
||||
|
||||
我们只需要这几个值,就是$(S_{t}, A_{t}, R_{t+1}, S_{t+1}, A_{t+1})$ ,这就是 Sarsa 算法。它的命名其实就是因为它用到的就是这几个值。因为它走了一步之后,它拿到了 $(S_{t}, A_{t}, R_{t+1}, S_{t+1}, A_{t+1})$ 之后,它就可以做一次这样子的更新。
|
||||
|
||||

|
||||
|
||||
然后知关于就是用那个巴甫洛夫效应来去理解的公式的,也是在强化学习那本书名第14章有提到过了。大家感兴趣可以再去读一读,了解一下。
|
||||
|
||||
我们看看用代码去怎么去实现。了解单步更新的一个基本公式之后,代码实现就很简单了。这个是环境,这个是 agent 。我们每次跟环境交互一次之后呢,就可以 learn 一下。我们向环境输出 action,
|
||||
|
||||
然后从环境当中拿到那 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。
|
||||
|
||||
@@ -143,13 +137,24 @@ $$
|
||||
|
||||
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}$ 的。它喂给目标策略的数据不需要 $a_{t+1}$,比如说目标策略优化时候,它才不管你下一步去往哪里探索,会不会掉悬崖,我就只选我收益最大一个最优的策略。探索环境的策略,我们叫做 `behavior policy`,它像是一个战士,可以在环境里面探索所有的动作和轨迹和经验。然后把这些经验的交给目标策略去学习。目标策略就像是在后方指挥战术的一个军师,它可以根据自己的经验来学习最优的策略,它不需要去和环境交互。
|
||||
|
||||

|
||||
|
||||
Q-learning 是 off-policy 的,Sarsa 是 on-policy 的。 我们通过对比的方式来去理解 Q-learning。Sarsa 在更新 Q 表格的时候,它用到的 A' 。我要获取下一个 Q 值的时候,我用到了的 A' 是下一个 step 一定会执行的 action 。这个也 action 有可能是 $\varepsilon$-greddy 方法 sample 出来的值,也有可能是 max Q 对应的 action,也有可能是随机动作。但是就是它实实在在执行了的那个动作。
|
||||
我们通过对比的方式来去理解 `Q-learning`。Q-learning 是 off-policy 的时序差分学习方法,Sarsa 是 on-policy 的时序差分学习方法。
|
||||
|
||||
* Sarsa 在更新 Q 表格的时候,它用到的 A' 。我要获取下一个 Q 值的时候,A' 是下一个 step 一定会执行的 action 。这个 action 有可能是 $\varepsilon$-greddy 方法 sample 出来的值,也有可能是 max Q 对应的 action,也有可能是随机动作。但是就是它实实在在执行了的那个动作。
|
||||
|
||||
* 但是 Q-learning 在更新 Q 表格的时候,它用到这个的 Q 值 $Q(S',a')$ 对应的那个 action ,它不一定是下一个 step 会执行的实际的 action,因为你下一个实际会执行的那个 action 可能会探索。Q-learning 默认的 action 不是通过 behavior policy 来选取的,它是默认 A' 为最优策略选的动作,所以 Q-learning 在学习的时候,不需要传入 A',即 $a_{t+1}$ 的值。
|
||||
|
||||
在Q-learning 中,Q函数的估计方法为
|
||||
$$
|
||||
Q(s, a) \leftarrow Q(s, a)+\alpha\left(r+\gamma \max _{a^{\prime}} Q\left(s^{\prime}, a^{\prime}\right)-Q(s, a)\right)
|
||||
$$
|
||||
相当于让 $Q(s,a)$ 直接去估计最优状态值函数 $Q^*(s,a)$。
|
||||
|
||||
> 事实上,Q-learning 算法被提出的时间更早,Sarsa 算法是 Q-learning 算法的改进。
|
||||
|
||||
但是 Q-learning 在更新 Q 表格的时候,它用到这个的 Q 值 $Q(S',a')$ 对应的那个 action ,它不一定是下一个 step 会执行的实际的 action,因为你下一个实际会执行的那个 action 可能会探索。Q-learning 默认的 action 不是通过 behavior policy 来选取的,它是默认 A' 为最优策略选的动作,所以 Q-learning 在学习的时候,不需要传入A',即 $a_{t+1}$ 的值。
|
||||
|
||||

|
||||
|
||||
@@ -159,7 +164,52 @@ Sarsa 实际上都是用自己的策略产生了 S,A,R,S',A' 这一条轨迹。
|
||||
|
||||
然后Q-learning 的这个逐步的一个拆解的话,跟Sarsa 唯一一点不一样就是我并不需要提前知道我 $A_2$ ,我就能更新 $Q(S_1,A_1)$ 。在训练一个 episode 这个流程图当中,Q-leanring 在 learn 之前它也不需要去拿到 next action A',它只需要前面四个 $(S,A,R,S')$也就可以了。这一点就是跟 Sarsa 有一个很明显的区别。
|
||||
|
||||
初始状态为$s$并进行动作 $a$,然后执行策略 $\pi$ 得到的期望总回报,称为`状态-动作值函数(State-Action Value Function)`:
|
||||
$$
|
||||
Q^{\pi}(s, a)=\mathbb{E}_{s^{\prime} \sim p\left(s^{\prime} | s, a\right)}\left[r\left(s, a, s^{\prime}\right)+\gamma V^{\pi}\left(s^{\prime}\right)\right] \qquad(1)
|
||||
$$
|
||||
|
||||
状态-动作值函数也经常称为`Q 函数(Q-Function)`。
|
||||
|
||||
状态值函数$V^{\pi}(s)$ 是 Q-Function $Q^{\pi}(s,a)$ 关于动作 $a$ 的期望,即
|
||||
$$
|
||||
V^{\pi}(s)=\mathbb{E}_{a \sim \pi(a | s)}\left[Q^{\pi}(s, a)\right] \qquad(2)
|
||||
$$
|
||||
|
||||
结合公式(1) 和公式(2),Q-Function可以写为
|
||||
$$
|
||||
Q^{\pi}(s, a)=\mathbb{E}_{s^{\prime} \sim p\left(s^{\prime} | s, a\right)}\left[r\left(s, a, s^{\prime}\right)+\gamma \mathbb{E}_{a^{\prime} \sim \pi\left(a^{\prime} | s^{\prime}\right)}\left[Q^{\pi}\left(s^{\prime}, a^{\prime}\right)\right]\right]
|
||||
$$
|
||||
这是关于 Q-Function 的 Bellman Equation。
|
||||
|
||||
### Bellman Equation
|
||||
|
||||
记策略 $\pi $ 的动作价值函数为 $Q^{\pi}(s_t,a_t)$,它表示在状态 $s_t$ 下,执行动作 $a_t$ 会带来的累积奖励 $G_t$ 的期望,具体公式为:
|
||||
$$
|
||||
\begin{aligned} Q ^ { \pi } \left( s _ { t } , a _ { t } \right) & = \mathbb { E } \left[ G _ { t } \mid s _ { t } , a _ { t } \right] \\ & = \mathbb { E } \left[ r _ { t } + \gamma r _ { t + 1 } + \gamma ^ { 2 } r _ { t + 2 } + \cdots \mid s _ { t } , a _ { t } \right] \\ & = \mathbb { E } \left[ r _ { t } + \gamma \left( r _ { t + 1 } + \gamma r _ { t + 2 } + \cdots \right) \mid s _ { t } , a _ { t } \right] \\ & = \mathbb { E } \left[ r _ { t } + \gamma Q ^ { \pi } \left( s _ { t + 1 } , a _ { t + 1 } \right) \mid s _ { t } , a _ { t } \right] \end{aligned}
|
||||
$$
|
||||
上式是马尔可夫决策过程中 Bellman 方程的基本形式。累积奖励 $G_t$ 的计算,不仅考虑当下 $t$ 时刻的动作 $a_t$ 的奖励 $r_t$,还会累积计算对之后決策带来的影响(公式中的 $\gamma$ 是后续奖励的衰减因子)。从上式可以看出,当前状态的动作价值 $Q^{\pi}(s_t,a_t)$ ,与当前动作的奖励 $r_t$ 以及下一状态的动作价值 $Q^{\pi}(s_{t+1},a_{t+1})$ 有关,因此,动作价值函数的计算可以通过动态规划算法来实现。
|
||||
|
||||
从另一方面考虑,在计算 $t$ 时刻的动作价值 $Q^{\pi}(s_t,a_t)$ 时,需要知道在 $t$、$t+1$、$t+2 \cdots \cdots$ 时刻的奖励,这样就不仅需要知道某一状态的所有可能出现的后续状态以及对应的奖励值,还要进行全宽度的回溯来更新状态的价值。这种方法无法在状态转移函数未知或者大规模问题中使用。因此,Q- learning 采用了浅层的时序差分采样学习,在计算累积奖励时,基于当前策略 $\pi$ 预测接下来发生的 $n$ 步动作($n$ 可以取 1 到 $+\infty$)并计算其奖励值。
|
||||
|
||||
具体来说,假设在状态 $s_t$ 下选择了动作 $a_t$,并得到了奖励 $r_t$ ,此时状态转移到 $s_{t+1}$,如果在此状态下根据同样的策略选择了动作 $a_{t+1}$ ,则 $Q^{\pi}(s_t,a_t)$ 可以表示为
|
||||
$$
|
||||
Q^{\pi}\left(s_{t}, a_{t}\right)=\mathbb{E}_{s_{t+1}, a_{t+1}}\left[r_{t}+\gamma Q^{\pi}\left(s_{t+1}, a_{t+1}\right) \mid s_{t}, a_{t}\right]
|
||||
$$
|
||||
|
||||
Q-learning 算法在使用过程中,可以根据获得的累积奖励来选择策略,累积奖励的期望值越高,价值也就越大,智能体越倾向于选择这个动作。因此,最优策略 $\pi^*$ 对应的动作价值函数 $Q^*(s_t,a_t)$ 满足如下关系式:
|
||||
|
||||
$$
|
||||
Q^{*}\left(s_{t}, a_{t}\right)=\max _{\pi} Q^{\pi}\left(s_{t}, a_{t}\right)=\mathbb{E}_{s_{t+1}}\left[r_{t}+\gamma \max _{a_{t+1}} Q\left(s_{t+1}, a_{t+1}\right) \mid s_{t}, a_{t}\right]
|
||||
$$
|
||||
|
||||
Q-learning 算法在学习过程中会不断地更新 Q 值,但它并没有直接采用上式中的项进行更新,而是采用类似于梯度下降法的更新方式,即状态 $s_t$ 下的动作价值 $Q^*(s_t,a_t)$ 会朝着状态 $s_{t+1}$ 下的动作价值 $r_{t}+\gamma \max _{a_{t+1}} Q^{*}\left(s_{t+1}, a_{t+1}\right)$ 做一定比例的更新:
|
||||
$$
|
||||
\begin{aligned}
|
||||
Q^{*}\left(s_{t}, a_{t}\right) \leftarrow Q^{*}\left(s_{t}, a_{t}\right)+\alpha\left(r_{t}+\gamma \max _{a_{t+1}} Q^{*}\left(s_{t+1}, a_{t+1}\right)-Q^{*}\left(s_{t}, a_{t}\right)\right)
|
||||
\end{aligned}
|
||||
$$
|
||||
其中 $\alpha$ 是更新比例(学习速率)。这种渐进式的更新方式,可以减少策略估计造成的影响,并且最终会收敛至最优策略。
|
||||
|
||||

|
||||
|
||||
@@ -167,14 +217,16 @@ Sarsa 实际上都是用自己的策略产生了 S,A,R,S',A' 这一条轨迹。
|
||||
|
||||
Sarsa 就是一个典型的 on-policy 策略,它只用一个 $\pi$ ,为了兼顾探索和利用,所以它训练的时候会显得有一点点胆小怕事。它在解决悬崖问题的时候,会尽可能地离悬崖边上远远的,确保说哪怕自己不小心探索了一点了,也还是在安全区域内不不至于跳进悬崖。Q-leanring 是一个比较典型的 off-policy 的策略,它有目标策略 target policy,一般用 $\pi$ 来表示。然后还有行为策略 behavior policy,用 $\mu$ 来表示。它分离了目标策略跟行为策略。Q-learning 就可以大胆的用 behavior policy 去探索得到的经验轨迹来去优化我的目标策略。这样子我更有可能去探索到最优的策略。
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
总结如上图所示。
|
||||
|
||||
|
||||
|
||||
## References
|
||||
|
||||
* [百面深度学习](https://book.douban.com/subject/35043939/)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ Q-learning 是 `value-based` 的方法。在 value based 的方法里面,我
|
||||
|
||||

|
||||
|
||||
第二个方法是`Temporal-difference(时序差分)` 的方法, `即 TD based ` 的方法。在 MC based 的方法中,每次我们都要算 accumulated reward,也就是从某一个 state $s_a$ 一直玩到游戏结束的时候,得到的所有reward 的总和。所以你要 apply MC based 的 approach,你必须至少把这个游戏玩到结束。但有些游戏非常的长,你要玩到游戏结束才能够 update network,你可能根本收集不到太多的资料,花的时间太长了。所以我们会采用 TD based 的方法。TD based 的方法不需要把游戏玩到底,只要在游戏的某一个情况,某一个 state $s_t$ 的时候,采取 action $a_t$ 得到 reward $r_t$ ,跳到 state $s_{t+1}$,就可以 apply TD 的方法。
|
||||
第二个方法是`Temporal-difference(时序差分)` 的方法, `即 TD based ` 的方法。在 MC based 的方法中,每次我们都要算 accumulated reward,也就是从某一个 state $s_a$ 一直玩到游戏结束的时候,得到的所有 reward 的总和。所以你要 apply MC based 的 approach,你必须至少把这个游戏玩到结束。但有些游戏非常的长,你要玩到游戏结束才能够 update network,你可能根本收集不到太多的资料,花的时间太长了。所以我们会采用 TD based 的方法。TD based 的方法不需要把游戏玩到底,只要在游戏的某一个情况,某一个 state $s_t$ 的时候,采取 action $a_t$ 得到 reward $r_t$ ,跳到 state $s_{t+1}$,就可以 apply TD 的方法。
|
||||
|
||||
怎么 apply TD 的方法呢?这边是基于以下这个式子:
|
||||
$$
|
||||
@@ -77,6 +77,18 @@ $$
|
||||
|
||||
所以不同的方法考虑了不同的假设,运算结果不同。
|
||||
|
||||
举个例子来解释时序差分强化学习和蒙特卡洛强化学习的区别,
|
||||
|
||||
* 时序差分强化学习是指在不清楚马尔可夫状态转移概率的情况下,以采样的方式得到不完整的状态序列,估计某状态在该状态序列完整后可能得到的收益,并通过不断地采样持续更新价值。
|
||||
* 蒙特卡洛强化学习则需要经历完整的状态序列后,再来更新状态的真实价值。
|
||||
|
||||
例如,你想获得开车去公司的时间,每天上班开车的经历就是一次采样。假设今天在路口 A 遇到了堵车,
|
||||
|
||||
* 时序差分强化学习会在路口 A 就开始更新预计到达路口 B、路口 C $\cdots \cdots$, 以及到达公司的时间;
|
||||
* 而蒙特卡洛强化学习并不会立即更新时间,而是在到达公司后,再修改到达每个路口和公司的时间。
|
||||
|
||||
时序差分强化学习能够在知道结果之前就开始学习,相比蒙特卡洛强化学习,其更快速、灵活。
|
||||
|
||||

|
||||
|
||||
还有另外一种critic,这种critic 叫做 `Q-function`。它又叫做`state-action value function`。
|
||||
|
||||
Reference in New Issue
Block a user