摘要

本系列知识点讲解基于蘑菇书EasyRL中的内容进行详细的疑难点分析!具体内容请阅读蘑菇书EasyRL


对应蘑菇书EasyRL——3.4 免模型控制


Q-learning 算法详细推导与示例

1. Q-learning 简介

Q-learning 是强化学习中的基于时序差分(Temporal Difference, TD)的方法之一,用于学习最优策略。它是一种 off-policy 学习算法,意味着它可以学习最优策略,而不一定遵循当前策略进行探索

Q-learning 的核心思想

Q-learning 通过迭代更新 状态-动作值函数 Q ( s , a ) Q(s, a) Q(s,a)逼近最优状态-动作值函数
Q ∗ ( s , a ) = max ⁡ π Q π ( s , a ) Q^*(s,a) = \max_{\pi} Q^\pi(s,a) Q(s,a)=πmaxQπ(s,a)
其中:

  • Q ∗ ( s , a ) Q^*(s,a) Q(s,a) 是在最优策略下,采取动作 a a a 之后能获得的最大期望累积奖励。
  • 我们希望找到最优策略 π ∗ \pi^* π,使得智能体在每个状态 s s s 选择的动作 a a a 能获得最大的长期回报。

2. Q-learning 公式推导

(1)Q 值的 Bellman 公式

强化学习的目标是最大化累积折扣奖励
G t = R t + 1 + γ R t + 2 + γ 2 R t + 3 + … G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \dots Gt=Rt+1+γRt+2+γ2Rt+3+
其中:

  • R t + 1 R_{t+1} Rt+1 是执行 A t A_t At 后获得的即时奖励。
  • γ ∈ [ 0 , 1 ] \gamma \in [0,1] γ[0,1] 是折扣因子(决定未来奖励的重要性)。

在马尔可夫决策过程中(MDP),最优 Q 值满足 Bellman 最优方程
Q ∗ ( s , a ) = E [ R t + 1 + γ max ⁡ a ′ Q ∗ ( S t + 1 , a ′ ) ∣ S t = s , A t = a ] Q^*(s,a) = \mathbb{E} \left[ R_{t+1} + \gamma \max_{a'} Q^*(S_{t+1}, a') \mid S_t = s, A_t = a \right] Q(s,a)=E[Rt+1+γamaxQ(St+1,a)St=s,At=a]

  • 这表示:如果我们从状态 s s s 采取动作 a a a,我们将获得奖励 R t + 1 R_{t+1} Rt+1,并且下一步会转移到 S t + 1 S_{t+1} St+1
  • 在新状态 S t + 1 S_{t+1} St+1 处,我们假设智能体会采取最优动作 a ′ a' a
  • 所以,Q-learning 通过不断逼近这个公式,最终学得最优策略。

(2)Q-learning 迭代更新公式

我们使用时序差分方法,通过采样来估计 Q ∗ ( s , a ) Q^*(s,a) Q(s,a)
Q ( S t , A t ) ← Q ( S t , A t ) + α ( R t + 1 + γ max ⁡ a ′ Q ( S t + 1 , a ′ ) − Q ( S t , A t ) ) Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha \left( R_{t+1} + \gamma \max_{a'} Q(S_{t+1}, a') - Q(S_t, A_t) \right) Q(St,At)Q(St,At)+α(Rt+1+γamaxQ(St+1,a)Q(St,At))
其中:

  • α \alpha α 是学习率(决定学习的步长)。
  • R t + 1 + γ max ⁡ a ′ Q ( S t + 1 , a ′ ) R_{t+1} + \gamma \max_{a'} Q(S_{t+1}, a') Rt+1+γmaxaQ(St+1,a) 称为 Q-learning 目标(TD 目标)。
  • R t + 1 + γ max ⁡ a ′ Q ( S t + 1 , a ′ ) − Q ( S t , A t ) R_{t+1} + \gamma \max_{a'} Q(S_{t+1}, a') - Q(S_t, A_t) Rt+1+γmaxaQ(St+1,a)Q(St,At) 称为 TD 误差(TD Error)。

区别于 Sarsa:

  • 在 Sarsa 中,我们使用当前策略选择的 A t + 1 A_{t+1} At+1 来更新 Q 值。
  • 在 Q-learning 中,我们使用 最大 Q 值 max ⁡ a ′ Q ( S t + 1 , a ′ ) \max_{a'} Q(S_{t+1}, a') maxaQ(St+1,a) 进行更新,而不管当前策略是否会选择这个动作。

3. Q-learning 算法步骤

Q-learning 通过 交互(探索)、更新、收敛 三个阶段来学习最优策略:

(1)初始化

  1. 初始化所有状态-动作对的 Q ( s , a ) Q(s,a) Q(s,a),通常设为 0 或随机小值。
  2. 设定 学习率 α \alpha α折扣因子 γ \gamma γ探索率 ϵ \epsilon ϵ(用于 ε-贪心策略)。

(2)与环境交互

  1. 从起始状态 S 0 S_0 S0 开始
  2. 使用 ε-贪心策略选择动作 A t A_t At
    • 以概率 1 − ϵ 1-\epsilon 1ϵ 选择 Q 值最高的动作(利用)。
    • 以概率 ϵ \epsilon ϵ 选择随机动作(探索)。
  3. 执行 A t A_t At,环境返回奖励 R t + 1 R_{t+1} Rt+1 和新状态 S t + 1 S_{t+1} St+1

(3)更新 Q 值

  1. 使用 Q-learning 公式更新 Q ( S t , A t ) Q(S_t, A_t) Q(St,At)
    Q ( S t , A t ) ← Q ( S t , A t ) + α ( R t + 1 + γ max ⁡ a ′ Q ( S t + 1 , a ′ ) − Q ( S t , A t ) ) Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha \left( R_{t+1} + \gamma \max_{a'} Q(S_{t+1}, a') - Q(S_t, A_t) \right) Q(St,At)Q(St,At)+α(Rt+1+γamaxQ(St+1,a)Q(St,At))

(4)继续交互,直到到达终止状态

  1. 更新状态:设定 S t ← S t + 1 S_t \leftarrow S_{t+1} StSt+1
  2. 如果达到终止状态,则重置环境,回到步骤 3。

4. 具体示例

(1)网格世界(Grid World)

假设:

  • 智能体在 3 × 3 3 \times 3 3×3 的网格中移动(上、下、左、右)。
  • 目标:到达终点 ( 2 , 2 ) (2,2) (2,2)
  • 采取每个动作的奖励 R = − 1 R = -1 R=1(每走一步消耗 1)。
  • 终点奖励 R = 10 R = 10 R=10

(2)Q-learning 运行示例

第一步
  • 初始状态 S 0 = ( 0 , 0 ) S_0 = (0,0) S0=(0,0)
  • ε-贪心选择动作 A 0 = 右 A_0 = \text{右} A0=
  • 执行 A 0 A_0 A0,环境返回:
    • 新状态 S 1 = ( 0 , 1 ) S_1 = (0,1) S1=(0,1)
    • 奖励 R 1 = − 1 R_1 = -1 R1=1
  • 更新 Q 值:
    Q ( S 0 , A 0 ) ← Q ( S 0 , A 0 ) + α ( − 1 + γ max ⁡ a ′ Q ( S 1 , a ′ ) − Q ( S 0 , A 0 ) ) Q(S_0, A_0) \leftarrow Q(S_0, A_0) + \alpha (-1 + \gamma \max_{a'} Q(S_1, a') - Q(S_0, A_0)) Q(S0,A0)Q(S0,A0)+α(1+γamaxQ(S1,a)Q(S0,A0))
第二步
  • 选择 A 1 A_1 A1(假设是向下)
  • 执行 A 1 A_1 A1,环境返回:
    • 新状态 S 2 = ( 1 , 1 ) S_2 = (1,1) S2=(1,1)
    • 奖励 R 2 = − 1 R_2 = -1 R2=1
  • 更新 Q 值:
    Q ( S 1 , A 1 ) ← Q ( S 1 , A 1 ) + α ( − 1 + γ max ⁡ a ′ Q ( S 2 , a ′ ) − Q ( S 1 , A 1 ) ) Q(S_1, A_1) \leftarrow Q(S_1, A_1) + \alpha (-1 + \gamma \max_{a'} Q(S_2, a') - Q(S_1, A_1)) Q(S1,A1)Q(S1,A1)+α(1+γamaxQ(S2,a)Q(S1,A1))

5. Q-learning 代码实现

import numpy as np

# 创建 Q-table
Q = {}
for i in range(3):
    for j in range(3):
        Q[(i,j)] = {"up": 0, "down": 0, "left": 0, "right": 0}

# 训练参数
alpha = 0.1
gamma = 0.9
epsilon = 0.1

# 训练过程
for episode in range(1000):
    state = (0,0)  # 初始状态
    while state != (2,2):
        action = max(Q[state], key=Q[state].get) if np.random.rand() > epsilon else np.random.choice(["up", "down", "left", "right"])
        next_state, reward = env.step(action)
        Q[state][action] += alpha * (reward + gamma * max(Q[next_state].values()) - Q[state][action])
        state = next_state  # 更新状态

6. 总结

  1. Q-learning 通过迭代更新 Q 值来学习最优策略。
  2. 它使用 max(Q(S_{t+1}, a')) 进行更新,而不是当前策略的动作(这就是 off-policy)。
  3. 与 Sarsa 的区别
    • Sarsa 是 on-policy,使用 Q ( S t + 1 , A t + 1 ) Q(S_{t+1}, A_{t+1}) Q(St+1,At+1) 进行更新。
    • Q-learning 是 off-policy,使用 max ⁡ a ′ Q ( S t + 1 , a ′ ) \max_{a'} Q(S_{t+1}, a') maxaQ(St+1,a) 进行更新。
  4. Q-learning 更容易找到全局最优策略,但可能更不稳定。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐