Course 3:强化学习入门
课程简介
MDP、Q-Learning、深度 Q 网络基础。
一、强化学习概述
1.1 基本框架
强化学习(Reinforcement Learning)是机器学习的第三大范式,与监督学习和无监督学习并列。它通过智能体(Agent)与环境(Environment)的交互来学习最优策略。
核心要素:
- 智能体:做出决策的算法
- 环境:智能体交互的对象
- 状态 S:环境在某个时刻的情况
- 动作 A:智能体在某个状态可以采取的行动
- 奖励 R:环境对智能体动作的反馈
- 策略 π:从状态到动作的映射
1.2 与监督学习的区别
| 方面 | 监督学习 | 强化学习 |
|---|---|---|
| 数据形式 | 带标签的独立样本 | 时序交互序列 |
| 反馈 | 即时且精确 | 延迟且稀疏 |
| 探索 | 不需要 | 需要在探索和利用间平衡 |
| 决策 | 一次性的 | 序列性的 |
1.3 马尔可夫决策过程(MDP)
MDP 是强化学习的数学框架,由五元组 (S, A, P, R, γ) 定义:
- S:状态集合
- A:动作集合
- P(s'|s,a):在状态 s 执行动作 a 后转移到状态 s' 的概率
- R(s,a):在状态 s 执行动作 a 获得的即时奖励
- γ:折扣因子 [0,1],决定未来奖励的重要性
二、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())
四、强化学习的应用
- 游戏:AlphaGo、DQN 玩 Atari 游戏
- 机器人控制:机械臂抓取、步行控制
- 自动驾驶:决策规划
- 推荐系统:将用户交互建模为 MDP
- 资源调度:数据中心节能、交通信号控制
延伸阅读
- 📺 B 站播放列表:Machine Learning Specialization (2022) — 新版机器学习
- 📚 更多学习资源,请访问 deeplearning.ai 官网