This commit is contained in:
johnjim0816
2021-05-03 23:00:05 +08:00
10 changed files with 35 additions and 30 deletions

View File

@@ -4,10 +4,7 @@
![](img/1.1.png)
* **强化学习讨论的问题是一个智能体(agent) 怎么在一个复杂不确定的环境(environment)里面去极大化它能获得的奖励。**
* 示意图由两部分组成agent 和 environment。
* 在强化学习过程中agent 跟 environment 一直在交互。Agent 在环境里面获取到状态agent 会利用这个状态输出一个动作(action),一个决策。然后这个决策会放到环境之中去,环境会根据 agent 采取的决策输出下一个状态以及当前的这个决策得到的奖励。Agent 的目的就是为了尽可能多地从环境中获取奖励。
**强化学习讨论的问题是一个智能体(agent) 怎么在一个复杂不确定的环境(environment)里面去极大化它能获得的奖励。** 示意图由两部分组成agent 和 environment。在强化学习过程中agent 跟 environment 一直在交互。Agent 在环境里面获取到状态agent 会利用这个状态输出一个动作(action),一个决策。然后这个决策会放到环境之中去,环境会根据 agent 采取的决策输出下一个状态以及当前的这个决策得到的奖励。Agent 的目的就是为了尽可能多地从环境中获取奖励。
![](img/1.2.png)
@@ -24,7 +21,7 @@
![](img/1.3.png)
在强化学习里面,这两点其实都不满足。举一个 Atari Breakout 游戏的例子,这是一个打砖块的游戏,控制木板,然后把这个球反弹到上面来消除这些砖块。
在强化学习里面,这两点其实都不满足。举一个 Atari Breakout 游戏的例子,这是一个打砖块的游戏,控制木板左右移动把球反弹到上面来消除砖块。
* 在游戏过程中,大家可以发现这个 agent 得到的观测不是个独立同分布的分布,上一帧下一帧其实有非常强的连续性。这就是说,得到的数据是相关的时间序列数据,不满足独立同分布。
* 另外一点,在玩游戏的过程中,你并没有立刻获得反馈,没有告诉你哪个动作是正确动作。比如你现在把这个木板往右移,那么只会使得这个球往上或者往左上去一点,你并不会得到立刻的反馈。所以强化学习这么困难的原因是没有得到很好的反馈,然后你依然希望 agent 在这个环境里面学习。
@@ -96,7 +93,7 @@
强化学习是有一定的历史的,只是最近大家把强化学习跟深度学习结合起来,就形成了`深度强化学习(Deep Reinforcemet Learning)`。深度强化学习 = 深度学习 + 强化学习。这里做一个类比,把它类比于这个传统的计算机视觉以及深度计算机视觉。
* 传统的计算机视觉由两个过程组成。
* 给一张图,我们先要提取它的特征,用一些设计好的特征(feature),比如说 HOG、DPM。
*一张图,我们先要提取它的特征,用一些设计好的特征(feature),比如说 HOG、DPM。
* 提取这些特征后,我们再单独训练一个分类器。这个分类器可以是 SVM、Boosting然后就可以辨别这张图片是狗还是猫。
* 2012 年过后,我们有了卷积神经网络,大家就把特征提取以及分类两者合到一块儿去了,就是训练一个神经网络。这个神经网络既可以做特征提取,也可以做分类。它可以实现这种端到端的训练,它里面的参数可以在每一个阶段都得到极大的优化,这样就得到了一个非常重要的突破。
@@ -120,10 +117,10 @@
![](img/1.17.png)
接下来给大家再看一些强化学习里面比较有意思的例子。
* **第一个例子是 [DeepMind 研发的一个走路的 agent](https://www.youtube.com/watch?v=gn4nRCC9TwQ)。**这个 agent 往前走一步,你就会得到一个 reward。这个 agent 有不同的这个形态,可以学到很多有意思的功能。比如怎么跨越这个障碍物,就像那个蜘蛛那样的 agent 。怎么跨越障碍物,像这个人有双腿一样, 这个 agent 往前走。以及像这个人形的 agent怎么在一个曲折的道路上面往前走。这个结果也是非常有意思这个人形 agent 会把手举得非常高,因为它这个手的功能就是为了使它身体保持平衡,这样它就可以更快地在这个环境里面往前跑,而且这里你也可以增加这个环境的难度,加入一些扰动,这个 agent 就会变得更鲁棒。
* **第二个例子是[机械臂抓取](https://ai.googleblog.com/2016/03/deep-learning-for-robots-learning-from.html)。**因为机械臂的应用自动去强化学习需要大量的 rollout所以它这里就有好多机械臂分布式系统可以让这个机械臂尝试抓取不同的物体。你发现这个盘子里面物体的形状、形态其实都是不同的这样就可以让这个机械臂学到一个统一的行为。然后在不同的抓取物下面都可以采取最优的一个抓取特征。你的这个抓取的物件形态存在很多不同一些传统的这个抓取算法就没法把所有物体都抓起来因为你对每一个物体都需要做一个建模这样的话就是非常花时间。但是通过强化学习你就可以学到一个统一的抓取算法在不同物体上它都可以适用。
* **第三个例子是 [OpenAI 做的一个机械臂翻魔方](https://www.youtube.com/watch?v=jwSbzNHGflM)。**这里它们 18 年的时候先设计了这个手指的一个机械臂,让它可以通过翻动手指,使得手中的这个木块达到一个预定的设定。人的手指其实非常精细,怎么使得这个机械手臂也具有这样灵活的能力就一直是个问题。它们通过这个强化学习在一个虚拟环境里面先训练,让 agent 能翻到特定的这个方向,再把它应用到真实的手臂之中。这在强化学习里面是一个比较常用的做法,就是你先在虚拟环境里面得到一个很好的 agent然后再把它使用到真实的这个机器人中。因为真实的机械手臂通常都是非常容易坏而且非常贵你没法大批量地购买。2019 年对手臂进一步改进了,这个手臂可以玩魔方了。这个结果也非常有意思,到后面,这个魔方就被恢复成了个六面都是一样的结构了。
* **第四个例子是[一个穿衣服的 agent](https://www.youtube.com/watch?v=ixmE5nt2o88) ,就是训练这个 agent 穿衣服。**因为很多时候你要在电影或者一些动画实现人穿衣服的场景,通过手写执行命令让机器人穿衣服其实非常困难。很多时候穿衣服也是一个非常精细的操作,那么它们这个工作就是训练这个强化学习 agent然后就可以实现这个穿衣功能。你还可以在这里面加入一些扰动然后 agent 可以抗扰动。可能会有失败的情况(failure case) agent 就穿不进去,就卡在这个地方。
1. **[DeepMind 研发的一个走路的 agent](https://www.youtube.com/watch?v=gn4nRCC9TwQ)。**这个 agent 往前走一步,你就会得到一个 reward。这个 agent 有不同的这个形态,可以学到很多有意思的功能。比如怎么跨越这个障碍物,就像那个蜘蛛那样的 agent 。怎么跨越障碍物,像这个人有双腿一样, 这个 agent 往前走。以及像这个人形的 agent怎么在一个曲折的道路上面往前走。这个结果也是非常有意思这个人形 agent 会把手举得非常高,因为它这个手的功能就是为了使它身体保持平衡,这样它就可以更快地在这个环境里面往前跑,而且这里你也可以增加这个环境的难度,加入一些扰动,这个 agent 就会变得更鲁棒。
2. **[机械臂抓取](https://ai.googleblog.com/2016/03/deep-learning-for-robots-learning-from.html)。**因为机械臂的应用自动去强化学习需要大量的 rollout所以它这里就有好多机械臂分布式系统可以让这个机械臂尝试抓取不同的物体。你发现这个盘子里面物体的形状、形态其实都是不同的这样就可以让这个机械臂学到一个统一的行为。然后在不同的抓取物下面都可以采取最优的一个抓取特征。你的这个抓取的物件形态存在很多不同一些传统的这个抓取算法就没法把所有物体都抓起来因为你对每一个物体都需要做一个建模这样的话就是非常花时间。但是通过强化学习你就可以学到一个统一的抓取算法在不同物体上它都可以适用。
3. **[OpenAI 做的一个机械臂翻魔方](https://www.youtube.com/watch?v=jwSbzNHGflM)。**这里它们 18 年的时候先设计了这个手指的一个机械臂,让它可以通过翻动手指,使得手中的这个木块达到一个预定的设定。人的手指其实非常精细,怎么使得这个机械手臂也具有这样灵活的能力就一直是个问题。它们通过这个强化学习在一个虚拟环境里面先训练,让 agent 能翻到特定的这个方向,再把它应用到真实的手臂之中。这在强化学习里面是一个比较常用的做法,就是你先在虚拟环境里面得到一个很好的 agent然后再把它使用到真实的这个机器人中。因为真实的机械手臂通常都是非常容易坏而且非常贵你没法大批量地购买。2019 年对手臂进一步改进了,这个手臂可以玩魔方了。这个结果也非常有意思,到后面,这个魔方就被恢复成了个六面都是一样的结构了。
4. **[一个穿衣服的 agent](https://www.youtube.com/watch?v=ixmE5nt2o88) ,就是训练这个 agent 穿衣服。**因为很多时候你要在电影或者一些动画实现人穿衣服的场景,通过手写执行命令让机器人穿衣服其实非常困难。很多时候穿衣服也是一个非常精细的操作,那么它们这个工作就是训练这个强化学习 agent然后就可以实现这个穿衣功能。你还可以在这里面加入一些扰动然后 agent 可以抗扰动。可能会有失败的情况(failure case) agent 就穿不进去,就卡在这个地方。
## Introduction to Sequential Decision Making
@@ -196,11 +193,11 @@ POMDP 可以用一个 7 元组描述:$(S,A,T,R,\Omega,O,\gamma)$,其中 $S$
对于一个强化学习 agent它可能有一个或多个如下的组成成分
* 首先 agent 有一个 `策略函数(policy function)`agent 会用这个函数来选取下一步的动作。
* `策略函数(policy function)`agent 会用这个函数来选取下一步的动作。
* 然后它也可能生成一个`价值函数(value function)`我们用价值函数来对当前状态进行估价,它就是说你进入现在这个状态,可以对你后面的收益带来多大的影响。当这个价值函数大的时候,说明你进入这个状态越有利。
* `价值函数(value function)`我们用价值函数来对当前状态进行估价,它就是说你进入现在这个状态,可以对你后面的收益带来多大的影响。当这个价值函数大的时候,说明你进入这个状态越有利。
* 另外一个组成成分是`模型(model)`模型表示了 agent 对这个环境的状态进行了理解,它决定了这个世界是如何进行的。
* `模型(model)`模型表示了 agent 对这个环境的状态进行了理解,它决定了这个世界是如何进行的。
### Policy
@@ -237,12 +234,19 @@ $$
所以你未来可以获得多少的奖励,它的这个期望取决于你当前的状态和当前的行为。这个 Q 函数是强化学习算法里面要学习的一个函数。因为当我们得到这个 Q 函数后,进入某一种状态,它最优的行为就可以通过这个 Q 函数来得到。
### Model
![](img/1.28.png)
第三个组成部分是模型,**模型决定了下一个状态会是什么样的,就是说下一步的状态取决于你当前的状态以及你当前采取的行为。**它由两个部分组成,
* 概率:这个转移状态之间是怎么转移的
* 概率:这个转移状态之间是怎么转移的,如下式所示:
$$
\mathcal{P}_{s s^{\prime}}^{a}=\mathbb{P}\left[S_{t+1}=s^{\prime} \mid S_{t}=s, A_{t}=a\right]
$$
* 奖励函数:当你在当前状态采取了某一个行为,可以得到多大的奖励,如下式所示:
$$
\mathcal{R}_{s}^{a}=\mathbb{E}\left[R_{t+1} \mid S_{t}=s, A_{t}=a\right]
$$
* 奖励函数:当你在当前状态采取了某一个行为,可以得到多大的奖励。
![](img/1.29.png)
@@ -252,9 +256,9 @@ $$
我们来看一个走迷宫的例子。
* 这个例子要求 agent 从 start 开始,然后到达 goal 的位置。
* 这里设定的奖励是每走一步,你就会得到一个负的奖励。
* 这里可以采取的动作是往上下左右走。
* 要求 agent 从 start 开始,然后到达 goal 的位置。
* 每走一步,你就会得到一个负的奖励。
* 可以采取的动作是往上下左右走。
* 当前状态用现在 agent 所在的位置来描述。
![](img/1.31.png)
@@ -295,8 +299,8 @@ A: 对于一个状态转移概率已知的马尔可夫决策过程,我们可
**另外,我们是可以通过 agent 到底有没有学习这个环境模型来分类。**
* 第一种是 `model-based(有模型)` RL agent它通过学习这个状态的转移来采取动作。
* 另外一种是 ` model-free(免模型)` RL agent它没有去直接估计这个状态的转移也没有得到环境的具体转移变量。它通过学习价值函数和策略函数进行决策。Model-free 的模型里面没有一个环境转移的模型。
* `model-based(有模型)` RL agent它通过学习这个状态的转移来采取动作。
* ` model-free(免模型)` RL agent它没有去直接估计这个状态的转移也没有得到环境的具体转移变量。它通过学习价值函数和策略函数进行决策。Model-free 的模型里面没有一个环境转移的模型。
我们可以用马尔可夫决策过程来定义强化学习任务,并表示为四元组 $<S,A,P,R>$,即状态集合、动作集合、状态转移函数和奖励函数。如果这四元组中所有元素均已知,且状态集合和动作集合在有限步数内是有限集,则机器可以对真实环境进行建模,构建一个虚拟世界来模拟真实环境的状态和交互反应。
@@ -337,14 +341,9 @@ A: 针对是否需要对真实环境建模,强化学习可以分为有模型
Learning 和 Planning 是序列决策的两个基本问题。
### Reinforcement Learning
![](img/learning.png)
在强化学习中环境初始时是未知的agent 不知道环境如何工作agent 通过不断地与环境交互,逐渐改进策略。
### Planning
![](img/planning.png)
在 plannning 中环境是已知的我们被告知了整个环境的运作规则的详细信息。Agent 能够计算出一个完美的模型并且在不需要与环境进行任何交互的时候进行计算。Agent 不需要实时地与环境交互就能知道未来环境,只需要知道当前的状态,就能够开始思考,来寻找最优解。
@@ -455,8 +454,8 @@ for step in range(100):
![](img/1.46.png)
在 OpenAI Gym 里面有很经典的控制类游戏。
* 比如说 Acrobot就是把这个两节铁杖,然后甩了立起来。
* CartPole 是通过控制一个平板,让这个木棍立起来。
* 比如说 Acrobot 就是把两节铁杖甩了立起来。
* CartPole 是通过控制一个平板,让木棍立起来。
* MountainCar 是通过前后移动这个车,让它到达这个旗子的位置。
大家可以点[这个链接](https://gym.openai.com/envs/#classic_control)看一看这些环境。在刚开始测试强化学习的时候,可以选择这些简单环境,因为这些环境可以在一两分钟之内见到一个效果。
@@ -680,3 +679,5 @@ print('平均回合奖励 = {}'.format(np.mean(episode_rewards)))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 KiB

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 425 KiB

After

Width:  |  Height:  |  Size: 396 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 KiB

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 725 KiB

After

Width:  |  Height:  |  Size: 553 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 281 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View File

@@ -274,9 +274,13 @@ $$
* 我们就可以从 $s_4$ 状态开始,随机产生很多轨迹,就是说产生很多小船,把小船扔到这个转移矩阵里面去,然后它就会随波逐流,产生轨迹。
* 每个轨迹都会得到一个 return我们得到大量的 return比如说一百个、一千个 return ,然后直接取一个平均,那么就可以等价于现在 $s_4$ 这个价值,因为 $s_4$ 的价值 $V(s_4)$ 定义了你未来可能得到多少的奖励。这就是蒙特卡罗采样的方法。
![](img/2.17.png)**我们也可以用这个动态规划的办法**,一直去迭代它的 Bellman equation让它最后收敛我们就可以得到它的一个状态。所以在这里算法二就是一个迭代的算法通过 bootstrapping(拔靴自助) 的办法,然后去不停地迭代这个 Bellman Equation。当这个最后更新的状态跟你上一个状态变化并不大的时候更新就可以停止我们就可以输出最新的 $V'(s)$ 作为它当前的状态。所以这里就是把 Bellman Equation 变成一个 Bellman Update这样就可以得到它的一个价值。
![](img/2.17.png)
>动态规划的方法基于后继状态值的估计来更新状态值的估计(算法二中的第 3 行用 $V'$ 来更新 $V$ )。也就是说,它们根据其他估算值来更新估算值。我们称这种基本思想为 bootstrapping
**我们也可以用这个动态规划的办法**,一直去迭代它的 Bellman equation让它最后收敛我们就可以得到它的一个状态。所以在这里算法二就是一个迭代的算法通过 `bootstrapping(自举) `的办法,然后去不停地迭代这个 Bellman Equation。当这个最后更新的状态跟你上一个状态变化并不大的时候更新就可以停止我们就可以输出最新的 $V'(s)$ 作为它当前的状态。所以这里就是把 Bellman Equation 变成一个 Bellman Update这样就可以得到它的一个价值
动态规划的方法基于后继状态值的估计来更新状态值的估计(算法二中的第 3 行用 $V'$ 来更新 $V$ )。也就是说,它们根据其他估算值来更新估算值。我们称这种基本思想为 bootstrapping。
>Bootstrap 本意是“解靴带”;这里是在使用徳国文学作品《吹牛大王历险记》中解靴带自助(拔靴自助)的典故,因此将其译为“自举”。
## Markov Decision Process(MDP)