This commit is contained in:
qiwang067
2021-09-21 17:04:59 +08:00
parent 929cbcc11a
commit 23dd8aaaad

View File

@@ -10,24 +10,24 @@
怎么让机器学会跟专家一模一样的行为呢?我们可以把它当作一个监督学习的问题,去收集很多行车记录器,然后再收集人在具体情境下会采取什么样的行为(训练数据)。你知道说人在状态$s_1$ 会采取动作$a_1$,人在状态$s_2$ 会采取动作$a_2$。人在状态, $s_3$ 会采取动作$a_3$。接下来,你就学习一个网络。这个网络就是演员,它输入$s_i$ 的时候,你就希望它的输出 是$a_i$,就这样结束了。它就是一个的监督学习的问题。 怎么让机器学会跟专家一模一样的行为呢?我们可以把它当作一个监督学习的问题,去收集很多行车记录器,然后再收集人在具体情境下会采取什么样的行为(训练数据)。你知道说人在状态$s_1$ 会采取动作$a_1$,人在状态$s_2$ 会采取动作$a_2$。人在状态, $s_3$ 会采取动作$a_3$。接下来,你就学习一个网络。这个网络就是演员,它输入$s_i$ 的时候,你就希望它的输出 是$a_i$,就这样结束了。它就是一个的监督学习的问题。
![](img/11.2.png) ![](img/11.2.png ':size=550')
行为克隆虽然非常简单但它的问题是如果你只收集专家的资料你可能看过的观测会是非常有限的。举例来说如下图所示假设你要学习一部自动驾驶汽车自动驾驶汽车就是要过这个弯道。如果是专家的话它就是把车顺着这个红线就开过去了。但假设智能体很笨它开着开着就撞墙了它永远不知道撞墙这种状况要怎么处理。因为训练数据里面从来没有撞过墙所以它根本就不知道撞墙这一种情况要怎么处理。打电玩也是一样让人去玩马里奥Mario那专家可能非常强它从来不会跳不上水管所以机器根本不知道跳不上水管时要怎么处理。 行为克隆虽然非常简单但它的问题是如果你只收集专家的资料你可能看过的观测会是非常有限的。举例来说如下图所示假设你要学习一部自动驾驶汽车自动驾驶汽车就是要过这个弯道。如果是专家的话它就是把车顺着这个红线就开过去了。但假设智能体很笨它开着开着就撞墙了它永远不知道撞墙这种状况要怎么处理。因为训练数据里面从来没有撞过墙所以它根本就不知道撞墙这一种情况要怎么处理。打电玩也是一样让人去玩马里奥Mario那专家可能非常强它从来不会跳不上水管所以机器根本不知道跳不上水管时要怎么处理。
所以光是做行为克隆是不够的,只观察专家的行为是不够的,需要一个招数,这个招数叫作`数据集聚合dataset aggregationDAgger` 所以光是做行为克隆是不够的,只观察专家的行为是不够的,需要一个招数,这个招数叫作`数据集聚合dataset aggregationDAgger`
![](img/11.3.png) ![](img/11.3.png ':size=550')
我们会希望收集更多样性的数据,而不是只收集专家所看到的观测。我们会希望能够收集专家在各种极端的情况下,它会采取什么样的行为。如下图所示,以自动驾驶汽车为例的话,假设一开始,我们有演员 $\pi_1$,并且让 $\pi_1$去开这个车,但车上坐了一个专家。这个专家会不断地告诉机器说,如果在这个情境里面,我会怎么样开。所以 $\pi_1$ 自己开自己的,但是专家会不断地表示它的想法。比如说,一开始的时候,专家可能说往前走。在拐弯的时候,专家可能就会说往右转。但 $\pi_1$ 是不管专家的指令的,所以它会继续去撞墙。虽然专家说往右转,但是不管它怎么下指令都是没有用的,$\pi_1$ 会自己做自己的事情,因为我们要做的记录的是说,专家在 $\pi_1$ 看到这种观测的情况下,它会做什么样的反应。这个方法显然是有一些问题的,因为你每开一次自动驾驶汽车就会牺牲一个人。那你用这个方法,你牺牲一个专家以后,你就会知道,人类在这样子的状态下,在快要撞墙的时候,会采取什么样的行为。再把这个数据拿去训练新的 $\pi_2$。这个过程就反复继续下去,这个方法就叫做数据集聚合。 我们会希望收集更多样性的数据,而不是只收集专家所看到的观测。我们会希望能够收集专家在各种极端的情况下,它会采取什么样的行为。如下图所示,以自动驾驶汽车为例的话,假设一开始,我们有演员 $\pi_1$,并且让 $\pi_1$去开这个车,但车上坐了一个专家。这个专家会不断地告诉机器说,如果在这个情境里面,我会怎么样开。所以 $\pi_1$ 自己开自己的,但是专家会不断地表示它的想法。比如说,一开始的时候,专家可能说往前走。在拐弯的时候,专家可能就会说往右转。但 $\pi_1$ 是不管专家的指令的,所以它会继续去撞墙。虽然专家说往右转,但是不管它怎么下指令都是没有用的,$\pi_1$ 会自己做自己的事情,因为我们要做的记录的是说,专家在 $\pi_1$ 看到这种观测的情况下,它会做什么样的反应。这个方法显然是有一些问题的,因为你每开一次自动驾驶汽车就会牺牲一个人。那你用这个方法,你牺牲一个专家以后,你就会知道,人类在这样子的状态下,在快要撞墙的时候,会采取什么样的行为。再把这个数据拿去训练新的 $\pi_2$。这个过程就反复继续下去,这个方法就叫做数据集聚合。
![](img/11.4.png) ![](img/11.4.png ':size=550')
行为克隆还有一个问题:机器会完全模仿专家的行为,不管专家的行为是否有道理,就算没有道理,没有什么用的,就算这是专家本身的习惯,机器也会硬把它记下来。如果机器确实可以记住所有专家的行为,也许还好。因为如果专家这么做,有些行为是多余的。但是没有问题,假设机器的行为可以完全仿造专家行为,也就算了,它就是跟专家一样得好,只是做一些多余的事。但问题是机器是一个网络,网络的容量是有限的。就算给网络训练数据,它在训练数据上得到的正确率往往也不是 100%,它有些事情是学不起来的。这个时候,什么该学,什么不该学就变得很重要。 行为克隆还有一个问题:机器会完全模仿专家的行为,不管专家的行为是否有道理,就算没有道理,没有什么用的,就算这是专家本身的习惯,机器也会硬把它记下来。如果机器确实可以记住所有专家的行为,也许还好。因为如果专家这么做,有些行为是多余的。但是没有问题,假设机器的行为可以完全仿造专家行为,也就算了,它就是跟专家一样得好,只是做一些多余的事。但问题是机器是一个网络,网络的容量是有限的。就算给网络训练数据,它在训练数据上得到的正确率往往也不是 100%,它有些事情是学不起来的。这个时候,什么该学,什么不该学就变得很重要。
举例来说,如下图所示,在学习中文的时候,老师有语音、行为和知识,但其实只有语音部分是重要的,知识的部分是不重要的。也许机器只能够学一件事,也许它就只学到了语音,那没有问题。如果它只学到了手势,这样子就有问题了。所以让机器学习什么东西是需要模仿,什么东西是不需要模仿,这件事情是重要的。而单纯的行为克隆就没有把这件事情学进来,因为机器只是复制专家所有的行为而已,它不知道哪些行为是重要,是对接下来有影响的,哪些行为是不重要的,是对接下来是没有影响的。 举例来说,如下图所示,在学习中文的时候,老师有语音、行为和知识,但其实只有语音部分是重要的,知识的部分是不重要的。也许机器只能够学一件事,也许它就只学到了语音,那没有问题。如果它只学到了手势,这样子就有问题了。所以让机器学习什么东西是需要模仿,什么东西是不需要模仿,这件事情是重要的。而单纯的行为克隆就没有把这件事情学进来,因为机器只是复制专家所有的行为而已,它不知道哪些行为是重要,是对接下来有影响的,哪些行为是不重要的,是对接下来是没有影响的。
![](img/11.5.png) ![](img/11.5.png ':size=550')
行为克隆还有一个问题:在做行为克隆的时候,训练数据跟测试数据是不匹配的。我们可以用数据集聚合的方法来缓解这个问题。在训练跟测试的时候,数据分布其实是不一样的。因为在强化学习里面,动作会影响到接下来所看到的状态。我们是先有状态$s_1$,然后采取动作$a_1$,动作$a_1$ 其实会决定接下来你看到什么样的状态$s_2$。所以在强化学习里面有一个很重要的特征,就是你采取了动作会影响你接下来所看到的状态,也就是会影响状态的分布。如果做了行为克隆的话,我们只能观察到专家$\hat{\pi}$的一堆状态跟动作的对$(s,a)$。 行为克隆还有一个问题:在做行为克隆的时候,训练数据跟测试数据是不匹配的。我们可以用数据集聚合的方法来缓解这个问题。在训练跟测试的时候,数据分布其实是不一样的。因为在强化学习里面,动作会影响到接下来所看到的状态。我们是先有状态$s_1$,然后采取动作$a_1$,动作$a_1$ 其实会决定接下来你看到什么样的状态$s_2$。所以在强化学习里面有一个很重要的特征,就是你采取了动作会影响你接下来所看到的状态,也就是会影响状态的分布。如果做了行为克隆的话,我们只能观察到专家$\hat{\pi}$的一堆状态跟动作的对$(s,a)$。
@@ -51,19 +51,19 @@
怎么让专家得到的奖励大过演员呢?如下图所示,其实我们在学习的时候,奖励函数也许就是神经网络。这个神经网络就是输入 $\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$ 的值越小越好。 怎么让专家得到的奖励大过演员呢?如下图所示,其实我们在学习的时候,奖励函数也许就是神经网络。这个神经网络就是输入 $\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$ 的值越小越好。
![](img/11.7.png) ![](img/11.7.png ':size=550')
什么叫做一个最好的奖励函数。最后你学习出来的奖励函数应该就是专家和演员在这个奖励函数都会得到一样高的分数。最终奖励函数没有办法分辨出谁应该会得到比较高的分数。通常在训练的时候你会迭代地去做。最早的逆强化学习对奖励函数有些限制它是假设奖励函数是线性的linear 。如果奖励函数是线性的话你可以证明这个算法会收敛converge。但是如果不是线性的你就没有办法证明说它会收敛。 什么叫做一个最好的奖励函数。最后你学习出来的奖励函数应该就是专家和演员在这个奖励函数都会得到一样高的分数。最终奖励函数没有办法分辨出谁应该会得到比较高的分数。通常在训练的时候你会迭代地去做。最早的逆强化学习对奖励函数有些限制它是假设奖励函数是线性的linear 。如果奖励函数是线性的话你可以证明这个算法会收敛converge。但是如果不是线性的你就没有办法证明说它会收敛。
逆强化学习的框架如下图所示,其实我们只要把逆强化学习中的演员看成生成器,把奖励函数看成判别器,它就是 GAN。所以逆强化学习会不会收敛这个问题就等于是问说 GAN 会不会收敛。如果你已经实现过,你会知道不一定会收敛。但除非你对 $R$ 下一个非常严格的限制,如果 $R$ 是一个一般的网络的话,你就会有很大的麻烦。 逆强化学习的框架如下图所示,其实我们只要把逆强化学习中的演员看成生成器,把奖励函数看成判别器,它就是 GAN。所以逆强化学习会不会收敛这个问题就等于是问说 GAN 会不会收敛。如果你已经实现过,你会知道不一定会收敛。但除非你对 $R$ 下一个非常严格的限制,如果 $R$ 是一个一般的网络的话,你就会有很大的麻烦。
![](img/11.8.png) ![](img/11.8.png ':size=550')
我们可以把逆强化学习跟 GAN 比较一下。 我们可以把逆强化学习跟 GAN 比较一下。
如下图所示GAN 里面,我们有一堆很好的图、一个生成器和一个判别器。一开始生成器不知道要产生什么样的图,它就乱画。判别器的工作就是给画的图打分,专家画的图就是高分,生成器画的图就是低分。生成器会想办法去骗过判别器,生成器会希望判别器 也会给它画的图高分。整个过程跟逆强化学习是一模一样的。画的图就是专家的示范。生成器就是 演员,生成器画很多图,演员 会去跟环境互动,产生很多轨迹。这些轨迹 跟环境互动的记录,游戏的纪录其实就是等于 GAN 里面的这些图。然后你学习一个奖励函数。奖励函数就是判别器。奖励函数要给专家的示范高分,给演员互动的结果低分。 如下图所示GAN 里面,我们有一堆很好的图、一个生成器和一个判别器。一开始生成器不知道要产生什么样的图,它就乱画。判别器的工作就是给画的图打分,专家画的图就是高分,生成器画的图就是低分。生成器会想办法去骗过判别器,生成器会希望判别器 也会给它画的图高分。整个过程跟逆强化学习是一模一样的。画的图就是专家的示范。生成器就是 演员,生成器画很多图,演员 会去跟环境互动,产生很多轨迹。这些轨迹 跟环境互动的记录,游戏的纪录其实就是等于 GAN 里面的这些图。然后你学习一个奖励函数。奖励函数就是判别器。奖励函数要给专家的示范高分,给演员互动的结果低分。
接下来,演员会想办法,从这个已经学习出来的奖励函数里面得到高分,然后迭代地去循环。跟 GAN 其实是一模一样的,我们只是换个说法而已。 接下来,演员会想办法,从这个已经学习出来的奖励函数里面得到高分,然后迭代地去循环。跟 GAN 其实是一模一样的,我们只是换个说法而已。
![](img/11.9.png) ![](img/11.9.png ':size=550')
逆强化学习有很多的应用,比如可以用开来自动驾驶汽车,有人用这个技术来学开自动驾驶汽车的不同风格。每个人在开车的时候会有不同风格,举例来说,能不能够压到线,能不能够倒退,要不要遵守交通规则等等。每个人的风格是不同的,然后用逆强化学习可以让自动驾驶汽车学会各种不同的开车风格。 逆强化学习有很多的应用,比如可以用开来自动驾驶汽车,有人用这个技术来学开自动驾驶汽车的不同风格。每个人在开车的时候会有不同风格,举例来说,能不能够压到线,能不能够倒退,要不要遵守交通规则等等。每个人的风格是不同的,然后用逆强化学习可以让自动驾驶汽车学会各种不同的开车风格。
@@ -78,11 +78,11 @@
其实还有很多相关的研究,如下图所示,举例来说,你在教机械手臂的时候,要注意就是也许机器看到的视野跟人看到的视野是不太一样的。在刚才那个例子里面,人跟机器的动作是一样的。但是在未来的世界里面,也许机器是看着人的行为学的。刚才是人拉着,假设你要让机器学会打高尔夫球,在刚才的例子里面就是人拉着机器人手臂去打高尔夫球,但是在未来有没有可能机器就是看着人打高尔夫球,它自己就学会打高尔夫球了呢?但这个时候,要注意的事情是机器的视野跟它真正去采取这个行为的时候的视野是不一样的。机器必须了解到当它是第三人的视角的时候,看到另外一个人在打高尔夫球,跟它实际上自己去打高尔夫球的时候,看到的视野显然是不一样的。但它怎么把它是第三人的时间所观察到的经验把它泛化到它是第一人称视角的时候所采取的行为,这就需要用到`第三人称视角模仿学习third person imitation learning`的技术。 其实还有很多相关的研究,如下图所示,举例来说,你在教机械手臂的时候,要注意就是也许机器看到的视野跟人看到的视野是不太一样的。在刚才那个例子里面,人跟机器的动作是一样的。但是在未来的世界里面,也许机器是看着人的行为学的。刚才是人拉着,假设你要让机器学会打高尔夫球,在刚才的例子里面就是人拉着机器人手臂去打高尔夫球,但是在未来有没有可能机器就是看着人打高尔夫球,它自己就学会打高尔夫球了呢?但这个时候,要注意的事情是机器的视野跟它真正去采取这个行为的时候的视野是不一样的。机器必须了解到当它是第三人的视角的时候,看到另外一个人在打高尔夫球,跟它实际上自己去打高尔夫球的时候,看到的视野显然是不一样的。但它怎么把它是第三人的时间所观察到的经验把它泛化到它是第一人称视角的时候所采取的行为,这就需要用到`第三人称视角模仿学习third person imitation learning`的技术。
![](img/11.13.png) ![](img/11.13.png ':size=550')
这个怎么做呢?它的技术其实也是不只是用到模仿学习,它用到了`领域对抗训练domain-adversarial Training`。我们在讲领域对抗训练的时候,我们有讲说这也是一个 GAN 的技术。如下图 所示我们希望有一个提取器有两个不同领域domain的图像通过特征提取器以后没有办法分辨出它来自哪一个领域。其实第一人称视角和第三人称视角模仿学习用的技术其实也是一样的希望学习一个特征提取器机器在第三人称的时候跟它在第一人称的时候看到的视野其实是一样的就是把最重要的东西抽出来就好了。 这个怎么做呢?它的技术其实也是不只是用到模仿学习,它用到了`领域对抗训练domain-adversarial Training`。我们在讲领域对抗训练的时候,我们有讲说这也是一个 GAN 的技术。如下图 所示我们希望有一个提取器有两个不同领域domain的图像通过特征提取器以后没有办法分辨出它来自哪一个领域。其实第一人称视角和第三人称视角模仿学习用的技术其实也是一样的希望学习一个特征提取器机器在第三人称的时候跟它在第一人称的时候看到的视野其实是一样的就是把最重要的东西抽出来就好了。
![](img/11.14.png) ![](img/11.14.png ':size=550')
## 序列生成和聊天机器人 ## 序列生成和聊天机器人
在讲序列生成对抗网络sequence GAN的时候我们有讲过句子生成sentence generation跟聊天机器人。那其实句子生成或聊天机器人 也可以想成是模仿学习。 在讲序列生成对抗网络sequence GAN的时候我们有讲过句子生成sentence generation跟聊天机器人。那其实句子生成或聊天机器人 也可以想成是模仿学习。
@@ -90,7 +90,7 @@
如果我们单纯用最大似然maximum likelihood这个技术来最大化会得到似然likelihood这个其实就是行为克隆。行为克隆就是看到一个状态接下来预测我们会得到什么样的动作有一个标准答案ground truth告诉机器说什么样的动作是最好的。在做似然的时候也是一样给定句子已经产生的部分。接下来机器要预测说接下来要写哪一个字才是最好的。所以其实最大似然在做序列生成sequence generation的时候它对应到模仿学习里面就是行为克隆。只有最大似然是不够的我们想要用序列生成对抗网络。其实序列生成对抗网络就是对应到逆强化学习逆强化学习就是一种 GAN 的技术。你把逆强化学习的技术放在句子生成,放到聊天机器人里面,其实就是序列生成对抗网络跟它的种种的变形。 如果我们单纯用最大似然maximum likelihood这个技术来最大化会得到似然likelihood这个其实就是行为克隆。行为克隆就是看到一个状态接下来预测我们会得到什么样的动作有一个标准答案ground truth告诉机器说什么样的动作是最好的。在做似然的时候也是一样给定句子已经产生的部分。接下来机器要预测说接下来要写哪一个字才是最好的。所以其实最大似然在做序列生成sequence generation的时候它对应到模仿学习里面就是行为克隆。只有最大似然是不够的我们想要用序列生成对抗网络。其实序列生成对抗网络就是对应到逆强化学习逆强化学习就是一种 GAN 的技术。你把逆强化学习的技术放在句子生成,放到聊天机器人里面,其实就是序列生成对抗网络跟它的种种的变形。
![](img/11.15.png) ![](img/11.15.png ':size=550')
## References ## References