fix some errors

This commit is contained in:
qiwang067
2020-07-17 09:07:12 +08:00
parent c0f7080b1a
commit a3f1f49a17
5 changed files with 198 additions and 47 deletions

View File

@@ -13,6 +13,7 @@
* 我们告诉了这个 learner 正确的标签是什么,这样它可以通过正确的标签来修正自己的这个预测。
![](img/1.3.png)
在强化学习里面,这两点其实都不满足。举一个 Atari Breakout 游戏的例子,这是一个打砖块的游戏,控制木板,然后把这个球反弹到上面来消除这些砖块。在游戏过程中,大家可以发现你这个 agent你这个 learner 得到的观测其实不是个 i.i.d 的分布。就是你上一帧下一帧其实有非常强的这个连续性。另外一点,你这个玩游戏的过程中,其实并没有立刻获得这个反馈,比如你现在把这个木板往右移,那么只会使得这个球然后往上或者往左上去一点,你并不会得到立刻的反馈。所以这也是为什么强化学习这么困难,就是你没有得到很好的反馈,然后你依然希望这个 agent 在这个环境里面学习。
![](img/1.4.png)
@@ -31,7 +32,7 @@
![](img/1.6.png)通过跟监督学习比较,我们可以总结出这个强化学习的一些特征。
* 首先它是有这个 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
![](img/1.18.png)
接下来我们讲序列决策过程,强化学习研究的问题 是 agent 跟环境交互,这幅图左边画的是一个 agentagent 一直在跟环境进行交互。这个agent 把它输出的动作给环境,然后环境取得这个动作过后,会进行到下一步,然后会把下一步的观测跟它上一步是否得到奖励返还给 agent。通过这样的交互过程然后会产生很多观测agent 的目的就是为了从这些观测之中学到能极大化奖励的策略。
接下来我们讲`序列决策过程`,强化学习研究的问题 是 agent 跟环境交互,这幅图左边画的是一个 agentagent 一直在跟环境进行交互。这个agent 把它输出的动作给环境,然后环境取得这个动作过后,会进行到下一步,然后会把下一步的观测跟它上一步是否得到奖励返还给 agent。通过这样的交互过程然后会产生很多观测agent 就是为了从这些观测之中学到能极大化奖励的策略。
### Rewards
### Reward
![](img/1.19.png)
奖励是由环境给的一个反馈信号,这个信号指定了这个 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 所在的位置来描述。
![](img/1.31.png)
我们可以用不同的强化学习算法来解这个环境,如果我们这里采取的是 Policy-based RL。当我们学习好了这个环境过后然后在每一个状态我们就会得到一个最佳的行为。比如说现在在第一格开始的时候我们知道它最佳行为是往右走然后第二格的时候得到的最佳策略是往上走第三格是往右走。通过这个最佳的策略我们就可以最快地到达终点。
@@ -198,22 +203,31 @@ Policy 就是决定了这个 agent 的行为,它其实是一个函数,把输
### Types of RL Agents
![](img/1.33.png)
所以根据强化学习 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 算法同时使用策略和价值评估来做出决策,其中,智能体会根据策略做出动作,而价值函数会对做出的动作给出价值,这样可以在原有的策略梯度算法的基础上加速学习过程,取得更好的效果。
![](img/1.34.png)
另外,我们是可以通过 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: 有模型学习和免模型学习有什么区别?
![](img/1.37.png)
在强化学习里面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
![](img/1.39.png)
接下来我们会进入一个实践环节。强化学习其实是一个理论跟实践结合的一个机器学习分支,需要去推导很多算法公式。然后去理解它算法背后的一些数学原理。另外一方面,上机实践通过实现算法,然后在很多实验环境里面去真正探索这个算法是不是可以得到预期效果也是一个非常重要的一个过程。所以我希望大家把实践提到一个很高的高度,真正去实践这个强化学习的算法。
@@ -296,13 +310,31 @@ Q: 有模型学习和免模型学习有什么区别?
![](img/1.42.png)
强化学习的话就不得不提 OpenAI 这家公司。OpenAI 是一个非盈利的人工智能研究公司。Open AI 公布了非常多的学习资源以及这个算法资源,他们之所以叫 Open AI就是他们把他们所有开发的这些算法都 open source 出来。
强化学习的话就不得不提 [ OpenAI](https://openai.com/)。OpenAI 是一个非盈利的人工智能研究公司。Open AI 公布了非常多的学习资源以及这个算法资源,他们之所以叫 Open AI就是他们把他们所有开发的这些算法都 open source 出来。
### Gym
![](img/1.43.png)
`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
```
![](img/1.44.png)
@@ -311,6 +343,10 @@ Q: 有模型学习和免模型学习有什么区别?
![](img/1.45.png)
在OpenAI Gym 里面有很经典的控制类游戏,比如说 Acrobot就是把这个两节铁杖然后甩了立起来。还有 CartPole通过控制一个平板让这个木棍立起来。还有 MountainCar 的一个例子,就通过前后移动这个车,让它到达这个旗子的位置。大家可以去[这个链接](https://gym.openai.com/envs/#classic_control)看一看这些环境。在刚开始测试强化学习的时候,可以选择这些简单环境,因为这些环境可能是在一两分钟之内你就可以见到一个效果。
Gym 官方网站提供了一个简单的例子供我们了解接口(https://gym.openai.com/docs/)。通过这个例子,我们就能知道这个接口的使用方法。
![](img/1.46.png)
这里我们看一下 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