本文作为李宏毅老师2020年春季强化学习课程的笔记记录,课件,本文默认读者有一定的机器学习和深度学习的背景知识。
概述
简单的讲,强化学习主要的工作就是训练一个 agent,从环境 (environment) 中获取信息 (observation),并且做出决策 (action) 来影响环境。最终的目标是得到一个决策序列,使得整个过程得到的收益 (reward) 最大。
目前强化学习方法可以分为 model based 和 model free 两种,其区别在于是否对交互环境本身具有先验信息。在这一系列教程中我们主要讨论 model free 方法,即我们认为交互环境是一个黑盒,不考虑其内部结构,只研究环境的输入输出。在 model free 方法中,比较有代表性的有基于值的 value based 方法(Q-learning)和基于策略的 policy based 方法(policy gradient)。其主要区别在于,
- value based method 本质是是训练一个 critic,只去判断状态/动作的价值,而不直接做出动作,Q-learning 的各类方法都实现了上述要求。关于 Q-learning 的介绍,可以移步笔者的另一篇文章,对主流的 Q-learning 技术进行的介绍。一些其背后原理的推导可以参见笔者的另一篇文章,介绍了 MDP,DP,MC,TD等内容。
- policy based method 本质是是训练一个 actor,只负责给出动作,但是不去考虑状态值本身的信息。
可以看到,这两种方法各有优势,但也有欠缺。因此,目前最为主流的方法都是将 Actor 和 Critic 结合起来,形成 Actor-Critic 方法,由一部分网络结构计算值,另一部分网络得到动作。本文将从 policy gradient 方法开始,逐步介绍到 AC 方法以及其一些其他变形。
Policy Gradient
我们先考虑一个最简单的例子,假设我们在玩一个打砖块的游戏,我们需要输入一副画面作为当前状态 state,并且输出一个动作 action(可能是向左走,向右走,发射,等等)。如果我们现在完全不会强化学习,我们会怎么处理这个问题呢?一个简单的想法是直接用监督学习,把 state 作为 input , 然后 action 的概率分布作为 output,然后游戏玩的好不好(比如获胜了?失败了?)作为 label ,接下来构造一个 Loss function 就能进行学习了。
那么目前最大的问题就在于我们无法得到一个确实的 label,因此强化学习在此就构造了一组 reward,用来衡量动作的好坏,从而可以获得了一个优化目标,给模型一个学习的方向。这就是强化学习的基本思想。
为了方便接下来的叙述,我们先定义一些符号,
- 状态
- 动作
- 回报
- 目前的 actor 及其参数
- actor 和环境交互产生的一个
- 某轮游戏 τ 得到的总回报
Goodness of Actor
我们可以这样定义我们的任务:我们希望训练一组参数
其中
其中
Pick the best function
在上文中,我们已经知道了该如何衡量 actor,接下来我们只要能最大化这个
实质上我们现在将问题转化成了求
考虑
即
要计算
代回,有
于是我们就得到了最基础形式的梯度。
Notes:
- 结果事实上是符合直觉的,当整个 episode 取得较好结果时,我们倾向于整个 episode 中发生的动作的概率都应该增加,反之亦然。
- 既然答案是符合直觉的,为什么不直接从直觉出发,去掉这个不明所以的 log ?原因是这个 log 实质上是对采样中同一状态下同一动作求了平均,对出现次数多的动作,对结果的贡献我们希望只计算一次。
- 需要注意的是公式中的 R(τ) 始终是整个 episode 产生的共同的 reward,而非某个单步的 reward,当若干步共同作用最终才取得成功时,前面的动作也会被认为是好的。否则可能出现认为只有吃的最后一个包子才能让人吃饱的谬论。
TIP1 : Add a baseline
一个可能存在的问题是,如果我们采样到所有的 episode 的 reward 都是正的,那么意味着,我们所有被采样的动作的概率都会被增加。因为总概率为1,那么没被采样的动作的概率就会下降。这对这些动作显然是不公平的。
因此,我们要加入一个额外的 bias 项,使得每次采样得到的 reward 的期望为 0, 这样就能够降低对未被采样的动作的干扰,即
TIP2 : Assign Suitable Credit
考虑 R(τ) 的值,最简单的想法是直接取整个 episode 的 reward 的和。如图所示,对于这两个 episode 来说,只在 a1 时候动作不同,后面动作都相同,如果我们用上述的简单的方法设计 reward,那么这个可能是不公平的,显然这个 -7 的 reward 是因为第一步才变坏的,并不是因为后面两步。如果我们有足够多的 sampling,那么这样的误差很可能被模型自己学到。但是现在我们 sampling 的很大,因此我们要设计一个更加合理的 reward 分配方式。
一个 intuition 是只有每个动作的 reward 应该只由其后面的动作决定;另一个是离得越远的动作贡献应该更小。因此可以设计一个窗口长度为
Conclusion
现在我们已经得到了 Policy gradient 一个最基本的形式,我们定义了目标函数
并得到了优化目标的梯度
其中 R(τ) 有两项优化:
我们可以通过梯度下降法来最大化目标函数
Intuition
一个有意思的问题是,在传统的分类问题中,我们可以使用交叉熵来优化目标函数
求梯度后
事实上,如果我们考虑
Algorithm: REINFORCE
但是不难发现,当 θ 发生变化之后, 之前的数据就不能再用了,因为之前采的样不能再近似当前
这是一个 on-policy 的算法,即数据取得后只能进行一轮训练就要丢弃,这无疑是非常浪费的,在后面的章节中,会介绍如何解决这一问题。