fix ch1 typos
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
* **强化学习讨论的问题是一个智能体(agent) 怎么在一个复杂不确定的环境(environment)里面去极大化它能获得的奖励。**
|
||||
|
||||
* 示意图由两部分组成:agent 和 environment。
|
||||
* 在强化学习过程中,agent 跟 environment 一直在交互。Agent 在环境里面获取到状态,agent 会利用这个状态输出一个动作(action),一个决策。然后这个决策会放到环境之中去,环境会通过这个 agent 采取的决策,输出下一个状态以及当前的这个决策得到的奖励。Agent 的目的就是为了尽可能多地从环境中获取奖励。
|
||||
* 在强化学习过程中,agent 跟 environment 一直在交互。Agent 在环境里面获取到状态,agent 会利用这个状态输出一个动作(action),一个决策。然后这个决策会放到环境之中去,环境会根据 agent 采取的决策,输出下一个状态以及当前的这个决策得到的奖励。Agent 的目的就是为了尽可能多地从环境中获取奖励。
|
||||
|
||||

|
||||
|
||||
@@ -48,18 +48,18 @@
|
||||
* 因此,我们需要在探索和利用之间取得一个权衡,这也是在监督学习里面没有的情况。
|
||||
* 在强化学习过程中,没有非常强的监督者(supervisor),只有一个`奖励信号(reward signal)`,就是环境会在很久以后告诉你之前你采取的行为到底是不是有效的。Agent 在这个强化学习里面学习的话就非常困难,因为你没有得到即时反馈。当你采取一个行为过后,如果是监督学习,你就立刻可以获得一个指引,就说你现在做出了一个错误的决定,那么正确的决定应该是谁。而在强化学习里面,环境可能会告诉你这个行为是错误的,但是它并没有告诉你正确的行为是什么。而且更困难的是,它可能是在一两分钟过后告诉你错误,它再告诉你之前的行为到底行不行。所以这也是强化学习和监督学习不同的地方。
|
||||
|
||||
通过跟监督学习比较,我们可以总结出强化学习的一些特征。
|
||||
通过跟监督学习比较,我们可以总结出强化学习的一些特征。
|
||||
|
||||
* 强化学习有这个 `试错探索(trial-and-error exploration)`,它需要通过探索环境来获取对这个环境的理解。
|
||||
* 强化学习有这个 `试错探索(trial-and-error exploration)`,它需要通过探索环境来获取对环境的理解。
|
||||
* 强化学习 agent 会从环境里面获得延迟的奖励。
|
||||
* 在强化学习的训练过程中,时间非常重要。因为你得到的数据都是有这个时间关联的,而不是独立同分布的。在机器学习中,如果观测数据有非常强的关联,其实会使得这个训练非常不稳定。这也是为什么在监督学习中,我们希望数据尽量是独立同分布,这样就可以消除数据之间的相关性。
|
||||
* 在强化学习的训练过程中,时间非常重要。因为你得到的数据都是有时间关联的(sequential data),而不是独立同分布的。在机器学习中,如果观测数据有非常强的关联,其实会使得这个训练非常不稳定。这也是为什么在监督学习中,我们希望数据尽量是独立同分布,这样就可以消除数据之间的相关性。
|
||||
* Agent 的行为会影响它随后得到的数据,这一点是非常重要的。在我们训练 agent 的过程中,很多时候我们也是通过正在学习的这个 agent 去跟环境交互来得到数据。所以如果在训练过程中,这个 agent 的模型很快死掉了,那会使得我们采集到的数据是非常糟糕的,这样整个训练过程就失败了。所以在强化学习里面一个非常重要的问题就是怎么让这个 agent 的行为一直稳定地提升。
|
||||
|
||||

|
||||
|
||||
为什么我们关注强化学习,其中非常重要的一点就是强化学习得到的这个模型可以取得超人类的结果。
|
||||
|
||||
* 监督学习获取的这些监督数据,其实是让人来标注的。比如说 ImageNet,这些图片都是人类标注的。那么我们就可以确定这个算法的上限(upper bound),人类的这个标注结果决定了它永远不可能超越人类。
|
||||
* 监督学习获取的这些监督数据,其实是让人来标注的。比如说 ImageNet 的图片都是人类标注的。那么我们就可以确定这个算法的上限(upper bound),人类的这个标注结果决定了它永远不可能超越人类。
|
||||
* 但是对于强化学习,它在环境里面自己探索,有非常大的潜力,它可以获得超越人的能力的这个表现,比如说 AlphaGo,谷歌 DeepMind 的 AlphaGo 这样一个强化学习的算法可以把人类最强的棋手都打败。
|
||||
|
||||

|
||||
@@ -78,7 +78,7 @@
|
||||
|
||||

|
||||
|
||||
在这个 pong 的游戏里面,决策其实就是两个动作:往上或者往下。如果强化学习是通过学习一个 policy network 来分类的话,其实就是输入当前帧的图片,然后 policy network 就会输出所有决策的可能性。
|
||||
在这个 pong 的游戏里面,决策其实就是两个动作:往上或者往下。如果强化学习是通过学习一个 policy network 来分类的话,其实就是输入当前帧的图片,policy network 就会输出所有决策的可能性。
|
||||
|
||||

|
||||
在这种情况下面,对于监督学习的话,我们就可以直接告诉这个 agent 正确的标签是什么。在这种游戏情况下面,我们并不知道它的正确的标签是什么。
|
||||
@@ -102,8 +102,9 @@
|
||||

|
||||
强化学习是有一定的历史的,只是最近大家把强化学习跟深度学习结合起来,就形成了`深度强化学习(Deep Reinforcemet Learning)`。这里做一个类比,把它类比于这个传统的计算机视觉以及深度计算机视觉。
|
||||
|
||||
* 传统的计算机视觉由两个过程组成。你给一张图,我们先要提取它的特征,用一些设计好的特征(feature),比如说 HOG、DPM。提取这些特征后,我们再单独训练一个分类器。这个分类器可以是 SVM、Boosting,然后就可以辨别这张图片是狗还是猫。
|
||||
|
||||
* 传统的计算机视觉由两个过程组成。
|
||||
* 你给一张图,我们先要提取它的特征,用一些设计好的特征(feature),比如说 HOG、DPM。
|
||||
* 提取这些特征后,我们再单独训练一个分类器。这个分类器可以是 SVM、Boosting,然后就可以辨别这张图片是狗还是猫。
|
||||
* 2012 年过后,我们有了卷积神经网络,大家就把特征提取以及分类两者合到一块儿去了,就是训练一个神经网络。这个神经网络既可以做特征提取,也可以做分类。它可以实现这种端到端的训练,它里面的参数可以在每一个阶段都得到极大的优化,这样就得到了一个非常重要的突破。
|
||||
|
||||

|
||||
@@ -115,9 +116,9 @@
|
||||
|
||||

|
||||
|
||||
为什么强化学习在这几年就用到各种应用中去,比如玩游戏以及机器人的一些应用,并且取得了可以击败人类最好棋手的一个结果。
|
||||
为什么强化学习在这几年就用到各种应用中去,比如玩游戏以及机器人的一些应用,并且可以击败人类的最好棋手。
|
||||
|
||||
这由几点组成:
|
||||
这有如下几点原因:
|
||||
|
||||
* 我们有了更多的计算能力,有了更多的 GPU,可以更快地做更多的试错的尝试。
|
||||
* 通过这种不同尝试使得 agent 在这个环境里面获得很多信息,然后可以在这个环境里面取得很大的奖励。
|
||||
@@ -126,10 +127,10 @@
|
||||

|
||||
接下来给大家再看一些强化学习里面比较有意思的例子。
|
||||
|
||||
* **第一个例子是 DeepMind 研发的一个走路的 agent。**这个 agent 往前走一步,你就会得到一个 reward。这个 agent 有不同的这个形态,可以学到很多有意思的功能。比如怎么跨越这个障碍物,就像那个蜘蛛那样的 agent 。怎么跨越障碍物,像这个人有双腿一样, 这个 agent 往前走。以及像这个人形的 agent,怎么在一个曲折的道路上面往前走。这个结果也是非常有意思,这个人形 agent 会把手举得非常高,因为它这个手的功能就是为了使它身体保持平衡,这样它就可以更快地在这个环境里面往前跑,而且这里你也可以增加这个环境的难度,加入一些扰动,这个 agent 就会变得更鲁棒。
|
||||
* **第二个例子是机械臂抓取。**因为机械臂的应用自动去强化学习需要大量的 rollout,所以它这里就有好多机械臂,分布式系统可以让这个机械臂尝试抓取不同的物体。你发现这个盘子里面物体的形状、形态其实都是不同的,这样就可以让这个机械臂学到一个统一的行为。然后在不同的抓取物下面都可以采取最优的一个抓取特征。你的这个抓取的物件形态存在很多不同,一些传统的这个抓取算法就没法把所有物体都抓起来,因为你对每一个物体都需要做一个建模,这样的话就是非常花时间。但是通过强化学习,你就可以学到一个统一的抓取算法,在不同物体上它都可以适用。
|
||||
* **第三个例子是 OpenAI 做的一个机械臂翻魔方**。这里它们 18 年的时候先设计了这个手指的一个机械臂,让它可以通过翻动手指,使得手中的这个木块达到一个预定的设定。人的手指其实非常精细,怎么使得这个机械手臂也具有这样灵活的能力就一直是个问题。它们通过这个强化学习在一个虚拟环境里面先训练,让 agent 能翻到特定的这个方向,再把它应用到真实的手臂之中。这在强化学习里面是一个比较常用的做法,就是你先在虚拟环境里面得到一个很好的 agent,然后再把它使用到真实的这个机器人中。因为真实的机械手臂通常都是非常容易坏,而且非常贵,你没法大批量地购买。2019 年对手臂进一步改进了,这个手臂可以玩魔方了。这个结果也非常有意思,到后面,这个魔方就被恢复成了个六面都是一样的结构了。
|
||||
* **第四个例子是一个穿衣服的 agent ,就是训练这个 agent 穿衣服。**因为很多时候你要在电影或者一些动画实现这个人穿衣的这种场景,通过手写执行命令让机器人穿衣服其实非常困难。很多时候穿衣服也是一个非常精细的操作,那么它们这个工作就是训练这个强化学习 agent,然后就可以实现这个穿衣功能。这里你还可以加入一些扰动,然后 agent 可以抗扰动。可能有这种失败的情况(failure case), agent 就穿不进去,就卡在这个地方。
|
||||
* **第一个例子是 [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 就穿不进去,就卡在这个地方。
|
||||
|
||||
## Introduction to Sequential Decision Making
|
||||
|
||||
@@ -437,7 +438,25 @@ $python
|
||||
|
||||

|
||||
|
||||
强化学习的这个交互就是由 agent 跟环境进行交互。所以算法的 interface 也是用这个来表示。比如说我们现在安装了 OpenAI Gym。那我们这里就可以直接调入 Taxi-v2 的环境,就建立了这个环境。初始化这个环境过后,就可以进行交互了。Agent 得到这个观测过后,它就会输出一个 action。然后这个动作会被这个环境拿进去执行这个 step,然后环境就会往前走一步,然后返回新的 observation 和 reward 以及一个 flag variable 就决定你这个游戏是不是结束了。几行代码就实现了强化学习的框架。
|
||||
```python
|
||||
import gym
|
||||
env = gym.make("Taxi-v3")
|
||||
observation = env.reset()
|
||||
agent = load_agent()
|
||||
for step in range(100):
|
||||
action = agent(observation)
|
||||
observation, reward, done, info = env.step(action)
|
||||
```
|
||||
|
||||
强化学习的这个交互就是由 agent 跟环境进行交互。所以算法的 interface 也是用这个来表示。比如说我们现在安装了 OpenAI Gym。
|
||||
|
||||
1. 我们就可以直接调入 Taxi-v3 的环境,就建立了这个环境。
|
||||
|
||||
2. 初始化这个环境过后,就可以进行交互了。
|
||||
3. Agent 得到这个观测过后,它就会输出一个 action。
|
||||
4. 这个动作会被环境拿进去执行这个 step,然后环境就会往前走一步,返回新的 observation 和 reward 以及一个 flag variable 就决定你这个游戏是不是结束了。
|
||||
|
||||
几行代码就实现了强化学习的框架。
|
||||
|
||||

|
||||
在 OpenAI Gym 里面有很经典的控制类游戏。
|
||||
@@ -471,7 +490,7 @@ env.close() # 关闭环境
|
||||
|
||||
注意:如果绘制了实验的图形界面窗口,那么关闭该窗口的最佳方式是调用`env.close()`。试图直接关闭图形界面窗口可能会导致内存不能释放,甚至会导致死机。
|
||||
|
||||
当你执行这段代码时,可能会很失望,因为机器人会完全无视那根本该立起来的杆子,驾驶着小车朝某个方向一通跑,直到不见踪影。这是因为我们还没开始训练机器人。
|
||||
当你执行这段代码时,机器人会完全无视那根本该立起来的杆子,驾驶着小车朝某个方向一通跑,直到不见踪影。这是因为我们还没开始训练机器人。
|
||||
|
||||
Gym 中的小游戏,大部分都可以用一个普通的实数或者向量来充当动作。打印 `env.action_space.sample()` 的返回值,能看到输出为 1 或者 0。
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 708 KiB After Width: | Height: | Size: 546 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 300 KiB After Width: | Height: | Size: 115 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 330 KiB After Width: | Height: | Size: 296 KiB |
Reference in New Issue
Block a user