深度强化学习实战:基于Q-Learning的FrozenLake和Taxi游戏AI训练

深度强化学习实战:基于Q-Learning的FrozenLake和Taxi游戏AI训练

deep-rl-class This repo contains the Hugging Face Deep Reinforcement Learning Course. deep-rl-class 项目地址: https://gitcode.com/gh_mirrors/de/deep-rl-class

前言

本文将通过两个经典强化学习环境——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. ϵ-贪婪策略:平衡探索与利用

    • 以ϵ概率随机探索
    • 以1-ϵ概率利用当前最优策略
  2. Q值更新公式

    Q(s,a) ← Q(s,a) + α[r + γ max Q(s',a') - Q(s,a)]
    
    • α:学习率,控制更新幅度
    • γ:折扣因子,衡量未来奖励的重要性
  3. 探索率衰减:随着训练进行,逐渐减少探索,增加利用

模型评估与可视化

测试智能体

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

训练技巧

  1. 调整超参数

    • 增加训练回合数(建议50000+)
    • 调整学习率和折扣因子
  2. 奖励塑形

    • 可以修改环境奖励函数加速学习
  3. 高级探索策略

    • 使用Boltzmann探索代替ϵ-贪婪

常见问题解决

  1. 收敛慢

    • 增加学习率
    • 调整探索率衰减速度
  2. 次优策略

    • 增加训练回合数
    • 检查Q值更新是否正确
  3. 视频生成失败

    • 确保虚拟显示设置正确
    • 检查render_mode是否为"rgb_array"

结语

通过本教程,你已经掌握了:

  1. Q-Learning算法的核心原理
  2. 在Gymnasium环境中实现强化学习智能体
  3. 超参数调优的基本方法
  4. 训练过程的可视化技巧

下一步可以尝试:

  • 实现更复杂的DQN算法
  • 在Atari游戏等更复杂环境中应用
  • 研究多智能体强化学习

deep-rl-class This repo contains the Hugging Face Deep Reinforcement Learning Course. deep-rl-class 项目地址: https://gitcode.com/gh_mirrors/de/deep-rl-class

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宣苓滢Rosa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值