深度强化学习实战:基于Q-Learning的FrozenLake和Taxi游戏AI训练
前言
本文将通过两个经典强化学习环境——FrozenLake(冰湖)和Taxi(出租车),手把手教你实现Q-Learning算法。我们将从零开始构建一个能够自主学习的AI智能体,最终让它在这两个环境中表现出色。
环境准备
虚拟显示设置
由于我们需要在Colab中渲染环境并录制视频,首先需要设置虚拟显示:
!sudo apt-get update
!sudo apt-get install -y python3-opengl
!apt install ffmpeg xvfb
!pip3 install pyvirtualdisplay
from pyvirtualdisplay import Display
virtual_display = Display(visible=0, size=(1400, 900))
virtual_display.start()
依赖安装
我们需要安装以下关键库:
gymnasium
: 提供强化学习环境numpy
: 用于处理Q表imageio
: 用于生成回放视频
import numpy as np
import gymnasium as gym
import random
import imageio
FrozenLake环境解析
环境特性
FrozenLake是一个网格世界环境,具有以下特点:
- 状态空间:离散的16个状态(4x4网格)
- 动作空间:4个离散动作(上、下、左、右)
- 奖励机制:
- 到达目标:+1
- 掉入冰洞:0
- 走在冰面:0
创建环境
我们使用4x4的非滑动版本(确定性环境):
env = gym.make("FrozenLake-v1",
map_name="4x4",
is_slippery=False,
render_mode="rgb_array")
Q-Learning算法实现
Q表初始化
Q表是一个二维数组,行代表状态,列代表动作:
state_space = env.observation_space.n
action_space = env.action_space.n
qtable = np.zeros((state_space, action_space))
超参数设置
total_episodes = 10000 # 训练总回合数
learning_rate = 0.8 # 学习率
max_steps = 99 # 每回合最大步数
gamma = 0.95 # 折扣因子
# 探索参数
epsilon = 1.0 # 初始探索率
max_epsilon = 1.0 # 最大探索率
min_epsilon = 0.01 # 最小探索率
decay_rate = 0.001 # 探索率衰减率
训练过程
rewards = []
for episode in range(total_episodes):
state = env.reset()[0]
step = 0
done = False
total_rewards = 0
for step in range(max_steps):
# ϵ-贪婪策略选择动作
if random.uniform(0,1) > epsilon:
action = np.argmax(qtable[state,:])
else:
action = env.action_space.sample()
# 执行动作
new_state, reward, done, truncated, info = env.step(action)
# Q值更新
qtable[state, action] = qtable[state, action] + learning_rate * (
reward + gamma * np.max(qtable[new_state,:]) - qtable[state, action]
)
total_rewards += reward
state = new_state
if done:
break
# 探索率衰减
epsilon = min_epsilon + (max_epsilon - min_epsilon)*np.exp(-decay_rate*episode)
rewards.append(total_rewards)
算法解析
-
ϵ-贪婪策略:平衡探索与利用
- 以ϵ概率随机探索
- 以1-ϵ概率利用当前最优策略
-
Q值更新公式:
Q(s,a) ← Q(s,a) + α[r + γ max Q(s',a') - Q(s,a)]
- α:学习率,控制更新幅度
- γ:折扣因子,衡量未来奖励的重要性
-
探索率衰减:随着训练进行,逐渐减少探索,增加利用
模型评估与可视化
测试智能体
env = gym.make("FrozenLake-v1",
map_name="4x4",
is_slippery=False,
render_mode="rgb_array")
frames = []
total_rewards = 0
state = env.reset()[0]
for step in range(max_steps):
action = np.argmax(qtable[state,:])
new_state, reward, done, info = env.step(action)
total_rewards += reward
frames.append(env.render())
state = new_state
if done:
break
print(f"Total rewards: {total_rewards}")
生成回放视频
imageio.mimsave("frozenlake.gif", frames, fps=10)
Taxi环境进阶
Taxi环境比FrozenLake更复杂:
- 状态空间:500个离散状态
- 动作空间:6个动作(上下左右、接送乘客)
- 奖励机制:
- 成功送达:+20
- 每步惩罚:-1
- 非法操作:-10
训练技巧
-
调整超参数:
- 增加训练回合数(建议50000+)
- 调整学习率和折扣因子
-
奖励塑形:
- 可以修改环境奖励函数加速学习
-
高级探索策略:
- 使用Boltzmann探索代替ϵ-贪婪
常见问题解决
-
收敛慢:
- 增加学习率
- 调整探索率衰减速度
-
次优策略:
- 增加训练回合数
- 检查Q值更新是否正确
-
视频生成失败:
- 确保虚拟显示设置正确
- 检查render_mode是否为"rgb_array"
结语
通过本教程,你已经掌握了:
- Q-Learning算法的核心原理
- 在Gymnasium环境中实现强化学习智能体
- 超参数调优的基本方法
- 训练过程的可视化技巧
下一步可以尝试:
- 实现更复杂的DQN算法
- 在Atari游戏等更复杂环境中应用
- 研究多智能体强化学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考