15 时序差分学习之Q学习的原理与实现
系列进度
强化学习入门 · 第 15 / 28 篇
整理说明
这篇内容怎么整理
郭震 · 2026-06-04
阅读路线
先按这条路线读
先抓住主线,再回到代码、配置和图文细节,读起来会更稳。
强化学习的核心是智能体在环境中试错,学习时要同时看状态、动作、奖励和策略更新。阅读时可以按「Q学习的基本原理 -> Q值更新公式 -> Q学习的特点 -> 算法实现」建立结构,再回到正文里的代码、案例或指标做验证。
读完后,用一个真实小任务复查:输入是什么,处理环节在哪里,输出是否可验收;失败时先查「Q学习的基本原理」,再查「Q值更新公式」。
在上一篇中,我们详细探讨了SARSA算法,这是一种基于时序差分学习的方法。接下来,我们将深入了解Q学习,这也是一种常用的时序差分学习算法。在这篇文章中,我们将重点讨论Q学习的原理、特点以及如何在Python中实现这一算法。
Q学习的基本原理
Q学习是一种无模型的强化学习算法,旨在学习一个策略,使得在一个给定的环境中智能体能够最大化其累积回报。它通过学习一个动作-价值函数,即Q函数,来实现这一目标。Q函数的定义为:
学习 Q 学习时,先看状态动作价值、即时奖励、最大下一动作价值、学习率、折扣因子和探索策略。
其中:
- 表示状态
- 表示动作
- 是时间 时所获得的即时回报
- 是折扣因子(通常在0和1之间)
- 是执行动作 后所到达的下一个状态
- 是在状态 下可选择的动作
Q学习的核心思想在于通过不断更新Q值,使其能够逼近真实的Q值,从而找到最优策略。
Q值更新公式
Q学习使用以下更新公式来调整Q值:
其中 是学习率,它决定了新经验对已有Q值的影响程度。
Q学习的特点
- 无模型:Q学习不需要环境的模型,即智能体不需要了解状态转移概率。
- 离线学习:Q学习可以基于经验回放进行学习,这意味着智能体可以利用历史经验来提高学习效率。
- 探索与利用平衡:Q学习通过 ε-greedy 策略来平衡探索与利用,智能体在选择动作时会随机选择某些动作以获得更多的经验。
读《时序差分学习之Q学习的原理与实现》时,可以先看配图里的任务、概念、练习和判断点,再回到正文补细节。这样更容易判断这篇内容能放到哪个真实场景里。
算法实现
接下来,我们将通过一个简单的网格环境案例,来实现Q学习算法。
环境设置
我们可以创建一个简单的5x5网格环境,智能体需要从起始位置(左下角)移动到目标位置(右上角)。
import numpy as np
import random
class GridWorld:
def __init__(self, grid_size):
self.grid_size = grid_size
self.state = (0, 0) # 起始位置
def reset(self):
self.state = (0, 0)
return self.state
def step(self, action):
if action == 0: # 上
next_state = (max(0, self.state[0] - 1), self.state[1])
elif action == 1: # 下
next_state = (min(self.grid_size[0] - 1, self.state[0] + 1), self.state[1])
elif action == 2: # 左
next_state = (self.state[0], max(0, self.state[1] - 1))
elif action == 3: # 右
next_state = (self.state[0], min(self.grid_size[1] - 1, self.state[1] + 1))
reward = 1 if next_state == (grid_size[0] - 1, grid_size[1] - 1) else 0
done = next_state == (grid_size[0] - 1, grid_size[1] - 1)
self.state = next_state
return next_state, reward, done
Q学习实现
现在我们将实现Q学习算法:
class QLearningAgent:
def __init__(self, grid_size, learning_rate=0.1, discount_factor=0.99, exploration_rate=1.0, exploration_decay=0.99):
self.grid_size = grid_size
self.q_table = np.zeros((*grid_size, 4)) # Q值表
self.alpha = learning_rate
self.gamma = discount_factor
self.epsilon = exploration_rate
self.epsilon_decay = exploration_decay
def choose_action(self, state):
if random.uniform(0, 1) < self.epsilon: # 探索
return random.randint(0, 3)
else: # 利用
return np.argmax(self.q_table[state])
def update_q_value(self, state, action, reward, next_state):
max_future_q = np.max(self.q_table[next_state])
current_q = self.q_table[state + (action,)]
# Q值更新
self.q_table[state + (action,)] = current_q + self.alpha * (reward + self.gamma * max_future_q - current_q)
def train(self, episodes):
for episode in range(episodes):
state = env.reset()
done = False
while not done:
action = self.choose_action(state)
next_state, reward, done = env.step(action)
self.update_q_value(state, action, reward, next_state)
state = next_state
# 衰减探索率
self.epsilon *= self.epsilon_decay
训练智能体
我们可以训练我们的智能体并观察结果:
grid_size = (5, 5)
env = GridWorld(grid_size)
agent = QLearningAgent(grid_size)
# 训练智能体
agent.train(1000)
# 打印最终的Q值表
print(agent.q_table)
如果《时序差分学习之Q学习的原理与实现》还没完全消化,可以从这张卡片的四个动作重新走一遍。
回看《时序差分学习之Q学习的原理与实现》时,不必一次做大项目,先用一条简单样例确认主线是否清楚。
小结
在本篇文章中,我们详细介绍了Q学习的原理与实现。通过创建一个简单的网格环境,我们成功实现了Q学习算法,并展示了如何通过行动与回报来不断更新Q值。Q学习的成功之处在于它能够在没有环境模型的情况下,通过与环境的交互自我学习最终实现最优策略。
在下一篇文章中,我们将深入探讨Q学习的详细应用和变种。在学习Q学习的过程中,您会发现它在强化学习中的重要性和广泛应用。希望您能将这些理论和实践相结合,加深对强化学习的理解。
继续阅读
从这篇继续找到相关教程
常见问题
读前先确认这三点
时序差分学习之Q学习的原理与实现适合谁读?
这是 强化学习入门 系列第 15 / 28 篇,适合正在学习强化学习入门,并且需要把概念落到操作步骤或判断标准里的读者。
读这篇强化学习入门教程要多久?
按中文技术文章阅读速度估算,通读大约 4 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。
这篇文章里的图文节点怎么用?
正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。
分享文章
转发到常用平台
微信/朋友圈可先复制链接
相关教程
从相近问题继续读
继续阅读