强化学习目标函数 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_{t=0}^{T-1} \pi_\theta(a_t|s_t) p(s_{t+1}|s_t,a_t) $$
取对数后变为求和:
$$ \log p_\theta(\tau) = \log p(s_0) + \sum_{t=0}^{T-1} [\log \pi_\theta(a_t|s_t) + \log p(s_{t+1}|s_t,a_t)] $$
求梯度时,只有策略项π_θ(a_t|s_t)依赖于θ,其他项消失:
$$ \nabla_\theta \log p_\theta(\tau) = \sum_{t=0}^{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_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) \right) \left( \sum_{t=0}^{T-1} \gamma^t r_{t+1} \right) \right] $$
这个期望可以通过采样来估计——我们只需要用当前策略π_θ与环境交互,收集N条轨迹,然后计算:
$$ \nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^N \left[ \left( \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t^{(i)}|s_t^{(i)}) \right) \left( \sum_{t=0}^{T-1} \gamma^t r_{t+1}^{(i)} \right) \right] $$
3.2 减少方差的技巧
原始估计器的方差往往很大,我们可以采用以下改进:
基准线减法:引入与状态相关的基准线b(s_t),通常选择值函数V(s_t)
$$ \nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^N \sum_{t=0}^{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_{i=1}^N \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t^{(i)}|s_t^{(i)}) \left( \sum_{t'=t}^{T-1} \gamma^{t'-t} r_{t'+1}^{(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_dim=64): 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, episodes=1000, gamma=0.99, lr=0.01): optimizer = optim.Adam(policy.parameters(), lr=lr) 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_{l=0}^{\infty} (\gamma\lambda)^l \delta_{t+l}$
并行采样:使用多个环境同时采样
- 加速数据收集
- 增加样本多样性
| 方法 | 偏差 | 方差 | 样本效率 |
|---|---|---|---|
| REINFORCE | 无偏 | 高 | 低 |
| 带基准线 | 无偏 | 中 | 中 |
| 优势函数 | 无偏 | 低 | 高 |
| GAE | 有偏 | 可调 | 高 |
策略梯度方法虽然理论优美,但在实际应用中常常面临梯度估计方差大的问题。这促使了后续Actor-Critic架构的发展,通过引入值函数来降低方差。理解从期望到蒙特卡洛采样的推导过程,是掌握这些高级算法的基础。