chatgpt app(ChatGPT强化学习大杀器——近端策略优化(PPO))
ChatGPT强化学习大杀器——近端策略优化(PPO)
近端策略优化(Proximal Policy Optimization)来自 Proximal Policy Optimization Algorithms(Schulman et. al., 2017)这篇论文 ,是当前最先进的强化学习 (RL) 算法 。这种优雅的算法可以用于各种任务 ,并且已经在很多项目中得到了应用 ,最近火爆的ChatGPT就采用了该算法 。
网上讲解ChatGPT算法和训练流程的文章很多 ,但很少有人深入地将其中关键的近端策略优化算法讲清楚 ,本文我会重点讲解近端策略优化算法 ,并用PyTorch从头实现一遍 。
强化学习
近端策略优化作为一个先进的强化学习算法 ,我们首先要对强化学习有个了解 。关于强化学习 ,介绍的文章很多 ,这里我不做过多介绍 ,但这里我们可以看一下ChatGPT是怎么解释的:
ChatGPT给出的解释比较通俗易懂 ,更加学术一点的说 ,强化学习的流程如下:
强化学习框架
上图中,每个时刻环境都会为代理反馈奖励 ,并监控当前状态 。有了这些信息 ,代理就会在环境中采取行动,然后新的奖励和状态等会反馈给代理 ,以此形成循环 。这个框架非常通用 ,可以应用于各种领域 。
我们的目标是创建一个可以最大化获得奖励的代理 。 通常这个最大化奖励是各时间折扣奖励的总和 。
G
=
∑
t
=
T
γ
t
r
t
G = \sum_{t=0}^T\gamma^tr_t
G=t=0∑Tγtrt 这里γ
\gamma
γ是折扣因子 ,通常在 [0.95, 0.99] 范围内 ,r
t
r_t
rt 是时间 t 的奖励 。算法
那么我们如何解决强化学习问题呢? 有多种算法 ,可以(对于马尔可夫决策过程或 MDP)分为两类:基于模型(创建环境模型)和无模型(仅给定状态学习) 。
强化学习算法分类
基于模型的算法创建环境模型并使用该模型来预测未来状态和奖励 。 该模型要么是给定的(例如棋盘) ,要么是学习的。
无模型算法直接学习如何针对训练期间遇到的状态(策略优化或 PO)采取行动 ,哪些状态-行动会产生良好的回报(Q-Learning) 。
我们今天讨论的近端策略优化算法属于 PO 算法家族 。 因此 ,我们不需要环境模型来驱动学习。PO 和 Q-Learning 算法之间的主要区别在于 PO 算法可以用于具有连续动作空间的环境(即我们的动作具有真实值)并且即使该策略是随机策略(即按概率行事)也可以找到最优策略;而 Q-Learning 算法不能做这两件事 。 这是PO 算法更受欢迎的另一个原因 。 另一方面 ,Q-Learning 算法往往更简单 、更直观且更易于训练 。
策略优化(基于梯度)
策略优化算法可以直接学习策略 。 为此 ,策略优化可以使用无梯度算法(例如遗传算法) ,也可以使用更常见的基于梯度的算法 。
通过基于梯度的方法 ,我们指的是所有尝试估计学习策略相对于累积奖励的梯度的方法 。 如果我们知道这个梯度(或它的近似值),我们可以简单地将策略的参数移向梯度的方向以最大化奖励 。
策略梯度方法通过重复估计梯度
g
:
=
∇
θ
E
[
∑
t
=
∞
r
t
]
g:=\nabla_\theta\mathbb{E}[\sum_{t=0}^{\infin}r_t]
g:=∇θE[∑t=0∞rt]来最大化预期总奖励 。策略梯度有几种不同的相关表达式 ,其形式为:g
=
E
[
∑
t
=
∞
Ψ
t
∇
θ
l
o
g
π
θ
(
a
t
∣
s
t
)
]
(1)
g=\mathbb{E}\Bigg\lbrack \sum_{t=0}^{\infin} \Psi_t \nabla_\theta log\pi_\theta(a_t \mid s_t) \Bigg\rbrack \tag{1}
g=E[t=0∑∞Ψt∇θlogπθ(at∣st)](1)其中
Ψ
t
\Psi_t
Ψt 可以是如下几个:∑
t
=
∞
r
t
\sum_{t=0}^\infin r_t
∑t=0∞rt: 轨迹的总奖励∑
t
′
=
t
∞
r
t
′
\sum_{t=t}^\infin r_{t}
∑t′=t∞rt′: 下一个动作a
t
a_t
at 的奖励∑
t
=
∞
r
t
−
b
(
s
t
)
\sum_{t=0}^\infin r_t - b(s_t)
∑t=0∞rt−b(st): 上面公式的基线版本Q
π
(
s
t
,
a
t
)
Q^\pi(s_t, a_t)
Qπ(st,at): 状态-动作价值函数A
π
(
s
t
,
a
t
)
A^\pi(s_t, a_t)
Aπ(st,at): 优势函数r
t
+
V
π
(
s
t
+
1
)
+
V
π
(
s
t
)
r_t+V^\pi(s_{t+1})+V^\pi(s_{t})
rt+Vπ(st+1)+Vπ(st): TD残差后面3个公式的具体定义如下:
V
π
(
s
t
)
:
=
E
s
t
+
1
:
∞
,
a
t
:
∞
[
∑
l
=
∞
r
t
+
l
]
Q
π
(
s
t
,
a
t
)
:
=
E
s
t
+
1
:
∞
,
a
t
+
1
:
∞
[
∑
l
=
∞
r
t
+
l
]
(2)
V^\pi(s_t) := \mathbb{E}_{s_{t+1:\infin}, a_{t:\infin}}\Bigg\lbrack\sum_{l=0}^\infin r_{t+l} \Bigg\rbrack \\ Q^\pi(s_t, a_t) := \mathbb{E}_{s_{t+1:\infin}, a_{t+1:\infin}}\Bigg\lbrack\sum_{l=0}^\infin r_{t+l} \Bigg\rbrack \tag{2}
Vπ(st):=Est+1:∞,at:∞[l=0∑∞rt+l]Qπ(st,at):=Est+1:∞,at+1:∞[l=0∑∞rt+l](2)A
π
(
s
t
,
a
t
)
:
=
Q
π
(
s
t
,
a
t
)
−
V
π
(
s
t
)
(3)
A^\pi(s_t, a_t) := Q^\pi(s_t, a_t) - V^\pi(s_t) \tag{3}
Aπ(st,at):=Qπ(st,at)−Vπ(st)(3)请注意 ,有多种方法可以估计梯度 。 在这里,我们列出了 6 个不同的值:总奖励 、后继动作的奖励 、减去基线版本的奖励 、状态-动作价值函数 、优势函数(在原始 PPO 论文中使用)和时间差 (TD) 残差 。我们可以选择这些值作为我们的最大化目标 。 原则上 ,它们都提供了我们所关注的真实梯度的估计 。
近端策略优化
近端策略优化简称PPO ,是一种(无模型)基于策略优化梯度的算法。 该算法旨在学习一种策略 ,可以根据训练期间的经验最大化获得的累积奖励 。
它由一个参与者(actor)
π
θ
(
.
∣
s
t
)
\pi\theta(. \mid st)
πθ(.∣st) 和一个评估者(critic)V
(
s
t
)
V(st)
V(st)组成 。前者在时间t
t
t 处输出下一个动作的概率分布 ,后者估计该状态的预期累积奖励(标量)。 由于 actor 和 critic 都将状态作为输入 ,因此可以在提取高级特征的两个网络之间共享骨干架构 。PPO 旨在使策略选择具有更高“优势 ”的行动 ,即具有比评估者预测的高得多的累积奖励 。 同时 ,我们也不希望一次更新策略太多 ,这样很可能会出现优化问题 。 最后 ,如果策略具有高熵 ,我们会倾向于给与额外奖励 ,以激励更多探索 。
总损失函数由三项组成:CLIP项 、价值函数 (VF) 项和熵奖励项 。最终目标如下:
L
t
C
L
I
P
+
V
F
+
S
(
θ
)
=
E
^
t
[
L
t
C
L
I
P
(
θ
)
−
c
1
L
t
V
F
(
θ
)
+
c
2
S
[
π
θ
]
(
s
t
)
]
L_t^{CLIP+VF+S}(\theta) = \hat{\mathbb{E}}_t \Big\lbrack L_t^{CLIP}(\theta) - c_1L_t^{VF}(\theta)+c_2S[\pi_\theta](s_t)\Big\rbrack
LtCLIP+VF+S(θ)=Et[LtCLIP(θ)−c1LtVF(θ)+c2S[πθ](st)] 其中c
1
c_1
c1 和c
2
c_2
c2 是超参 ,分别衡量策略评估(critic)和探索(exploration)准确性的重要性 。CLIP项
正如我们所说,损失函数激发行为概率最大化(或最小化) ,从而导致行为正面优势(或负面优势)
L
C
L
I
P
(
θ
)
=
E
^
t
[
m
i
n
(
r
t
(
θ
)
A
t
^
,
c
l
i
p
(
r
t
(
θ
)
,
1
−
ϵ
,
1
+
ϵ
)
A
^
t
)
]
L^{CLIP}(\theta) = \hat{\mathbb{E}}_t\Big\lbrack min \Big\lparen r_t(\theta)\hat{A_t},clip \big\lparen r_t(\theta),1-\epsilon, 1+\epsilon\big\rparen \hat{A}_t \Big\rparen \Big\rbrack
LCLIP(θ)=Et[min(rt(θ)At,clip(rt(θ),1−ϵ,1+ϵ)At)]其中:
r
t
(
θ
)
=
π
θ
(
a
t
∣
s
t
)
π
θ
o
l
d
(
a
t
∣
s
t
)
r_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta_{old}}(a_t \mid s_t)}
rt(θ)=πθold(at∣st)πθ(at∣st) 是衡量我们现在(更新后的策略)相对于之前执行该先前操作的可能性的比率 。 原则上 ,我们不希望这个系数太大,因为太大意味着策略突然改变 。这就是为什么我们采用其最小值和[
1
−
ϵ
,
1
+
ϵ
]
[1-\epsilon, 1+\epsilon]
[1−创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!