配音

Course 3:强化学习入门

课程简介

MDP、Q-Learning、深度 Q 网络基础。

🎬 本课程视频:Machine Learning Specialization (2022) — 新版机器学习


一、强化学习概述

1.1 基本框架

强化学习(Reinforcement Learning)是机器学习的第三大范式,与监督学习和无监督学习并列。它通过智能体(Agent)与环境(Environment)的交互来学习最优策略。

核心要素:
- 智能体:做出决策的算法
- 环境:智能体交互的对象
- 状态 S:环境在某个时刻的情况
- 动作 A:智能体在某个状态可以采取的行动
- 奖励 R:环境对智能体动作的反馈
- 策略 π:从状态到动作的映射

1.2 与监督学习的区别

方面 监督学习 强化学习
数据形式 带标签的独立样本 时序交互序列
反馈 即时且精确 延迟且稀疏
探索 不需要 需要在探索和利用间平衡
决策 一次性的 序列性的

1.3 马尔可夫决策过程(MDP)

MDP 是强化学习的数学框架,由五元组 (S, A, P, R, γ) 定义:

二、Q-Learning

2.1 Q 函数

Q 函数 Q(s,a) 表示在状态 s 执行动作 a 后,遵循最优策略所能获得的期望累积奖励:

$$Q(s, a) = \mathbb{E}[R_{t+1} + \gamma \max_{a'} Q(s', a') | s, a]$$

这个关系称为贝尔曼方程(Bellman Equation)。

2.2 Q-Learning 算法

Q-Learning 通过学习 Q 表来找到最优策略。更新公式:

$$Q(s, a) \leftarrow Q(s, a) + \alpha [R + \gamma \max_{a'} Q(s', a') - Q(s, a)]$$

其中 α 是学习率,γ 是折扣因子。

def q_learning(env, episodes=1000, alpha=0.1, gamma=0.9, epsilon=0.1):
    # 初始化 Q 表为零
    Q = np.zeros((env.n_states, env.n_actions))

    for episode in range(episodes):
        state = env.reset()
        done = False

        while not done:
            # ε-贪婪策略
            if np.random.random() < epsilon:
                action = np.random.randint(env.n_actions)  # 探索
            else:
                action = np.argmax(Q[state])  # 利用

            next_state, reward, done = env.step(action)

            # Q 值更新
            td_target = reward + gamma * np.max(Q[next_state])
            td_error = td_target - Q[state, action]
            Q[state, action] += alpha * td_error

            state = next_state

    return Q

2.3 ε-贪婪策略

ε-贪婪策略在探索和利用之间做平衡:
- 以概率 ε 执行随机动作(探索)
- 以概率 1-ε 执行当前最优动作(利用)

ε 通常在训练初期较大(多探索),随训练推进逐渐衰减(多利用)。

三、深度 Q 网络(DQN)

3.1 为什么需要 DQN

当状态空间很大(如游戏屏幕的像素组合是天文数字)时,Q 表无法存储。DQN 用神经网络逼近 Q 函数:

$$Q(s, a; \theta) \approx Q^*(s, a)$$

3.2 经验回放

DQN 的关键技巧:将智能体的经验 (s, a, r, s') 存储到回放缓冲区中,训练时随机采样批量经验。这打破了数据之间的时序相关性,提高了训练稳定性。

# 经验回放缓冲区
class ReplayBuffer:
    def __init__(self, capacity=10000):
        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):
        batch = random.sample(self.buffer, batch_size)
        states, actions, rewards, next_states, dones = zip(*batch)
        return (np.array(states), np.array(actions), 
                np.array(rewards), np.array(next_states), np.array(dones))

3.3 目标网络

DQN 使用两个网络——在线网络和目标网络。目标网络的参数每隔一定步数从在线网络复制,减少训练震荡。

3.4 DQN 训练循环

def train_dqn(env, q_network, target_network, buffer, episodes=500):
    optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)

    for episode in range(episodes):
        state = env.reset()
        total_reward = 0

        for t in range(200):
            # ε-贪婪
            if np.random.random() < epsilon:
                action = env.action_space.sample()
            else:
                q_values = q_network(state[np.newaxis], training=False)
                action = np.argmax(q_values[0])

            next_state, reward, done = env.step(action)
            buffer.push(state, action, reward, next_state, done)
            total_reward += reward
            state = next_state

            if len(buffer) > batch_size:
                batch = buffer.sample(batch_size)
                # 使用目标网络计算 TD 目标
                targets = rewards + gamma * np.max(target_q, axis=1) * (1 - dones)
                # 训练在线网络

            if done:
                break

        # 每隔 C 步更新目标网络
        if episode % C == 0:
            target_network.set_weights(q_network.get_weights())

四、强化学习的应用

  1. 游戏:AlphaGo、DQN 玩 Atari 游戏
  2. 机器人控制:机械臂抓取、步行控制
  3. 自动驾驶:决策规划
  4. 推荐系统:将用户交互建模为 MDP
  5. 资源调度:数据中心节能、交通信号控制

延伸阅读