跳转至

01 - 什么是强化学习

⚠️ 时效性说明:本章涉及前沿模型/价格/榜单等信息,可能随版本快速变化;请以论文原文、官方发布页和 API 文档为准。

学习时间: 2小时 重要性: ⭐⭐⭐⭐⭐ 建立整体框架,理解核心思想


🎯 学习目标

完成本章后,你将能够: - 理解强化学习与其他机器学习范式的区别 - 掌握智能体-环境交互的基本框架 - 理解奖励、回报、策略、值函数等核心概念 - 了解强化学习的主要分类和应用场景


1. 强化学习简介

1.1 一句话定义

强化学习(Reinforcement Learning, RL)是让智能体(Agent)通过与环境(Environment)的交互,学习如何做出最优决策的机器学习方法。

1.2 核心思想(类比理解)

想象你在训练一只小狗:

Text Only
小狗(智能体)做对了动作 → 给零食(正奖励)
小狗做错了动作 → 不给零食或轻轻拍一下(负奖励)

经过反复训练,小狗学会:
- 什么情况下做什么动作
- 如何最大化获得零食的机会

强化学习就是让机器像小狗一样,通过"试错"来学习最优行为。

1.3 强化学习 vs 其他机器学习

Text Only
机器学习三大范式:

监督学习 (Supervised Learning)
├── 输入: 带有标签的数据
├── 目标: 学习输入到输出的映射
├── 例子: 图像分类、房价预测
└── 特点: 有"标准答案"

无监督学习 (Unsupervised Learning)
├── 输入: 无标签的数据
├── 目标: 发现数据的内在结构
├── 例子: 聚类、降维
└── 特点: 没有"正确答案"

强化学习 (Reinforcement Learning) ← 我们在这里
├── 输入: 环境反馈的奖励信号
├── 目标: 学习最大化累积奖励的策略
├── 例子: 玩游戏、机器人控制
└── 特点: 通过试错学习,延迟奖励

1.4 详细对比

特性 监督学习 无监督学习 强化学习
数据 有标签 (x, y) 无标签 (x) 状态、动作、奖励
反馈 即时、正确 延迟、稀疏
目标 最小化预测误差 发现模式 最大化累积奖励
数据分布 固定 固定 非平稳(策略变化)
样本 独立同分布 独立同分布 序列相关
应用 分类、回归 聚类、降维 游戏、机器人、决策

2. 智能体-环境交互框架

2.1 核心组件

Text Only
┌─────────────────────────────────────────────────────────────────┐
│                    强化学习交互循环                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│    ┌─────────┐          动作 a           ┌──────────┐          │
│    │         │ ────────────────────────→ │          │          │
│    │  Agent  │                           │Environment│          │
│    │ (智能体) │ ←──────────────────────── │  (环境)   │          │
│    │         │    新状态 s' + 奖励 r      │          │          │
│    └─────────┘                           └──────────┘          │
│         ↑                                    │                   │
│         └────────────────────────────────────┘                   │
│                        状态转移                                  │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

2.2 关键概念详解

智能体 (Agent)

  • 定义:做决策的主体
  • 例子:游戏AI、机器人、推荐系统
  • 组成
  • 策略(Policy):决定做什么动作
  • 值函数(Value Function):评估状态/动作的好坏
  • 模型(Model):对环境的预测(可选)

环境 (Environment)

  • 定义:智能体所处的外部世界
  • 例子:游戏世界、物理世界、金融市场
  • 功能
  • 接收智能体的动作
  • 返回新的状态
  • 给出奖励信号

状态 (State, s)

  • 定义:环境在某一时刻的完整描述
  • 例子
  • 棋盘游戏的当前局面
  • 机器人的传感器读数
  • 股票的当前价格
  • 注意:状态应该是充分的(包含做决策所需的所有信息)

动作 (Action, a)

  • 定义:智能体可以执行的操作
  • 类型
  • 离散动作:有限的选项(如:上、下、左、右)
  • 连续动作:实数值(如:方向盘角度、油门力度)

奖励 (Reward, r)

  • 定义:环境给智能体的即时反馈信号
  • 特点
  • 标量值(正、负或零)
  • 稀疏性:很多情况下奖励很少(如围棋只有最后一步有奖励)
  • 延迟性:当前动作的影响可能很久后才体现

2.3 交互流程示例

以CartPole游戏为例:

Text Only
时间步 t:
┌─────────────────────────────────────────────────────────────┐
│  状态 s_t: [小车位置, 小车速度, 杆角度, 杆角速度]            │
│       ↓                                                     │
│  智能体观察 s_t,根据策略选择动作 a_t(左或右)              │
│       ↓                                                     │
│  执行动作,环境返回:                                        │
│    - 新状态 s_{t+1}                                         │
│    - 奖励 r_t(保持平衡+1,倾倒0)                           │
│       ↓                                                     │
│  智能体更新策略,目标是最大化累积奖励                        │
└─────────────────────────────────────────────────────────────┘

3. 核心数学概念

3.1 策略 (Policy, π)

定义:策略是智能体的行为规则,决定在给定状态下采取什么动作。

Text Only
确定性策略: π(s) = a
  - 输入状态,输出确定的动作
  - 例如:如果车在左边,一定向右推

随机策略: π(a|s) = P(A=a | S=s)
  - 输入状态,输出动作的概率分布
  - 例如:80%概率向右,20%概率向左

3.2 回报 (Return, G)

定义:从某一时刻开始的累积奖励。

\[G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + ... = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1}\]

其中: - \(G_t\):从时刻t开始的回报 - \(R_{t+k}\):时刻t+k的奖励 - \(\gamma\):折扣因子(0 ≤ γ ≤ 1)

折扣因子的作用

Text Only
γ = 0:  只关心即时奖励(贪婪)
γ = 0.9: 关心长期奖励,但越远权重越小
γ = 1:  同等对待所有未来奖励(可能不收敛)

直观理解:
- γ小:短视,只看眼前
- γ大:有远见,考虑未来

3.3 值函数 (Value Function)

状态值函数 V(s)

定义:从状态s开始,按照策略π的期望回报。

\[V^\pi(s) = E_\pi[G_t | S_t = s]\]

直观理解:站在状态s,按照当前策略走下去,平均能拿到多少回报。

动作值函数 Q(s, a)

定义:在状态s执行动作a,然后按照策略π的期望回报。

\[Q^\pi(s, a) = E_\pi[G_t | S_t = s, A_t = a]\]

直观理解:站在状态s,先执行动作a,然后按照策略走下去,平均能拿到多少回报。

V和Q的关系

Text Only
V^π(s) = Σ π(a|s) * Q^π(s, a)   (对所有动作加权平均)

如果策略是确定性的:
V^π(s) = Q^π(s, π(s))

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 无模型

Text Only
基于模型 (Model-Based RL)
├── 学习环境的动力学模型
│   - P(s'|s,a): 状态转移概率
│   - R(s,a): 奖励函数
├── 使用模型进行规划
│   - 模拟未来,选择最优动作
├── 优点:样本效率高
└── 缺点:模型可能不准确

无模型 (Model-Free RL) ← 更常用
├── 直接学习策略或值函数
├── 不需要显式建模环境
├── 优点:通用性强,无需建模
└── 缺点:样本效率低

4.2 基于值函数 vs 基于策略

Text Only
基于值函数 (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

Text Only
On-Policy(同策略)
├── 学习当前正在执行的策略
├── 用当前策略收集的数据来改进当前策略
├── 代表算法:SARSA, PPO
└── 特点:简单,但样本效率低

Off-Policy(异策略)
├── 学习的目标策略与执行的策略不同
├── 可以用旧数据学习新策略
├── 代表算法:Q-Learning, DQN
└── 特点:样本效率高,更复杂

5. 应用场景

5.1 游戏AI

Text Only
经典案例:
├── AlphaGo / AlphaZero (围棋、国际象棋)
├── OpenAI Five (Dota 2)
├── AlphaStar (星际争霸II)
└── Atari游戏 (DQN)

为什么适合RL:
- 有明确的胜负(奖励信号)
- 需要长期规划
- 状态空间巨大

5.2 机器人控制

Text Only
应用场景:
├── 机械臂抓取
├── 双足行走
├── 无人机飞行
└── 自动驾驶

挑战:
- 连续动作空间
- 样本收集昂贵(真实世界)
- 安全性要求高

5.3 推荐系统

Text Only
应用场景:
├── 新闻推荐
├── 视频推荐
├── 商品推荐

RL优势:
- 考虑长期用户满意度
- 平衡探索(新内容)和利用(已知好内容)
- 处理延迟反馈

5.4 其他应用

  • 金融交易:投资组合优化、高频交易
  • 资源调度:数据中心、网络流量
  • 对话系统:ChatGPT使用RLHF进行对齐
  • 化学/药物发现:分子设计

6. 代码示例:第一个RL程序

让我们用一个简单的例子来理解RL的基本流程:

Python
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()

输出示例

Text Only
状态空间: Box([-4.8 -inf -0.418 -inf], [4.8 inf 0.418 inf], (4,), float32)
动作空间: Discrete(2)
随机策略平均奖励: 22.45

说明: - CartPole-v1的目标是保持杆子不倒 - 随机策略平均只能坚持约22步 - 我们的目标是训练一个智能体,能够坚持500步(环境最大值)


7. 本章总结

核心概念回顾

Text Only
强化学习 = 智能体 + 环境 + 奖励

关键概念:
├── 状态 (State): 环境的当前情况
├── 动作 (Action): 智能体的选择
├── 奖励 (Reward): 环境的即时反馈
├── 策略 (Policy): 智能体的决策规则
├── 值函数 (Value): 状态的长期价值
└── 回报 (Return): 累积奖励

核心问题:
如何学习一个策略,使得长期累积奖励最大化?

学习路径

Text Only
下一步学习:
├── 马尔可夫决策过程(MDP)- 形式化建模
├── 贝尔曼方程 - 值函数的递归关系
├── 动态规划 - 求解最优策略
└── 蒙特卡洛方法 - 从经验中学习

✅ 自测问题

  1. 强化学习与监督学习的主要区别是什么?

  2. 为什么需要折扣因子γ?如果不使用会怎样?

  3. V(s)和Q(s,a)的区别和联系是什么?

  4. 基于值函数和基于策略的方法各有什么优缺点?

  5. On-Policy和Off-Policy的区别是什么?各举一个例子。


📚 延伸阅读

推荐资源

  1. Sutton & Barto《Reinforcement Learning: An Introduction》
  2. 第1章:Introduction
  3. 第3章:Finite Markov Decision Processes

  4. David Silver的RL课程(YouTube)

  5. Lecture 1: Introduction to Reinforcement Learning

  6. Hugging Face Deep RL Course

  7. Unit 1: Introduction to Deep Reinforcement Learning

🛠️ 实践练习:Grid World环境

练习1:实现简单的Grid World

让我们从零开始实现一个简单的Grid World环境,这是理解RL的最好方式。

Python
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:策略改进实验

尝试实现以下策略,观察哪种策略最快到达终点:

Python
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,并回到起点 - 观察这对策略的影响

Python
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