引入
给一张动物的图片,分辨是什么动物。这个问题可以用 CNN 解决(HW3)。核心是通过有标注(label)的图片进行学习。
而在下围棋时,如何落子是一个难以标注的问题,但是机器可以学到什么是好的,什么是不好的。这就是强化学习的适用场景。
结构
总的目标是想找一个 Actor(或称 policy),环境(environment)会给 actor 一个输入(成为 observation),actor 会有对应的输出,成为 action。对于 action 而言,环境会有一个给定的 reward。最终的目标就是要最大化总的 reward(total reward 也叫 return)
以这个游戏为例,每次可以向左/向右/开火,想让最后的分数最大。
在前面的部分,我们知道深度学习有三个大步骤:设一个未知函数、定义损失值 loss、利用梯度下降等方法求出函数中的参数(Optimization)。
考虑把这些步骤移动到强化学习中。
1. 构建未知函数
比如,当看到一张游戏图片,可以构建一个 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。
由于 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}\))
如图,只需要把输出的 loss 定义为 cross entropy,那么想要最小化 loss 只需要让 distribution 的最大值更接近我想做的事。
同理,如果我不想让 actor 做,只需要让 loss 变成负的 cross entropy。
这里,cross entropy 的前面的系数相当于是 ±1,可以拓展成一个系数 \(A\),代表我多想/不想让模型做某个决策
如,\(A_N=-10\),说明我非常不想让机器在看到 \(s_N\) 的时候做 \(\hat{a}^N\) 的决策。
简单来说,\(A_i\) 就是我有多希望模型执行决策 \(\{s_i, a_i\}\)
actor 设计 - ver.0
直接把某一个决策的系数设为当前决策的 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\)
注意一下,一个 episode 的定义是 trajectory,是很多个 \(\{s_i,a_i\}\) 合起来
ver.3
引入“相对”的概念,对 reward 做标准化处理。
也就是说,虽然可能所有的 reward \(r_i\) 都大于 0,但是也会有相对好和相对差的决策。我们可以选取一个 baseline,做标准化。
至于 baseline 如何选取,就是后面的 ver
policy gradient 的流程
一个需要注意的地方:收集资料的过程是在循环过程中的。也就是说,每一次更新都需要重新收集数据。
重新收集数据是因为,我们希望被训练的 actor,和与环境互动(收集数据)的 actor 是相同的。
这样的 actor 叫做 on-policy。
而 \(\theta^i\) 的训练在 \(\theta^{i-1}\) 的数据的基础上,叫做 off-policy。这样就能优化时间。一个经典的 off-policy 叫做 PPO。