强化学习目标函数 J(θ) 梯度推导从期望到蒙特卡洛采样的 3 步数学拆解强化学习中的策略优化问题本质上是在寻找一个能够最大化长期回报的策略。当我们用参数θ表示策略π_θ时目标函数J(θ)就是期望回报的数学表达。然而这个期望涉及对所有可能轨迹的积分直接计算几乎不可能。本文将深入剖析如何将这个理论期望转化为可计算的梯度估计这是理解现代强化学习算法的关键一步。1. 目标函数的期望形式与梯度难题在强化学习中我们定义目标函数为$$ J(\theta) \mathbb{E}{\tau \sim p\theta(\tau)}[G(\tau)] $$其中τ表示从初始状态到终止状态的完整轨迹G(τ)是轨迹的折扣回报总和。策略梯度方法的核心思想是直接对这个目标函数进行梯度上升$$ \theta \leftarrow \theta \alpha \nabla_\theta J(\theta) $$关键难点在于p_θ(τ)依赖于策略参数θ而期望又对所有可能轨迹τ求积分。这意味着我们不能简单地交换梯度和积分的顺序。为了突破这个困境我们需要对目标函数梯度进行数学变形。提示策略梯度定理的妙处在于它通过巧妙的数学变换将梯度表达式中的轨迹概率梯度转换为了对数概率梯度这使得采样估计成为可能。2. 从期望到采样的三步推导2.1 第一步展开期望表达式首先我们明确写出期望的积分形式$$ \nabla_\theta J(\theta) \nabla_\theta \int p_\theta(\tau) G(\tau) d\tau $$根据微积分中的莱布尼茨规则梯度可以进入积分内部但需要注意p_θ(τ)也依赖于θ$$ \int \nabla_\theta [p_\theta(\tau) G(\tau)] d\tau $$由于G(τ)不依赖于θ可以将其提出$$ \int G(\tau) \nabla_\theta p_\theta(\tau) d\tau $$2.2 第二步引入对数导数技巧这里我们需要一个关键的数学技巧——对数导数$$ \nabla_\theta p_\theta(\tau) p_\theta(\tau) \nabla_\theta \log p_\theta(\tau) $$将其代入前式$$ \int p_\theta(\tau) G(\tau) \nabla_\theta \log p_\theta(\tau) d\tau $$这实际上又回到了一个期望的形式$$ \mathbb{E}{\tau \sim p\theta(\tau)} [G(\tau) \nabla_\theta \log p_\theta(\tau)] $$2.3 第三步分解轨迹概率现在我们需要计算∇_θ log p_θ(τ)。根据马尔可夫性质轨迹概率可以分解为$$ p_\theta(\tau) p(s_0) \prod_{t0}^{T-1} \pi_\theta(a_t|s_t) p(s_{t1}|s_t,a_t) $$取对数后变为求和$$ \log p_\theta(\tau) \log p(s_0) \sum_{t0}^{T-1} [\log \pi_\theta(a_t|s_t) \log p(s_{t1}|s_t,a_t)] $$求梯度时只有策略项π_θ(a_t|s_t)依赖于θ其他项消失$$ \nabla_\theta \log p_\theta(\tau) \sum_{t0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) $$3. 蒙特卡洛梯度估计的实现3.1 基本估计器将上述结果代入我们得到策略梯度的最终表达式$$ \nabla_\theta J(\theta) \mathbb{E}{\tau \sim p\theta(\tau)} \left[ \left( \sum_{t0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) \right) \left( \sum_{t0}^{T-1} \gamma^t r_{t1} \right) \right] $$这个期望可以通过采样来估计——我们只需要用当前策略π_θ与环境交互收集N条轨迹然后计算$$ \nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i1}^N \left[ \left( \sum_{t0}^{T-1} \nabla_\theta \log \pi_\theta(a_t^{(i)}|s_t^{(i)}) \right) \left( \sum_{t0}^{T-1} \gamma^t r_{t1}^{(i)} \right) \right] $$3.2 减少方差的技巧原始估计器的方差往往很大我们可以采用以下改进基准线减法引入与状态相关的基准线b(s_t)通常选择值函数V(s_t)$$ \nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i1}^N \sum_{t0}^{T-1} \nabla_\theta \log \pi_\theta(a_t^{(i)}|s_t^{(i)}) (G_t^{(i)} - b(s_t^{(i)})) $$折扣回报使用从时刻t开始的折扣回报G_t代替完整回报时间相关权重只考虑动作a_t之后获得的回报改进后的估计器$$ \nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i1}^N \sum_{t0}^{T-1} \nabla_\theta \log \pi_\theta(a_t^{(i)}|s_t^{(i)}) \left( \sum_{tt}^{T-1} \gamma^{t-t} r_{t1}^{(i)} - b(s_t^{(i)}) \right) $$4. Python实现示例import torch import torch.nn as nn import torch.optim as optim import numpy as np class PolicyNetwork(nn.Module): def __init__(self, state_dim, action_dim, hidden_dim64): super().__init__() self.fc1 nn.Linear(state_dim, hidden_dim) self.fc2 nn.Linear(hidden_dim, action_dim) def forward(self, x): x torch.relu(self.fc1(x)) return torch.softmax(self.fc2(x), dim-1) def get_action(self, state): probs self.forward(torch.FloatTensor(state)) dist torch.distributions.Categorical(probs) action dist.sample() log_prob dist.log_prob(action) return action.item(), log_prob def reinforce(env, policy, episodes1000, gamma0.99, lr0.01): optimizer optim.Adam(policy.parameters(), lrlr) for episode in range(episodes): state env.reset() log_probs [] rewards [] # 收集轨迹 done False while not done: action, log_prob policy.get_action(state) next_state, reward, done, _ env.step(action) log_probs.append(log_prob) rewards.append(reward) state next_state # 计算折扣回报 returns [] G 0 for r in reversed(rewards): G r gamma * G returns.insert(0, G) # 归一化回报 returns torch.tensor(returns) returns (returns - returns.mean()) / (returns.std() 1e-9) # 计算策略梯度 policy_loss [] for log_prob, G in zip(log_probs, returns): policy_loss.append(-log_prob * G) # 参数更新 optimizer.zero_grad() loss torch.stack(policy_loss).sum() loss.backward() optimizer.step()5. 实际应用中的考量在实际实现策略梯度方法时有几个关键因素需要考虑批量大小每次更新使用多少条轨迹小批量更新频繁但高方差大批量更稳定的更新但计算成本高学习率调度随着训练调整学习率初始阶段可以使用较大学习率后期需要减小学习率以稳定训练优势估计使用GAE(Generalized Advantage Estimation)等技术平衡偏差和方差公式$A_t^{GAE} \sum_{l0}^{\infty} (\gamma\lambda)^l \delta_{tl}$并行采样使用多个环境同时采样加速数据收集增加样本多样性方法偏差方差样本效率REINFORCE无偏高低带基准线无偏中中优势函数无偏低高GAE有偏可调高策略梯度方法虽然理论优美但在实际应用中常常面临梯度估计方差大的问题。这促使了后续Actor-Critic架构的发展通过引入值函数来降低方差。理解从期望到蒙特卡洛采样的推导过程是掌握这些高级算法的基础。