fix some errors

This commit is contained in:
qiwang067
2020-07-16 15:40:15 +08:00
parent 1b11db2dbd
commit 27f8afded4
15 changed files with 51 additions and 19 deletions

View File

@@ -14,7 +14,7 @@
- bilibili[李宏毅《深度强化学习》](https://www.bilibili.com/video/BV1MW411w79n)
## 目录
- [P1 强化学习基础](https://datawhalechina.github.io/leedeeprl-notes/#/chapter1/chapter1)
- [P1 强化学习概述](https://datawhalechina.github.io/leedeeprl-notes/#/chapter1/chapter1)
- [P2 表格型方法](https://datawhalechina.github.io/leedeeprl-notes/#/chapter2/chapter2)
- [P3 策略梯度](https://datawhalechina.github.io/leedeeprl-notes/#/chapter3/chapter3)
- [P4 近端策略优化 (PPO) 算法](https://datawhalechina.github.io/leedeeprl-notes/#/chapter4/chapter4)

View File

@@ -3,7 +3,7 @@
## Reinforcement Learning
![](img/1.1.png)
强化学习讨论的问题是说一个 agent 怎么在一个复杂不确定的环境里面去极大化它能获得的这个奖励。示意图由两部分组成一部分是agent下面一部分是环境。然后在强化学习过程中Agent 跟 environment 其实一直在交互。当 agent 在环境里面获取到状态agent 会利用这个状态会输出一个 action一个决策。然后这个决策会放到这个环境之中去然后环境会通过这个 agent 采取的决策输出下一个状态以及当前的这个决策得到的奖励。Agent 的目的就是为了尽可能多的从环境中获取这个奖励。
强化学习讨论的问题是说一个 agent 怎么在一个复杂不确定的环境里面去极大化它能获得的这个奖励。示意图由两部分组成,一部分是 agent下面一部分是环境。然后在强化学习过程中Agent 跟 environment 其实一直在交互。当 agent 在环境里面获取到状态agent 会利用这个状态会输出一个 action一个决策。然后这个决策会放到这个环境之中去然后环境会通过这个 agent 采取的决策输出下一个状态以及当前的这个决策得到的奖励。Agent 的目的就是为了尽可能多的从环境中获取这个奖励。
![](img/1.2.png)
@@ -29,9 +29,7 @@
![](img/1.6.png)
通过跟监督学习比较,我们可以总结出这个强化学习的一些特征。
![](img/1.6.png)通过跟监督学习比较,我们可以总结出这个强化学习的一些特征。
* 首先它是有这个 trial-and-error exploration它需要通过在环境里面探索来获取对这个环境的理解。
* 第二点是这个强化学习 agent 会从环境里面获得延迟的奖励。
@@ -56,7 +54,7 @@
![](img/1.9.png)
上图是强化学习的一个经典例子,就是在雅达利叫 Pong 的一个游戏。这个游戏就是通过把这个球然后拍到左边,然后左边这个选手需要把这个球拍到右边,这里我给大家看的是训练好的一个 agent 。大家可以猜猜哪一边是强化学习的 agent 。右边是强化学习的agent你会发现它,一直在做这种无意义的一些振动,而正常的选手不会出现这种这样的行为。
上图是强化学习的一个经典例子,就是在雅达利叫 Pong 的一个游戏。这个游戏就是通过把这个球然后拍到左边,然后左边这个选手需要把这个球拍到右边,这里我给大家看的是训练好的一个 agent 。大家可以猜猜哪一边是强化学习的 agent 。右边是强化学习的 agent你会发现它,一直在做这种无意义的一些振动,而正常的选手不会出现这种这样的行为。
![](img/1.10.png)
@@ -210,16 +208,50 @@ Policy 就是决定了这个 agent 的行为,它其实是一个函数,把输
![](img/1.34.png)
另外,我们是可以通过 agent 到底有没有学习这个环境模型来分类。
* 有一类这个强化学习 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: 有模型学习和免模型学习有什么区别?
针对是否需要对真实环境建模,强化学习可以分为有模型学习和免模型学习。
* 有模型学习是指根据环境中的经验,构建一个虚拟世界,同时在真实环境和虚拟世界中学习;
* 免模型学习是指不对环境进行建模,直接与真实环境进行交互来学习到最优策略。
我们可以用马尔可夫决策过程来定义强化学习任务,并表示为四元组 $<S,A,P,R>$,即状态集合、动作集合、状态转移函数和奖励函数。如果这四元组中所有元素均已知,且状态集合和动作集合在有限步数内是有限集,则机器可以对真实环境进行建模,构建一个虚拟世界来模拟真实环境的状态和交互反应。
具体来说,当智能体知道状态转移函数 $P(s_{t+1}|s_t,a_t)$ 和奖励函数 $R(s_t,a_t)$ 后,它就能知道在某一状态下执行某一动作后能带来的奖励和环境的下一状态,这样智能体就不需要在真实环境中采取动作,直接在虚拟世界中学习和规划策略即可。这种学习方法称为`有模型学习`
![](img/1.35.png)
上图是有模型强化学习的流程图。
然而在实际应用中,智能体并不是那么容易就能知晓马尔科夫决策过程中的所有元素的。通常情况下,状态转移函数和奖励函数很难估计,甚至连环境中的状态都可能是未知的,这时就需要采用免模型学习。免模型学习没有对真实环境进行建模,智能体只能在真实环境中通过一定的策略来执行动作,等待奖励和状态迁移,然后根据这些反馈信息来更新行为策略,这样反复迭代直到学习到最优策略。
那么,有模型强化学习与免模型强化学习有哪些区别?各自有些优势呢?
总的来说,有模型学习相比于免模型学习仅仅多出一个步骤,即对真实环境进行建模。因此,一些有模型的强化学习方法,也可以在免模型的强化学习方法中使用。在实际应用中,如果不清楚该用有模型强化学习还是免模型强化学习,可以先思考一下,在智能体执行动作前,是否能对下一步的状态和奖励进行预测,如果可以,就能够对环境进行建模,从而采用有模型学习。
免模型学习通常属于数据驱动型方法,需要大量的采样来估计状态、动作及奖励函数,从而优化动作策略。例如,在 Atari 平台上的《太空侵略者》Space Invader游戏中免模型的深度强化学习需要大约 2 亿帧游戏画面才能学到比较理想的效果。相比之下,有模型学习可以在一定程度上缓解训练数据匮乏的问题,因为智能体可以在虚拟世界中行训练。
免模型学习的泛化性要优于有模型学习,原因是有模型学习算需要对真实环境进行建模,并且虚拟世界与真实环境之间可能还有差异,这限制了有模型学习算法的泛化性。
有模型的强化学习方法可以对环境建模,使得该类方法具有独特魅力,即“想象能力”。在免模型学习中,智能体只能一步一步地采取策略,等待真实环境的反馈;而有模型学习可以在虚拟世界中预测出所有将要发生的事,并采取对自己最有利的策略。
目前,大部分深度强化学习方法都采用了免模型学习,这是因为:
* 免模型学习更为简单直观且有丰富的开源资料,像 DQN、AlphaGo 系列等都采用免模型学习;
* 在目前的强化学习研究中,大部分情况下环境都是静态的、可描述的,智能体的状态是离散的、可观察的(如 Atari 游戏平台),这种相对简单确定的问题并不需要评估状态转移函数和奖励函数,直接采用免模型学习,使用大量的样本进行训练就能获得较好的效果。
![](img/1.36.png)
把几类模型放到同一个 pie chart 里面。三个组成部分value function、policy、model。按一个 agent 具不具有三者中的两者或者一者可以把它分成很多类。
### Exploration and Exploitation
![](img/1.36.png)
![](img/1.37.png)
在强化学习里面Exploration 和 Exploitation 是两个很核心的问题。
* Exploration 的意思是说我们怎么去探索这个环境。通过尝试不同的行为,然后可以得到一个最佳的策略,得到最大奖励的策略。
@@ -228,7 +260,7 @@ Policy 就是决定了这个 agent 的行为,它其实是一个函数,把输
因为在刚开始的时候这个强化学习 agent 并不知道它采取了某个行为会发生什么,所以它只能通过试错去探索。所以 Exploration 就是在试错来理解采取的这个行为到底可不可以得到好的奖励。Exploitation 是说我们直接采取已知的可以得到很好奖励的行为。所以这里就面临一个 trade-off。怎么通过牺牲一些短期的 reward 来获得行为的理解。
![](img/1.37.png)
![](img/1.38.png)
这里我再给大家举一些例子来说明 Exploration 和 Exploitation 的定义。
* 比如说我们在选择餐馆的时候。
@@ -249,37 +281,37 @@ Policy 就是决定了这个 agent 的行为,它其实是一个函数,把输
### Experiment with Reinforcement Learning
![](img/1.38.png)
![](img/1.39.png)
接下来我们会进入一个实践环节。强化学习其实是一个理论跟实践结合的一个机器学习分支,需要去推导很多算法公式。然后去理解它算法背后的一些数学原理。另外一方面,上机实践通过实现算法,然后在很多实验环境里面去真正探索这个算法是不是可以得到预期效果也是一个非常重要的一个过程。所以我希望大家把实践提到一个很高的高度,真正去实践这个强化学习的算法。
![](img/1.39.png)
![](img/1.40.png)
然后我们这门课程,我会在网页上面公布一些代码,会有很多会利用到 Python编程然后也会利用到深度学习的一些包主要是用 PyTorch 为主,然后在[这个链接](https://github.com/cuhkrlcourse/RLexample)里面,我其实已经公布了一些 RL 相关的代码。
![](img/1.40.png)
![](img/1.41.png)
你就直接调用现有的包来实践,现在其实有很多深度学习的包可以用,熟练使用这里面的两三种其实已经可以实现非常多的功能。所以你并不需要从头去去造轮子,就直接调用它里面的函数去实现你想实现的功能。
![](img/1.41.png)
![](img/1.42.png)
强化学习的话就不得不提 OpenAI 这家公司。OpenAI 是一个非盈利的人工智能研究公司。Open AI 公布了非常多的学习资源以及这个算法资源,他们之所以叫 Open AI就是他们把他们所有开发的这些算法都 open source 出来。
![](img/1.42.png)
![](img/1.43.png)
`OpenAI Gym` 里面包含了很多现有的环境,比如说这个 Atari 游戏然后还有一些强化学习里面比较经典的一些控制的环境。Gym Retro 是这个 gym 环境的进一步扩展,包含了更多的一些游戏。
![](img/1.43.png)
![](img/1.44.png)
强化学习的这个交互就是由 agent 跟环境进行交互。所以我们算法的 interface 也是用这个来表示。比如说我们现在安装了 OpenAI Gym。那我们这里就可以直接调入 Taxi-v2 的环境就建立了一个这个环境初始化这个环境过后就可以进行交互了。Agent 得到这个观测过后,它就会输出一个 action。然后这个 action 会被这个环境拿进去执行这个step然后环境就会往前走一步然后返回新的 observation 和 reward 以及一个 flag variable 就决定你现在这个游戏是不是结束了。这几行代码就实现了强化学习里面的 framework。
![](img/1.44.png)
![](img/1.45.png)
在OpenAI Gym 里面有很经典的控制类游戏,比如说 Acrobot就是把这个两节铁杖然后甩了立起来。还有 CartPole通过控制一个平板让这个木棍立起来。还有 MountainCar 的一个例子,就通过前后移动这个车,让它到达这个旗子的位置。大家可以去[这个链接](https://gym.openai.com/envs/#classic_control)看一看这些环境。在刚开始测试强化学习的时候,可以选择这些简单环境,因为这些环境可能是在一两分钟之内你就可以见到一个效果。
![](img/1.45.png)
![](img/1.46.png)
这里我们看一下 CartPole 的这个环境。对于这个环境有两个动作Cart 往左移还是往右移。这里得到了观测它这个车当前的位置Cart 当前的往左往右移的速度,这个杆的这个角度以及它的杆的最高点的这个速度。
@@ -298,7 +330,7 @@ observation, reward, done, info = env.step(action)
## Todo
## To-do
* Gym 安装过程
* RL例子

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 356 KiB

After

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 324 KiB

After

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 502 KiB

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 807 KiB

After

Width:  |  Height:  |  Size: 502 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 508 KiB

After

Width:  |  Height:  |  Size: 807 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 558 KiB

After

Width:  |  Height:  |  Size: 508 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 558 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 KiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 330 KiB

After

Width:  |  Height:  |  Size: 300 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 425 KiB

After

Width:  |  Height:  |  Size: 330 KiB

BIN
docs/chapter1/img/1.46.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 KiB