0%

强化学习PG系列小结-1-PG

本文作为李宏毅老师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

我们可以这样定义我们的任务:我们希望训练一组参数 , 使得 actor 依据策略 选取行动时产生的回报最大,即

其中 表示 actor 在遵循 进行行动时,能够得到的期望收益,即

其中 表示在当前策略下所有 episode 出现的概率分布。但是显然我们没有办法得到这个概率分布,我们只能进行若干次sampling来对这个分布进行近似,即

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

一个有意思的问题是,在传统的分类问题中,我们可以使用交叉熵来优化目标函数

求梯度后

事实上,如果我们考虑 就是我们的目标 R(τ) , 就是当前选取动作 的概率 ,那么我们可以认为,在同一 actor 进行采样时,任务其实就可以被认为是一个简单的分类任务,我们可以直接在上面进行学习。

Algorithm: REINFORCE

但是不难发现,当 θ 发生变化之后, 之前的数据就不能再用了,因为之前采的样不能再近似当前 采样结果的分布了。所以目前来说,我们需要采样一轮,然后将其当成一个分类任务训练一次,然后再采样,再训练。这也就是 policy gradient 最基础的算法 REINFORCE 的训练流程。

这是一个 on-policy 的算法,即数据取得后只能进行一轮训练就要丢弃,这无疑是非常浪费的,在后面的章节中,会介绍如何解决这一问题。