强化学习踩坑记录
之前做强化学习项目时,从环境搭建到算法实现走了不少弯路,这里记录一下过程。
机器学习基础环境搭建
CentOS环境TensorFlow安装
Python 3.8安装
在CentOS 7/8上使用yum从第三方仓库安装Python 3.8:
1 | # 注册SCL仓库 |
TensorFlow安装
1 | pip install tensorflow |
安装验证
1 | import tensorflow as tf |
Anaconda环境配置
Anaconda是Python数据科学环境的一站式解决方案。
下载安装
推荐从清华大学开源软件镜像站下载:
1 | https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ |
环境变量配置
在Windows系统中,需要添加以下路径到系统环境变量:
1 | F:\anaconda |
配置方法:此电脑 - 右键属性 - 高级系统设置 - 环境变量 - 系统变量 - Path - 新建
验证安装
1 | conda --version |
Windows + PyCharm + Gym开发环境
完整环境搭建流程
Step 1: 安装Anaconda
按照前述步骤安装并配置Anaconda。
Step 2: 安装PyCharm
推荐使用PyCharm Community或Edu版本。
Step 3: 创建Conda虚拟环境
1 | # 创建新环境(Python 3.9) |
Step 4: 安装依赖库
1 | # 更新pandas |
Step 5: PyCharm中配置解释器
- File - Settings - Project: [项目名]
- Python Interpreter - Add Interpreter - Add Local Interpreter
- 左侧选择”Conda Environment”
- 选择已创建的gym_env环境
Gym框架测试代码
1 | import gym |
关键参数说明:
render_mode="human":显示游戏画面disable_env_checker=True:禁用环境检查器env.step()返回5个参数:观察值、奖励、是否终止、是否截断、信息
强化学习基础
强化学习核心概念
强化学习(Reinforcement Learning)是机器学习的一个重要分支,其核心思想是让智能体通过与环境的交互来学习最优策略。
核心要素:
- Agent(智能体):执行动作的决策者
- Environment(环境):智能体所处的外部世界
- State(状态):环境在某一时刻的描述
- Action(动作):智能体可以执行的操作
- Reward(奖励):环境对动作的反馈
- Policy(策略):状态到动作的映射
更新方式对比
单步更新 (Temporal Difference)
1 | 特点:每一步都更新Q值 |
典型算法: Q-Learning、Sarsa
回合更新 (Monte Carlo)
1 | 特点:整个回合结束后才更新 |
典型算法: 蒙特卡洛方法
Q-Learning算法
Q-Learning核心思想
Q-Learning是一种离策略(Off-Policy)的强化学习算法,其核心是维护一个Q表来存储状态-动作值函数。
核心公式:
1 | Q(s,a) = Q(s,a) + α[r + γ·maxQ(s',a') - Q(s,a)] |
其中:
α:学习率,控制更新步长γ:折扣因子,平衡当前和未来奖励maxQ(s',a'):下一状态的最大Q值
Off-Policy特性
Q-Learning是”说到但不一定做到”的算法:
- Off-Policy(离线学习):学习用的动作和实际执行的动作可以不同
- 探索与利用:使用ε-贪婪策略平衡探索和开发
- 勇敢型算法:因为有maxQ,总是选择最近的成功路径
Q-Learning实现要点
1 | import numpy as np |
Sarsa算法
Sarsa核心思想
Sarsa是一种在策略(On-Policy)的强化学习算法,与Q-Learning的关键区别在于更新方式。
核心公式:
1 | Q(s,a) = Q(s,a) + α[r + γ·Q(s',a') - Q(s,a)] |
与Q-Learning的区别:
- Q-Learning使用maxQ(s’,a’)(下一状态的最大Q值)
- Sarsa使用Q(s’,a’)(实际采取的下一动作的Q值)
On-Policy特性
Sarsa是”说到做到”的算法:
- On-Policy(在线学习):学习的动作和实际执行的动作一致
- 保守型算法:选择远离危险的路线,保命优先
- 安全性高:适合危险环境中的应用
Q-Learning vs Sarsa对比
| 特性 | Q-Learning | Sarsa |
|---|---|---|
| 策略类型 | Off-Policy | On-Policy |
| 更新方式 | maxQ(s’,a’) | Q(s’,a’) |
| 行为特点 | 勇敢,选择最短路径 | 保守,选择安全路径 |
| 适用场景 | 安全环境、追求效率 | 危险环境、安全第一 |
| 收敛速度 | 较快 | 较慢但更稳定 |
形象比喻:
- Q-Learning像勇敢的探险家,总是选择最近的成功道路,不管多危险
- Sarsa像谨慎的行者,保住小命最重要,拿宝藏是次要的
深度Q网络(DQN)
DQN核心创新
DeepMind团队通过DQN算法让计算机玩电动游戏超越人类水平,其核心创新是将神经网络与Q-Learning相结合。
核心思想:
1 | 传统Q-Learning:维护Q表,状态多时需要大量内存 |
神经网络替代Q表:
1 | 输入:状态s |
DQN两大核心技术
经验回放(Experience Replay)
1 | 机制: |
优势:
- 样本利用率提高
- 打破时间相关性
- 平滑数据分布
固定Q目标(Fixed Q-targets)
1 | 机制: |
优势:
- 减少训练过程中的震荡
- 提高学习稳定性
- 避免自举(Bootstrapping)问题
DQN算法流程
1 | class DQNAgent: |
强化学习进阶概念
探索与利用平衡
ε-贪婪策略
1 | def epsilon_greedy(q_values, epsilon): |
衰减ε-贪婪
1 | epsilon = max(min_epsilon, initial_epsilon * decay_rate ** episode) |
奖励塑形(Reward Shaping)
通过修改奖励函数来引导智能体学习:
1 | def shaped_reward(original_reward, state, action, next_state): |
实战应用案例
CartPole平衡问题
CartPole是强化学习的经典入门问题,目标是控制小车平衡倒立摆。
环境特性:
- 状态空间:4维连续值(位置、速度、角度、角速度)
- 动作空间:2个离散动作(左移、右移)
- 奖励:每存活一帧+1
- 终止条件:角度过大或位置超出范围
DQN解决方案要点:
- 神经网络输入4维状态
- 输出2个动作的Q值
- 使用经验回放和固定Q目标
- ε-贪婪策略平衡探索
Atari游戏
DeepMind使用DQN在Atari游戏上取得突破:
技术创新:
- 原始像素作为输入
- 卷积神经网络提取特征
- 帧堆叠处理时序信息
- 跳帧(Frame Skip)加速训练
学习资源推荐
在线教程
经典论文
- Playing Atari with Deep Reinforcement Learning (2013) - DQN开山之作
- Human-level control through deep reinforcement learning (2015) - Nature版DQN
- Double DQN (2015) - 解决过估计问题
- Dueling Network Architectures (2015) - 分离价值流和优势流
- Prioritized Experience Replay (2015) - 优先级经验回放
开源项目
- OpenAI Gym - 强化学习环境库
- Stable Baselines3 - 高质量强化学习实现
- RLlib - 大规模分布式强化学习
总结
强化学习是一个很有趣的方向,从简单的Q-Learning到DQN,再到更高级的算法如DDPG、PPO等,每一步都需要动手实践才能真正理解。建议从简单的CartPole开始,逐步深入。
参考资源: