李宏毅《机器学习》总结 - RL

引入

给一张动物的图片,分辨是什么动物。这个问题可以用 CNN 解决(HW3)。核心是通过有标注(label)的图片进行学习。
而在下围棋时,如何落子是一个难以标注的问题,但是机器可以学到什么是好的,什么是不好的。这就是强化学习的适用场景。

结构

总的目标是想找一个 Actor(或称 policy),环境(environment)会给 actor 一个输入(成为 observation),actor 会有对应的输出,成为 action。对于 action 而言,环境会有一个给定的 reward。最终的目标就是要最大化总的 reward(total reward 也叫 return)
image
以这个游戏为例,每次可以向左/向右/开火,想让最后的分数最大。
image

在前面的部分,我们知道深度学习有三个大步骤:设一个未知函数、定义损失值 loss、利用梯度下降等方法求出函数中的参数(Optimization)。
考虑把这些步骤移动到强化学习中。

1. 构建未知函数

image
比如,当看到一张游戏图片,可以构建一个 network,也就是 actor,希望输出的是决策的 distribution。发现这实质上就是一个分类任务。
注意一下,这里的最终决策最好不要用直接 argmax,而是利用这个 distribution 来抽样(sample),抽到的就是当前决策。有两个原因:1. 为游戏添加随机性。2. 让机器看到不同的决策,防止只看一种决策导致机器只会输出这种决策。(exploration)

2. 定义损失 loss

在游戏过程中,会有很多种决策。每个决策都会产生 reward(如击杀怪物,reward 增加,移动时 reward 不变)。
一局游戏从开始到结束之间,会有很多个决策。叫做一个 episode。
我们想要最大化一个 episode 的 total reward。\(R=\sum_{t=1}^Tr_t\) 因为要最大化,因此可以把 loss 设为负的 \(R\),这样就只需要让 loss 越小越好。

3. Optimization

游戏进行过程中,会有很多决策。这个过程可以看成环境给 actor 一个输入(\(s_i\)),actor 根据这个输入做出相应的反应(\(a_i\)),这个反应也会反作用于环境中。同时,每个反应还会产生 reward \(r_i\)(如干掉敌人),把每个时刻的 reward 加起来就是我们要最大化的东西。
其中,\(\tau=\{s_1,a_1,s_2,a_2\cdots \}\) 称为训练过程的 trajectory。
image
由于 actor 是一个普通的 network,这个结构似乎与 RNN 很像,能不能直接用深度学习解?
是不能的,有几个原因:1. actor 的决策是 sample 出来的,有随机性。2. 环境和 reward 实际上是“黑盒子”,我们实际不了解其构造,从而无法求出梯度。3. 环境和 reward 也存在随机性。
在某种意义上,这和 GAN 有点像。把 actor 看成 generator,把 环境和 reward 看成 discriminator。actor 想要通过训练来使得 loss 最小。
这种问题,只能使用 RL 来解。
此外,RL 的随机性也很大。因为 actor 环境和 reward 都会有随机性。

RL 常见算法 - policy gradient

如何控制 actor?

也就是说,如何控制 actor,使得当输入为 \(s_1\) 的时候,我希望 actor 的输出是/不是做xx事呢?(我们把xx事叫做 ground truth,记作\(\hat{a}\)
image
如图,只需要把输出的 loss 定义为 cross entropy,那么想要最小化 loss 只需要让 distribution 的最大值更接近我想做的事。
同理,如果我不想让 actor 做,只需要让 loss 变成负的 cross entropy。
这里,cross entropy 的前面的系数相当于是 ±1,可以拓展成一个系数 \(A\),代表我多想/不想让模型做某个决策
image
如,\(A_N=-10\),说明我非常不想让机器在看到 \(s_N\) 的时候做 \(\hat{a}^N\) 的决策。
简单来说,\(A_i\) 就是我有多希望模型执行决策 \(\{s_i, a_i\}\),衡量有多“好”的一个分数。

actor 设计 - ver.0

image

直接把某一个决策的系数设为当前决策的 reward。
这样的缺点是比较短视。一个决策没有关注到其对后面的影响。
另外,也存在 reward delay 的情况,即需要牺牲短期的利益获取长期的。

ver.1

使用 cumulated reward。
\(A_1=G_1=r_1+r_2+\cdots\)
\(A_2=G_2=r_2+r_3+\cdots\)
缺点:当 \(n\) 很大的时候,把 \(r_n\) 的 reward 归功于 \(a_1\) 似乎不合理。因此有了 ver.2

ver.2

使用 discount 的 cumulated reward。
引入系数 \(\gamma\),代表当前决策对后续 reward 的影响程度会越来越低。
\(A_1=G_1'=r_1+\gamma r_2+\gamma^2 r_3+\cdots\)
\(A_2=G_2'=r_2+\gamma r_3+\gamma^2 r_4+\cdots\)
image

注意一下,一个 episode 的定义是 trajectory,是很多个 \(\{s_i,a_i\}\) 合起来

ver.3

引入“相对”的概念,对 reward 做标准化处理。
也就是说,虽然可能所有的 reward \(r_i\) 都大于 0,但是也会有相对好和相对差的决策。我们可以选取一个 baseline,做标准化。
image
至于 baseline 如何选取,就是后面的 ver

policy gradient 的流程

image
实际上,policy gradient 可以看成低配版 actor-critic,但是其中 critic 的训练方法是用 Monte-Carlo 来训练的,需要更新多次完整的 trajectory 来计算 \(A\)(这里是确定性的 reward 函数,而用 TD 等方法训练的 \(V^{\theta}(s)\) 不是实际的,而是估测的期望值)
一个需要注意的地方:收集资料的过程是在循环过程中的。也就是说,每一次更新都需要重新收集数据。
image
重新收集数据是因为,我们希望被训练的 actor,和与环境互动(收集数据)的 actor 是相同的。
这样的 actor 叫做 on-policy。
\(\theta^i\) 的训练在 \(\theta^{i-1}\) 的数据的基础上,叫做 off-policy。这样就能优化时间。一个经典的 off-policy 叫做 PPO。

Critic

Critic 能估测某个 actor 在当前状态为 \(s\) 时到游戏结束时的期望得分。以一种 Critic 为例(\(V^{\theta}(s)\)
\(V^{\theta}(s)\):给定 actor,其中参数为 \(\theta\)。当前的状态为 \(s\),则从当前状态 \(s\) 到游戏结束时,使用当前 actor(\(\theta\))的期望得分为 \(V\)
实际上这与 A* 的估价函数(heuristic function)有点像,都是“猜”

如何估计 \(V^{\theta}(s)\)

  1. Monte-Carlo(MC)
    当看到某个画面 \(s_a\) 时,重复玩很多次游戏(很多个 episode),每次都可以看到 \(s_a\)。把每次游戏的 cumulated reward 平均一下就得到了估测的 reward(\(G_a'\)))
    image
    \(G_a'\)\(G_b'\) 训练一下 \(V^{\theta}\) 即可

  2. Temporal-difference(TD)
    image
    忽略期望值,则 \(V(s_t)\)\(V(s_{t+1})\) 之间有关系。利用这个关系训练即可。

ver.3.5

在 ver.3 中,通过减去 baseline 来对 \(A_i\) 的分数做标准化。baseline 如何选取呢?此时我们选择 \(baseline_t=V^{\theta}(s_t)\)
即在看到 \(\{s_t,a_t\}\) 之后对 \(a_t\) 这个决策的好的分数为 \(A_t=G_t'-V^{\theta}(s_t)\)
下图中,看到 \(s_t\) 之后,训练好的 \(V\) 能求出这个状态之后期望能获得的分数。(此图用的是蒙特卡洛法)
image
而在 \(s_t\) 之后使用 \(a_t\) 的决策直到游戏结束,reward 的分数为 \(G_t'\)
如果 \(G_t'\)\(V\) 大,说明采取 \(a_t\) 的决策之后比平均分数高。
但是这样又出现问题:\(a_t\) 之后的决策也是随机的,可能我们 sample 出来的游戏结果不具有代表性。这就引出 ver.4

ver.4

我们考虑到,当 \(s_t\) 采取 \(a_t\) 决策之后得到 \(s_{t+1}\)。我们训练的 \(V\) 也可以对 \(s_{t+1}\) 的状态的分数进行估测。
因此修正 \(A_t=r_t+V^{\theta}(s_{t+1})-V^{\theta}(s_t)\)
image
这样,我们就排除了 \(a_t\) 之后随机决策带来的干扰。

这个方法叫做 Advantage Actor-Critic

一个 Actor 和 Critic 的训练技巧

以游戏画面为例,actor 和 critic 可能都需要处理游戏画面,因此可以共用一个 CNN 网络
image

特殊的,如果不用 actor,而是直接根据 critic (scalar)得到 action,这就是 Q-learning(DQN)

Reward shaping

如下围棋,只有最后结束的时候才会给赢了/输了的 reward,也就是说 reward 是非常稀疏的。我们可以人为的设定一些额外的 reward 来有利于训练。
此外,还有一种 curiosity based 的方法。机器如果看到有意义的新的环境,会获得 reward。有意义是为了防止 noise 的干扰。

无 reward 的条件下的 RL

是否可以人为设定 extra reward 呢?容易出现人类没有考虑到的逻辑。
考虑模仿学习(Imitation Learning)
先通过人类示范一下应该怎么做,即先求出 trajectory 的集合。利用这个集合去训练 actor。
这里,我们认为人类的行为就是最好的(expert)
image
这样为什么不能直接 supervised learning 呢(\(\tau=\{s_1, \hat{a}_1\, \cdots\}\))?这样就叫做行为克隆。1. 因为可能会出现机器没有学到的情况。如 self-driving,如果学习资料中没有撞墙的例子,机器就不会学到撞墙的时候该如何做。2. 有一些人类的行为是不需要完全模仿的。

Inverse RL

大致思想是让机器自己决定 reward,而决定的标准就是 expert 的输入的 reward 一定是最高的。(而不是简单的模仿)
image

我们需要自己训练一个 reward function,使得它对于某个环境而言,能给 expert 产生的决策高分,给机器产生的决策低分。
有点像 GAN?把产生决策的机器看成 generator,把 reward function 看成 discriminator。
image


实际上,IRL 一开始是为了给专家数据制定某一个 reward,因为简单的行为克隆(BC)会出现各种问题,如复合误差(compounding error),即在某一个时刻由于没和专家数据集“对上”,学习模型就会随机一个策略,从而越差越大。
IRL 赋予了专家数据“原因”,即为什么要这样走。具体来说,根据专家数据“反推”出 reward function,再通过 reward function 进行正向的强化学习(这也是为什么 IRL 叫做逆向强化学习)。
GAIL 是 IRL 的一种,通过和 GAN 相似的想法,通过 discriminator 来分辨是来自 expert 还是 learning,而 learning 就要想办法骗过 discriminator。reward 函数就可以设置成 discriminator 对当前数据的分辨。和 GAN 公式类似。image
接着,根据新生成的 reward 函数进行正向 RL。

posted @ 2024-02-22 14:44  SkyRainWind  阅读(81)  评论(0编辑  收藏  举报