# Q-Learning算法
# 基本概念
Q-Learning是一种无模型(Model-Free)的强化学习算法,它通过学习动作值函数(Q函数)来找到最优策略。算法的核心思想是通过与环境的交互来更新Q值表,最终学习到在每个状态下应该采取什么动作才能获得最大的长期回报。
# 数学原理
# 1. Q函数定义
Q函数表示在状态s下采取动作a能够获得的期望累积奖励:
其中:
- 是状态-动作值函数
- 是即时奖励
- 是折扣因子(0到1之间)
- 是当前状态
- 是当前动作
# 2. 更新规则
Q-Learning使用时序差分(TD)学习方法,其更新公式为:
其中:
- 是学习率(0到1之间)
- 是即时奖励
- 是下一状态的最大Q值
# 3. 探索与利用
使用ε-贪心策略来平衡探索与利用:
其中:
- 是探索概率(0到1之间)
- 是动作空间的大小
# 算法步骤
初始化
- 创建Q表,所有状态-动作对的Q值初始化为0
- 设定超参数:学习率α、折扣因子γ、探索率ε
对每个回合:
- 初始化状态s
- 重复直到达到终止状态:
- 使用ε-贪心策略选择动作a
- 执行动作a,观察奖励r和新状态s'
- 更新Q值
- s ← s'
import numpy as np
class QLearning:
def __init__(self, n_states, n_actions, alpha=0.1, gamma=0.9, epsilon=0.1):
self.q_table = np.zeros((n_states, n_actions))
self.alpha = alpha # 学习率
self.gamma = gamma # 折扣因子
self.epsilon = epsilon # 探索率
def choose_action(self, state):
if np.random.random() > self.epsilon:
return np.argmax(self.q_table[state])
return np.random.randint(self.q_table.shape[1])
def learn(self, state, action, reward, next_state):
old_value = self.q_table[state, action]
next_max = np.max(self.q_table[next_state])
# Q-Learning更新公式
new_value = (1 - self.alpha) * old_value + \
self.alpha * (reward + self.gamma * next_max)
self.q_table[state, action] = new_value
# 优势特点
# 1. 离线学习
- 可以学习最优策略而不需要遵循它
- 支持离线批量学习
- 可以从随机策略中学习
# 2. 收敛性
- 在适当条件下保证收敛到最优策略
- 收敛速度相对较快
- 理论基础扎实
# 3. 简单直观
- 实现简单
- 易于理解和调试
- 计算效率高
# 应用场景
游戏AI
- 迷宫寻路
- 井字棋
- 简单电子游戏
机器人控制
- 路径规划
- 运动控制
- 任务调度
资源分配
- 网络路由
- 库存管理
- 能源调度
推荐系统
- 内容推荐
- 广告投放
- 用户交互
# 优缺点
# 优点
- 模型无关性
- 收敛性有保证
- 实现简单
- 效果稳定
# 缺点
- 状态空间大时效率低
- 离散动作空间限制
- 需要大量样本
- 探索效率不高
# 实践建议
# 1. 参数调优
- 学习率α不宜过大
- 折扣因子γ通常接近1
- ε随训练进程递减
# 2. 状态设计
- 选择关键特征
- 合理离散化
- 降低维度
# 3. 奖励设计
- 奖励稀疏性
- 奖励尺度
- 奖励延迟
# 4. 训练技巧
- 经验回放
- 优先级采样
- 目标网络
# 进阶优化
Double Q-Learning
- 解决过估计问题
- 提高学习稳定性
- 改进探索效率
Dueling Q-Network
- 分离状态值和优势函数
- 提高学习效率
- 更好的泛化性
优先级经验回放
- 基于TD误差采样
- 提高样本效率
- 加速收敛
多步Q-Learning
- 使用n步回报
- 权衡偏差和方差
- 提高学习效率