基于“蘑菇书”的强化学习知识点(九):强化学习中的Q-learning算法
强化学习中的Q-learning算法
强化学习中的Q-learning算法
摘要
本系列知识点讲解基于蘑菇书EasyRL中的内容进行详细的疑难点分析!具体内容请阅读蘑菇书EasyRL!
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+γa′maxQ∗(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+γa′maxQ(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+γmaxa′Q(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+γmaxa′Q(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') maxa′Q(St+1,a′) 进行更新,而不管当前策略是否会选择这个动作。
3. Q-learning 算法步骤
Q-learning 通过 交互(探索)、更新、收敛 三个阶段来学习最优策略:
(1)初始化
- 初始化所有状态-动作对的 Q ( s , a ) Q(s,a) Q(s,a),通常设为
0或随机小值。 - 设定 学习率 α \alpha α,折扣因子 γ \gamma γ,探索率 ϵ \epsilon ϵ(用于 ε-贪心策略)。
(2)与环境交互
- 从起始状态 S 0 S_0 S0 开始。
- 使用 ε-贪心策略选择动作 A t A_t At:
- 以概率 1 − ϵ 1-\epsilon 1−ϵ 选择 Q 值最高的动作(利用)。
- 以概率 ϵ \epsilon ϵ 选择随机动作(探索)。
- 执行 A t A_t At,环境返回奖励 R t + 1 R_{t+1} Rt+1 和新状态 S t + 1 S_{t+1} St+1。
(3)更新 Q 值
- 使用 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+γa′maxQ(St+1,a′)−Q(St,At))
(4)继续交互,直到到达终止状态
- 更新状态:设定 S t ← S t + 1 S_t \leftarrow S_{t+1} St←St+1。
- 如果达到终止状态,则重置环境,回到步骤 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+γa′maxQ(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+γa′maxQ(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. 总结
- Q-learning 通过迭代更新 Q 值来学习最优策略。
- 它使用
max(Q(S_{t+1}, a'))进行更新,而不是当前策略的动作(这就是 off-policy)。 - 与 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') maxa′Q(St+1,a′) 进行更新。
- Q-learning 更容易找到全局最优策略,但可能更不稳定。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)