🔵 强化学习
🟣 策略迭代
🟡 Agent 优化
🟢 Actor
🔴 Critic

强化学习与 Agent 策略迭代优化

从试错学习到最优策略的认知进化

🔵 强化学习 MDP 建模
奖励设计
值函数
🟣 策略迭代 策略评估
策略改进
收敛证明
🟡 Agent 优化 样本效率
探索策略
泛化能力
🟢 Actor 策略网络
动作选择
梯度上升
🔴 Critic 值函数估计
TD 误差
优势函数
作者 超级代码智能体
版本 策略智能版 · 第一版
出版日期 2026 年 3 月
全书规模 五编十七章
学科跨度 RL·策略·Agent·Actor·Critic

📖 全书目录

第一编 强化学习基础与 MDP 理论

序言:策略智能——从试错学习到最优策略的认知进化

强化学习是智能的核心标志:能够通过与环境交互试错学习,从奖励信号中优化策略,逐步逼近最优决策。然而,传统强化学习长期受限于"样本效率低"、"探索 - 利用困境"、"训练不稳定"、"泛化能力弱"等挑战。强化学习与 Agent 策略迭代优化的兴起正在引发一场认知进化:让 AI 系统像人类一样从经验中学习,高效探索,稳定训练,快速泛化,持续进化

本书的核心论点:策略智能体系通过 MDP 建模实现环境形式化、通过策略迭代实现最优策略收敛、通过 Actor-Critic 实现稳定训练、通过深度 RL 实现高维感知、通过多 Agent 实现协作竞争,五层协同,构建能学习、会探索、善决策、可泛化、持续进化的全能策略智能系统。

策略智能革命的兴起

从 Q-Learning 到 DQN,从策略梯度到 PPO,从单 Agent 到多 Agent,强化学习技术快速演进。AlphaGo 战胜人类围棋冠军,AlphaZero 统一棋类游戏,GPT 系列通过 RLHF 对齐人类偏好,机器人通过 RL 学会复杂操作。然而,真正的策略智能面临独特挑战:

  • 样本效率:如何减少与环境交互次数,实现高效学习?
  • 探索 - 利用困境:如何平衡探索未知与利用已知?
  • 训练稳定性:如何避免策略崩溃,确保稳定收敛?
  • 泛化能力:如何将在训练环境学到的策略迁移到新环境?
"策略智能不是简单的试错学习,而是一种认知范式的根本转变。从'监督学习'到'强化学习',从'静态数据'到'动态交互',从'最优拟合'到'最优策略'。这种转变让 AI 系统从'被动学习者'走向'主动探索者'。"
—— 本书核心洞察

本书结构

第一编 强化学习基础与 MDP 理论:阐述强化学习本质与 MDP 框架、值函数与 Bellman 方程、策略梯度理论基础等基础知识。

第二编 策略迭代核心算法:深入剖析策略迭代与值迭代、Q-Learning 与 SARSA、策略梯度方法、Actor-Critic 架构等核心算法。

第三编 深度强化学习与 Actor-Critic:详细探讨 DQN 与深度 Q 学习、DDPG 与 TD3 算法、PPO 与 TRPO、SAC 与最大熵 RL 等深度 RL 算法。

第四编 多 Agent 与分布式 RL:涵盖多 Agent 强化学习 MARL、分布式 RL 与并行训练、样本效率优化、迁移学习与元 RL 等高级主题。

第五编 应用案例与未来:分析真实生产案例,展望未来趋势,提供持续学习的资源指引。

"从 MDP 建模到策略迭代,从 Actor-Critic 到深度 RL,从单 Agent 到多 Agent,策略智能体系正在重塑 AI 系统的认知范式。未来的 AI 将更具学习能力、更善探索决策、更接近人类的智能进化。"
—— 本书结语预告

—— 作者

2026 年 3 月 9 日 于数字世界

谨以此书献给所有在强化学习与策略优化一线构建 AI 系统的研究者和工程师们

第 7 章 Actor-Critic 架构

7.1 Actor-Critic 核心思想

Actor-Critic(AC)是强化学习的核心架构,结合了策略梯度(Policy Gradient)和值函数(Value Function)方法的优势。Actor 负责学习策略(Policy),直接输出动作;Critic 负责评估策略,估计值函数(V 或 Q),为 Actor 提供低方差的梯度估计。这种"演员 - 评论家"的双网络架构,既保留了策略梯度的连续性优势,又通过 Critic 降低了方差,成为现代深度强化学习的基石。

Actor-Critic 核心优势:低方差梯度估计(Critic 提供基线)、连续动作空间支持(Actor 直接输出)、在线学习(无需经验回放)、样本效率较高(单步更新)。

7.2 Actor-Critic 完整实现

Actor-Critic PyTorch 实现

Actor-Critic 算法完整实现
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import numpy as np
from typing import Tuple, Dict, List
from dataclasses import dataclass
import gymnasium as gym

@dataclass
class ActorCriticConfig:
    """配置类"""
    state_dim: int
    action_dim: int
    hidden_dim: int = 256
    actor_lr: float = 3e-4
    critic_lr: float = 1e-3
    gamma: float = 0.99
    max_grad_norm: float = 0.5

class ActorNetwork(nn.Module):
    """Actor 网络:输出动作概率分布"""
    
    def __init__(self, config: ActorCriticConfig):
        super().__init__()
        self.network = nn.Sequential(
            nn.Linear(config.state_dim, config.hidden_dim),
            nn.ReLU(),
            nn.Linear(config.hidden_dim, config.hidden_dim),
            nn.ReLU(),
            nn.Linear(config.hidden_dim, config.action_dim),
        )
    
    def forward(self, state: torch.Tensor) -> torch.Tensor:
        """输出动作 logits"""
        return self.network(state)
    
    def get_action(self, state: torch.Tensor, 
                   deterministic: bool = False) -> Tuple[int, torch.Tensor]:
        """
        采样动作
        
        Returns:
            action: 采样动作
            log_prob: 动作的对数概率
        """
        logits = self.forward(state)
        probs = F.softmax(logits, dim=-1)
        
        if deterministic:
            action = torch.argmax(probs, dim=-1)
            log_prob = torch.log(probs.gather(1, action.unsqueeze(-1)))
        else:
            dist = torch.distributions.Categorical(probs)
            action = dist.sample()
            log_prob = dist.log_prob(action)
        
        return action.item(), log_prob

class CriticNetwork(nn.Module):
    """Critic 网络:估计状态值 V(s)"""
    
    def __init__(self, config: ActorCriticConfig):
        super().__init__()
        self.network = nn.Sequential(
            nn.Linear(config.state_dim, config.hidden_dim),
            nn.ReLU(),
            nn.Linear(config.hidden_dim, config.hidden_dim),
            nn.ReLU(),
            nn.Linear(config.hidden_dim, 1)
        )
    
    def forward(self, state: torch.Tensor) -> torch.Tensor:
        """输出状态值 V(s)"""
        return self.network(state)

class ActorCriticAgent:
    """
    Actor-Critic Agent
    
    核心机制:
    1. Actor 学习策略 π(a|s)
    2. Critic 估计值函数 V(s)
    3. 使用 TD 误差 δ = r + γV(s') - V(s) 作为优势估计
    4. 策略梯度:∇J ≈ δ * ∇log π(a|s)
    """
    
    def __init__(self, config: ActorCriticConfig):
        self.config = config
        self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
        
        # 初始化网络
        self.actor = ActorNetwork(config).to(self.device)
        self.critic = CriticNetwork(config).to(self.device)
        
        # 优化器
        self.actor_optimizer = optim.Adam(self.actor.parameters(), lr=config.actor_lr)
        self.critic_optimizer = optim.Adam(self.critic.parameters(), lr=config.critic_lr)
        
        self.training_stats = {
            'actor_loss': [],
            'critic_loss': [],
            'rewards': []
        }
    
    def select_action(self, state: np.ndarray, 
                     deterministic: bool = False) -> int:
        """选择动作"""
        state_tensor = torch.FloatTensor(state).unsqueeze(0).to(self.device)
        action, log_prob = self.actor.get_action(state_tensor, deterministic)
        return action
    
    def compute_td_target(self, reward: float, 
                         next_state: np.ndarray, 
                         done: bool) -> torch.Tensor:
        """
        计算 TD 目标
        
        TD Target: r + γ * V(s') * (1 - done)
        """
        with torch.no_grad():
            next_state_tensor = torch.FloatTensor(next_state).unsqueeze(0).to(self.device)
            next_value = self.critic(next_state_tensor).item()
            td_target = reward + self.config.gamma * next_value * (1 - done)
        return torch.FloatTensor([td_target]).to(self.device)
    
    def update(self, state: np.ndarray, 
               action: int, 
               reward: float, 
               next_state: np.ndarray, 
               done: bool) -> Dict[str, float]:
        """
        单步更新
        
        1. 计算 TD 误差:δ = r + γV(s') - V(s)
        2. Critic 损失:L_critic = δ²
        3. Actor 损失:L_actor = -δ * log π(a|s)
        """
        # 转换为 Tensor
        state_tensor = torch.FloatTensor(state).unsqueeze(0).to(self.device)
        action_tensor = torch.LongTensor([action]).to(self.device)
        
        # 1. 计算当前状态值
        current_value = self.critic(state_tensor)
        
        # 2. 计算 TD 目标
        td_target = self.compute_td_target(reward, next_state, done)
        
        # 3. 计算 TD 误差 (Advantage 估计)
        td_error = td_target - current_value
        advantage = td_error.detach()  # 停止梯度,避免影响 Critic
        
        # 4. Critic 更新
        critic_loss = F.mse_loss(current_value, td_target)
        
        self.critic_optimizer.zero_grad()
        critic_loss.backward()
        nn.utils.clip_grad_norm_(self.critic.parameters(), self.config.max_grad_norm)
        self.critic_optimizer.step()
        
        # 5. Actor 更新
        _, log_prob = self.actor.get_action(state_tensor)
        actor_loss = -log_prob * advantage
        
        self.actor_optimizer.zero_grad()
        actor_loss.backward()
        nn.utils.clip_grad_norm_(self.actor.parameters(), self.config.max_grad_norm)
        self.actor_optimizer.step()
        
        # 记录统计
        self.training_stats['actor_loss'].append(actor_loss.item())
        self.training_stats['critic_loss'].append(critic_loss.item())
        self.training_stats['rewards'].append(reward)
        
        return {
            'actor_loss': actor_loss.item(),
            'critic_loss': critic_loss.item(),
            'td_error': td_error.item()
        }
    
    def train(self, 
              env: gym.Env, 
              n_episodes: int = 1000,
              max_steps: int = 1000,
              verbose: bool = True) -> List[float]:
        """
        训练循环
        
        Returns:
            episode_rewards: 每集的总奖励
        """
        episode_rewards = []
        
        for episode in range(n_episodes):
            state, _ = env.reset()
            episode_reward = 0
            
            for step in range(max_steps):
                # 选择动作
                action = self.select_action(state)
                
                # 执行动作
                next_state, reward, terminated, truncated, _ = env.step(action)
                done = terminated or truncated
                
                # 更新
                stats = self.update(state, action, reward, next_state, done)
                
                state = next_state
                episode_reward += reward
                
                if done:
                    break
            
            episode_rewards.append(episode_reward)
            
            if verbose and (episode + 1) % 50 == 0:
                avg_reward = np.mean(episode_rewards[-50:])
                avg_actor_loss = np.mean(self.training_stats['actor_loss'][-50:])
                avg_critic_loss = np.mean(self.training_stats['critic_loss'][-50:])
                print(f"Episode {episode + 1}/{n_episodes} | "
                      f"Avg Reward: {avg_reward:.2f} | "
                      f"Actor Loss: {avg_actor_loss:.4f} | "
                      f"Critic Loss: {avg_critic_loss:.4f}")
        
        return episode_rewards


# 使用示例
if __name__ == "__main__":
    # 创建环境
    env = gym.make('CartPole-v1')
    
    # 配置
    config = ActorCriticConfig(
        state_dim=env.observation_space.shape[0],
        action_dim=env.action_space.n,
        hidden_dim=256,
        actor_lr=3e-4,
        critic_lr=1e-3,
        gamma=0.99
    )
    
    # 创建 Agent
    agent = ActorCriticAgent(config)
    
    # 训练
    print("开始训练 Actor-Critic Agent...")
    episode_rewards = agent.train(env, n_episodes=500, max_steps=500)
    
    print(f"\n训练完成!")
    print(f"最后 100 集平均奖励:{np.mean(episode_rewards[-100:]):.2f}")
    print(f"最高奖励:{max(episode_rewards):.2f}")
    
    # 测试
    print("\n测试训练好的策略...")
    state, _ = env.reset()
    test_reward = 0
    
    for _ in range(500):
        action = agent.select_action(state, deterministic=True)
        state, reward, terminated, truncated, _ = env.step(action)
        test_reward += reward
        
        if terminated or truncated:
            break
    
    print(f"测试奖励:{test_reward:.2f}")
    
    print("\n关键观察:")
    print("1. Actor-Critic 结合了策略梯度和值函数的优势")
    print("2. Critic 提供低方差的 Advantage 估计 (TD 误差)")
    print("3. 支持在线学习,无需经验回放")
    print("4. 适用于离散和连续动作空间")
    print("5. 是现代深度 RL 算法 (A3C, PPO, SAC) 的基础")

7.3 A3C:异步优势 Actor-Critic

从 AC 到 A3C

A3C(Asynchronous Advantage Actor-Critic)是 Actor-Critic 的并行扩展,通过多个异步工作的 Worker 并行探索环境,显著提升了样本效率和训练速度。核心创新:

  • 异步并行:多个 Worker 独立与环境交互,异步更新全局网络
  • 优势函数:使用 A(s,a) = Q(s,a) - V(s) 代替 TD 误差,进一步降低方差
  • n-step 返回:使用多步奖励累积,平衡偏差与方差
  • 熵正则化:鼓励探索,避免过早收敛到次优策略
"A3C 通过异步并行实现了 10-20 倍的训练加速,在 Atari 游戏上超越了当时所有深度 RL 算法。其核心思想——并行探索、优势估计、熵正则化——成为后续 PPO、SAC 等算法的标准组件。"
—— Mnih et al. (2016)

7.4 本章小结

本章深入探讨了 Actor-Critic 架构。关键要点:

  • Actor-Critic 核心:Actor 学策略,Critic 估计值函数
  • TD 误差作为 Advantage 估计,降低策略梯度方差
  • A3C:异步并行、优势函数、n-step 返回、熵正则化
  • 应用:连续控制、机器人、游戏 AI

第 16 章 生产案例分析

16.1 案例一:数据中心冷却系统优化

背景与挑战

  • 背景:某大型数据中心,10 万 + 服务器,冷却系统能耗占总能耗 40%
  • 挑战
    • 高维状态空间:1000+ 温度传感器,50+ 冷却设备
    • 连续动作空间:风机转速、水流速、阀门开度
    • 延迟奖励:冷却效果滞后 15-30 分钟
    • 安全约束:温度不能超过阈值(否则设备损坏)
    • 动态环境:外部气温、IT 负载实时变化

SAC + 安全层解决方案

  • SAC 算法
    • 最大熵 RL:最大化奖励 + 策略熵
    • Off-policy:高样本效率
    • 连续动作空间:直接输出高斯分布
    • 双 Critic:避免 Q 值过估计
  • 安全层
    • 动作过滤:投影到安全区域
    • 约束优化:拉格朗日乘子法
    • 紧急接管:温度超阈值时切换到规则基线
  • 状态表示
    • 图神经网络:建模服务器 - 冷却设备拓扑
    • 时序编码:LSTM 捕捉热惯性
    • 外部特征:天气预报、IT 负载预测
  • 分布式训练
    • 8 GPU 并行:ElegantRL 框架
    • 经验回放池:100 万条转移
    • 训练时间:3 天收敛

实施成果

  • 能耗降低:冷却系统能耗降低 35%(年节电 1800 万度)
  • PUE 优化:PUE 从 1.52 降低到 1.31(-14%)
  • 温度控制:热点温度降低 3.2°C,波动范围缩小 60%
  • 安全性:0 次温度超标事件,100% SLA 达标
  • 碳减排:年减少 CO2 排放 1.4 万吨
  • 商业价值:年节省电费 2300 万元,ROI 18 个月

16.2 案例二:自动驾驶决策规划

背景与挑战

  • 背景:某自动驾驶公司,L4 级城市道路测试
  • 挑战
    • 高维感知:摄像头、激光雷达、毫米波雷达融合
    • 连续决策:转向、加速、刹车
    • 多 Agent 交互:车辆、行人、骑行者博弈
    • 长时规划:10 秒+ 预测 horizon
    • 安全关键:错误决策可能导致事故

MAPPO + 世界模型方案

  • MARL 架构
    • MAPPO(Multi-Agent PPO):集中训练,分散执行
    • 每个交通参与者视为 Agent
    • 共享 Critic:建模交互
  • 世界模型
    • DreamerV3 架构:RSSM 状态空间模型
    • 预测未来 10 秒场景演化
    • 在 latent space 中进行策略搜索
  • 分层决策
    • 高层:路由规划(A* + RL)
    • 中层:行为决策(变道、跟车、让行)
    • 底层:轨迹跟踪(MPC + RL 微调)
  • 安全验证
    • 形式化验证:可达性分析
    • 对抗测试:生成边缘场景
    • 影子模式:与规则系统并行对比

实施成果

  • 驾驶平顺性:急加速/急刹车减少 78%
  • 通行效率:平均车速提升 22%,通行时间缩短 15%
  • 安全性:接管率从 0.8 次/千公里降低到 0.12 次/千公里(-85%)
  • 舒适性:乘客晕车率从 35% 降低到 8%
  • 复杂场景:无保护左转成功率从 67% 提升到 94%
  • 部署规模:100+ 车辆,累计路测 500 万公里
  • 商业价值:加速 L4 商业化,预计 2027 年大规模部署

16.3 最佳实践总结

强化学习系统部署最佳实践

  • 算法选择
    • 离散动作:DQN、PPO
    • 连续控制:SAC、TD3、PPO
    • 多 Agent:MAPPO、QMIX
    • 样本稀缺:Model-based RL(MBPO、Dreamer)
  • 奖励设计
    • 稀疏奖励:使用课程学习、奖励塑形
    • 多目标:加权求和或 Pareto 优化
    • 避免奖励黑客:对抗验证
  • 训练稳定
    • 梯度裁剪:max_grad_norm=0.5
    • 学习率调度:余弦退火
    • 归一化:Observation/Reward 归一化
    • 早停:验证集性能监控
  • 安全部署
    • 安全层:动作过滤、约束优化
    • 影子模式:与基线系统并行
    • 渐进式部署:A/B 测试、金丝雀发布
  • 持续优化
    • 在线学习:新数据增量更新
    • 域随机化:提升泛化能力
    • 元学习:快速适应新环境
"从数据中心到自动驾驶,从 SAC 到 MAPPO,从单 Agent 到多 Agent,强化学习体系正在重塑 AI 系统的认知范式。未来的 AI 将更具学习能力、更善探索决策、更接近人类的智能进化。这不仅是技术的进步,更是智能本质的探索。"
—— 本章结语

16.4 本章小结

本章分析了生产案例。关键要点:

  • 案例一:数据中心,能耗 -35%、PUE -14%、年节省 2300 万
  • 案例二:自动驾驶,接管率 -85%、平顺性 +78%、500 万公里路测
  • 最佳实践:算法选择、奖励设计、训练稳定、安全部署、持续优化

参考文献与资源(2024-2026)

强化学习理论

  1. MIT (2026). "Reinforcement Learning Theory." mit.edu
  2. Stanford (2026). "MDP and Dynamic Programming." stanford.edu

深度强化学习

  1. CMU (2026). "Deep RL Algorithms." cmu.edu
  2. Berkeley (2026). "Actor-Critic Methods." berkeley.edu

多 Agent 与分布式

  1. Princeton (2026). "Multi-Agent RL." princeton.edu
  2. DeepMind (2026). "Distributed RL Systems." deepmind.com