欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

强化学习笔记:Policy-based Approach

发布时间:2025/4/5 编程问答 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 强化学习笔记:Policy-based Approach 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

主要内容来自李宏毅老师的视频:【李宏毅】2020 最新课程 (完整版) 强化学习 - 71.作業十五 ML Lecture 23-1 - Deep Re_哔哩哔哩_bilibili

1 强化学习概念复习

 2 像深度学习一样分析强化学习

2.1 深度学习三部曲

这是李宏毅教授之前在介绍深度学习的时候说提到的三部曲。

step1相当于是深度学习model,step2相当于是损失函数,step3相当于梯度下降等参数更新方法 

2.2 强化学习的“step1”

我们以一款类似于“雷霆战机”的游戏为例

输入是当前的游戏界面(被表示成一个向量或者一个矩阵)

输出是我们执行每个动作的概率

2.3 强化学习的“step 2”

给定agent看到的状态s,模型的参数θ,agent会做出一系列的决策

 

但是,就像2.2中说的那样,我们模型返回的是选择不同action的概率,所以即便是一个agent,选择的action组成的路径也很有可能是不同的

 所以我们认为Rθ的平均值是我们的衡量标准

某个轨迹出现的概率,这个的总奖励。 对所有的按照出现的概率进行加权求和,这个就是平均的reward。

我们还可以写成上式那样,从这个分布采样一个轨迹 ,然后计算R(τ) 的期望值,就是你的期望的奖励。 我们要做的事情就是最大化期望奖励。 

 对于一个agent,“玩一遍游戏”过程中的status、action、reward,连起来就是轨迹

 如果我们选择一个agent去“玩游戏”,那么每一种轨迹都有可能会被采样到,只不过是概率问题。

 

而某一条轨迹出现的概率是:

 这个概率取决于两部分:环境的行为和 agent 的行为

 

2.4 强化学习的“step 3”

同样地,也是使用梯度下降(但这里我们希望R是越大越好,所以是梯度上升)

 

R(τ) 这个奖励函数不需要是可微分的(differentiable),这个不影响我们解接下来的问题。

举例来说,如果是在 GAN 里面,R(τ) 其实是一个 discriminator,它就算是没有办法微分,也无所谓,你还是可以做接下来的运算。

最右边的一项(分式)就是logP的微分

这个在2.3中讲过,我们通过采样N次来近似这个求和操作

 注意这里是整个路径的R,也就是说这里的的计算不涉及的微分。所以哪怕不可微也可以 

那么,怎么算呢?

我们假设路径为

那么我们有:

两个黄颜色的式子,是由environment决定的,只有红颜色的一个是由agent决定

取log,我们有:

  

 对于梯度下降,我们有:

 

 

 

我们可以直观地来理解上面这个式子,也就是在你采样到的数据里面, 你采样到在某一个状态 st​ 要执行某一个动作at​, 这个 st​ 跟 at​ 它是在整个轨迹τ 的里面的某一个状态和动作的对。

  • 假设你在 st​ 执行at​,最后发现τ 的奖励是正的, 那你就要增加这一项的概率,你就要增加在 st​ 执行 at​ 的概率。
  • 反之,在 st​ 执行at​ 会导致τ 的奖励变成负的, 你就要减少这一项的概率。

 3 基于策略的强化学习

 

 类似于SGD,每一我跑一些agent,然后用这些agent的结果(s,a的pair)更新模型。再用更新的模型跑另外的一些agent,再更新模型。。。。如此迭代

一般 policy gradient(PG) 采样的数据就只会用一次。你把这些数据采样起来,然后拿去更新参数,这些数据就丢掉了。接着再重新采样数据,才能够去更新参数

 

 这里用一种方式解释了为什么前面我们梯度下降的时候需要加log

我们把强化学习看成一个分类问题,那么我们的损失函数就是交叉熵。(最小化交叉熵就是最大化对数似然)

上图是一个分类问题的示意图,假设我们最终希望是执行“left”选项,那么在分类问题中,就是这一个的item为1,其他的为0。

 

 对于梯度下降的式子,我们不妨这么看:先遮去R

那么这就是一个分类问题

 

 现在我们是强化学习问题,有了一个reward在里面。

我们假设路径1的reward为2,路径2的reward为1

那么可以想象成,选择left的结果,我们会看到两次;选择fire的结果,我们会看到一次

所以大体框架和分类差不多,只不过加了一个权重罢了

 4 几个tips

4.1 加一个baseline

         第一个 tip 是 add 一个 baseline。 如果给定状态 s 采取动作 a 会给你整场游戏正的奖励,就要增加它的概率。如果状态 s 执行动作 a,整场游戏得到负的奖励,就要减少这一项的概率。

         但在很多游戏里面,奖励总是正的,就是说最低都是 0。比如说打乒乓球游戏, 你的分数就是介于 0 到 21 分之间,所以 R 总是正的。假设你直接套用这个式子, 在训练的时候告诉模型说,不管是什么动作你都应该要把它的概率提升。

         在理想上,这么做并不一定会有问题。因为虽然说 R 总是正的,但它正的量总是有大有小,你在玩乒乓球那个游戏里面,得到的奖励总是正的,但它是介于 0~21分之间,有时候你采取某些动作可能是得到 0 分,采取某些动作可能是得到 20 分。

        假设你在某一个状态有 3 个动作 a/b/c可以执行。根据下式,

        

        

        我们要把这 3 项的概率,对数概率都拉高。

         但是它们前面权重的 R 是不一样的。 R 是有大有小的,权重小的,它上升的就少,权重多的,它上升的就大一点。

         因为这个对数概率是一个概率,所以动作 a、b、c 的对数概率的和要是 0。 所以上升少的,在做完归一化(normalize)以后, 它其实就是下降的,上升的多的,才会上升。

        这是一个理想上的状况,我们做采样理论上是希望求出 对所有可能的 s 跟 a 的pair 进行求和。 

        实际上,我们真正在训练的时候不可能是这么做的,只是采样了少量的 s 跟 a 的pair而已。

        因为我们做的是采样,有一些动作可能从来都没有采样到。在某一个状态,虽然可以执行的动作有 a/b/c,但你可能只采样到动作 b,你可能只采样到动作 c,你没有采样到动作 a。

        但现在所有动作的奖励都是正的,所以根据这个式子,它的每一项的概率都应该要上升。

        会遇到的问题是,因为 a 没有被采样到,其它动作的概率如果都要上升,a 的概率就下降。 

        所以 a 不一定是一个不好的动作, 它只是没被采样到。但只是因为它没被采样到, 它的概率就会下降,这个显然是有问题的。

        

        要怎么解决这个问题呢?你会希望你的奖励不要总是正的。

         为了解决奖励总是正的这个问题,你可以把奖励减掉一项叫做 b,这项 b 叫做 baseline。你减掉这项 b 以后,就可以让 这一项有正有负。

        所以如果得到的总奖励 大于 b 的话,就让它的概率上升。如果这个总奖励小于 b,就算它是正的,也是不好的,你就要让这一项的概率下降。

 4.2 给每一个动作合适的分数(credit)

        我们原来会做的事情是,在某一个状态,假设你执行了某一个动作 a,它得到的奖励,它前面乘上的这一项。

        这件事情显然是不公平的,因为在同一场游戏里面 也许有些动作是好的,有些动作是不好的。 假设整场游戏的结果是好的, 并不代表这个游戏里面每一个行为都是对的。若是整场游戏结果不好, 但不代表游戏里面的所有行为都是错的。

        所以我们希望可以给每一个不同的动作前面都乘上不同的权重。每一个动作的不同权重, 它反映了每一个动作到底是好还是不好。

         举个例子, 假设这个游戏都很短,只有 3~4 个互动。

        在 sa​ 执行a1​ 得到 5 分。在sb​ 执行 a2​ 得到 0 分。在 sc​ 执行 a3​ 得到 -2 分。 整场游戏下来,你得到 +3 分。

        那你得到 +3 分 代表在 sb​ 执行动作 a2​ 是好的吗?

        并不见得代表 sb​ 执行 a2​ 是好的。因为这个正的分数,主要来自于在 sa​ 执行了 a1​,跟在 sb​ 执行 a2​ 是没有关系的,也许在 sb​ 执行 a2​ 反而是不好的, 因为它导致你接下来会进入 sc​,执行 a3​ 被扣分,所以整场游戏得到的结果是好的, 并不代表每一个行为都是对的。

        

         如果按照我们刚才的讲法,整场游戏得到的分数是 3 分,那到时候在训练的时候, 每一个状态跟动作的对,都会被乘上 +3。

        在理想的状况下,这个问题,如果你采样够多就可以被解决。因为假设你采样够多,在 sb​ 执行 a2​ 的这件事情,被采样到很多。

        就某一场游戏,在 sb​ 执行 a2​,你会得到 +3 分。 但在另外一场游戏,在 sb​ 执行 a2​,你却得到了 -7 分。

        

        为什么会得到 -7 分呢? 因为在 sb​ 执行 a2​ 之前, 你在 sa​ 执行 a2​ 得到 -5 分,-5 分这件事可能也不是在 sb​ 执行 a2​ 的错,这两件事情,可能是没有关系的,因为它先发生了,这件事才发生,所以它们是没有关系的。

         假设我们今天采样到这项的次数够多,把所有发生这件事情的情况的分数通通都集合起来, 那可能不是一个问题。

        但现在的问题就是,我们采样的次数是不够多的。在采样的次数不够多的情况下,你要给每一个状态跟动作对合理的分数,你要让大家知道它合理的贡献。

        怎么给它一个合理的贡献呢?

        一个做法是计算这个对的奖励的时候,不把整场游戏得到的奖励全部加起来,只计算从这一个动作执行以后所得到的奖励

        因为这场游戏在执行这个动作之前发生的事情是跟执行这个动作是没有关系的, 所以在执行这个动作之前得到多少奖励都不能算是这个动作的功劳。

        跟这个动作有关的东西, 只有在执行这个动作以后发生的所有的奖励把它加起来,才是这个动作真正的贡献。

        所以在这个例子里面,在 sb​ 执行a2​ 这件事情,也许它真正会导致你得到的分数应该是 -2 分而不是 +3 分,因为前面的 +5 分 并不是执行 a2​ 的功劳。

        实际上执行 a2​ 以后,到游戏结束前, 你只有被扣 2 分而已,所以它应该是 -2。

        那一样的道理,今天执行 a2​ 实际上不应该是扣 7 分,因为前面扣 5 分,跟在 sb​ 执行 a2​ 是没有关系的。

         在 sb​ 执行 a2​,只会让你被扣两分而已,所以也许在 sb​ 执行 a2​, 你真正会导致的结果只有扣两分而已。

如果要把它写成式子的话是什么样子呢?如下式所示:

 本来的权重是整场游戏的奖励的总和,现在改成从某个时间 t开始,假设这个动作是在 t 这个时间点所执行的,从 t这个时间点一直到游戏结束所有奖励的总和,才真的代表这个动作是好的还是不好的。

4.2.1 折扣回报

         接下来再更进一步,我们把未来的奖励做一个折扣(discount),由此得到的回报被称为 Discounted Return(折扣回报)

        为什么要把未来的奖励做一个折扣呢?

        因为虽然在某一个时间点,执行某一个动作,会影响接下来所有的结果,有可能在某一个时间点执行的动作,接下来得到的奖励都是这个动作的功劳。

        但在比较真实的情况下, 如果时间拖得越长,影响力就越小。

         比如说在第二个时间点执行某一个动作, 那我在第三个时间点得到的奖励可能是在第二个时间点执行某个动作的功劳,但是在 100 个时间点之后又得到奖励,那可能就不是在第二个时间点执行某一个动作得到的功劳。

        所以我们实际上在做的时候,你会在 R 前面乘上一个 discount factor γ, γ∈[0,1] ,一般会设个 0.9 或 0.99。 

     

  • γ=0 : 只关心即时奖励;
  • γ=1 : 未来奖励等同于即时奖励。

         举一个例子, 这是游戏的第 1、2、3、4 回合,假设你在游戏的第二回合的某一个st​ 执行at​ 得到 +1 分,在​ 执行得到 +3 分,在执行得到 -5 分,然后第二回合结束。at​ 的分数应该是:

总结

以上是生活随笔为你收集整理的强化学习笔记:Policy-based Approach的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。