This commit is contained in:
johnjim0816
2021-09-27 03:44:32 +08:00
58 changed files with 109 additions and 108 deletions

View File

@@ -17,9 +17,9 @@
地址https://github.com/datawhalechina/easy-rl/releases 地址https://github.com/datawhalechina/easy-rl/releases
国内地址(推荐国内读者使用)https://qiwang067163com.coding.net/s/987e7ca5-aca7-4c7e-b5c8-1d78c93cfd8c 国内地址(推荐国内读者使用)https://pan.baidu.com/s/1t2jw_vLwHBb15Ah5vcFRzw 提取码: vi2s
压缩版(推荐网速较差的读者使用,文件小,图片分辨率较低)https://qiwang067163com.coding.net/s/7421e049-f6c4-49f8-8e15-d7294b690301 压缩版(推荐网速较差的读者使用,文件小,图片分辨率较低) https://pan.baidu.com/s/1_sbSSt0WjV2YTxepYcAe8g 提取码: c1rx
## 内容导航 ## 内容导航
| 章节 | 习题 | 相关项目 | | 章节 | 习题 | 相关项目 |

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 KiB

After

Width:  |  Height:  |  Size: 738 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 332 KiB

After

Width:  |  Height:  |  Size: 805 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

After

Width:  |  Height:  |  Size: 662 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 KiB

After

Width:  |  Height:  |  Size: 5.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 580 KiB

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 546 KiB

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 KiB

After

Width:  |  Height:  |  Size: 486 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 767 KiB

After

Width:  |  Height:  |  Size: 5.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 KiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 406 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 870 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 632 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 KiB

After

Width:  |  Height:  |  Size: 375 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 366 KiB

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 8.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 KiB

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 396 KiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 553 KiB

After

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 658 KiB

View File

@@ -1,114 +1,96 @@
# Imitation Learning # 模仿学习
![](img/11.1.png) `模仿学习imitation learningIL`讨论的问题是:假设我们连奖励都没有,那要怎么办呢?模仿学习又叫做`示范学习learning from demonstration``学徒学习apprenticeship learning``观察学习learning by watching`。在模仿学习里面,你有一些专家的示范,那机器也可以跟环境互动,但它没有办法从环境里面得到任何的奖励,它只能看着专家的示范来学习什么是好,什么是不好。其实,多数的情况,我们都没有办法真的从环境里面得到非常明确的奖励。举例来说,如果是棋类游戏或者是电玩,你有非常明确的奖励。但是其实多数的任务,都是没有奖励的。以聊天机器人为例,机器跟人聊天,聊得怎么样算是好,聊得怎么样算是不好,你无法给出明确的奖励。所以很多任务是根本就没有办法给出奖励的。
`模仿学习(imitation learningIL)` 讨论的问题是假设我们连奖励都没有那要怎么办呢Imitation learning 又叫做 `learning from demonstration(示范学习)` `apprenticeship learning(学徒学习)``learning by watching(观察学习)`。在 Imitation learning 里面,你有一些专家的 demonstration那机器也可以跟环境互动但它没有办法从环境里面得到任何的奖励它只能看着专家的 demonstration 来学习什么是好,什么是不好。其实,多数的情况,我们都没有办法真的从环境里面得到非常明确的奖励。举例来说,如果是棋类游戏或者是电玩,你有非常明确的奖励。但是其实多数的任务,都是没有奖励的。以 chat-bot 为例,机器跟人聊天,聊得怎么样算是好,聊得怎么样算是不好,你无法给出明确的奖励。所以很多任务是根本就没有办法给出奖励的。
虽然没有办法给出奖励,但是收集专家的 demonstration 是可以做到的。举例来说, 虽然没有办法给出奖励,但是收集专家的示范是可以做到的。举例来说,在自动驾驶汽车里面,虽然你没有办法给出自动驾驶汽车的奖励,但你可以收集很多人类开车的纪录。在聊天机器人里面,你可能没有办法定义什么叫做好的对话,什么叫做不好的对话。但是收集很多人的对话当作范例,这一件事情也是可行的。
* 在自动驾驶汽车里面,虽然你没有办法给出自动驾驶汽车的奖励,但你可以收集很多人类开车的纪录 所以模仿学习的使用性非常高。假设你不知道该怎么定义奖励,你就可以收集到专家的示范。如果你可以收集到一些范例的话,你可以收集到一些很厉害的智能体(比如人)跟环境实际上的互动的话,那你就可以考虑模仿学习这个技术。在模仿学习里面,我们介绍两个方法。第一个叫做`行为克隆behavior cloningBC`,第二个叫做`逆强化学习inverse reinforcement learningIRL` 或者叫做`逆最优控制inverse optimal control`
* 在 chat-bot 里面,你可能没有办法定义什么叫做好的对话,什么叫做不好的对话。但是收集很多人的对话当作范例,这一件事情也是可行的。
所以 imitation learning 的使用性非常高。假设你不知道该怎么定义奖励,你就可以收集到专家的 demonstration。如果你可以收集到一些范例的话你可以收集到一些很厉害的 agent(比如人)跟环境实际上的互动的话,那你就可以考虑 imitation learning 这个技术。在 imitation learning 里面,我们介绍两个方法。第一个叫做 `Behavior Cloning`,第二个叫做 `Inverse Reinforcement Learning` 或者叫做 `Inverse Optimal Control` ## 行为克隆
其实行为克隆跟监督学习是一模一样的。如下图所示,以自动驾驶汽车为例,你可以收集到人开自动驾驶汽车的所有资料,比如说可以通过行车记录器进行收集。看到下图的观测的时候,人会决定向前。机器就采取跟人一样的行为,也向前,就结束了。这个就叫做行为克隆,专家做什么,机器就做一模一样的事。
## Behavior Cloning 怎么让机器学会跟专家一模一样的行为呢?我们可以把它当作一个监督学习的问题,去收集很多行车记录器,然后再收集人在具体情境下会采取什么样的行为(训练数据)。你知道说人在状态$s_1$ 会采取动作$a_1$,人在状态$s_2$ 会采取动作$a_2$。人在状态, $s_3$ 会采取动作$a_3$。接下来,你就学习一个网络。这个网络就是演员,它输入$s_i$ 的时候,你就希望它的输出 是$a_i$,就这样结束了。它就是一个的监督学习的问题。
![](img/11.2.png)
其实 `Behavior Cloning` 跟监督学习是一模一样的。以自动驾驶汽车为例,你可以收集到人开自动驾驶汽车的所有资料,比如说可以通过行车记录器进行收集。看到这样子的 observation 的时候,人会决定向前。机器就采取跟人一样的行为,也向前,就结束了。**这个就叫做行为克隆(Behavior CloningBC),专家做什么,机器就做一模一样的事。** ![](img/11.2.png ':size=400')
怎么让机器学会跟专家一模一样的行为呢?就把它当作一个监督学习的问题,你去收集很多行车记录器,然后再收集人在那个情境下会采取什么样的行为。你知道说人在 state $s_1$ 会采取 action $a_1$,人在 state $s_2$ 会采取 action $a_2$。人在 state, $s_3$ 会采取 action $a_3$。接下来,你就学习一个网络。这个网络 就是你的 actor它输入 $s_i$ 的时候,你就希望它的输出是 $a_i$,就这样结束了。它就是一个监督学习的问题 行为克隆虽然非常简单但它的问题是如果你只收集专家的资料你可能看过的观测会是非常有限的。举例来说如下图所示假设你要学习一部自动驾驶汽车自动驾驶汽车就是要过这个弯道。如果是专家的话它就是把车顺着这个红线就开过去了。但假设智能体很笨它开着开着就撞墙了它永远不知道撞墙这种状况要怎么处理。因为训练数据里面从来没有撞过墙所以它根本就不知道撞墙这一种情况要怎么处理。打电玩也是一样让人去玩马里奥Mario那专家可能非常强它从来不会跳不上水管所以机器根本不知道跳不上水管时要怎么处理
![](img/11.3.png)
Behavior Cloning 虽然非常简单,但它的问题是如果你只收集专家的资料,你可能看过的 observation 会是非常有限的。
举例来说,
* 假设你要 learn 一部自动驾驶汽车,自动驾驶汽车就是要过这个弯道。如果是专家的话,它就是把车顺着这个红线就开过去了。但假设你的 agent 很笨,它今天开着开着,就开到撞墙了,它永远不知道撞墙这种状况要怎么处理,为什么?因为训练数据里面从来没有撞过墙,所以它根本就不知道撞墙这一种情况要怎么处理。
* 打电玩也是一样,让人去玩 Mario那专家可能非常强它从来不会跳不上水管所以机器根本不知道跳不上水管时要怎么处理。
所以光是做 Behavior Cloning 是不够的,只观察专家的行为是不够的,需要一个招数,这个招数叫作`Dataset Aggregation`
![](img/11.4.png)
我们会希望收集更多样性的数据,而不是只收集专家所看到的 observation。我们会希望能够收集专家在各种极端的情况下它会采取什么样的行为。以自动驾驶汽车为例的话假设一开始你的 actor 叫作 $\pi_1$,你让 $\pi_1$去开这个车。但车上坐了一个专家。这个专家会不断地告诉机器说,如果在这个情境里面,我会怎么样开。所以 $\pi_1$ 自己开自己的,但是专家会不断地表示它的想法。比如说,如上图所示,一开始的时候,专家 可能说往前走。在拐弯的时候,专家 可能就会说往右转。但 $\pi_1$ 是不管专家的指令的,所以它会继续去撞墙。虽然专家说往右转,但是不管它怎么下指令都是没有用的,$\pi_1$ 会自己做自己的事情,因为我们要做的记录的是说,今天专家在 $\pi_1$ 看到这种 observation 的情况下,它会做什么样的反应。这个方法显然是有一些问题的,因为你每开一次自动驾驶汽车就会牺牲一个人。那你用这个方法,你牺牲一个专家以后,你就会知道,人类在这样子的 state 下,在快要撞墙的时候,会采取什么样的行为。再把这个数据拿去训练新的 $\pi_2$。这个 process 就反复继续下去,这个方法就叫做`Dataset Aggregation(DAgger)`
![](img/11.5.png)
Behavior Cloning 还有一个问题:机器会完全 copy 专家的行为,不管专家的行为是否有道理,就算没有道理,没有什么用的,就算这是专家本身的习惯,机器也会硬把它记下来。如果机器确实可以记住所有专家的行为,那也许还好,为什么呢?因为如果专家这么做,有些行为是多余的。但是没有问题,假设机器的行为可以完全仿造专家行为,那也就算了,那它是跟专家一样得好,只是做一些多余的事。但问题就是它是一个机器,它是一个网络,网络的 capacity 是有限的。就算给网络 训练数据,它在训练数据上得到的正确率往往也不是 100%,它有些事情是学不起来的。这个时候,什么该学,什么不该学就变得很重要。
举例来说,在学习中文的时候,你的老师,它有语音,它也有行为,它也有知识,但其实只有语音部分是重要的,知识的部分是不重要的。也许机器只能够学一件事,也许它就只学到了语音,那没有问题。如果它只学到了手势,这样子就有问题了。所以让机器学习什么东西是需要 copy什么东西是不需要 copy这件事情是重要的。而单纯的 Behavior Cloning 就没有把这件事情学进来,因为机器只是复制专家所有的行为而已,它不知道哪些行为是重要,是对接下来有影响的,哪些行为是不重要的,是对接下来是没有影响的。
![](img/11.6.png) 所以光是做行为克隆是不够的,只观察专家的行为是不够的,需要一个招数,这个招数叫作`数据集聚合dataset aggregationDAgger`
Behavior Cloning 还有什么样的问题呢?在做 Behavior Cloning 的时候,训练数据跟测试数据是 mismatch 的。我们可以用 Dataset Aggregation 的方法来缓解这个问题。这个问题是在训练跟测试的时候数据分布其实是不一样的。因为在强化学习里面action 会影响到接下来所看到的 state。我们是先有 state $s_1$,然后采取 action $a_1$action $a_1$ 其实会决定接下来你看到什么样的 state $s_2$。所以在强化学习里面有一个很重要的特征,就是你采取了 action 会影响你接下来所看到的 state。如果做了 Behavior Cloning 的话,我们只能观察到专家的一堆 state 跟 action 的 pair。然后我们希望可以 learn 一个 $\pi^*$,我们希望 $\pi^*$ 跟 $\hat{\pi}$ 越接近越好。如果 $\pi^*$ 可以跟 $\hat{\pi}$ 一模一样的话training 的时候看到的 state 跟 testing 的时候所看到的 state 会是一样的。因为虽然 action 会影响我们看到的 state但假设两个 policy 一模一样, 在同一个 state 都会采取同样的 action那你接下来所看到的 state 都会是一样的。但问题就是你很难让你的 learn 出来的 policy 跟专家的 policy 一模一样。专家 可是一个人,网络要跟人一模一样,感觉很难吧。 ![](img/11.3.png ':size=300')
如果你的 $\pi^*$ 跟 $\hat{\pi}$ 有一点误差。这个误差在一般监督学习问题里面,每一个 example 都是 independent 的,也许还好。但对强化学习的问题来说,可能在某个地方就是失之毫厘,差之千里。可能在某个地方,也许机器没有办法完全复制专家的行为,它复制的差了一点点,也许最后得到的结果就会差很多这样。所以 Behavior Cloning 并不能够完全解决 imitation learning 这件事情。所以就有另外一个比较好的做法叫做 `Inverse Reinforcement Learning` 我们会希望收集更多样性的数据,而不是只收集专家所看到的观测。我们会希望能够收集专家在各种极端的情况下,它会采取什么样的行为。如下图所示,以自动驾驶汽车为例的话,假设一开始,我们有演员 $\pi_1$,并且让 $\pi_1$去开这个车,但车上坐了一个专家。这个专家会不断地告诉机器说,如果在这个情境里面,我会怎么样开。所以 $\pi_1$ 自己开自己的,但是专家会不断地表示它的想法。比如说,一开始的时候,专家可能说往前走。在拐弯的时候,专家可能就会说往右转。但 $\pi_1$ 是不管专家的指令的,所以它会继续去撞墙。虽然专家说往右转,但是不管它怎么下指令都是没有用的,$\pi_1$ 会自己做自己的事情,因为我们要做的记录的是说,专家在 $\pi_1$ 看到这种观测的情况下,它会做什么样的反应。这个方法显然是有一些问题的,因为你每开一次自动驾驶汽车就会牺牲一个人。那你用这个方法,你牺牲一个专家以后,你就会知道,人类在这样子的状态下,在快要撞墙的时候,会采取什么样的行为。再把这个数据拿去训练新的 $\pi_2$。这个过程就反复继续下去,这个方法就叫做数据集聚合
![](img/11.4.png ':size=300')
行为克隆还有一个问题:机器会完全模仿专家的行为,不管专家的行为是否有道理,就算没有道理,没有什么用的,就算这是专家本身的习惯,机器也会硬把它记下来。如果机器确实可以记住所有专家的行为,也许还好。因为如果专家这么做,有些行为是多余的。但是没有问题,假设机器的行为可以完全仿造专家行为,也就算了,它就是跟专家一样得好,只是做一些多余的事。但问题是机器是一个网络,网络的容量是有限的。就算给网络训练数据,它在训练数据上得到的正确率往往也不是 100%,它有些事情是学不起来的。这个时候,什么该学,什么不该学就变得很重要。
举例来说,如下图所示,在学习中文的时候,老师有语音、行为和知识,但其实只有语音部分是重要的,知识的部分是不重要的。也许机器只能够学一件事,也许它就只学到了语音,那没有问题。如果它只学到了手势,这样子就有问题了。所以让机器学习什么东西是需要模仿,什么东西是不需要模仿,这件事情是重要的。而单纯的行为克隆就没有把这件事情学进来,因为机器只是复制专家所有的行为而已,它不知道哪些行为是重要,是对接下来有影响的,哪些行为是不重要的,是对接下来是没有影响的。
![](img/11.5.png ':size=450')
行为克隆还有一个问题:在做行为克隆的时候,训练数据跟测试数据是不匹配的。我们可以用数据集聚合的方法来缓解这个问题。在训练跟测试的时候,数据分布其实是不一样的。因为在强化学习里面,动作会影响到接下来所看到的状态。我们是先有状态$s_1$,然后采取动作$a_1$,动作$a_1$ 其实会决定接下来你看到什么样的状态$s_2$。所以在强化学习里面有一个很重要的特征,就是你采取了动作会影响你接下来所看到的状态,也就是会影响状态的分布。如果做了行为克隆的话,我们只能观察到专家$\hat{\pi}$的一堆状态跟动作的对$(s,a)$。
然后我们希望可以学习一个 $\pi^*$,我们希望 $\pi^*$ 跟 $\hat{\pi}$ 越接近越好。如果 $\pi^*$ 可以跟 $\hat{\pi}$ 一模一样的话,训练的时候看到的状态跟测试的时候所看到的状态会是一样的。因为虽然动作会影响我们看到的状态,但假设两个策略一模一样, 在同一个状态都会采取同样的动作,那你接下来所看到的状态都会是一样的。但问题就是你很难让学习出来的策略跟专家的策略一模一样。专家可是一个人,网络要跟人一模一样,有点困难。
如果 $\pi^*$ 跟 $\hat{\pi}$ 有一点误差。这个误差在一般监督学习问题里面每一个样本example都是独立的也许还好。但对强化学习的问题来说可能在某个地方就是失之毫厘差之千里。可能在某个地方也许机器没有办法完全复制专家的行为它复制的差了一点点也许最后得到的结果就会差很多这样。所以行为克隆并不能够完全解决模仿学习这件事情我们就有另外一个比较好的做法叫做逆强化学习。
## 逆强化学习
为什么叫逆强化学习,因为原来的强化学习里面,有一个环境和一个奖励函数。根据环境和奖励函数,通过强化学习这个技术,你会找到一个演员,你会学习出一个最优演员。但逆强化学习刚好是相反的,你没有奖励函数,你只有一堆专家的示范。但你还是有环境的。逆强化学习的做法是说假设我们现在有一堆专家的示范,我们用 $\hat{\tau}$ 来代表专家的示范。如果是在玩电玩的话,每一个 $\tau$ 就是一个很会玩电玩的人玩一场游戏的纪录,如果是自动驾驶汽车的话,就是人开自动驾驶汽车的纪录。这一边就是专家的示范,每一个 $\tau$ 是一个轨迹。
## Inverse RL 把所有专家示范收集起来,然后,使用逆强化学习这个技术。使用逆强化学习技术的时候,机器是可以跟环境互动的。但它得不到奖励。它的奖励必须要从专家那边推出来,有了环境和专家示范以后,去反推出奖励函数长什么样子。之前强化学习是由奖励函数反推出什么样的动作、演员是最好的。逆强化学习是反过来,我们有专家的示范,我们相信它是不错的,我就反推说,专家是因为什么样的奖励函数才会采取这些行为。你有了奖励函数以后,接下来,你就可以套用一般的强化学习的方法去找出最优演员。所以逆强化学习是先找出奖励函数,找出奖励函数以后,再去用强化学习找出最优演员。
![](img/11.7.png)
为什么叫`逆强化学习(Inverse Reinforcement Learning, IRL)`,因为原来的强化学习里面,有一个环境和一个 奖励函数。根据环境和奖励函数,通过强化学习这个技术,你会找到一个 actor你会 learn 出一个optimal actor。**但 Inverse Reinforcement Learning 刚好是相反的,你没有 奖励函数,你只有一堆专家的 demonstration。**但你还是有环境的。IRL 的做法是说假设我们现在有一堆专家的demonstration我们用 $\hat{\tau}$ 来代表专家 的demonstration。如果是在玩电玩的话每一个 $\tau$ 就是一个很会玩电玩的人玩一场游戏的纪录,如果是自动驾驶汽车的话,就是人开自动驾驶汽车的纪录。这一边就是专家的 demonstration每一个 $\tau$ 是一个轨迹。
把所有专家 demonstration 收集起来,然后,使用 Inverse Reinforcement Learning 这个技术。使用 Inverse Reinforcement Learning 技术的时候,机器是可以跟环境互动的。但它得不到奖励。它的奖励必须要从专家那边推出来,有了环境和专家 demonstration 以后,去反推出奖励函数长什么样子。之前强化学习是由奖励函数反推出什么样的 action、actor 是最好的。Inverse Reinforcement Learning 是反过来,我们有专家 的demonstration我们相信它是不错的我就反推说专家 是因为什么样的奖励函数才会采取这些行为。你有了奖励函数以后,接下来,你就可以套用一般的强化学习的方法去找出 optimal actor。所以 Inverse Reinforcement Learning 是先找出 奖励函数,找出奖励函数以后,再去用强化学习找出 optimal actor。
把这个奖励函数学习出来,相较于原来的强化学习有什么样好处。一个可能的好处是也许奖励函数是比较简单的。也许,虽然这个专家的行为非常复杂,但也许简单的奖励函数就可以导致非常复杂的行为。一个例子就是也许人类本身的奖励函数就只有活着这样,每多活一秒,你就加一分。但人类有非常复杂的行为,但是这些复杂的行为,都只是围绕着要从这个奖励函数里面得到分数而已。有时候很简单的奖励函数也许可以推导出非常复杂的行为。 把这个奖励函数学习出来,相较于原来的强化学习有什么样好处。一个可能的好处是也许奖励函数是比较简单的。也许,虽然这个专家的行为非常复杂,但也许简单的奖励函数就可以导致非常复杂的行为。一个例子就是也许人类本身的奖励函数就只有活着这样,每多活一秒,你就加一分。但人类有非常复杂的行为,但是这些复杂的行为,都只是围绕着要从这个奖励函数里面得到分数而已。有时候很简单的奖励函数也许可以推导出非常复杂的行为。
![](img/11.8.png)
Inverse Reinforcement Learning 实际上是怎么做的呢?首先,我们有一个专家$\hat{\pi}$,这个专家去跟环境互动,给我们很多 $\hat{\tau_1}$$\hat{\tau_n}$。如果是玩游戏的话,就让某一个电玩高手,去玩 n 场游戏。把 n 场游戏的 state 跟 action 的 sequence 都记录下来。接下来,你有一个actor $\pi$,一开始actor 很烂,这个 actor 也去跟环境互动。它也去玩了n 场游戏,它也有 n 场游戏的纪录。接下来,我们要反推出奖励函数。**怎么推出奖励函数呢?原则就是专家永远是最棒的,是先射箭,再画靶的概念。** 逆强化学习实际上是怎么做的呢?如下图所示,首先,我们有一个专家$\hat{\pi}$,这个专家去跟环境互动,给我们很多轨迹:{$\hat{\tau_1}$,$\hat{\tau_2}$,$\hat{\tau_N}$}。如果是玩游戏的话,就让某一个电玩高手,去玩 $N$ 场游戏。把 $N$ 场游戏的状态跟动作的序列都记录下来。接下来,你有一个演员 $\pi$,一开始演员很烂,这个演员也去跟环境互动。它也去玩了 $N$ 场游戏,它也有 $N$ 场游戏的纪录。接下来,我们要反推出奖励函数。怎么推出奖励函数呢?原则就是专家永远是最棒的,是先射箭,再画靶的概念。
专家去玩一玩游戏,得到这一些游戏的纪录,演员也去玩一玩游戏,得到这些游戏的纪录。接下来,你要定一个奖励函数,这个奖励函数的原则就是专家得到的分数要比演员得到的分数高(先射箭,再画靶),所以我们就学习出一个奖励函数。你就找出一个奖励函数。这个奖励函数会使专家所得到的奖励大过于演员所得到的奖励。你有了新的奖励函数以后,就可以套用一般强化学习的方法去学习一个演员,这个演员会针对奖励函数去最大化它的奖励。它也会采取一大堆的动作。但是这个演员虽然可以最大化这个奖励函数,采取一大堆的行为,得到一大堆游戏的纪录。
专家 去玩一玩游戏,得到这一些游戏的纪录,你的 actor 也去玩一玩游戏,得到这些游戏的纪录。接下来,你要定一个奖励函数,这个奖励函数的原则就是专家得到的分数要比 actor 得到的分数高,先射箭,再画靶。所以我们就 learn 出一个奖励函数。你就找出一个奖励函数。这个奖励函数会使专家所得到的奖励大过于 actor 所得到的奖励。你有了新的奖励函数以后就可以套用一般强化学习的方法去learn 一个actor这个 actor 会针对奖励函数去 maximize 它的奖励。它也会采取一大堆的 action。但是今天这个 actor 虽然可以 maximize 这个奖励函数,采取一大堆的行为,得到一大堆游戏的纪录 但接下来,我们就改奖励函数。这个演员就会很生气,它已经可以在这个奖励函数得到高分。但是它得到高分以后,我们就改奖励函数,仍然让专家可以得到比演员更高的分数。这个就是逆强化学习。有了新的奖励函数以后,根据这个新的奖励函数,你就可以得到新的演员,新的演员再去跟环境做一下互动,它跟环境做互动以后, 你又会重新定义奖励函数,让专家得到的奖励比演员大
但接下来,我们就改奖励函数。这个 actor 就会很生气,它已经可以在这个奖励函数得到高分。但是它得到高分以后,我们就改奖励函数,仍然让专家可以得到比 actor 更高的分数。这个就是 `Inverse Reinforcement learning`。有了新的奖励函数以后,根据这个新的奖励函数,你就可以得到新的 actor新的 actor 再去跟环境做一下互动,它跟环境做互动以后, 你又会重新定义你的奖励函数,让专家得到的奖励比 actor 大 怎么让专家得到的奖励大过演员呢?如下图所示,其实我们在学习的时候,奖励函数也许就是神经网络。这个神经网络就是输入 $\tau$,输出就是应该要给这个 $\tau$ 多少的分数。或者说,你假设觉得输入整个 $\tau$ 太难了。因为 $\tau$ 是 $s$ 和 $a$ 的一个很强的序列。也许它就是输入一个 $s$ 和 $a$ 的对,然后输出一个实数。把整个 $\tau$ 会得到的实数都加起来就得到 $R(\tau)$。在训练的时候,对于 $\left\{\hat{\tau}_{1}, \hat{\tau}_{2}, \cdots, \hat{\tau}_{N}\right\}$,我们希望它输出的 $R$ 越大越好。对于 $\left\{\tau_{1}, \tau_{2}, \cdots, \tau_{N}\right\}$,我们就希望 $R$ 的值越小越好
怎么让专家得到的奖励大过 actor 呢?其实你在 learning 的时候,你可以很简单地做一件事就是,奖励函数也许就是神经网络。这个神经网络就是吃一个 $\tau$,输出就是应该要给这个 $\tau$ 多少的分数。或者说,你假设觉得输入整个 $\tau$ 太难了。因为 $\tau$ 是 s 和 a 的一个很强的 sequence。也许它就是输入一个 s 和 a 的 pair然后输出一个 real number。把整个 sequence整个 $\tau$ 会得到的 real number 都加起来就得到 $R(\tau)$。在训练的时候,对于 $\left\{\hat{\tau}_{1}, \hat{\tau}_{2}, \cdots, \hat{\tau}_{N}\right\}$,我们希望它 输出的 R 越大越好。对于 $\left\{\tau_{1}, \tau_{2}, \cdots, \tau_{N}\right\}$,我们就希望它 R 的值越小越好。 ![](img/11.7.png ':size=450')
什么叫做一个最好的奖励函数。最后你学习出来的奖励函数应该就是专家和 actor 在这个奖励函数都会得到一样高的分数。最终你的奖励函数没有办法分辨出谁应该会得到比较高的分数。 什么叫做一个最好的奖励函数。最后你学习出来的奖励函数应该就是专家和演员在这个奖励函数都会得到一样高的分数。最终奖励函数没有办法分辨出谁应该会得到比较高的分数。通常在训练的时候你会迭代地去做。最早的逆强化学习对奖励函数有些限制它是假设奖励函数是线性的linear 。如果奖励函数是线性的话你可以证明这个算法会收敛converge。但是如果不是线性的你就没有办法证明说它会收敛。
通常在训练的时候,你会迭代的去做。那今天的状况是这样,最早的 Inverse Reinforcement Learning 对奖励函数有些限制,它是假设奖励函数是 linear 的。如果奖励函数是 linear 的话,你可以证明这个算法会收敛(converge)。但是如果不是 linear 的,你就没有办法证明说它会收敛。你有没有觉得这个东西,看起来还挺熟悉呢?其实你只要把它换个名字,说 actor 就是 generator然后说奖励函数就是 discriminator,它就是 GAN。所以会不会收敛这个问题就等于是问说 GAN 会不会收敛。如果你已经实现过,你会知道不一定会收敛。但除非你对 R 下一个非常严格的限制,如果你的 R 是一个 general 的网络的话,你就会有很大的麻烦。 逆强化学习的框架如下图所示,其实我们只要把逆强化学习中的演员看成生成器,把奖励函数看成判别器,它就是 GAN。所以逆强化学习会不会收敛这个问题就等于是问说 GAN 会不会收敛。如果你已经实现过,你会知道不一定会收敛。但除非你对 $R$ 下一个非常严格的限制,如果 $R$ 是一个一般的网络的话,你就会有很大的麻烦。
![](img/11.8.png ':size=450')
![](img/11.9.png) 我们可以把逆强化学习跟 GAN 比较一下。
如下图所示GAN 里面,我们有一堆很好的图、一个生成器和一个判别器。一开始生成器不知道要产生什么样的图,它就乱画。判别器的工作就是给画的图打分,专家画的图就是高分,生成器画的图就是低分。生成器会想办法去骗过判别器,生成器会希望判别器 也会给它画的图高分。整个过程跟逆强化学习是一模一样的。画的图就是专家的示范。生成器就是 演员,生成器画很多图,演员 会去跟环境互动,产生很多轨迹。这些轨迹 跟环境互动的记录,游戏的纪录其实就是等于 GAN 里面的这些图。然后你学习一个奖励函数。奖励函数就是判别器。奖励函数要给专家的示范高分,给演员互动的结果低分。
接下来,演员会想办法,从这个已经学习出来的奖励函数里面得到高分,然后迭代地去循环。跟 GAN 其实是一模一样的,我们只是换个说法而已。
那怎么说它像是一个 GAN我们来跟 GAN 比较一下。GAN 里面,你有一堆很好的图。然后你有一个 generator一开始它根本不知道要产生什么样的图它就乱画。然后你有一个 discriminatordiscriminator 的工作就是给画的图打分,专家 画的图就是高分generator 画的图就是低分。你有 discriminator 以后generator 会想办法去骗过 discriminator。Generator 会希望 discriminator 也会给它画的图高分。整个 process 跟 Inverse Reinforcement Learning 是一模一样的。 ![](img/11.9.png ':size=450')
* 画的图就是专家的 demonstration。generator 就是 actorgenerator 画很多图actor 会去跟环境互动,产生很多 trajectory。这些 trajectory 跟环境互动的记录,游戏的纪录其实就是等于 GAN 里面的这些图 逆强化学习有很多的应用,比如可以用开来自动驾驶汽车,有人用这个技术来学开自动驾驶汽车的不同风格。每个人在开车的时候会有不同风格,举例来说,能不能够压到线,能不能够倒退,要不要遵守交通规则等等。每个人的风格是不同的,然后用逆强化学习可以让自动驾驶汽车学会各种不同的开车风格
* 然后你 learn 一个奖励函数。奖励函数就是 discriminator。奖励函数要给专家的 demonstration 高分,给 actor 互动的结果低分。
* 接下来actor 会想办法,从这个已经 learn 出来的奖励函数里面得到高分,然后迭代地去循环。跟 GAN 其实是一模一样的,我们只是换个说法来而已。
![](img/11.10.png) 下图是文献上真实的例子。在这个例子里面,逆强化学习有一个有趣的地方,通常你不需要太多的训练数据,因为训练数据往往都是个位数。因为逆强化学习只是一种示范,只是一种范例,实际上机器可以去跟环境互动非常多次。所以在逆强化学习的文献, 往往会看到说只用几笔数据就训练出一些有趣的结果。
比如说,在这个例子里面是要让自动驾驶汽车学会在停车场里面停。这边的示范是这样,蓝色是终点,自动驾驶汽车要开到蓝色终点停车。给机器只看一行的四个示范,然后让它去学怎么样开车,最后它就可以学出,在红色的终点位置,如果它要停车的话,它会这样开。给机器看不同的示范,最后它学出来开车的风格就会不太一样。举例来说,上图第二行是不守规矩的开车方式,因为它会开到道路之外,这边,它会穿过其它的车,然后从这边开进去。所以机器就会学到说,不一定要走在道路上,它可以走非道路的地方。上图第三行是倒退来停车,机器也会学会说,它可以倒退,
IRL 有很多的应用,比如可以用开来自动驾驶汽车,有人用这个技术来学开自动驾驶汽车的不同风格。每个人在开车的时候会有不同风格,举例来说,能不能够压到线,能不能够倒退,要不要遵守交通规则等等。每个人的风格是不同的,然后用 Inverse Reinforcement Learning 可以让自动驾驶汽车学会各种不同的开车风格。 ![](img/11.11.png ':size=450')
![](img/11.11.png) 这种技术也可以拿来训练机器人。你可以让机器人,做一些你想要它做的动作,过去如果你要训练机器人,做你想要它做的动作,其实是比较麻烦的。怎么麻烦呢?过去如果你要操控机器的手臂,你要花很多力气去写程序才让机器做一件很简单的事看。假设你有模仿学习的技术,你可以让人做一下示范,然后机器就跟着人的示范来进行学习,比如学会摆盘子,拉着机器人的手去摆盘子,机器自己动。让机器学会倒水,人只教它 20 次,杯子每次放的位置不太一样。用这种方法来教机械手臂。
上图是文献上真实的例子。在这个例子里面, Inverse Reinforcement Learning 有一个有趣的地方,通常你不需要太多的训练数据,因为训练数据往往都是个位数。因为 Inverse Reinforcement Learning 只是一种 demonstration只是一种范例实际上机器可以去跟环境互动非常多次。所以在 Inverse Reinforcement Learning 的文献, 往往会看到说只用几笔 data 就训练出一些有趣的结果。 ## 第三人称视角模仿学习
比如说,在这个例子里面是要让自动驾驶汽车学会在停车场里面停。这边的 demonstration 是这样,蓝色是终点,自动驾驶汽车要开到蓝色终点停车。给机器只看一行的四个 demonstration然后让它去学怎么样开车最后它就可以学出在红色的终点位置如果它要停车的话它会这样开。今天给机器看不同的 demonstration最后它学出来开车的风格就会不太一样。举例来说上图第二行是不守规矩的开车方式因为它会开到道路之外这边它会穿过其它的车然后从这边开进去。所以机器就会学到说不一定要走在道路上它可以走非道路的地方。上图第三行是倒退来停车机器也会学会说它可以倒退 其实还有很多相关的研究,如下图所示,举例来说,你在教机械手臂的时候,要注意就是也许机器看到的视野跟人看到的视野是不太一样的。在刚才那个例子里面,人跟机器的动作是一样的。但是在未来的世界里面,也许机器是看着人的行为学的。刚才是人拉着,假设你要让机器学会打高尔夫球,在刚才的例子里面就是人拉着机器人手臂去打高尔夫球,但是在未来有没有可能机器就是看着人打高尔夫球,它自己就学会打高尔夫球了呢?但这个时候,要注意的事情是机器的视野跟它真正去采取这个行为的时候的视野是不一样的。机器必须了解到当它是第三人的视角的时候,看到另外一个人在打高尔夫球,跟它实际上自己去打高尔夫球的时候,看到的视野显然是不一样的。但它怎么把它是第三人称视角所观察到的经验把它泛化到它是第一人称视角的时候所采取的行为,这就需要用到`第三人称视角模仿学习third person imitation learning`的技术。
![](img/11.12.png) ![](img/11.13.png ':size=450')
种技术也可以拿来训练机器人。你可以让机器人,做一些你想要它做的动作,过去如果你要训练机器人,做你想要它做的动作,其实是比较麻烦的。怎么麻烦呢?过去如果你要操控机器的手臂,你要花很多力气去写 program 才让机器做一件很简单的事看。假设你有 Imitation Learning 的技术你可以让人做一下示范然后机器就跟着人的示范来进行学习比如学会摆盘子拉着机器人的手去摆盘子机器自己动。让机器学会倒水人只教它20 次,杯子每次放的位置不太一样。用这种方法来教机械手臂。 个怎么做呢?它的技术其实也是不只是用到模仿学习,它用到了`领域对抗训练domain-adversarial Training`。我们在讲领域对抗训练的时候,我们有讲说这也是一个 GAN 的技术。如下图 所示我们希望有一个提取器有两个不同领域domain的图像通过特征提取器以后没有办法分辨出它来自哪一个领域。其实第一人称视角和第三人称视角模仿学习用的技术其实也是一样的希望学习一个特征提取器机器在第三人称的时候跟它在第一人称的时候看到的视野其实是一样的就是把最重要的东西抽出来就好了。
## Third Person lmitation Learning ![](img/11.14.png ':size=450')
![](img/11.13.png)
其实还有很多相关的研究,举例来说,你在教机械手臂的时候,要注意就是也许机器看到的视野跟人看到的视野是不太一样的。在刚才那个例子里面,人跟机器的动作是一样的。但是在未来的世界里面,也许机器是看着人的行为学的。刚才是人拉着,假设你要让机器学会打高尔夫球,在刚才的例子里面就是人拉着机器人手臂去打高尔夫球,但是在未来有没有可能机器就是看着人打高尔夫球,它自己就学会打高尔夫球了呢?但这个时候,要注意的事情是机器的视野跟它真正去采取这个行为的时候的视野是不一样的。机器必须了解到当它是第三人的视角的时候,看到另外一个人在打高尔夫球,跟它实际上自己去打高尔夫球的时候,看到的视野显然是不一样的。但它怎么把它是第三人的时间所观察到的经验把它 generalize 到它是第一人称视角的时候所采取的行为,这就需要用到`Third Person Imitation Learning`的技术。 ## 序列生成和聊天机器人
在讲序列生成对抗网络sequence GAN的时候我们有讲过句子生成sentence generation跟聊天机器人。那其实句子生成或聊天机器人 也可以想成是模仿学习。
如下图所示,机器在模仿人写的句子,你在写句子的时候,你写下去的每一个字都想成是一个动作,所有的字合起来就是一个回合。举例来说,句子生成里面,你会给机器看很多人类写的文字。你要让机器学会写诗,那你就要给它看唐诗三百首。人类写的文字其实就是专家的示范。每一个词汇其实就是一个动作。你让机器做句子生成的时候,其实就是在模仿专家的轨迹。聊天机器人也是一样,在聊天机器人 里面你会收集到很多人互动对话的纪录,那些就是专家的示范。
![](img/11.14.png) 如果我们单纯用最大似然maximum likelihood这个技术来最大化会得到似然likelihood这个其实就是行为克隆。行为克隆就是看到一个状态接下来预测我们会得到什么样的动作有一个标准答案ground truth告诉机器说什么样的动作是最好的。在做似然的时候也是一样给定句子已经产生的部分。接下来机器要预测说接下来要写哪一个字才是最好的。所以其实最大似然在做序列生成sequence generation的时候它对应到模仿学习里面就是行为克隆。只有最大似然是不够的我们想要用序列生成对抗网络。其实序列生成对抗网络就是对应到逆强化学习逆强化学习就是一种 GAN 的技术。你把逆强化学习的技术放在句子生成,放到聊天机器人里面,其实就是序列生成对抗网络跟它的种种的变形。
这个怎么做呢?它的技术其实也是不只是用到 Imitation Learning它用到了 `Domain-Adversarial Training`。我们在讲 Domain-Adversarial Training 的时候我们有讲说这也是一个GAN 的技术。那我们希望今天有一个 extractor有两个不同 domain 的image通过 feature extractor 以后,没有办法分辨出它来自哪一个 domain。其实第一人称视角和第三人称视角Imitation Learning 用的技术其实也是一样的,希望 learn 一个 Feature Extractor机器在第三人称的时候跟它在第一人称的时候看到的视野其实是一样的就是把最重要的东西抽出来就好了。 ![](img/11.15.png ':size=450')
## Recap: Sentence Generation & Chat-bot
![](img/11.15.png)
在讲 Sequence GAN 的时候,我们有讲过 Sentence Generation 跟 Chat-bot。那其实 Sentence Generation 或 Chat-bot 也可以想成是 imitation learning。机器在模仿人写的句子你在写句子的时候你写下去的每一个 word 都想成是一个 action所有的 word 合起来就是一个 episode。举例来说 sentence generation 里面,你会给机器看很多人类写的文字。你要让机器学会写诗,那你就要给它看唐诗三百首。人类写的文字其实就是专家的 demonstration。每一个词汇其实就是一个 action。你让机器做 Sentence Generation 的时候其实就是在模仿专家的轨迹。Chat-bot 也是一样,在 Chat-bot 里面你会收集到很多人互动对话的纪录,那些就是专家的 demonstration。
如果我们单纯用 maximum likelihood 这个技术来 maximize 会得到 likelihood这个其实就是 behavior cloning。我们做 behavior cloning 就是看到一个 state接下来预测我们会得到什么样的 action。看到一个 state然后有一个 ground truth 告诉机器说什么样的 action 是最好的。在做 likelihood 的时候也是一样given sentence 已经产生的部分。接下来机器要 predict 说接下来要写哪一个word 才是最好的。**所以,其实 maximum likelihood 在做 sequence generation 的时候,它对应到 imitation learning 里面就是 behavior cloning。**只有 maximum likelihood 是不够的,我们想要用 Sequence GAN。**其实 Sequence GAN 就是对应到 Inverse Reinforcement Learning**Inverse Reinforcement Learning 就是一种 GAN 的技术。你把 Inverse Reinforcement Learning 的技术放在 sentence generation放到 Chat-bot 里面,其实就是 Sequence GAN 跟它的种种的变形。
## References ## References
@@ -117,3 +99,9 @@ IRL 有很多的应用,比如可以用开来自动驾驶汽车,有人用这

Binary file not shown.

Before

Width:  |  Height:  |  Size: 669 KiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 MiB

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 401 KiB

After

Width:  |  Height:  |  Size: 675 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 802 KiB

After

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 820 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 330 KiB

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 994 KiB

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 519 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

@@ -16,7 +16,7 @@ AlphaStar是DeepMind公司与暴雪使用深度强化学习技术进行PC与星
AlphaStar将星际争霸2的环境状态分为四部分分别为实体信息Entities、地图信息Map、玩家数据信息Player data、游戏统计信息Game statistics AlphaStar将星际争霸2的环境状态分为四部分分别为实体信息Entities、地图信息Map、玩家数据信息Player data、游戏统计信息Game statistics
![img1](img\img1.png) ![img1](img\13.1.png)
- 第一部分:实体信息,例如当前时刻环境中有什么建筑、兵种等等,并且我们将每一个实体的属性信息以向量的形式表示,例如对于一个建筑,其当前时刻的向量中包含此建筑的血量、等级、位置以及冷却时间等等信息。所以对于当前帧的全部实体信息,环境会给神经网络 $N$ 个长度为 $K$ 的向量,各表示此刻智能体能够看见的 $N$ 个实体的具体信息。(向量信息) - 第一部分:实体信息,例如当前时刻环境中有什么建筑、兵种等等,并且我们将每一个实体的属性信息以向量的形式表示,例如对于一个建筑,其当前时刻的向量中包含此建筑的血量、等级、位置以及冷却时间等等信息。所以对于当前帧的全部实体信息,环境会给神经网络 $N$ 个长度为 $K$ 的向量,各表示此刻智能体能够看见的 $N$ 个实体的具体信息。(向量信息)
- 第二部分:地图信息,这个比较好理解,也就是将地图中的信息以矩阵的形式送入神经网络中,来表示当前状态全局地图的信息。(向量信息或者说是图像信息) - 第二部分:地图信息,这个比较好理解,也就是将地图中的信息以矩阵的形式送入神经网络中,来表示当前状态全局地图的信息。(向量信息或者说是图像信息)
@@ -27,7 +27,7 @@ AlphaStar将星际争霸2的环境状态分为四部分分别为实体信息
AlphaStar的动作信息主要分为六个部分分别为动作类型Action type、选中的单元Selected units、目标Target、执行动作的队列Queued、是否重复Repeat、延时Delay每一个部分间是有关联的。 AlphaStar的动作信息主要分为六个部分分别为动作类型Action type、选中的单元Selected units、目标Target、执行动作的队列Queued、是否重复Repeat、延时Delay每一个部分间是有关联的。
![img2](img\img2.png) ![img2](img\13.2.png)
- 第一部分:动作类型,即下一次要进行的动作的类型是移动小兵、升级建筑还是移动小窗口的位置等等 - 第一部分:动作类型,即下一次要进行的动作的类型是移动小兵、升级建筑还是移动小窗口的位置等等
- 第二部分:选中的单元,即承接第一部分,例如我们要进行的动作类型是移动小兵,那么我们就应该选择具体“操作”哪一个小兵 - 第二部分:选中的单元,即承接第一部分,例如我们要进行的动作类型是移动小兵,那么我们就应该选择具体“操作”哪一个小兵
@@ -40,11 +40,11 @@ AlphaStar的动作信息主要分为六个部分分别为动作类型Actio
上面我们说明了AlphaStar网络的输入和输出即状态和动作那么从状态怎么得到动作呢其网络结构是怎么样的呢 上面我们说明了AlphaStar网络的输入和输出即状态和动作那么从状态怎么得到动作呢其网络结构是怎么样的呢
![img3](img\img3.png) ![img3](img\13.3.png)
### 输入部分 ### 输入部分
![img4](img\img4.png) ![img4](img\13.4.png)
从上图的红框可以看出模型的输入框架中主要有三个部分即Scalar features标量特征例如前面叙述的玩家的等级、小窗口的位置等等信息、Entities实体是向量即前面所叙述的一个建筑一个兵的当前的所有属性信息、Minimap地图即上面说的图像的数据。 从上图的红框可以看出模型的输入框架中主要有三个部分即Scalar features标量特征例如前面叙述的玩家的等级、小窗口的位置等等信息、Entities实体是向量即前面所叙述的一个建筑一个兵的当前的所有属性信息、Minimap地图即上面说的图像的数据。
@@ -56,13 +56,13 @@ AlphaStar的动作信息主要分为六个部分分别为动作类型Actio
中间过程比较简单即通过一个deep LSTM进行融合三种当前状态下的embedding进行下一时刻的embedding输出并且将该结果分别送入ValueNetwork、Residual MLP以及Actoin type的后续的MLP中。 中间过程比较简单即通过一个deep LSTM进行融合三种当前状态下的embedding进行下一时刻的embedding输出并且将该结果分别送入ValueNetwork、Residual MLP以及Actoin type的后续的MLP中。
![img5](img\img5.png) ![img5](img\13.5.png)
### 输出部分 ### 输出部分
正如前面介绍的,输出的动作是前后有关联的,按照顺序 正如前面介绍的,输出的动作是前后有关联的,按照顺序
![img6](img\img6.png) ![img6](img\13.6.png)
- 首先是动作类型Action type使用Deep LSTM的embedding的向量作为输入使用residual MLP得到Action type的softmax的输出结果并传给下一个子模型进行embedding。 - 首先是动作类型Action type使用Deep LSTM的embedding的向量作为输入使用residual MLP得到Action type的softmax的输出结果并传给下一个子模型进行embedding。
- 然后是延时Delay使用上一个上面的embedding的结果以及Deep LSTM的结果一起输入MLP后得到结果并传给下一个子模型进行embedding。 - 然后是延时Delay使用上一个上面的embedding的结果以及Deep LSTM的结果一起输入MLP后得到结果并传给下一个子模型进行embedding。
@@ -143,7 +143,7 @@ $$
### 宏观结果 ### 宏观结果
![img7](img\img7.png) ![img7](img\13.7.png)
图A为训练后的agent与人类对战的结果天梯图具体地刚刚结束监督学习后的AlphaStar可以达到钻石级别而训练到一半20天以及训练完结40天的AlphaStar可以达到GM的级别。AlphaStar已经可以击败绝大多数的普通玩家。 图A为训练后的agent与人类对战的结果天梯图具体地刚刚结束监督学习后的AlphaStar可以达到钻石级别而训练到一半20天以及训练完结40天的AlphaStar可以达到GM的级别。AlphaStar已经可以击败绝大多数的普通玩家。
@@ -155,7 +155,7 @@ $$
AlphaStar的论文中也使用了消融实验即控制变量法来进一步分析每一个约束条件对于对战结果的影响。下面举一个特别的例子 AlphaStar的论文中也使用了消融实验即控制变量法来进一步分析每一个约束条件对于对战结果的影响。下面举一个特别的例子
![img8](img\img8.png) ![img8](img\13.8.png)
上面的图片表示的是人类对局数据的使用的情况。可以看到如果没有人类对局数据的情况下数值仅仅为149但是只要经过了简单的监督学习对应的数值就可以达到936当然使用人类初始化后的强化学习可以达到更好的效果利用强化学习加监督学习的KL Loss的话可以达到接近于完整的利用人类统计量 $Z$ 的效果。可以分析出AlphaStar中人类对局的数据对于整个model的表现是很重要的其并没有完全像AlphaGo一样可以不使用人类数据的情况。 上面的图片表示的是人类对局数据的使用的情况。可以看到如果没有人类对局数据的情况下数值仅仅为149但是只要经过了简单的监督学习对应的数值就可以达到936当然使用人类初始化后的强化学习可以达到更好的效果利用强化学习加监督学习的KL Loss的话可以达到接近于完整的利用人类统计量 $Z$ 的效果。可以分析出AlphaStar中人类对局的数据对于整个model的表现是很重要的其并没有完全像AlphaGo一样可以不使用人类数据的情况。

BIN
docs/chapter13/img/13.1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 KiB

BIN
docs/chapter13/img/13.2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
docs/chapter13/img/13.3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

BIN
docs/chapter13/img/13.4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

BIN
docs/chapter13/img/13.5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

BIN
docs/chapter13/img/13.6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

BIN
docs/chapter13/img/13.7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

BIN
docs/chapter13/img/13.8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

View File

@@ -81,7 +81,7 @@ $$
那可是接下来有人就会问说会不会最后 学习出来的结果是说,反正 machine 就学到 V 永远都是 0然后反正 A 就等于 Q那你就没有得到任何 Dueling DQN 可以带给你的好处, 就变成跟原来的 DQN 一模一样。为了避免这个问题,实际上你要给 A 一些约束,让 更新 A 其实比较麻烦,让网络倾向于会想要去用 V 来解问题。 那可是接下来有人就会问说会不会最后 学习出来的结果是说,反正 machine 就学到 V 永远都是 0然后反正 A 就等于 Q那你就没有得到任何 Dueling DQN 可以带给你的好处, 就变成跟原来的 DQN 一模一样。为了避免这个问题,实际上你要给 A 一些约束,让 更新 A 其实比较麻烦,让网络倾向于会想要去用 V 来解问题。
举例来说,你可以看原始的文献,它有不同的约束 。一个最直觉的约束是你必须要让这个 A 的每一列的和都是 0所以看我这边举的例子列的和都是 0。如果这边列的和都是 0这边这个 V 的值,你就可以想成是上面 Q 的每一列的平均值。这个平均值,加上这些值才会变成是 Q 的 值。所以今天假设你发现说你在更新参数的时候,你是要让整个一起被更新。你就不会想要更新这边,因为你不会想要更新 这个矩阵。因为 A 这个矩阵的每一列的和都要是 0所以你没有办法说让这边的值通通都 +1这件事是做不到的。因为它的约束就是你的和永远都是要 0。所以不可以都 +1这时候就会强迫网络去更新 V 的值,然后让你可以用比较有效率的方法,去使用你的数据。 举例来说,你可以看原始的文献,它有不同的约束 。一个最直觉的约束是你必须要让这个 A 的每一列的和都是 0所以看我这边举的例子列的和都是 0。如果这边列的和都是 0这边这个 V 的值,你就可以想成是上面 Q 的每一列的平均值。这个平均值,加上这些值才会变成是 Q 的 值。所以今天假设你发现说你在更新参数的时候,你是要让整个一起被更新。你就不会想要更新这边,因为你不会想要更新 这个矩阵。因为 A 这个矩阵的每一列的和都要是 0所以你没有办法说让这边的值通通都 +1这件事是做不到的。因为它的约束就是你的和永远都是要 0。所以不可以都 +1这时候就会强迫网络去更新 V 的值,然后让你可以用比较有效率的方法,去使用你的数据。
![](img/7.6.png) ![](img/7.6.png)

View File

@@ -1,41 +1,54 @@
# Q-learning for Continuous Actions # 针对连续动作的 DQN
## Solution 1 & Solution 2 ## 方案 1 & 方案 2
跟基于策略梯度的方法比起来DQN 是比较稳的。策略梯度是没有太多游戏是玩得起来的,策略梯度比较不稳,在没有 近端策略优化 之前我们很难用策略梯度做什么事情。DQN 相对而言是比较稳的。最早 DeepMind 的论文拿深度强化学习来玩雅达利的游戏,用的就是 DQN。DQN 比较容易训练的一个理由是:在 DQN 里面你只要能够估计出Q函数就保证你一定可以找到一个比较好的策略。也就是你只要能够估计出Q函数就保证你可以改进策略。而估计Q函数这件事情是比较容易的因为它就是一个回归问题。在回归问题里面 你可以轻易地知道模型学习得是不是越来越好只要看那个回归的损失有没有下降你就知道说模型学习得好不好所以估计Q函数相较于学习一个策略是比较容易的。你只要估计Q函数就可以保证说现在一定会得到比较好的策略。所以一般而言 DQN 比较容易操作。
![](img/8.1.png) DQN 其实存在一些问题,最大的问题是它不太容易处理连续动作。很多时候动作是连续的,比如我们玩雅达利的游戏,智能体只需要决定比如说上下左右,这种动作是离散的。那很多时候动作是连续的。举例来说假设智能体要做的事情是开自驾车,它要决定说它方向盘要左转几度, 右转几度,这是连续的。假设智能体是一个机器人,它身上有 50 个 关节,它的每一个动作就对应到它身上的这 50 个关节的角度。而那些角度也是连续的。所以很多时候动作并不是一个离散的东西,它是一个向量。在这个向量里面,它的每一个维度都有一个对应的值,都是实数,它是连续的。假设动作是连续的,做 DQN 就会有困难。因为在做 DQN 里面一个很重要的一步是你要能够解这个优化问题。估计出 Q函数$Q(s,a)$ 以后,必须要找到一个 $a$,它可以让 $Q(s,a)$ 最大,如下式所示。
继续讲一下 Q-learning其实跟 policy gradient based 方法比起来Q-learning 是比较稳的。policy gradient 是没有太多游戏是玩得起来的policy gradient 比较不稳,尤其在没有 PPO 之前,你很难用 policy gradient 做什么事情。Q-learning 相对而言是比较稳的。最早 DeepMind 的 paper 拿 deep reinforcement learning 来玩 Atari 的游戏,用的就是 Q-learning。Q-learning 比较容易 train 的一个理由是:在 Q-learning 里面,你只要能够 estimate 出 Q-function就保证你一定可以找到一个比较好的 policy。也就是你只要能够 estimate 出 Q-function就保证你可以 improve 你的 policy。而 estimate Q-function 这件事情,是比较容易的,因为它就是一个 regression problem。在这个 regression problem 里面, 你可以轻易地知道 model learn 得是不是越来越好,只要看那个 regression 的 loss 有没有下降,你就知道说你的 model learn 得好不好,所以 estimate Q-function 相较于 learn 一个 policy 是比较容易的。你只要 estimate Q-function就可以保证说现在一定会得到比较好的 policy。所以一般而言 Q-learning 比较容易操作。 $$
a=\arg \max _{a} Q(s, a)
$$
Q: Q-learning 有什么问题呢? 假设$a$是离散的,即$a$的可能性都是有限的。举例来说,雅达利的小游戏里面,$a$ 就是上下左右跟开火,它是有限的,我们可以把每一个可能的动作都带到 Q 里面算它的 Q 值。但假如$a$是连续的,你无法穷举所有可能的连续动作,试试看哪一个连续动作可以让 Q 的值最大。
A: **最大的问题是它不太容易处理 continuous action**。很多时候 action 是 continuous 的。什么时候你的 action 会是 continuous 的呢?我们玩 Atari 的游戏,你的 agent 只需要决定比如说上下左右,这种 action 是 discrete 的。那很多时候你的 action 是 continuous 的。举例来说假设你的 agent 要做的事情是开自驾车,它要决定说它方向盘要左转几度, 右转几度,这是 continuous 的。假设 agent 是一个机器人,它身上有 50 个 关节,它的每一个 action 就对应到它身上的这 50 个关节的角度。而那些角度也是 continuous 的。所以很多时候 action 并不是一个 discrete 的东西,它是一个 vector。在这个 vector 里面,它的每一个 dimension 都有一个对应的 value都是 real number它是 continuous 的。假设 action 是 continuous 的,做 Q-learning 就会有困难。因为在做 Q-learning 里面一个很重要的一步是你要能够解这个 optimization problem。你 estimate 出 Q-function $Q(s,a)$ 以后,必须要找到一个 a它可以让 $Q(s,a)$ 最大。假设 a 是 discrete 的,那 a 的可能性都是有限的。举例来说Atari 的小游戏里面a 就是上下左右跟开火,它是有限的,你可以把每一个可能的 action 都带到 Q 里面算它的 Q value。但假如 a 是 continuous 的,你无法穷举所有可能的 continuous action试试看哪一个 continuous action 可以让 Q 的 value 最大 怎么解这个问题呢?就有各种不同的方案
所以怎么办呢?在概念上,我们就是要能够解这个问题。怎么解这个问题呢?就有各种不同的 solution 第一个方案是假设你不知道怎么解这个问题,因为$a$是没有办法穷举的,怎么办?我们可以采样出 $N$ 个可能的 $a$$\left\{a_{1}, a_{2}, \cdots, a_{N}\right\}$ ,一个一个带到 Q函数里面看谁最大。这个方法其实也不会太不高效 因为你在运算的时候会使用 GPU一次会把 $N$ 个连续动作都丢到 Q函数里面一次得到 $N$ 个 Q 值,然后看谁最大。当然这不是一个非常精确的做法,因为你没有办法做太多的采样, 所以你估计出来的 Q 值,最后决定的动作可能不是非常的精确,这是第一个方案
**第一个 solution 是假设你不知道怎么解这个问题,因为 a 是没有办法穷举的。怎么办?用 sample 的。Sample 出 N 个 可能的 a一个一个带到 Q-function 里面,看谁最快。**这个方法其实也不会太不 efficient 因为你真的在运算的时候,你会用 GPU一次会把 N 个 continuous action 都丢到 Q-function 里面,一次得到 N 个 Q value然后看谁最大。当然这不是一个非常精确的做法因为你没有办法做太多的 sample 所以你 estimate 出来的 Q value你最后决定的 action 可能不是非常的精确, 这是第一个 solution 第二个方案是什么呢既然要解的是一个优化问题optimization problem其实是要最大化目标函数objective function要最大化一个东西 就可以用梯度上升。我们就把$a$当作是参数,然后要找一组$a$去最大化Q函数就用梯度上升去更新 $a$ 的值,最后看看能不能找到一个$a$去最大化Q函数也就是目标函数。当然这样子你会遇到全局最大值global maximum的问题 就不见得能够真的找到最优的结果,而且这个运算量显然很大, 因为你要迭代地更新 $a$。我们训练一个网络就很花时间了。如果你用梯度上升的方法来处理连续的问题, 等于是你每次要决定采取哪一个动作的时候,都还要做一次训练网络的过程,显然运算量是很大的。这是第二个方案
**第二个 solution 是什么呢?既然要解的是一个 optimization problem其实是要 maximize objective function要 maximize 一个东西, 就可以用 gradient ascent。**你就把 a 当作是 parameter然后你要找一组 a 去 maximize 你的 Q-function你就用 gradient ascent 去 update a 的 value最后看看你能不能找到一个 a 去 maximize 你的 Q-function也就是你的 objective function。当然这样子你会遇到 global maximum 的问题, 就不见得能够真的找到 optimal 的结果,而且这个运算量显然很大, 因为你要迭代地 update a。我们 train 一个 network 就很花时间了。如果你用 gradient ascent 的方法来处理 continuous 的 problem 等于是你每次要决定 take 哪一个 action 的时候,你都还要做一次 train network 的 process显然运算量是很大的。这是第二个 solution。
## Solution 3: Design a network ## 方案 3设计网络
第三个方案是特别设计一个网络的架构特别设计Q函数使得解 arg max 的问题变得非常容易。也就是这边的Q函数不是一个一般的Q函数特别设计一下它的样子让你要找让这个Q函数最大的 $a$ 的时候非常容易。
下图是一个例子这边有Q函数这个Q函数的做法是这样。
通常输入状态 $s$ 就是一个图像,可以用一个向量或一个矩阵来表示。
输入 $s$Q函数会输出 3 个东西。它会输出 $\mu(s)$,这是一个向量。它会输出 $\Sigma(s)$ ,这是一个矩阵。它会输出 $V(s)$,这是一个标量。
输出这 3 个东西以后我们知道Q函数其实是吃一个$s$跟 $a$然后决定一个值。Q函数意思是说在某一个状态采取某一个动作的时候你期望的奖励有多大。到目前为止这个Q函数只吃 $s$,它还没有吃$a$进来,$a$ 在哪里呢当这个Q函数吐出 $\mu$、 $\Sigma$ 跟 $V$ 的时候,我们才把$a$引入,用$a$跟 $\mu(s)、\Sigma(s)、V$ 互相作用一下,你才算出最终的 Q 值。
![](img/8.2.png) ![](img/8.2.png)
**第三个 solution 是特别 design 一个 network 的架构,特别 design 你的 Q-function使得解 arg max 的 problem 变得非常容易**。也就是这边的 Q-function 不是一个 general 的 Q-function特别设计一下它的样子让你要找让这个 Q-function 最大的 a 的时候非常容易 $a$怎么和这 3 个东西互相作用呢?实际上 $Q(s,a)$Q函数的运作方式是先输入 $s$,让你得到 $\mu,\Sigma$ 跟 $V$。然后再输入 $a$,然后接下来把$a$跟 $\mu$ 相减。注意一下$a$现在是连续的动作,所以它也是一个向量。假设你现在是要操作机器人的话,这个向量的每一个维度,可能就对应到机器人的某一个关节,它的数值就是关节的角度,所以$a$是一个向量。把向量 $a$ 减掉向量 $\mu$,取转置,所以它是一个横的向量。$\Sigma$ 是一个矩阵。然后$a$减掉 $\mu(s)$ $a$ 和 $\mu(s)$ 都是向量,减掉以后还是一个竖的向量。所以 $-(a-\mu(s))^{T} \Sigma(s)(a-\mu(s))+V(s)$ 是一个标量,这个数值就是 Q 值 $Q(s,a)$
上图是一个例子,这边有我们的 Q-function这个 Q-function 的做法是这样 假设 $Q(s,a)$ 定义成这个样子,我们要怎么找到一个$a$去最大化这个 Q 值呢?这个方案非常简单。因为 $(a-\mu(s))^{T} \Sigma(s)(a-\mu(s))$ 一定是正的,它前面乘上一个负号,所以第一项就假设我们不看这个负号的话,第一项的值越小,最终的 Q 值就越大。因为我们是把 $V(s)$ 减掉第一项,所以第一项的值越小,最后的 Q 值就越大。怎么让第一项的值最小呢?你直接把$a$代入 $\mu$ 的值,让它变成 0就会让第一项的值最小
* Input state s通常它就是一个 image可以用一个向量或一个 matrix 来表示 $\Sigma$ 一定是正定的。因为这个东西就像是高斯分布Gaussian distribution所以 $\mu$ 就是高斯分布的均值,$\Sigma$ 就是高斯分布的方差。但方差是一个正定positive definite的矩阵怎么样让这个 $\Sigma$ 一定是正定的矩阵呢?其实在 $Q^{\pi}$ 里面,它不是直接输出 $\Sigma$,如果直接输出 一个 $\Sigma$ 它不一定是正定的矩阵。它其实是输出 一个矩阵,然后再把那个矩阵跟另外一个矩阵做转置相乘, 然后可以确保 $\Sigma$ 是正定的。这边要强调的点就是说,实际上它不是直接输出一个矩阵。你再去那个论文里面查看一下它的技巧,它可以保证说 $\Sigma$ 是正定的
* Input 这个 sQ-function 会 output 3 个东西。它会 output $\mu(s)$,这是一个 vector。它会 output $\Sigma(s)$ ,这是一个 matrix。它会 output $V(s)$,这是一个 scalar。
* output 这 3 个东西以后,我们知道 Q-function 其实是吃一个 s 跟 a然后决定一个 value。Q-function 意思是说在某一个 statetake 某一个 action 的时候,你 expected 的 reward 有多大。到目前为止这个 Q-function 只吃 s它还没有吃 a 进来a 在哪里呢?当这个 Q-function 吐出 $\mu$、 $\Sigma$ 跟 $V$ 的时候,我们才把 a 引入,用 a 跟 $\mu(s)、\Sigma(s)、V$ 互相作用一下,你才算出最终的 Q value。
* a 怎么和这 3 个东西互相作用呢?实际上 $Q(s,a)$,你的 Q-function 的运作方式是先 input s让你得到 $\mu,\Sigma$ 跟 V。然后再 input a然后接下来把 a 跟 $\mu$ 相减。注意一下 a 现在是 continuous 的 action所以它也是一个 vector。假设你现在是要操作机器人的话这个 vector 的每一个 dimension可能就对应到机器人的某一个关节它的数值就是关节的角度所以 a 是一个 vector。把 a 的这个 vector 减掉 $\mu$ 的这个 vector取 transpose所以它是一个横的 vector。$\Sigma$ 是一个 matrix。然后 a 减掉 $\mu(s)$ a 和 $\mu(s)$ 都是 vector减掉以后还是一个竖的 vector。所以 $-(a-\mu(s))^{T} \Sigma(s)(a-\mu(s))+V(s)$ 是一个 scalar这个数值就是 Q value $Q(s,a)$,。
* 假设 $Q(s,a)$ 定义成这个样子,我们要怎么找到一个 a 去 maximize 这个 Q value 呢?这个 solution 非常简单,什么样的 a 可以让这一个 Q-function 最终的值最大呢?。因为 $(a-\mu(s))^{T} \Sigma(s)(a-\mu(s))$ 一定是正的,它前面乘上一个负号,所以第一项就假设我们不看这个负号的话,第一项的值越小,最终的 Q value 就越大。因为我们是把 V(s) 减掉第一项,所以第一项的值越小,最后的 Q value 就越大。怎么让第一项的值最小呢?你直接把 a 代入 $\mu$ 的值,让它变成 0就会让第一项的值最小。
* $\Sigma$ 一定是正定的。因为这个东西就像是 Gaussian distribution所以 $\mu$ 就是 Gaussian 的 mean$\Sigma$ 就是 Gaussian 的 variance。但 variance 是一个 positive definite 的 matrix怎么样让这个 $\Sigma$ 一定是 positive definite 的 matrix 呢?其实在 $Q^{\pi}$ 里面,它不是直接 output $\Sigma$,如果直接 output 一个 $\Sigma$ 它不一定是 positive definite 的 matrix。它其实是 output 一个 matrix然后再把那个 matrix 跟另外一个 matrix 做 transpose 相乘, 然后可以确保 $\Sigma $ 是 positive definite 的。这边要强调的点就是说,实际上它不是直接 output 一个 matrix。你再去那个 paper 里面 check 一下它的 trick它可以保证说 $\Sigma$ 是 positive definite 的。
* 你把 a 代入 $\mu(s)$ 以后,你可以让 Q 的值最大。所以假设要你 arg max 这个东西,虽然一般而言,若 Q 是一个 general function 你很难算,但是我们这边 design 了 Q 这个 functiona 只要设 $\mu(s)$,我们就得到最大值。你在解这个 arg max 的 problem 的时候就变得非常容易。所以 Q-learning 也可以用在 continuous 的 case只是有一些局限就是 function 不能够随便乱设,它必须有一些限制。
## Solution 4: Don't use Q-learning 你把$a$代入 $\mu(s)$ 以后,你可以让 Q 的值最大。所以假设要你 arg max Q 函数,如下式所示。
$$
\mu(s)=\arg \max _{a} Q(s, a)
$$
虽然一般而言,若 Q 是一个一般的函数, 你很难算,但是我们这边设计了 Q 这个函数,$a$ 只要设 $\mu(s)$,我们就得到最大值。你在解这个 arg max 的问题的时候就变得非常容易。所以 DQN 也可以用在连续的情况,只是有一些局限,就是函数不能够随便乱设,它必须有一些限制。
## 方案 4不使用DQN
第 4 招就是不要用 DQN。用 DQN 处理连续动作还是比较麻烦。
基于策略的方法 PPO 和基于价值的方法 DQN这两者其实是可以结合在一起的如下图所示也就是演员-评论员的方法。
![](img/8.3.png) ![](img/8.3.png)
**第 4 招就是不要用 Q-learning。**用 Q-learning 处理 continuous action 还是比较麻烦。
我们讲了 policy-based 的方法 PPO 和 value-based 的方法 Q-learning这两者其实是可以结合在一起的 也就是 Actor-Critic 的方法。

Binary file not shown.

Before

Width:  |  Height:  |  Size: 676 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 794 KiB

After

Width:  |  Height:  |  Size: 482 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 969 KiB

After

Width:  |  Height:  |  Size: 393 KiB