第 1 课 / 共 30 课
MDP基础 · 阶段1
强化学习概述
强化学习的核心概念、与其他机器学习范式的区别、应用场景、智能体-环境交互模型
🧠 核心概念
智能体(Agent)环境(Environment)状态(State)动作(Action)奖励(Reward)策略(Policy)值函数(Value Function)模型(Model)
📚 强化学习是什么?
强化学习是机器学习的第三大范式(与监督学习、无监督学习并列),其核心思想是:智能体通过与环境交互获得奖励,学习最优行为策略。
💡 关键区别:监督学习是"老师告诉你答案",而强化学习是"自己探索,从后果中学习"。
智能体-环境交互循环
在时刻t,智能体处于状态sₜ,选择动作aₜ,环境返回奖励rₜ和新状态sₜ₊₁。这个循环持续进行,直到终止。
sₜ → aₜ → rₜ, sₜ₊₁ → aₜ₊₁ → ...
强化学习的应用场景
| 领域 | 应用 | 算法 |
| 游戏 | AlphaGo, Dota 2 | MCTS + PPO |
| 机器人 | 机械臂控制, 步行 | SAC, TD3 |
| 自动驾驶 | 路径规划, 决策 | DQN, PPO |
| 推荐系统 | 长期用户留存 | Contextual Bandit |
| 金融 | 量化交易 | DQN, A2C |
⚠️ 注意:强化学习没有监督信号告诉智能体"正确答案"是什么,只有延迟的、稀疏的奖励信号。
🔍 RL的数学框架
强化学习的目标是最大化累积折扣奖励:
G_t = r_t + gamma*r_{t+1} + gamma^2*r_{t+2} + ...
策略的定义
- 确定性策略: a = pi(s)
- 随机策略: pi(a|s) = P(a_t=a | s_t=s)
值函数
V^pi(s) = E_pi[G_t | s_t = s]
Q^pi(s,a) = E_pi[G_t | s_t = s, a_t = a]
FrozenLake环境详解
| 符号 | 含义 | 数量 |
| S | 起点 | 1 |
| F | 冰面 | 10 |
| H | 冰洞 | 4 |
| G | 目标 | 1 |
💡 环境特征:is_slippery=True时,动作有1/3概率滑向垂直方向。随机策略成功率约1.3%。
RL三大范式对比
| 范式 | 信号 | 代表算法 |
| 监督学习 | 标签 | SVM, 神经网络 |
| 无监督学习 | 无标签 | K-means, GAN |
| 强化学习 | 奖励 | Q-Learning, PPO |
核心挑战
- 探索与利用困境: 何时尝试新动作vs利用已知好动作
- 信用分配问题: 哪个动作导致了最终结果
- 样本效率: 需要多少交互才能学好
- 泛化能力: 训练环境的表现能否迁移
RL历史发展
| 年份 | 里程碑 | 意义 |
| 1956 | Bellman动态规划 | 最优控制理论基础 |
| 1989 | Watkins Q-Learning | 第一个off-policy TD算法 |
| 2013 | DeepMind DQN | 深度学习+RL的突破 |
| 2016 | AlphaGo | 围棋击败人类冠军 |
| 2017 | PPO | 最实用的RL算法 |
💻 代码实现
import gymnasium as gym
import numpy as np
import json
# 创建FrozenLake环境
env = gym.make('FrozenLake-v1', desc=None, map_name="4x4", is_slippery=True)
# 环境基本信息
print(f"观察空间: {env.observation_space}")
print(f"动作空间: {env.action_space}")
print(f"动作含义: 0=左 1=下 2=右 3=上")
# 随机策略运行
episodes = 1000
rewards = []
steps_list = []
success = 0
for ep in range(episodes):
state, _ = env.reset(seed=ep)
total_reward = 0
step = 0
done = False
while not done:
action = env.action_space.sample() # 随机策略
state, reward, terminated, truncated, info = env.step(action)
total_reward += reward
step += 1
done = terminated or truncated
rewards.append(total_reward)
steps_list.append(step)
if total_reward > 0:
success += 1
print(f"\\n随机策略统计 ({episodes}回合):")
print(f"成功率: {success/episodes*100:.1f}%")
print(f"平均步数: {np.mean(steps_list):.1f}")
print(f"平均奖励: {np.mean(rewards):.4f}")
print(f"奖励标准差: {np.std(rewards):.4f}")
# 保存结果
result = {
"episodes": episodes,
"success_rate": round(success/episodes*100, 1),
"avg_steps": round(np.mean(steps_list), 1),
"avg_reward": round(float(np.mean(rewards)), 4),
"success": success
}
with open("/var/www/ttl/rl/lesson01_result.json", "w") as f:
json.dump(result, f)
print("\\n✅验证通过 - 随机策略在FrozenLake上成功运行")
env.close()
# ============================================
# 扩展实验:不同地图配置对比
# ============================================
print("\n=== 扩展实验 ===")
for map_name in ["4x4", "8x8"]:
env2 = gym.make('FrozenLake-v1', map_name=map_name, is_slippery=True)
wins = 0
for ep in range(5000):
s, _ = env2.reset(seed=ep)
done = False
while not done:
a = env2.action_space.sample()
s, r, t, tr, _ = env2.step(a)
done = t or tr
if r > 0: wins += 1
print(f"{map_name}随机策略成功率: {wins/5000*100:.2f}%")
# slippery vs non-slippery
env3 = gym.make('FrozenLake-v1', map_name="4x4", is_slippery=False)
wins = 0
for ep in range(5000):
s, _ = env3.reset(seed=ep)
done = False
while not done:
a = env3.action_space.sample()
s, r, t, tr, _ = env3.step(a)
done = t or tr
if r > 0: wins += 1
print(f"4x4非滑行随机策略成功率: {wins/5000*100:.2f}%")
print("扩展实验完成 - ✅")
📝 算法伪代码:随机策略交互
输入: 环境env, 回合数N
输出: 平均奖励avg_reward
1. 初始化: total_reward = 0
2. FOR episode = 1 TO N:
3. state = env.reset()
4. done = False
5. WHILE NOT done:
6. action = 随机选择(env.action_space)
7. state, reward, done = env.step(action)
8. total_reward += reward
9. END WHILE
10. END FOR
11. avg_reward = total_reward / N
12. RETURN avg_reward
❓ 常见问题FAQ
Q: 强化学习和监督学习最大的区别是什么?
A: 监督学习有标签(标准答案),RL只有奖励信号(好坏的标量反馈)。RL需要探索来发现好的行为,而监督学习只需要拟合给定的输入-输出映射。
Q: 为什么需要折扣因子gamma?
A: 1)数学上保证无限长回合的回报有限;2)直觉上,未来的奖励不如现在的确定;3)gamma=1时某些任务不收敛。
Q: FrozenLake的is_slippery有什么影响?
A: is_slippery=True时,选择一个方向有1/3概率滑到垂直方向,增加了随机性,使得策略需要更鲁棒。这也使得随机策略的成功率从约50%降到约1.3%。
🏃 动手练习
练习1: 环境探索
修改FrozenLake地图(使用desc参数),观察随机策略在不同地图上的成功率变化
练习2: 策略改进
实现一个简单的启发式策略(如优先向目标方向移动),比较与随机策略的差异
练习3: 奖励分析
统计不同状态下获得奖励的概率分布,绘制热力图
📊 训练曲线说明
✅ 验证通过!实机运行结果:
- episodes: 1000
- success_rate: 2.3
- avg_steps: 7.7
- avg_reward: 0.023
- success: 23
完整数据: lesson01_result.json
🔬 关键公式推导
强化学习基础的数学基础
强化学习的理论基础建立在概率论和优化理论之上。以下推导展示了强化学习基础背后的核心数学原理:
回报定义: G_t = r_t + gamma * r_{t+1} + gamma^2 * r_{t+2} + ... = sum_{k=0}^{inf} gamma^k * r_{t+k}
值函数定义: V^pi(s) = E_pi[G_t | s_t = s]
动作值函数: Q^pi(s,a) = E_pi[G_t | s_t = s, a_t = a]
贝尔曼方程: V^pi(s) = sum_a pi(a|s) sum_{s'} P(s'|s,a) [R(s,a) + gamma * V^pi(s')]
最优贝尔曼: V*(s) = max_a sum_{s'} P(s'|s,a) [R(s,a) + gamma * V*(s')]
强化学习基础的收敛性分析
算法的收敛性是其理论保证的核心。对于强化学习基础:
- 学习率条件: sum alpha_t = infinity, sum alpha_t^2 < infinity
- 探索条件: 所有(s,a)对被无限次访问
- 收缩性: 贝尔曼算子是gamma-收缩映射
- 收敛速度: O(gamma^k) 或 O(1/sqrt(t))
强化学习基础的复杂度分析
| 维度 | 时间复杂度 | 空间复杂度 |
| 每步更新 | O(|S|) 或 O(batch_size) | O(|S|*|A|) 或 O(params) |
| 完整迭代 | O(|S|^2*|A|) 或 O(n_episodes) | O(|S|*|A|) 或 O(buffer_size) |
💡 理论与实践:理论收敛性保证了算法在大样本下能找到最优解,但实践中样本效率、训练稳定性和超参数敏感性同样重要。强化学习基础在这些方面的表现需要通过实验验证。
🎯 本课小结
本课深入讲解了强化学习基础的核心原理。关键要点:
- 理解算法的数学基础和推导过程
- 掌握代码实现的关键步骤
- 通过实验验证理论预测
- 了解算法的适用范围和局限性
🏆
成就解锁:强化学习概述
完成本课所有练习,掌握智能体(Agent)的核心原理