【深度学习】强化学习(三)目标函数的梯度优化与策略提升
1. 目标函数与策略优化的核心关系
在强化学习中,目标函数 J(θ) 是策略优化的指南针。它量化了策略 πθ 的优劣程度,本质上反映了智能体在长期交互中能获得的期望回报。我刚开始研究时常常困惑:为什么不能直接用累计奖励作为目标?后来发现,直接使用轨迹的原始回报会导致训练极不稳定,因为不同轨迹的长度和奖励规模差异巨大。
目标函数的数学定义看起来简单:
J(θ) = E_{τ∼πθ}[Σγ^t r_t]但这个公式背后隐藏着几个关键设计:
- 折扣因子γ:控制未来奖励的权重,γ接近1时更关注长期收益
- 期望运算E:需要对所有可能轨迹求平均,这是计算难点
- 策略参数θ:通常指神经网络的权重,决定了动作选择概率
实际项目中我发现,目标函数的设计直接影响训练效果。比如在机器人控制任务中,当我把γ从0.9调整到0.99时,智能体开始学会"未雨绸缪",会主动避开可能导致未来跌倒的动作。
2. 策略梯度定理的推导与实践
策略梯度定理是理解策略优化的钥匙。第一次看到这个定理时,我被其优雅性震撼——它告诉我们不需要知道环境动力学,只需通过采样就能估计梯度。定理的核心结论是:
∇J(θ) = E[∇logπ(a|s) * Q(s,a)]这个公式的实践意义在于:
- 对数概率技巧:将梯度计算转化为可采样的形式
- Q值作为权重:好的动作会被加强,差的动作会被抑制
- 无偏估计:只需足够多的样本就能逼近真实梯度
在PyTorch中实现时,有个细节容易出错:
# 正确实现 log_prob = torch.log(policy_net(state).gather(1, action)) loss = -log_prob * Q_value # 负号因为要最大化 # 常见错误:忘记取对数或符号错误3. REINFORCE算法的实现细节
REINFORCE是最基础的策略梯度算法,我在CartPole环境中实现时踩过不少坑。完整流程包括:
- 轨迹收集:运行当前策略与环境交互
states, actions, rewards = [], [], [] state = env.reset() while not done: prob = policy_net(state) action = torch.multinomial(prob, 1).item() next_state, reward, done, _ = env.step(action) states.append(state) actions.append(action) 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-8) loss = -torch.mean(log_probs * returns) optimizer.zero_grad() loss.backward() optimizer.step()实际调试时发现,如果不做回报标准化,训练很容易发散。此外,batch size过小会导致方差过大,一般至少需要10条完整轨迹。
4. 梯度优化的进阶技巧
基础策略梯度方法存在高方差问题,我在实践中总结了几个有效技巧:
基线方法:用状态值函数作为基线减少方差
∇J(θ) = E[∇logπ(a|s) * (Q(s,a)-V(s))]优势函数:结合TD误差估计优势
delta = r + gamma * V(s') - V(s) advantage = discount_cumsum(delta, gamma*lambda)熵正则化:防止策略过早收敛
probs = policy_net(state) entropy = -torch.sum(probs * torch.log(probs)) loss = -log_prob * advantage - 0.01 * entropy在Atari游戏实验中,加入这些技巧后训练稳定性显著提升。特别是熵正则化,能有效缓解智能体过早固定策略的问题。
5. 策略提升的理论保证
策略迭代理论告诉我们,策略评估+策略改进的循环能保证策略单调提升。但在函数逼近情况下,这个保证可能失效。这时需要关注:
策略性能边界:
J(π') - J(π) ≥ A(π')/(1-γ) - 2εγ/(1-γ)^2其中ε是优势函数的近似误差。
信任域方法:通过KL散度约束更新幅度
# TRPO的核心约束 kl = torch.distributions.kl.kl_divergence(old_policy, new_policy) loss = - (advantages * new_probs).mean() constraint = kl.mean() <= delta在机械臂控制任务中,使用TRPO后策略更新更平稳,避免了普通策略梯度中常见的性能崩溃问题。
6. 实战中的挑战与解决方案
在真实项目中遇到的主要挑战和应对策略:
稀疏奖励问题:
- 采用基于好奇心的内在奖励
- 设计分层强化学习架构
- 使用逆向强化学习从专家示范中学习奖励函数
高维动作空间:
- 对连续动作使用高斯策略
- 混合离散-连续动作表示
- 动作分解为多个子动作
训练不稳定:
- 使用PPO的clip目标函数
ratio = new_prob / old_prob surr1 = ratio * advantage surr2 = torch.clamp(ratio, 1-ε, 1+ε) * advantage loss = -torch.min(surr1, surr2).mean()- 实现梯度裁剪
- 使用学习率调度器
在无人机导航项目中,结合PPO和课程学习后,训练效率提升了3倍以上。
7. 策略梯度与值函数方法的融合
Actor-Critic架构结合了两种方法的优势:
- Actor(策略网络)负责生成动作
- Critic(值函数网络)提供评估信号
实现时的关键点:
# 双网络结构 class ActorCritic(nn.Module): def __init__(self): super().__init__() self.actor = nn.Sequential(...) # 输出动作概率 self.critic = nn.Sequential(...) # 输出状态值 def forward(self, x): return self.actor(x), self.critic(x) # 更新逻辑 values = critic(states) advantages = returns - values.detach() actor_loss = -(log_probs * advantages).mean() critic_loss = F.mse_loss(values, returns)在股票交易策略优化中,这种架构相比纯策略梯度方法收敛更快,最终收益提高了15%。
8. 现代深度策略优化算法
近年来出现的几种重要算法:
PPO:通过clip机制约束更新
clip_ratio = 0.2 ratio = new_probs / old_probs clip_adv = torch.clamp(ratio, 1-clip_ratio, 1+clip_ratio) * adv loss = -torch.min(ratio * adv, clip_adv).mean()SAC:最大熵框架下的离线算法
# 温度参数自动调整 alpha_loss = -(log_alpha * (log_probs + target_entropy).detach()).mean()MPO:基于期望最大化的策略搜索
# E-step:拟合非参数化策略 # M-step:投影回参数化策略在模拟机器人 locomotion 任务中,SAC 表现出卓越的样本效率,能在100万步内学会复杂步态。
