趋近智
Q-学习作为一种离策略、免模型、时序差分控制算法运行。它的目标是通过迭代更新基于经验转换的估计来找到最优动作价值函数Q∗。在这里,我们将逐步讲解使用Python实现Q-学习算法所需的核心组成部分。
我们在这里不会构建一个复杂环境;相反,我们将侧重于智能体的学习逻辑。假设我们有一个环境,它提供必要的交互:给定一个动作,它返回下一个状态、奖励和终止状态。许多强化学习库,如Gymnasium(原OpenAI Gym),都提供了这类标准化的环境接口。
表格型Q-学习的核心是Q表。它只是一个数据结构,通常是矩阵或字典,用于存储每个状态-动作对的估计动作价值Q(s,a)。如果我们的环境有∣S∣个状态和∣A∣个动作,Q表的维度将是∣S∣×∣A∣。
我们通常会乐观地或悲观地初始化Q表。一个常见方法是将所有Q值初始化为零。在Python中使用NumPy,代码如下:
import numpy as np
num_states = 10 # 示例:10个离散状态
num_actions = 4 # 示例:4个可能的动作
q_table = np.zeros((num_states, num_actions))
智能体通过与环境交互多个回合来学习。每个回合由多个步骤组成。以下是单个回合的流程:
我们来分解步骤2.d,即更新规则。
为确保智能体找到最优策略,它需要充分尝试环境,然后才能确定最佳已知动作。一个常见策略是epsilon-贪婪策略(ϵ-greedy):
import random
epsilon = 0.1 # 尝试率
# 假设'state'是当前状态的索引
if random.uniform(0, 1) < epsilon:
action = random.randint(0, num_actions - 1) # 尝试:选择一个随机动作索引
else:
action = np.argmax(q_table[state, :]) # 选择最优:根据Q表选择最佳动作索引
通常,ϵ初始值较高(例如1.0),并随回合逐渐降低(衰减),以便随着智能体学习更多而将平衡从尝试转向选择最优。
Q-学习的性能很大程度上取决于其超参数:
以下是Q-学习训练循环的Python结构:
# 超参数
learning_rate = 0.1
discount_factor = 0.99
epsilon = 1.0
epsilon_decay_rate = 0.001
min_epsilon = 0.01
num_episodes = 1000
# 假设'env'是一个已初始化的环境对象,具有以下方法:
# env.reset() -> 返回初始状态
# env.step(action) -> 返回next_state, reward, terminated, truncated, info
# env.observation_space.n -> 状态数量
# env.action_space.n -> 动作数量
num_states = env.observation_space.n
num_actions = env.action_space.n
q_table = np.zeros((num_states, num_actions))
rewards_per_episode = [] # 用于跟踪学习进度
for episode in range(num_episodes):
state, info = env.reset() # 获取初始状态(整数索引)
terminated = False
truncated = False
total_episode_reward = 0
while not terminated and not truncated:
# Epsilon-贪婪动作选择
if random.uniform(0, 1) < epsilon:
action = env.action_space.sample() # 尝试
else:
action = np.argmax(q_table[state, :]) # 选择最优
# 执行动作并观察结果
next_state, reward, terminated, truncated, info = env.step(action)
# Q-学习更新规则
best_next_action_value = np.max(q_table[next_state, :])
td_target = reward + discount_factor * best_next_action_value
td_error = td_target - q_table[state, action]
q_table[state, action] = q_table[state, action] + learning_rate * td_error
# 更新状态和总奖励
state = next_state
total_episode_reward += reward
# Epsilon衰减
epsilon = max(min_epsilon, epsilon - epsilon_decay_rate)
# 存储回合奖励(用于后续绘图)
rewards_per_episode.append(total_episode_reward)
if (episode + 1) % 100 == 0:
print(f"Episode {episode + 1}: Total Reward: {total_episode_reward}, Epsilon: {epsilon:.3f}")
print("训练完成。")
# 训练完成后,q_table包含了学习到的动作价值。
# 最优策略可以通过选择每个状态下具有最高Q值的动作来推导。
跟踪每回合总奖励等指标有助于了解智能体是否正在学习。绘制此图可以显示收敛情况。
智能体在每个训练回合中累积的总奖励。上升趋势通常表示学习成功。(显示示例数据)。
这个动手实践章节提供了实现Q-学习的结构和逻辑。您初始化了一个Q表,实现了核心更新循环,包含了Q-学习规则和epsilon-贪婪尝试,并考虑了超参数设置。通过在多个回合中运行此过程,智能体迭代地改进其Q值估计,最终学习到最大化累积奖励的策略。请记住,Q-学习是离策略的,这意味着即使它由于尝试而可能表现出次优行为,它也能学习到最优的Q∗函数。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造