Skip to content

07 - 强化学习

从马尔可夫决策过程到深度强化学习,掌握智能体决策技术。

模块概览

属性
前置要求概率论, 优化理论, 深度学习基础
学习时长3-4 周
Notebooks12+
难度⭐⭐⭐⭐ 高级

学习目标

完成本模块后,你将能够:

  • ✅ 理解马尔可夫决策过程 (MDP) 的数学框架
  • ✅ 掌握值迭代、策略迭代等经典算法
  • ✅ 实现 Q-Learning 和 DQN
  • ✅ 理解策略梯度方法和 Actor-Critic 架构
  • ✅ 应用 PPO 等现代算法解决实际问题

子模块详解

01. 马尔可夫决策过程 (MDP)

强化学习的数学基础。

MDP 定义

一个 MDP 由五元组 (S,A,P,R,γ) 定义:

符号含义说明
S状态空间所有可能的状态集合
A动作空间所有可能的动作集合
P状态转移概率$P(s'
R奖励函数R(s,a,s)
γ折扣因子γ[0,1)

核心概念

时刻 t:    状态 s_t ──► 动作 a_t ──► 奖励 r_t+1 ──► 状态 s_t+1
                │            │            │            │
                └────────────┴────────────┴────────────┘
                              交互循环

回报与价值函数

累积回报

Gt=rt+1+γrt+2+γ2rt+3+...=k=0γkrt+k+1

状态价值函数

Vπ(s)=Eπ[Gt|st=s]

动作价值函数

Qπ(s,a)=Eπ[Gt|st=s,at=a]

贝尔曼方程

Vπ(s)=aπ(a|s)s,rp(s,r|s,a)[r+γVπ(s)]Qπ(s,a)=s,rp(s,r|s,a)[r+γaπ(a|s)Qπ(s,a)]

02. 动态规划

已知环境模型时的最优求解。

策略评估 (Policy Evaluation)

python
def policy_evaluation(env, policy, gamma=0.99, theta=1e-6):
    V = np.zeros(env.nS)
    while True:
        delta = 0
        for s in range(env.nS):
            v = 0
            for a, action_prob in enumerate(policy[s]):
                for prob, next_state, reward, done in env.P[s][a]:
                    v += action_prob * prob * (reward + gamma * V[next_state])
            delta = max(delta, abs(v - V[s]))
            V[s] = v
        if delta < theta:
            break
    return V

值迭代 (Value Iteration)

Vk+1(s)=maxas,rp(s,r|s,a)[r+γVk(s)]

策略迭代 (Policy Iteration)

初始化策略 π
循环:
    1. 策略评估: 计算 V^π
    2. 策略改进: π'(s) = argmax_a Q^π(s, a)
    3. 如果 π' = π,停止

03. 无模型方法:蒙特卡洛与 TD

不需要环境模型的学习方法。

方法对比

方法更新时机偏差方差
蒙特卡洛 (MC)回合结束无偏
时序差分 (TD)每步有偏
n-步 TDn 步后折中折中

TD(0) 更新

V(st)V(st)+α[rt+1+γV(st+1)V(st)]

SARSA (On-Policy TD Control)

Q(st,at)Q(st,at)+α[rt+1+γQ(st+1,at+1)Q(st,at)]
python
def sarsa(env, num_episodes, alpha=0.1, gamma=0.99, epsilon=0.1):
    Q = defaultdict(lambda: np.zeros(env.action_space.n))

    for episode in range(num_episodes):
        state = env.reset()
        action = epsilon_greedy(Q, state, epsilon)

        while True:
            next_state, reward, done, _ = env.step(action)
            next_action = epsilon_greedy(Q, next_state, epsilon)

            # SARSA 更新
            td_target = reward + gamma * Q[next_state][next_action]
            Q[state][action] += alpha * (td_target - Q[state][action])

            if done:
                break
            state, action = next_state, next_action

    return Q

Q-Learning (Off-Policy TD Control)

Q(st,at)Q(st,at)+α[rt+1+γmaxaQ(st+1,a)Q(st,at)]

04. Deep Q-Network (DQN)

使用深度神经网络近似 Q 函数。

DQN 核心创新

技术作用
经验回放打破数据相关性
目标网络稳定训练
Clip Reward归一化奖励

DQN 算法

python
class DQN(nn.Module):
    def __init__(self, state_dim, action_dim, hidden_dim=128):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(state_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, hidden_dim),
            nn.ReLU(),
            nn.Linear(hidden_dim, action_dim)
        )

    def forward(self, x):
        return self.net(x)

class ReplayBuffer:
    def __init__(self, capacity):
        self.buffer = deque(maxlen=capacity)

    def push(self, state, action, reward, next_state, done):
        self.buffer.append((state, action, reward, next_state, done))

    def sample(self, batch_size):
        return random.sample(self.buffer, batch_size)

def train_dqn(env, num_episodes):
    policy_net = DQN(state_dim, action_dim)
    target_net = DQN(state_dim, action_dim)
    target_net.load_state_dict(policy_net.state_dict())

    optimizer = torch.optim.Adam(policy_net.parameters(), lr=1e-4)
    memory = ReplayBuffer(10000)

    for episode in range(num_episodes):
        state = env.reset()

        while True:
            # ε-greedy 选择动作
            action = select_action(state, policy_net, epsilon)
            next_state, reward, done, _ = env.step(action)

            # 存储经验
            memory.push(state, action, reward, next_state, done)

            # 训练
            if len(memory.buffer) > batch_size:
                batch = memory.sample(batch_size)
                loss = compute_loss(batch, policy_net, target_net)
                optimizer.zero_grad()
                loss.backward()
                optimizer.step()

            # 定期更新目标网络
            if episode % target_update == 0:
                target_net.load_state_dict(policy_net.state_dict())

            if done:
                break
            state = next_state

DQN 改进变体

变体创新点
Double DQN解耦动作选择与评估
Dueling DQN分离状态价值与优势函数
Prioritized Experience Replay优先采样重要经验
Rainbow集成多种改进

05. 策略梯度方法

直接优化策略参数。

策略梯度定理

θJ(θ)=Eτπθ[t=0Tθlogπθ(at|st)Gt]

REINFORCE 算法

python
def reinforce(env, policy_net, optimizer, num_episodes):
    for episode in range(num_episodes):
        states, actions, rewards = [], [], []
        state = env.reset()

        # 生成一条轨迹
        while True:
            action = policy_net.select_action(state)
            next_state, reward, done, _ = env.step(action)

            states.append(state)
            actions.append(action)
            rewards.append(reward)

            if done:
                break
            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)

        # 策略梯度更新
        loss = 0
        for state, action, G in zip(states, actions, returns):
            log_prob = policy_net.log_prob(state, action)
            loss += -log_prob * G

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

06. Actor-Critic 方法

结合策略梯度和价值函数。

架构

状态 s ──┬──► Actor (策略网络) ──► 动作 a

         └──► Critic (价值网络) ──► V(s) 或 Q(s,a)

Advantage Actor-Critic (A2C)

θJ(θ)=E[θlogπθ(a|s)A(s,a)]

其中优势函数:

A(s,a)=Q(s,a)V(s)r+γV(s)V(s)

PPO (Proximal Policy Optimization)

LCLIP(θ)=E[min(rt(θ)At,clip(rt(θ),1ϵ,1+ϵ)At)]

其中 rt(θ)=πθ(at|st)πθold(at|st)

PPO 优势

特性说明
稳定性限制策略更新幅度
样本效率可重复使用经验
易实现无需 KL 散度约束
SOTA大多数任务表现优异

07. 多智能体强化学习

多个智能体协同或竞争。

场景特点应用
合作共同目标机器人协作
竞争零和博弈游戏对战
混合部分合作竞争自动驾驶

核心挑战

  • 非平稳环境(其他智能体也在学习)
  • 信用分配问题
  • 通信与协调

实验列表

实验内容文件
MDP 基础GridWorld 求解01_mdp_gridworld.ipynb
值迭代冰湖环境02_value_iteration.ipynb
Q-LearningTaxi-v3 任务03_q_learning.ipynb
DQNCartPole 平衡04_dqn_cartpole.ipynb
REINFORCELunarLander05_reinforce.ipynb
A2CAtari 游戏06_a2c_atari.ipynb
PPOMuJoCo 连续控制07_ppo_mujoco.ipynb
Multi-Agent多智能体粒子环境08_multiagent.ipynb

参考资源

教材

  • Sutton & Barto (2018). Reinforcement Learning: An Introduction (2nd ed.) - 在线阅读
  • Szepesvári, C. (2010). Algorithms for Reinforcement Learning

论文

  • Mnih et al. (2015). Human-level control through deep reinforcement learning (DQN)
  • Schulman et al. (2017). Proximal Policy Optimization Algorithms (PPO)
  • Silver et al. (2016). Mastering the game of Go with deep neural networks

课程

工具

Released under the MIT License.