从零开始:强化学习新手入门与环境搭建实战指南
强化学习(Reinforcement Learning, RL)不同于监督学习,它不依赖静态数据集,而是让智能体(Agent)通过与环境(Environment)的持续交互,利用“试错”机制最大化累积奖励来学习策略 。本文将带你完成从理论认知到本地环境搭建,再到运行第一个“走迷宫”案例的全过程。
以下内容仅为本人早期的学习过程和ai创作使用,若有问题请及时指出。
一、核心概念:极简认知框架
在动手写代码前,需明确强化学习的五大核心要素,这是理解后续代码逻辑的基础:
| 核心要素 | 英文标识 | 通俗解释 | 类比案例(走迷宫) |
|---|---|---|---|
| 智能体 | Agent | 学习的主体,做出决策的角色 | 迷宫中的小方块 |
| 环境 | Environment | 智能体所处的外部世界 | 5x5 的迷宫地图(含墙壁、终点) |
| 状态 | State | 当前时刻环境的快照 | 小方块当前的坐标位置 (x, y) |
| 动作 | Action | 智能体可以执行的操作 | 上、下、左、右移动 |
| 奖励 | Reward | 执行动作后获得的即时反馈 | 到达终点 +10,撞墙 -5,每步 -0.1 |
注:强化学习的目标是找到一个策略(Policy),使得智能体在长期互动中获得的累积奖励最大,这与有监督学习中最小化预测误差的逻辑截然不同 。
二、环境搭建:本地开发环境配置
对于新手而言,版本兼容性是最大的拦路虎。推荐使用 Anaconda 管理虚拟环境,并固定关键库的版本以避免报错。
1. 创建虚拟环境
打开终端(Terminal)或命令提示符(CMD),执行以下命令创建名为 rl_env 的独立环境,指定 Python 版本为 3.8(兼容性最佳):
# 创建名为 rl_env 的虚拟环境,指定 Python 3.8
conda create -n rl_env python=3.8 -y
# 激活环境
conda activate rl_env
2. 安装核心依赖库
我们需要安装 gym(提供标准测试环境)、numpy(数值计算)和 matplotlib(可视化绘图)。为防止网络问题导致安装失败,建议指定国内镜像源,并锁定 gym 版本为 0.26.2 以规避高版本的接口变动问题 :
# 使用清华源安装指定版本的 gym 及基础库
pip install gym==0.26.2 numpy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
若需进阶物理模拟(如机器人控制),可后续安装 Mujoco,但入门阶段上述库已足够 。
三、实战演练:Q-Learning 走迷宫案例
我们将实现一个经典的表格型 Q-Learning 算法,让智能体在一个 5x5 的迷宫中学习从起点走到终点。
1. 案例逻辑设计
- 奖励机制:到达终点奖励 +10,撞墙惩罚 -5,每走一步消耗 -0.1(鼓励最短路径)。
- 算法核心:维护一个 Q 表(Q-Table),记录在每种状态下采取每个动作的预期收益,通过不断更新 Q 值来优化策略。
2. 完整代码实现
新建文件 maze_ql.py,将以下代码复制进去。该代码包含了环境定义、Q-Learning 训练循环及结果可视化。
import numpy as np
import gym
import matplotlib.pyplot as plt
# --- 1. 自定义简单的迷宫环境 (基于 Gym 接口简化版) ---
class MazeEnv:
def __init__(self, size=5):
self.size = size
self.start_pos = (0, 0)
self.end_pos = (4, 4)
self.walls = [(1, 1), (1, 2), (2, 2), (3, 1)] # 障碍物坐标
self.reset()
self.action_space = [0, 1, 2, 3] # 0:上,1:下,2:左,3:右
def reset(self):
self.agent_pos = list(self.start_pos)
return tuple(self.agent_pos)
def step(self, action):
# 根据动作更新位置
if action == 0: self.agent_pos[0] -= 1 # 上
elif action == 1: self.agent_pos[0] += 1 # 下
elif action == 2: self.agent_pos[1] -= 1 # 左
elif action == 3: self.agent_pos[1] += 1 # 右
# 边界检查
self.agent_pos[0] = max(0, min(self.size-1, self.agent_pos[0]))
self.agent_pos[1] = max(0, min(self.size-1, self.agent_pos[1]))
pos_tuple = tuple(self.agent_pos)
# 奖励逻辑
if pos_tuple in self.walls:
reward = -5
done = False
# 撞墙后退回原位(简化处理)
if action == 0: self.agent_pos[0] += 1
elif action == 1: self.agent_pos[0] -= 1
elif action == 2: self.agent_pos[1] += 1
elif action == 3: self.agent_pos[1] -= 1
elif pos_tuple == self.end_pos:
reward = 10
done = True
else:
reward = -0.1 # 每一步的惩罚,鼓励快速到达
done = False
return tuple(self.agent_pos), reward, done
# --- 2. Q-Learning 算法核心 ---
class QLearningAgent:
def __init__(self, actions, learning_rate=0.1, discount_factor=0.9, epsilon=0.9):
self.q_table = {} self.actions = actions
self.lr = learning_rate
self.gamma = discount_factor
self.epsilon = epsilon
def get_q_value(self, state, action):
if state not in self.q_table:
self.q_table[state] = np.zeros(len(self.actions))
return self.q_table[state][action]
def choose_action(self, state):
# epsilon-greedy 策略:大部分时间选最优,偶尔随机探索
if np.random.uniform() < self.epsilon:
if state not in self.q_table:
self.q_table[state] = np.zeros(len(self.actions))
# 选择 Q 值最大的动作
return int(np.argmax(self.q_table[state]))
else:
return np.random.choice(self.actions)
def learn(self, state, action, reward, next_state, done):
if state not in self.q_table:
self.q_table[state] = np.zeros(len(self.actions))
if next_state not in self.q_table:
self.q_table[next_state] = np.zeros(len(self.actions))
q_predict = self.get_q_value(state, action)
if done:
q_target = reward
else:
q_target = reward + self.gamma * np.max(self.q_table[next_state])
# 更新公式:Q(s,a) = Q(s,a) + lr * (target - predict)
self.q_table[state][action] += self.lr * (q_target - q_predict)
# --- 3. 训练与可视化主流程 ---
def train_and_plot(): env = MazeEnv()
agent = QLearningAgent(actions=env.action_space)
episodes = 500 # 训练回合数
rewards_per_episode = []
print("开始训练...")
for ep in range(episodes): state = env.reset()
total_reward = 0
done = False
while not done:
action = agent.choose_action(state)
next_state, reward, done = env.step(action)
agent.learn(state, action, reward, next_state, done)
state = next_state
total_reward += reward
rewards_per_episode.append(total_reward) if (ep + 1) % 100 == 0:
print(f"回合 {ep+1}, 平均奖励:{np.mean(rewards_per_episode[-100:]):.2f}")
# 绘制学习曲线
plt.figure(figsize=(10, 6))
plt.plot(rewards_per_episode)
plt.title('Q-Learning Training Process (Maze)')
plt.xlabel('Episode')
plt.ylabel('Total Reward')
plt.grid(True)
plt.show()
print("训练完成,窗口显示学习曲线。")
if __name__ == "__main__":
train_and_plot()
3. 运行与结果解读
在终端运行 python maze_ql.py。你将看到一张折线图:
- 初期:奖励值波动大且多为负数(智能体在随机乱撞)。
- 后期:曲线逐渐上升并稳定在较高正值(智能体学会了避开墙壁并直达终点)。
四、进阶路线与资源推荐
掌握基础表格型方法后,可按以下路径深入:1. 深度学习结合 (Deep RL):当状态空间过大(如图像输入)无法使用 Q 表时,需引入神经网络。推荐从 DQN (Deep Q-Network) 开始,尝试玩 Atari 游戏 。
2. 主流算法:逐步学习 PPO (近端策略优化)、SAC 等更强大的策略梯度算法,这些是目前工业界的主流 。
3. 工具升级:
* Stable Baselines3:封装好的高质量 RL 算法库,适合快速实验 。
* Google Colab:若本地显卡性能不足,可利用其免费 GPU 资源运行深度强化学习项目 。
推荐学习资料:
- 📘 经典教材:《Reinforcement Learning: An Introduction》(Sutton & Barto)
- 🎓 视频课程:李宏毅教授强化学习公开课(中文讲解深入浅出)、吴恩达 Coursera 课程 。
- 🌐 实践指南:OpenAI Spinning Up (官方最佳实践文档) 。
引用来源:
本文内容综合参考了 CSDN 关于《动手学强化学习》的实战指南 、华为云关于 Mujoco 及环境配置的详细教程 、博客园提供的走迷宫代码实例 、Bilibili 关于强化学习基础定义的解析 以及 CSDN 关于入门路径与资源推荐的综述文章 。
参考来源
- [通俗易懂]《动手学强化学习》实战指南1-第1章 强化学习初体验-CSDN博客
- 强化学习环境配置指南:Mujoco、Mujoco_py、D4RL、gym、d3rlpy及Pycharm远程连接配置详解
- 强化学习入门教程 - wangya216 - 博客园
- 强化学习1:基础入门篇
- 强化学习怎么入门?从零开始入门强化学习!看这篇就够了_强化学习怎么学-CSDN博客
15万+

被折叠的 条评论
为什么被折叠?



