01 - 什么是强化学习¶
⚠️ 时效性说明:本章涉及前沿模型/价格/榜单等信息,可能随版本快速变化;请以论文原文、官方发布页和 API 文档为准。
学习时间: 2小时 重要性: ⭐⭐⭐⭐⭐ 建立整体框架,理解核心思想
🎯 学习目标¶
完成本章后,你将能够: - 理解强化学习与其他机器学习范式的区别 - 掌握智能体-环境交互的基本框架 - 理解奖励、回报、策略、值函数等核心概念 - 了解强化学习的主要分类和应用场景
1. 强化学习简介¶
1.1 一句话定义¶
强化学习(Reinforcement Learning, RL)是让智能体(Agent)通过与环境(Environment)的交互,学习如何做出最优决策的机器学习方法。
1.2 核心思想(类比理解)¶
想象你在训练一只小狗:
强化学习就是让机器像小狗一样,通过"试错"来学习最优行为。
1.3 强化学习 vs 其他机器学习¶
机器学习三大范式:
监督学习 (Supervised Learning)
├── 输入: 带有标签的数据
├── 目标: 学习输入到输出的映射
├── 例子: 图像分类、房价预测
└── 特点: 有"标准答案"
无监督学习 (Unsupervised Learning)
├── 输入: 无标签的数据
├── 目标: 发现数据的内在结构
├── 例子: 聚类、降维
└── 特点: 没有"正确答案"
强化学习 (Reinforcement Learning) ← 我们在这里
├── 输入: 环境反馈的奖励信号
├── 目标: 学习最大化累积奖励的策略
├── 例子: 玩游戏、机器人控制
└── 特点: 通过试错学习,延迟奖励
1.4 详细对比¶
| 特性 | 监督学习 | 无监督学习 | 强化学习 |
|---|---|---|---|
| 数据 | 有标签 (x, y) | 无标签 (x) | 状态、动作、奖励 |
| 反馈 | 即时、正确 | 无 | 延迟、稀疏 |
| 目标 | 最小化预测误差 | 发现模式 | 最大化累积奖励 |
| 数据分布 | 固定 | 固定 | 非平稳(策略变化) |
| 样本 | 独立同分布 | 独立同分布 | 序列相关 |
| 应用 | 分类、回归 | 聚类、降维 | 游戏、机器人、决策 |
2. 智能体-环境交互框架¶
2.1 核心组件¶
┌─────────────────────────────────────────────────────────────────┐
│ 强化学习交互循环 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ 动作 a ┌──────────┐ │
│ │ │ ────────────────────────→ │ │ │
│ │ Agent │ │Environment│ │
│ │ (智能体) │ ←──────────────────────── │ (环境) │ │
│ │ │ 新状态 s' + 奖励 r │ │ │
│ └─────────┘ └──────────┘ │
│ ↑ │ │
│ └────────────────────────────────────┘ │
│ 状态转移 │
│ │
└─────────────────────────────────────────────────────────────────┘
2.2 关键概念详解¶
智能体 (Agent)¶
- 定义:做决策的主体
- 例子:游戏AI、机器人、推荐系统
- 组成:
- 策略(Policy):决定做什么动作
- 值函数(Value Function):评估状态/动作的好坏
- 模型(Model):对环境的预测(可选)
环境 (Environment)¶
- 定义:智能体所处的外部世界
- 例子:游戏世界、物理世界、金融市场
- 功能:
- 接收智能体的动作
- 返回新的状态
- 给出奖励信号
状态 (State, s)¶
- 定义:环境在某一时刻的完整描述
- 例子:
- 棋盘游戏的当前局面
- 机器人的传感器读数
- 股票的当前价格
- 注意:状态应该是充分的(包含做决策所需的所有信息)
动作 (Action, a)¶
- 定义:智能体可以执行的操作
- 类型:
- 离散动作:有限的选项(如:上、下、左、右)
- 连续动作:实数值(如:方向盘角度、油门力度)
奖励 (Reward, r)¶
- 定义:环境给智能体的即时反馈信号
- 特点:
- 标量值(正、负或零)
- 稀疏性:很多情况下奖励很少(如围棋只有最后一步有奖励)
- 延迟性:当前动作的影响可能很久后才体现
2.3 交互流程示例¶
以CartPole游戏为例:
时间步 t:
┌─────────────────────────────────────────────────────────────┐
│ 状态 s_t: [小车位置, 小车速度, 杆角度, 杆角速度] │
│ ↓ │
│ 智能体观察 s_t,根据策略选择动作 a_t(左或右) │
│ ↓ │
│ 执行动作,环境返回: │
│ - 新状态 s_{t+1} │
│ - 奖励 r_t(保持平衡+1,倾倒0) │
│ ↓ │
│ 智能体更新策略,目标是最大化累积奖励 │
└─────────────────────────────────────────────────────────────┘
3. 核心数学概念¶
3.1 策略 (Policy, π)¶
定义:策略是智能体的行为规则,决定在给定状态下采取什么动作。
确定性策略: π(s) = a
- 输入状态,输出确定的动作
- 例如:如果车在左边,一定向右推
随机策略: π(a|s) = P(A=a | S=s)
- 输入状态,输出动作的概率分布
- 例如:80%概率向右,20%概率向左
3.2 回报 (Return, G)¶
定义:从某一时刻开始的累积奖励。
其中: - \(G_t\):从时刻t开始的回报 - \(R_{t+k}\):时刻t+k的奖励 - \(\gamma\):折扣因子(0 ≤ γ ≤ 1)
折扣因子的作用:
γ = 0: 只关心即时奖励(贪婪)
γ = 0.9: 关心长期奖励,但越远权重越小
γ = 1: 同等对待所有未来奖励(可能不收敛)
直观理解:
- γ小:短视,只看眼前
- γ大:有远见,考虑未来
3.3 值函数 (Value Function)¶
状态值函数 V(s)¶
定义:从状态s开始,按照策略π的期望回报。
直观理解:站在状态s,按照当前策略走下去,平均能拿到多少回报。
动作值函数 Q(s, a)¶
定义:在状态s执行动作a,然后按照策略π的期望回报。
直观理解:站在状态s,先执行动作a,然后按照策略走下去,平均能拿到多少回报。
V和Q的关系¶
3.4 最优策略与最优值函数¶
最优策略 π*:在所有策略中,能够获得最大期望回报的策略。
最优状态值函数: $\(V^*(s) = \max_\pi V^\pi(s)\)$
最优动作值函数: $\(Q^*(s, a) = \max_\pi Q^\pi(s, a)\)$
关键洞察: - 如果知道了 \(Q^*(s, a)\),最优策略就是:\(\pi^*(s) = \arg\max_a Q^*(s, a)\) - 这就是Q-Learning的核心思想!
4. 强化学习的分类¶
4.1 基于模型 vs 无模型¶
基于模型 (Model-Based RL)
├── 学习环境的动力学模型
│ - P(s'|s,a): 状态转移概率
│ - R(s,a): 奖励函数
├── 使用模型进行规划
│ - 模拟未来,选择最优动作
├── 优点:样本效率高
└── 缺点:模型可能不准确
无模型 (Model-Free RL) ← 更常用
├── 直接学习策略或值函数
├── 不需要显式建模环境
├── 优点:通用性强,无需建模
└── 缺点:样本效率低
4.2 基于值函数 vs 基于策略¶
基于值函数 (Value-Based)
├── 学习值函数 V(s) 或 Q(s,a)
├── 策略是隐式的(如ε-贪婪)
├── 适合离散动作
├── 代表算法:Q-Learning, DQN
└── 优点:样本效率高,稳定
基于策略 (Policy-Based)
├── 直接学习策略 π(a|s)
├── 可以处理连续动作
├── 代表算法:REINFORCE, PPO
└── 优点:收敛性好,适合连续空间
Actor-Critic
├── 结合两者优势
├── Actor:策略网络
├── Critic:值函数网络
├── 代表算法:A2C, A3C, SAC
└── 优点:平衡了稳定性和效率
4.3 On-Policy vs Off-Policy¶
On-Policy(同策略)
├── 学习当前正在执行的策略
├── 用当前策略收集的数据来改进当前策略
├── 代表算法:SARSA, PPO
└── 特点:简单,但样本效率低
Off-Policy(异策略)
├── 学习的目标策略与执行的策略不同
├── 可以用旧数据学习新策略
├── 代表算法:Q-Learning, DQN
└── 特点:样本效率高,更复杂
5. 应用场景¶
5.1 游戏AI¶
经典案例:
├── AlphaGo / AlphaZero (围棋、国际象棋)
├── OpenAI Five (Dota 2)
├── AlphaStar (星际争霸II)
└── Atari游戏 (DQN)
为什么适合RL:
- 有明确的胜负(奖励信号)
- 需要长期规划
- 状态空间巨大
5.2 机器人控制¶
5.3 推荐系统¶
5.4 其他应用¶
- 金融交易:投资组合优化、高频交易
- 资源调度:数据中心、网络流量
- 对话系统:ChatGPT使用RLHF进行对齐
- 化学/药物发现:分子设计
6. 代码示例:第一个RL程序¶
让我们用一个简单的例子来理解RL的基本流程:
import numpy as np
import gymnasium as gym
# 创建环境
env = gym.make('CartPole-v1')
# 查看环境信息
print(f"状态空间: {env.observation_space}")
print(f"动作空间: {env.action_space}")
# 随机策略的完整episode
def random_policy_episode():
state, info = env.reset()
total_reward = 0
done = False
while not done:
# 随机选择动作
action = env.action_space.sample()
# 执行动作
next_state, reward, terminated, truncated, info = env.step(action)
done = terminated or truncated
total_reward += reward
state = next_state
return total_reward
# 测试随机策略
rewards = [random_policy_episode() for _ in range(100)]
print(f"随机策略平均奖励: {np.mean(rewards):.2f}")
env.close()
输出示例:
状态空间: Box([-4.8 -inf -0.418 -inf], [4.8 inf 0.418 inf], (4,), float32)
动作空间: Discrete(2)
随机策略平均奖励: 22.45
说明: - CartPole-v1的目标是保持杆子不倒 - 随机策略平均只能坚持约22步 - 我们的目标是训练一个智能体,能够坚持500步(环境最大值)
7. 本章总结¶
核心概念回顾¶
强化学习 = 智能体 + 环境 + 奖励
关键概念:
├── 状态 (State): 环境的当前情况
├── 动作 (Action): 智能体的选择
├── 奖励 (Reward): 环境的即时反馈
├── 策略 (Policy): 智能体的决策规则
├── 值函数 (Value): 状态的长期价值
└── 回报 (Return): 累积奖励
核心问题:
如何学习一个策略,使得长期累积奖励最大化?
学习路径¶
✅ 自测问题¶
-
强化学习与监督学习的主要区别是什么?
-
为什么需要折扣因子γ?如果不使用会怎样?
-
V(s)和Q(s,a)的区别和联系是什么?
-
基于值函数和基于策略的方法各有什么优缺点?
-
On-Policy和Off-Policy的区别是什么?各举一个例子。
📚 延伸阅读¶
推荐资源¶
- Sutton & Barto《Reinforcement Learning: An Introduction》
- 第1章:Introduction
-
第3章:Finite Markov Decision Processes
-
David Silver的RL课程(YouTube)
-
Lecture 1: Introduction to Reinforcement Learning
-
Hugging Face Deep RL Course
- Unit 1: Introduction to Deep Reinforcement Learning
🛠️ 实践练习:Grid World环境¶
练习1:实现简单的Grid World¶
让我们从零开始实现一个简单的Grid World环境,这是理解RL的最好方式。
import numpy as np
import random
class SimpleGridWorld:
"""
简单的网格世界环境
4x4网格:
S . . .
. . . .
. . . .
. . . G
S = 起点 (0,0)
G = 终点 (3,3),到达后获得奖励+1
其他格子奖励为0
"""
def __init__(self, size=4):
self.size = size
self.start_pos = (0, 0)
self.goal_pos = (size-1, size-1)
self.reset()
def reset(self):
"""重置环境,返回初始状态和info"""
self.agent_pos = self.start_pos
return self._get_state(), {}
def _get_state(self):
"""将位置转换为状态编号"""
return self.agent_pos[0] * self.size + self.agent_pos[1]
def step(self, action):
"""
执行动作,返回 (next_state, reward, terminated, truncated, info)
动作: 0=上, 1=下, 2=左, 3=右
"""
x, y = self.agent_pos
# 根据动作移动
if action == 0: # 上
x = max(0, x - 1)
elif action == 1: # 下
x = min(self.size - 1, x + 1)
elif action == 2: # 左
y = max(0, y - 1)
elif action == 3: # 右
y = min(self.size - 1, y + 1)
self.agent_pos = (x, y)
# 计算奖励
if self.agent_pos == self.goal_pos:
reward = 1.0
done = True
else:
reward = 0.0
done = False
return self._get_state(), reward, done, False, {}
def render(self):
"""可视化当前状态"""
grid = np.full((self.size, self.size), '.')
grid[self.goal_pos] = 'G'
grid[self.agent_pos] = 'A'
print('\n'.join([' '.join(row) for row in grid]))
print()
# 测试环境
env = SimpleGridWorld(size=4)
print("初始状态:")
env.render()
# 随机策略运行一个episode
state, _ = env.reset()
total_reward = 0
done = False
steps = 0
print("随机策略运行:")
while not done and steps < 20:
action = random.randint(0, 3) # 随机选择动作
next_state, reward, terminated, truncated, _ = env.step(action)
done = terminated or truncated
total_reward += reward
steps += 1
action_names = ['上', '下', '左', '右']
print(f"步骤 {steps}: 动作={action_names[action]}, 奖励={reward}")
env.render()
print(f"总奖励: {total_reward}, 总步数: {steps}")
练习2:手动计算值函数¶
对于上面的Grid World,假设有一个简单的策略:总是向右或向下移动(各50%概率)。
问题: 1. 从起点(0,0)到终点(3,3)的最短路径是多少步? 2. 在这个随机策略下,平均需要多少步才能到达终点? 3. 你能手动计算出每个状态的V(s)吗?
练习3:策略改进实验¶
尝试实现以下策略,观察哪种策略最快到达终点:
def greedy_policy(state, env):
"""
贪婪策略:总是向终点方向移动
"""
x, y = env.agent_pos
goal_x, goal_y = env.goal_pos
# 计算应该移动的方向
if x < goal_x:
return 1 # 下
elif x > goal_x:
return 0 # 上
elif y < goal_y:
return 3 # 右
else:
return 2 # 左
# 测试贪婪策略
env = SimpleGridWorld(size=4)
state, _ = env.reset()
total_reward = 0
done = False
steps = 0
print("贪婪策略运行:")
while not done and steps < 20:
action = greedy_policy(state, env)
next_state, reward, terminated, truncated, _ = env.step(action)
done = terminated or truncated
total_reward += reward
steps += 1
action_names = ['上', '下', '左', '右']
print(f"步骤 {steps}: 动作={action_names[action]}")
env.render()
print(f"贪婪策略总步数: {steps}")
练习4:添加障碍物¶
修改Grid World,在网格中添加一些障碍物: - 障碍物位置:(1,1), (1,2), (2,1) - 碰到障碍物奖励-1,并回到起点 - 观察这对策略的影响
class GridWorldWithObstacles(SimpleGridWorld):
def __init__(self, size=4):
super().__init__(size) # super()调用父类方法
self.obstacles = [(1, 1), (1, 2), (2, 1)]
def step(self, action):
next_state, reward, done, truncated, info = super().step(action)
# 检查是否碰到障碍物
if self.agent_pos in self.obstacles:
reward = -1.0
self.agent_pos = self.start_pos # 回到起点
done = False
return self._get_state(), reward, done, False, {}
def render(self):
"""可视化(包含障碍物)"""
grid = np.full((self.size, self.size), '.')
for obs in self.obstacles:
grid[obs] = 'X'
grid[self.goal_pos] = 'G'
grid[self.agent_pos] = 'A'
print('\n'.join([' '.join(row) for row in grid]))
print()
准备好进入下一阶段了吗? 下一章我们将学习如何用数学语言形式化描述RL问题——马尔可夫决策过程(MDP)。
→ 下一步:02-马尔可夫决策过程.md