强化学习:基础知识篇(包含Gym库的简单实践)——手把手教你入门强化学习(一)

前言

本期笔者将开启新的专栏--手把手教你入门强化学习强化学习正在改变人类社会的方方面面,像基于强化学习的游戏AI,AlphaGo,以及最近大火的Deepseek的GRPO算法等等。所以笔者希望能带领大家走入强化学习的世界,同样笔者会尽量以通俗易懂的语言带领大家入门强化学习,当然,我的栏目还是喜欢以实践为主,本教程依旧是从入门到实践,先会简单介绍强化学习基础概念,然后会以Gym(强化学习环境库)进行一个案例的实操。

一、什么是强化学习

在了解一个概念之前,我们必须先知道,它是什么,能帮我们解决什么问题以及它有什么优势。

首先它的基本定义是,智能体通过与环境的交互来学习如何采取动作,以最大化长期累积 的奖励。也就是说,强化学习希望智能体在一个环境中,随着"时间的流逝"​,不断地自我学习学习策略),并最终在这个环境中学到一套最为合理的行为策略(最大化奖励)。智能体可以是机器人或者Ai等等,环境是它所处的环境,可以是一局棋盘游戏,也可以是当前的路况等等。

知道了什么是强化学习,紧接着,它能帮我们解决什么问题,按照定义的说法,它能帮我解决贯序决策问题(也就是需要连续进行决策的问题)。那走迷宫,从起点走到终点,找到一条最优路的问题,肯定是贯序决策问题啊,我直接用算法建图,用最短路算法不就可以解决了,为什么要用强化学习呢?是不是啊,但是如果这个迷宫很复杂呢,每一步有上百种选择,如果我们还用传统算法,会发现根本解决不了,这是个NP问题。这时候,通过一系列科学的方法,对这类普适性问题进行体系性的求解方式和方法的归纳就是强化学习需要解决的问题。

最后我肯定想它有什么优势呢?

1 无需环境先验知识 :自适应的"试错学习",如果是传统方法解决dp问题,我需要提前知道地图的布局,障碍物等等,而强化学习可以处理未知环境的问题,如机器人探索火星地形等等。

2 处理高维或连续状态/动作空间 :若迷宫每一步有上百种选择,传统算法(如动态规划)会因"维度灾难"无法计算,而深度强化学习(如DQN)可以使用神经网络逼近Q值函数,处理图像等高维输入。

3 避免局部最优 :传统最短路径算法找到的路径可能是"理论最短",但若某些路径有潜在风险(如湿滑地面),但强化学习可以通过负奖励设计进行规避。
总结:如果是问题简单且静态,传统算法更高效;但如果是迷宫复杂、未知或动态变化的问题,强化学习能处理的更好。

二、基础概念

智能体和环境

强化学习的基础概念我们通过这张图来研究。

我们可以看到,整个系统分为智能体和环境两个部分。

• **智能体(agent)**是强化学习系统中的决策者和学习者,它可以做出决策和接受奖励信号。一个强化学习系统里可以有一个或多个智能体。我们并不需要对智能体本身进行建模,只需要了解它在不同环境下可以做出的动作,并接受奖励信号。

• **环境(environment)**是强化系统中除智能体以外的所有事物,它是智能体交互的对象。环境本身可以是确定性的,也可以是不确定性的。环境可能是已知的,也可能是未知的。我们可以对环境建模,也可以不对环境建模。

智能体和环境的交互

• 智能体观测环境,可以获得环境的观测(observation),记为O;

• 智能体根据观测做出决策,决定要对环境施加的动作(action),记为A;

• 环境受智能体动作的影响,改变自己的状态(state),记为S,并给出奖励(reward),记为R。

智能体通过观察环境得到观测和收到环境给的奖励 ,再根据策略 (强化学习需要学习的)给出相应的决策,采取下一步的动作,下一步的动作又会产生新的环境,新的环境又会产生新的观测和奖励。我们可以把这一过程一个序列来表示。
Ot→Rt→At→Ot+1→Rt+1→At+1

三、Gym简单实践

Gym是OpenAI团队开发的一个主要针对强化学习实验的开源项目。Gym库内置上百种实验环境,包括以下几类:

算法环境 :包括一些字符串处理等传统计算机算法的实验环境。

简单文本环境 :包括几个用文本表示的简单游戏。

经典控制环境 :包括一些简单几何体的运动,常用于经典强化学习算法的研究。

Atari游戏环境 :包括数十个Atari 2600游戏,具有像素化的图形界面,希望玩家尽可能争夺高分。

二维方块(Box2D)环境 :包括一些连续性控制的任务。

MuJoCo环境 :利用收费的MuJoCo运动引擎进行连续性控制任务。

机械控制环境:关于机械臂的抓取和控制等。

安装及简单使用

1 由于是简单实践,我们进行最小安装,完整版安装后面实践我们再装。

bash 复制代码
conda create -n RL python=3.9 -y
conda activate RL
pip install gym -i https://pypi.tuna.tsinghua.edu.cn/simple

2 安装好后,我们简单进行几个命令进行使用。

1)在python环境下,导入gym库

bash 复制代码
import gym

2)查看Gym库里有哪些环境

bash 复制代码
env_list = envs.registry.keys()
env_ids = [item for item in env_list]
env_ids

 3)取出环境

bash 复制代码
env = gym.make('CartPole-v0')

4)初始化环境对象env

bash 复制代码
env.reset()

ps:该调用返回的是智能体对于环境的初始观测

5)我们先查看一下动作空间,再从动作空间中我们随机抽样一个动作

bash 复制代码
env.action_space
action = env.action_space.sample()

ps:这表明动作空间是取{0,1}的int型数值。

5)将动作作为参数传给环境,表面智能体做出动作,环境需要改变状态。我们这里循环5次看一下状态变化。

bash 复制代码
for k in range(5):
    action = env.action_space.sample()
    state, reward, done, truncated, info = env.step(action)
    print('动作 = {0}: 当前状态 = {1}, 奖励 = {2}, 结束标志 = {3}, 日志信息 = {4}'.format(action, state, reward, done, info))

5)如果需要渲染环境的话,我们需要在创建环境的时候指定。

bash 复制代码
env = gym.make("CartPole-v0", render_mode="human")  

PS:

1 不能直接调用env.render()函数,因为从 gym==0.21.0 开始,渲染模式必须在创建环境时通过 render_mode 参数指定。

2 render_mode 有三个参数:
human (在人类显示器或终端上渲染)
rgb_array (返回像素图像的RGB阵列作为返回值)
ansi (将文本作为返回值返回)

5)简单示例 不过在这之前,由于我们之前是最小安装,在运行以下代码之前,我们需要安装一下gym[classic_control]

bash 复制代码
pip install gym[classic_control] -i https://pypi.tuna.tsinghua.edu.cn/simple
bash 复制代码
import gym

env = gym.make("CartPole-v0", render_mode="human")
observation, info = env.reset()

for _ in range(100):
    action = env.action_space.sample()
    observation, reward, terminated, truncated, info = env.step(action)
    
    if terminated or truncated:
        observation, info = env.reset()
env.close()

ps:由于笔者是远程服务器,没有如果是远程服务器的我们需要另辟蹊径,这里我就不尝试了,给大家一个思路。 使用 xvfb 创建虚拟显示

bash 复制代码
sudo apt-get install xvfb
xvfb-run -s "-screen 0 1024x768x24" python your_script.py

运行成功效果图

案例实现

接下来会带领大家通过一个完整的例子来学习如何与Gym库中的环境交互。选用的例子是经典的控制任务:小车上山(MountainCar-v0)。

1 编写智能体代码,也就是小车代码,需要两个函数,一是决策,而是学习(训练的时候)

python 复制代码
import gym
import numpy as np
class BaspokeAgent:
    def __init__(self, env):
        pass
    def decide(self, observation):#决策
        position, velocity = observation
        lb = np.minimum(-0.09 * (position + 0.25) ** 2 + 0.03, 0.3 * (position + 0.9) ** 4 - 0.008)
        up = -0.07 * (position + 0.38) ** 2 + 0.06
        if lb < velocity < up:
            action = 2
        else:
            action = 0
        return action # 返回动作
    def learn(self,*args): #学习
        pass

2 智能体和环境进行交互一回合,也即是小车移动,环境产生的变换,我们需要返回交互的奖励以及状态。

python 复制代码
def play_montecarlo(env, agent, train=False):
    episode_reward = 0.0 # 记录回合总奖励
    observation, _ = env.reset() # 重置游戏环境
    while True:
        action = agent.decide(observation) # 小车根据环境产生动作
        next_observation, reward, done, _, _= env.step(action) # 环境返回奖励和状态
        episode_reward += reward #记录总奖励
        if train:# 如果训练,更新策略
            argent.learn(observation,action,reward,done)
        if done:#如果到底最终状态,终止
            break
        observation = next_observation#状态更新
    return episode_reward #返回回合总奖励

3 进行交互100次,看策略的平均回合奖励。

python 复制代码
env = gym.make('MountainCar-v0')
agent = BaspokeAgent(env)
episode_rewards = [play_montecarlo(env, agent) for _ in range(100)]
print('平均回合奖励 = {}'.format(np.mean(episode_rewards)))

总结

本教程笔者先从基础知识入手,带领大家了解强化学习的基础概念,再逐步讲解使用gym强化学习实践,这一时刻,相信大家已经对强化学习有了基本概念,下一小节我将带领大家走进强化学习的重要数学模型(MDP),也就是大家熟知的马尔科夫决策(Markov 决策)

如果想要更深入强化学习的内容,关注我,下期更精彩


创作不易,求关注,点赞,收藏,谢谢~

相关推荐
Mr.Winter`1 天前
深度强化学习 | 基于优先级经验池的DQN算法(附Pytorch实现)
人工智能·pytorch·神经网络·机器学习·机器人·强化学习
wxchyy3 天前
强化学习:Markov决策过程(MDP)——手把手教你入门强化学习(二)
强化学习
deephub3 天前
SWEET-RL:基于训练时信息的多轮LLM代理强化学习框架
人工智能·大语言模型·强化学习
电力程序小学童4 天前
【强化学习】基于深度强化学习的微能源网能量管理与优化策略研究【Python】
python·强化学习·dqn·q学习·微能源网
Blossom.1184 天前
基于深度强化学习的智能机器人路径规划技术研究
深度学习·机器人·动态规划·人机交互·制造·强化学习·路径规划
Mu先生Ai世界6 天前
强化学习RL-NPC复杂奖励机制的陷阱与需求简化策略
强化学习
ModestCoder_7 天前
Ubuntu20.04系统安装IsaacSim4.5与IsaacLab环境
强化学习·具身智能
文弱_书生10 天前
关于强化学习小记
人工智能·神经网络·强化学习·马尔科夫决策
CH3_CH2_CHO10 天前
【机器学习】算法分类
算法·机器学习·强化学习·无监督学习·半监督学习·有监督学习