0Pricing
Learn AI with Python · 课时

策略梯度方法:REINFORCE

策略梯度定理、REINFORCE 算法、基线减法和方差降低。

策略梯度方法:REINFORCE 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。

基于价值与基于 Policy 的 RL

一些 RL 方法会学习动作的价值,然后采取贪心行动。策略梯度方法则直接学习策略本身:一个输出动作概率的函数。这种方法能够自然地处理连续动作和随机策略。

策略 pi(a|s)

参数化策略 pi(a|s, theta) 将状态映射为动作上的概率分布,其参数为 theta(一个神经网络)。训练会调整 theta,使能够获得更多奖励的动作更受偏好。

class Policy(nn.Module):
    def __init__(self, obs_dim, n_actions):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(obs_dim, 128), nn.ReLU(),
            nn.Linear(128, n_actions)
        )
    def forward(self, s):
        return torch.softmax(self.net(s), dim=-1)

采样动作

由于策略是一个分布,因此您需要采样动作,而不是直接选择最大值。采样可以提供探索能力,并使策略具有随机性。

probs = policy(state)
dist = torch.distributions.Categorical(probs)
action = dist.sample()
log_prob = dist.log_prob(action)

展开一条轨迹

一个回合(轨迹)是从开始到结束的一系列状态、动作和奖励。您可以在环境中持续采取行动,直到回合终止,从而收集完整轨迹。

states, actions, rewards, log_probs = [], [], [], []
state, _ = env.reset()
done = False
while not done:
    probs = policy(torch.tensor(state).float())
    dist = torch.distributions.Categorical(probs)
    a = dist.sample()
    state, r, term, trunc, _ = env.step(a.item())
    rewards.append(r); log_probs.append(dist.log_prob(a))
    done = term or trunc

折扣回报 G_t

回报 G_t 是从时间 t 开始获得的未来奖励总和,并通过 gamma 进行折扣,使较近的奖励具有更高权重。它告诉我们从第 t 步开始所采取的动作最终表现得有多好。

def returns(rewards, gamma=0.99):
    G, out = 0, []
    for r in reversed(rewards):
        G = r + gamma * G
        out.insert(0, G)
    return torch.tensor(out)

REINFORCE 目标

REINFORCE 会对期望回报执行梯度上升。直观地说:提高带来高回报的动作的概率,降低带来低回报的动作的概率。每个动作都由 G_t 加权。

策略梯度

损失是 -sum(log_prob * G_t)。负号会将梯度上升转为梯度下降,使优化器最大化回报。高回报动作的对数概率会被推高。

G = returns(rewards)
loss = -torch.sum(torch.stack(log_probs) * G)

更新策略

按通常方式进行反向传播并执行 step。一次更新使用整条轨迹,然后丢弃它(REINFORCE 是同策略方法:只能使用当前策略生成的数据)。

optimizer.zero_grad()
loss.backward()
optimizer.step()

高方差问题

原始 REINFORCE 以不稳定和高方差著称:不同回合之间的回报差异非常大,因此梯度估计噪声很大,学习过程缓慢且反复波动。

用于降低方差的基线

从 G_t 中减去一个基线(例如平均回报)可以降低方差,同时不会给梯度引入偏差。我们奖励的是表现优于预期的动作,而不只是带来正回报的动作。

baseline = G.mean()
advantage = G - baseline
loss = -torch.sum(torch.stack(log_probs) * advantage)

REINFORCE 的重要性

REINFORCE 是所有策略梯度方法的基础。它的缺点——高方差和样本利用率低——促使人们提出了接下来将学习的演员-评论家和 PPO 方法。

快速检查

请测试您对策略梯度的理解。

回顾:REINFORCE

您学会了如何将策略参数化为 pi(a|s,theta),展开轨迹,计算折扣回报 G_t,并使用损失 -sum(log_prob * G_t) 执行梯度上升。您还了解了 REINFORCE 的高方差问题,以及基线如何降低方差。

常见问题解答

「策略梯度方法:REINFORCE」课时是免费的吗?

是的 — 「策略梯度方法:REINFORCE」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。

「策略梯度方法:REINFORCE」这节课中我会学到什么?

策略梯度定理、REINFORCE 算法、基线减法和方差降低。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn AI with Python 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「策略梯度方法:REINFORCE」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn AI with Python 课中编写并运行代码吗?

能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 策略梯度方法:REINFORCE
  2. Actor-Critic 方法(A2C)
  3. 近端策略优化(PPO)
  4. 自定义 Gymnasium 环境
← 返回 Learn AI with Python