强化学习:从Q学习到PPO算法

强化学习(Reinforcement Learning, RL)是一种机器学习范式,智能体通过与环境交互来学习最优策略,以最大化累积奖励。从Q学习(Q-Learning)到近端策略优化(Proximal Policy Optimization, PPO)的演进,代表了RL从值函数方法到策略优化方法的进步。本回答将逐步解释这一过程,包括关键概念、数学公式和算法实现,帮助您理解其核心思想。

1. Q学习:基础值函数方法

Q学习是一种无模型(model-free)的强化学习算法,它通过学习状态-动作值函数$Q(s,a)$来找到最优策略。$Q(s,a)$表示在状态$s$下采取动作$a$后,预期获得的累积折扣奖励。Q学习基于Bellman最优方程进行迭代更新。

Bellman最优方程为: $$Q^(s,a) = \mathbb{E}\left[ r + \gamma \max_{a'} Q^(s',a') \mid s,a \right]$$ 其中,$r$是即时奖励,$\gamma$是折扣因子($0 \leq \gamma < 1$),$s'$是下一个状态。

Q学习更新规则为: $$Q(s,a) \leftarrow Q(s,a) + \alpha \left[ r + \gamma \max_{a'} Q(s',a') - Q(s,a) \right]$$ 这里,$\alpha$是学习率($0 < \alpha \leq 1$),用于控制更新步长。

Q学习简单高效,适合离散状态和动作空间。它使用Q-table存储值,但面对高维状态时,Q-table变得不切实际,需引入函数逼近(如神经网络)。以下是Python伪代码实现:

def q_learning(env, num_episodes, alpha, gamma):
    # 初始化Q-table,状态数和动作数
    Q = np.zeros((env.observation_space.n, env.action_space.n))
    for episode in range(num_episodes):
        state = env.reset()
        done = False
        while not done:
            # ε-贪婪策略选择动作
            if np.random.rand() < epsilon:
                action = env.action_space.sample()  # 随机探索
            else:
                action = np.argmax(Q[state, :])    # 利用最优动作
            # 执行动作,获取奖励和新状态
            next_state, reward, done, _ = env.step(action)
            # 更新Q-table
            Q[state, action] += alpha * (reward + gamma * np.max(Q[next_state, :]) - Q[state, action])
            state = next_state
    return Q

Q学习的局限性:

  • 无法直接处理连续动作空间。
  • 当状态空间巨大时,收敛速度慢。
  • 依赖贪婪策略,可能导致探索不足。
2. 策略梯度方法:从值函数到策略优化

为解决Q学习的问题,策略梯度(Policy Gradient)方法直接优化策略$\pi(a|s)$,而不是学习值函数。策略定义为参数化函数(如神经网络),输出动作概率分布。目标函数$J(\theta)$是期望累积奖励: $$J(\theta) = \mathbb{E}{\tau \sim \pi\theta} \left[ \sum_{t=0}^{T} \gamma^t r_t \right]$$ 其中,$\tau$是轨迹(状态-动作序列),$\theta$是策略参数。

策略梯度定理给出梯度: $$\nabla J(\theta) = \mathbb{E}{\tau \sim \pi\theta} \left[ \sum_{t=0}^{T} \nabla \log \pi(a_t|s_t) A_t \right]$$ 这里,$A_t$是优势函数(advantage function),定义为$A_t = Q(s_t,a_t) - V(s_t)$,其中$V(s)$是状态值函数,表示状态$s$的预期累积奖励。

策略梯度方法能处理连续动作,但存在高方差问题,导致训练不稳定。常用算法包括REINFORCE,它使用蒙特卡洛采样估计梯度。

3. Actor-Critic架构:结合值函数和策略

Actor-Critic方法结合了值函数(Critic)和策略(Actor),以降低方差并提高效率。Critic评估状态值$V(s)$或优势$A_t$,Actor更新策略参数$\theta$。更新规则为:

  • Critic更新:使用时间差分(TD)学习,例如$V(s) \leftarrow V(s) + \alpha [r + \gamma V(s') - V(s)]$。
  • Actor更新:$\theta \leftarrow \theta + \beta \nabla \log \pi(a|s) A_t$,其中$\beta$是学习率。

Actor-Critic架构是PPO的前身,能处理高维状态,但训练仍可能不稳定。

4. PPO算法:稳定高效的策略优化

近端策略优化(PPO)是一种改进的Actor-Critic方法,由OpenAI于2017年提出,它通过裁剪(clipping)机制确保策略更新稳定,避免大幅偏离旧策略。PPO的目标函数设计为核心创新点。

PPO的目标函数为: $$L^{CLIP}(\theta) = \mathbb{E}_{t} \left[ \min\left( r_t(\theta) A_t, \text{clip}\left(r_t(\theta), 1-\epsilon, 1+\epsilon\right) A_t \right) \right]$$ 其中:

  • $r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$是重要性采样比率,表示新策略与旧策略的概率比。
  • $A_t$是优势函数,通常用Critic网络估计。
  • $\text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)$将比率限制在$[1-\epsilon, 1+\epsilon]$范围内,$\epsilon$是超参数(如0.2),防止策略突变。

PPO的优势:

  • 降低策略更新方差,确保训练稳定。
  • 支持并行采样,提高数据效率。
  • 适用于连续和离散动作空间。

以下是PPO的简化Python伪代码(使用PyTorch风格):

import torch
import torch.optim as optim

def ppo(env, num_epochs, clip_epsilon, gamma):
    # 初始化Actor和Critic网络
    actor = PolicyNetwork()
    critic = ValueNetwork()
    optimizer = optim.Adam(list(actor.parameters()) + list(critic.parameters()), lr=0.001)
    
    for epoch in range(num_epochs):
        states, actions, rewards, old_log_probs = collect_trajectories(env, actor)  # 收集轨迹数据
        advantages = compute_advantages(rewards, critic(states), gamma)  # 计算优势函数
        
        for _ in range(10):  # 多次优化步骤
            log_probs = actor.log_prob(states, actions)
            ratios = torch.exp(log_probs - old_log_probs)  # r_t(θ)
            
            # 计算裁剪目标函数
            surr1 = ratios * advantages
            surr2 = torch.clamp(ratios, 1 - clip_epsilon, 1 + clip_epsilon) * advantages
            actor_loss = -torch.min(surr1, surr2).mean()
            
            # Critic损失:均方误差
            value_preds = critic(states)
            critic_loss = torch.mean((value_preds - rewards) ** 2)
            
            # 总损失并更新
            total_loss = actor_loss + critic_loss
            optimizer.zero_grad()
            total_loss.backward()
            optimizer.step()
    return actor, critic

总结
  • Q学习:基于值函数的简单方法,适合离散空间,但扩展性差。
  • 策略梯度:直接优化策略,处理连续动作,但方差高。
  • Actor-Critic:结合值函数和策略,提高效率。
  • PPO:通过裁剪目标函数实现稳定训练,成为现代RL的基准算法。

演进趋势:从离散值函数到连续策略优化,PPO在样本效率、稳定性和性能上显著提升。实际应用中,Q学习用于简单任务(如游戏AI),而PPO广泛应用于机器人控制、自动驾驶等复杂场景。建议结合具体问题选择算法,并参考开源库(如Stable Baselines3)进行实现。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐