跳至主要内容

使用 Gymnasium 的强化学习:实用指南

理解强化学习(RL)的基础知识,并探索 Gymnasium 软件包,以 Python 构建与测试 RL 算法。
· 15分钟 阅读

使用 AI 探索

Reinforcement Learning(强化学习,RL)是三大机器学习范式之一,另外两种是监督学习和无监督学习。在 RL 中,智能体通过与环境交互,学习如何最大化累计回报。它通过试错在不同环境条件下学习最优动作。基于人类反馈的强化学习(RLHF)允许智能体在每一步根据人类输入调整行为。

RL 可用于解决自动驾驶、自动化交易、电子游戏中的电脑玩家、机器人训练等问题。当用深度神经网络来实现 RL 算法时,称为深度强化学习。

在本教程中,我将带您上手 Gymnasium——一个用于开发和对比强化学习算法的开源 Python 库。我会演示如何进行安装配置、探索各种 RL 环境,并使用 Python 构建一个简单的智能体来实现 RL 算法。

什么是 Gymnasium?

Gymnasium 是一个支持 RL 算法开发的开源 Python 库。为促进 RL 的研究与开发,Gymnasium 提供:

  • 丰富多样的环境,从简单游戏到模拟真实场景的问题。
  • 简化的 API 和包装器,便于与环境交互。
  • 创建自定义环境的能力,并可充分利用 API 框架。

开发者可以构建 RL 算法,并通过 API 调用执行如下任务:

  • 将智能体选择的动作传递给环境。
  • 在每个动作后获取环境状态与回报。
  • 训练模型。
  • 测试模型性能。

OpenAI 的 Gym 与 Farama 的 Gymnasium

OpenAI 并未在 Gym 的开发上投入大量资源,因为这并非其业务优先事项。由此成立了 Farama Foundation,以在长期内对 RL 库进行标准化与维护。Gymnasium 是 Farama Foundation 对 OpenAI Gym 的分支。Gymnasium 0.26.2 可与 Gym 0.26.2 无缝替换。通过该分支,Farama 计划为所有 API 调用增添函数式(除类式外)方法、支持向量化环境,并改进包装器。总体目标是让框架更简洁高效。

安装与配置 Gymnasium

Gymnasium 需要特定版本(非最新)的多种依赖程序,例如 NumPy 和 PyTorch。因此,我们建议创建全新的 Conda 或 venv 环境,或使用全新的笔记本来安装、使用 Gymnasium,并运行 RL 程序。

您可以使用此 DataLab 工作簿来配合教程动手实践。

安装 Gymnasium

在服务器或本地机器上安装 Gymnasium,运行:

$ pip install gymnasium 

在 Google Colab 或 DataLab 等 Notebook 中安装,使用:

!pip install gymnasium

上述命令会安装 Gymnasium 及其正确版本的依赖。

探索 Gymnasium 环境

截至 2024 年 11 月,Gymnasium 内置了 60 多个环境。要浏览可用的内置环境,可使用 gym.envs.registry.all() 函数,如下例所示:

import gymnasium as gym
for i in gym.envs.registry.keys():
	print(i)

您也可以访问 Gymnasium 主页。左侧栏列出了所有环境的链接。每个环境的页面都包含其详细信息,如动作、状态等。

环境被组织为 Classic Control、Box2D 等类别。下面我列出每组中的一些常见环境:

  • Classic Control:这些是 RL 开发中的经典环境;许多教材示例都以此为基础。它们在复杂性与简洁性之间取得平衡,适合测试和评估新 RL 算法。Gymnasium 中的经典控制环境包括:
    • Acrobot
    • Cart Pole
    • Mountain Car Discrete
    • Mountain Car Continuous
    • Pendulum
  • Box2D:Box2D 是一个用于游戏的 2D 物理引擎。基于该引擎的环境包括以下简单游戏:
    • Lunar Lander
    • Car Racing
  • ToyText:这些是小而简单的环境,常用于调试 RL 算法。许多环境基于小型网格世界模型和简单纸牌游戏。示例包括:
    • Blackjack
    • Taxi
    • Frozen Lake
  • MuJoCo:Multi-Joint dynamics with Contact(MuJoCo)是一个开源物理引擎,可模拟机器人、生物力学、机器学习等应用的环境。Gymnasium 中的 MuJoCo 环境包括:
    • Ant
    • Hopper
    • Humanoid
    • Swimmer
    • 等等

除了内置环境外,Gymnasium 还可使用相同 API 与许多外部环境配合。

在本教程中,我们将使用一个经典控制的典型环境。要导入特定环境,使用 .make() 命令,并将环境名称作为参数传入。例如,要基于 CartPole(版本 1)创建一个新环境,使用下方命令:

import gymnasium as gym
env = gym.make("CartPole-v1")

在 Gymnasium 中理解强化学习概念

简而言之,强化学习由一个与环境交互的智能体(如机器人)组成。策略决定智能体的动作。根据智能体的动作,环境在每个时间步给出回报(或惩罚)。智能体通过 RL 找到能最大化累计回报的最优策略。

RL 环境的组成部分

RL 环境的关键组成部分如下:

  • 环境: 外部系统、世界或语境。智能体以一系列时间步与环境交互。在每个时间步中,基于智能体的动作,环境会:
    • 给出回报(或惩罚)
    • 决定下一状态
  • 状态:对环境当前配置的数学表示。
    • 例如,在摆环境中,状态可包含每个时间步摆的位置和角速度。
    • 终止状态:不会再通向新状态的状态。
  • 智能体: 观察环境并据此采取动作的算法。智能体的目标是最大化回报。
    • 例如,智能体决定以多大力度、向哪个方向推摆。
  • 观测: 智能体通过传感器等方式获得的对环境的数学表征。
  • 动作: 智能体在进入下一步前做出的决策。该动作会影响环境的下一状态,并为智能体带来回报。
  • 回报: 环境对智能体的反馈。根据动作与环境状态,回报可为正或负。
  • 回报总和(Return): 未来各时间步累计回报的期望值。未来时间步的回报可用折扣因子折扣。
  • 策略: 智能体在各状态下采取何种动作的策略。通常以概率矩阵P 表示,将状态映射为动作。
    • 给定有限的 m 个可能状态与 n 个可能动作,矩阵元素 Pmn 表示在状态 sm 下采取动作 an 的概率。
  • 回合(Episode): 从(随机化的)初始状态到达到终止状态的一系列时间步。

观测空间与动作空间

观测是智能体获取的关于环境的信息。例如,机器人可以通过传感器收集环境信息。理想情况下,智能体应能观察到完整状态,涵盖环境的全部方面。在实践中,智能体以观测作为状态的替代。因此,观测决定了智能体的动作。

一个空间类似于数学集合。类型为 X 的空间包含 X 的所有可能实例。该空间也定义了所有 X 项的结构(语法与格式)。每个 Gymnasium 环境都有两个空间:动作空间 action_space 与观测空间 observation_space。二者均派生自父类 gymnasium.spaces.Space。

观测空间

观测空间包含所有可能的观测,也定义了观测的存储格式。观测空间通常表示为数据类型 Box 的对象。这是一个 ndarray,用于描述观测的参数。Box 指定了每个维度的取值范围。可以使用 observation_space 方法查看某个环境的观测空间:

print("observation space: ", env.observation_space)

对于 CartPole-v1 环境,输出类似如下示例:

observation space:  Box([-4.8 -inf -0.41887903 -inf], [4.8 inf 0.41887903 inf], (4,), float32)

在此示例中,CartPole-v1 的观测空间为 4 维。观测数组的 4 个元素为:

  • 小车位置 —— 介于 -4.8 与 +4.8 之间
  • 小车速度 —— 范围为 - 到 +
  • 杆角度 —— 介于 -0.4189 与 +0.4189 之间
  • 杆角速度 —— 范围为 - 到 +

要查看单个观测数组的示例,使用 .reset() 命令。

observation, info = env.reset()
print("observation: ", observation)

对于 CartPole-v1 环境,输出类似如下示例:

[ 0.03481963 -0.0277232   0.01703267 -0.04870504]                                                                                                       

该数组的四个元素分别对应前述四个观测量(小车位置、小车速度、杆角度、杆角速度)。

动作空间

动作空间包含智能体可采取的所有可能动作,同时也定义了动作的表示格式。可以使用 action_space 方法查看环境的动作空间:

print("action space: ", env.action_space)

对于 CartPole-v1 环境,输出类似如下示例:

action space:  Discrete(2)

对于 CartPole-v1 环境,动作空间是离散的。智能体共有两种可选动作:

  • 0:将小车向左推
  • 1:将小车向右推

用 Gymnasium 构建您的第一个 RL 智能体

前文我们已经了解了 RL 与 Gymnasium 的基本概念。本节将展示如何使用 Gymnasium 构建一个 RL 智能体。

创建与重置环境

第一步是创建环境实例。创建新环境请使用 .make() 方法。

env = gym.make('CartPole-v1')

智能体的交互会改变环境状态。.reset() 方法将环境重置为初始状态。默认情况下,环境会初始化到一个随机状态。您可以在 .reset() 方法中使用 SEED 参数,使每次运行时环境均初始化为相同状态。如下所示:

SEED = 1111
env.reset(seed=SEED)

动作采样也包含随机性。为控制这种随机性并获得完全可复现的训练路径,我们可以为 NumPy 与 PyTorch 的随机数生成器设定种子:

np.random.seed(SEED)
torch.manual_seed(SEED)

随机动作 vs. 智能动作

在马尔可夫过程的每一步,智能体可以随机选择一个动作并探索环境,直到达到终止状态。若随机选择动作:

  • 可能需要很长时间才能到达终止状态。
  • 累计回报会远低于潜在最优值。

更高效的做法是训练智能体基于过去(与环境交互)的经验来优化动作选择,以最大化长期回报。

未经训练的智能体从随机初始化的策略出发,采取随机动作。该策略通常用神经网络表示。训练过程中,智能体会学习到能最大化回报的最优策略。在 RL 中,训练过程也称为策略优化。

常见的策略优化方法有多种。贝尔曼方程描述了如何计算 RL 策略的价值并确定最优策略。在本教程中,我们将使用一种简单技术——策略梯度。此外还存在其他方法,如近端策略优化(PPO)。

实现一个简单的策略梯度智能体

要构建使用策略梯度的 RL 智能体,我们创建一个实现策略的神经网络,编写函数从逐步回报与动作概率计算回报与损失,并使用标准反向传播方法迭代更新策略。

搭建策略网络

我们使用神经网络来实现策略。由于 CartPole-v1 是一个简单环境,我们使用如下结构的神经网络:

  • 输入维度等于环境观测空间的维度。
  • 单个隐藏层,包含 64 个神经元。
  • 输出维度等于环境动作空间的维度。

因此,策略网络的功能是将观测到的状态映射为动作。给定输入观测,它预测合适的动作。下面的代码实现了策略网络:

class PolicyNetwork(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim, dropout):
        super().__init__()
        self.layer1 = nn.Linear(input_dim, hidden_dim)
        self.layer2 = nn.Linear(hidden_dim, output_dim)
        self.dropout = nn.Dropout(dropout)
    def forward(self, x):
        x = self.layer1(x)
        x = self.dropout(x)
        x = F.relu(x)
        x = self.layer2(x)
        return x

收集回报与前向传递

如前所述,在马尔可夫过程的每一步,环境会基于智能体的动作与状态给出回报。RL 的目标是最大化总回报。

  • 每个时间步的回报总和为从开局到该步获得的回报的累计和。
  • 每个回合的总回报是该回合中所有逐步回报的累计。因此,总回报等于最后一个时间步(智能体抵达终止状态时)的回报总和。

在实践中,累计回报时通常会:

  • 使用折扣因子调整未来回报。
  • 对逐步回报数组做归一化,以保证训练平滑稳定。

如下代码演示了如何实现:

def calculate_stepwise_returns(rewards, discount_factor):
    returns = []
    R = 0
    for r in reversed(rewards):
        R = r + R * discount_factor
        returns.insert(0, R)
    returns = torch.tensor(returns)
    normalized_returns = (returns - returns.mean()) / returns.std()
    return normalized_returns

前向传递包括在当前策略下运行智能体直至达到终止状态,并收集逐步回报与动作概率。实现步骤如下:

  • 将环境重置到初始状态。
  • 初始化缓冲区以存储动作对数概率、回报与累计回报
  • 使用 .step() 函数迭代地在环境中运行智能体,直到结束:
    • 获取环境状态的观测。
    • 基于观测,用策略预测动作。
    • 使用 Softmax 估计所预测动作的概率。
    • 基于这些估计概率模拟一个类别分布。
    • 对该分布采样以得到智能体动作。
    • 从模拟分布估计所采样动作的对数概率。
  • 将每步的动作对数概率与回报追加到各自缓冲区。
  • 基于回报估计每步的归一化且折扣后的回报总和。
def forward_pass(env, policy, discount_factor):
    log_prob_actions = []
    rewards = []
    done = False
    episode_return = 0
    policy.train()
    observation, info = env.reset()
    while not done:
        observation = torch.FloatTensor(observation).unsqueeze(0)
        action_pred = policy(observation)
        action_prob = F.softmax(action_pred, dim = -1)
        dist = distributions.Categorical(action_prob)
        action = dist.sample()
        log_prob_action = dist.log_prob(action)
        observation, reward, terminated, truncated, info = env.step(action.item())
        done = terminated or truncated
        log_prob_actions.append(log_prob_action)
        rewards.append(reward)
        episode_return += reward
    log_prob_actions = torch.cat(log_prob_actions)
    stepwise_returns = calculate_stepwise_returns(rewards, discount_factor)
    return episode_return, stepwise_returns, log_prob_actions

基于回报更新策略

损失表示我们要进行梯度下降的量。RL 的目标是最大化回报。因此,我们使用期望回报作为损失的代理。期望回报计算为逐步期望回报与逐步动作对数概率的乘积。如下代码计算损失:

def calculate_loss(stepwise_returns, log_prob_actions):
    loss = -(stepwise_returns * log_prob_actions).sum()
    return loss

要更新策略,您需要针对损失函数运行反向传播。下面的 update_policy() 方法会调用 calculate_loss(),随后对该损失执行反向传播来更新策略参数,即策略网络的模型权重。

def update_policy(stepwise_returns, log_prob_actions, optimizer):
    stepwise_returns = stepwise_returns.detach()
    loss = calculate_loss(stepwise_returns, log_prob_actions)
    
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    return loss.item()

基于回报梯度更新策略被称为策略梯度方法。

训练策略

现在我们已经具备训练与评估策略所需的全部组件。训练循环的实现如下:

开始前,声明超参数、实例化策略并创建优化器:

  • 将超参数声明为 Python 常量:
    • MAX_EPOCHS 是我们用于训练策略的最大迭代回合数。
    • DISCOUNT_FACTOR 决定未来时间步回报的相对重要性。为 1 表示所有回报同等重要,为 0 表示仅当前时间步的回报重要。
    • N_TRIALS 是用于评估智能体性能的平均回报所跨越的回合数。若 N_TRIALS 个回合的平均回报超过阈值,则认为训练成功。
    • REWARD_THRESHOLD:若策略取得的回报高于阈值,则视为成功。
    • DROPOUT 决定应随机置零的权重比例。Dropout 会随机将部分模型权重置零,从而降低对特定神经元的依赖,防止过拟合,使网络更健壮。
    • LEARNING_RATE 决定每步可对策略参数进行的修改幅度。每次迭代的参数更新量等于梯度与学习率的乘积。
  • 将策略定义为前文实现的 PolicyNetwork 类的实例。
  • 使用Adam 算法与学习率创建优化器。

训练策略时,我们反复执行训练步骤,直到平均回报(跨 N_TRIALS)超过回报阈值:

  • 每个回合运行一次前向传递。收集该回合的动作对数概率、逐步回报与总回报,并将回合总回报累加入数组。
  • 使用对数概率与逐步回报计算损失。对损失执行反向传播,并使用优化器更新策略参数。
  • 检查最近 N_TRIALS 个回合的平均回报是否超过回报阈值。

以下代码实现了上述步骤:

def main(): 
    MAX_EPOCHS = 500
    DISCOUNT_FACTOR = 0.99
    N_TRIALS = 25
    REWARD_THRESHOLD = 475
    PRINT_INTERVAL = 10
    INPUT_DIM = env.observation_space.shape[0]
    HIDDEN_DIM = 128
    OUTPUT_DIM = env.action_space.n
    DROPOUT = 0.5
    episode_returns = []
    policy = PolicyNetwork(INPUT_DIM, HIDDEN_DIM, OUTPUT_DIM, DROPOUT)
    LEARNING_RATE = 0.01
    optimizer = optim.Adam(policy.parameters(), lr = LEARNING_RATE)
    for episode in range(1, MAX_EPOCHS+1):
        episode_return, stepwise_returns, log_prob_actions = forward_pass(env, policy, DISCOUNT_FACTOR)
        _ = update_policy(stepwise_returns, log_prob_actions, optimizer)
        episode_returns.append(episode_return)
        mean_episode_return = np.mean(episode_returns[-N_TRIALS:])
        if episode % PRINT_INTERVAL == 0:
            print(f'| Episode: {episode:3} | Mean Rewards: {mean_episode_return:5.1f} |')
        if mean_episode_return >= REWARD_THRESHOLD:
            print(f'Reached reward threshold in {episode} episodes')
            break

最后,调用 main() 函数来训练策略:

main()

请使用此 DataLab 工作簿直接运行上述算法,并通过 RL 解决 CartPole 环境。

Gymnasium 的进阶技巧

在演示如何实现一个 RL 算法之后,我们再讨论一些实践中常用的高级技巧。

使用预构建架构

从零实现 RL 算法既耗时又困难,尤其是在复杂环境和前沿策略上。

更务实的替代方案是使用软件如 Stable Baselines3。它提供经过验证的 RL 算法实现,包含预训练智能体、训练脚本、评估工具,以及用于绘图和录制视频的模块。

Ray RLib 是另一个流行的 RL 工具。RLib 旨在具备可扩展性,便于在多 GPU 系统上实现 RL 算法。它还支持多智能体 RL,从而实现如下新可能:

  • 独立多智能体学习:每个智能体将其他智能体视为环境的一部分。
  • 协作式多智能体训练:一组智能体共享相同的策略与价值函数,并并行从彼此的经验中学习。
  • 对抗式训练:智能体(或智能体组)在竞争性、类游戏环境中相互对抗。

在 RLib 与 Stable Baselines3 中,您都可以导入并使用 OpenAI Gymnasium 的环境。

自定义环境

Gymnasium 打包的环境非常适合测试新 RL 策略与训练策略。然而,在多数实际应用中,您需要创建并使用能够准确反映待解决问题的环境。您可以使用 Gymnasium 创建自定义环境。使用 Gymnasium 自定义环境的优势在于,许多外部工具如 RLib 与 Stable Baselines3 已配置为适配 Gymnasium 的 API 结构。

在 Gymnasium 中创建自定义环境,您需要定义:

  • 观测空间。
  • 终止条件。
  • 智能体可选的动作集合。
  • 如何初始化环境(调用 reset() 函数时)。
  • 给定智能体动作后,环境如何决定下一状态(调用 step() 函数时)。

想了解更多,请参阅 Gymnasium 的自定义环境创建指南。

使用 Gymnasium 的最佳实践

尝试不同环境

本教程的代码展示了如何在 CartPole 环境中实现策略梯度算法。这是一个具有离散动作空间的简单环境。为更深入理解 RL,我们建议您将同一策略梯度算法(以及其他算法,如 PPO)应用到其他环境中。

例如,Pendulum 环境具有连续动作空间。它只有一个输入,为连续变量——在任一给定状态下施加在摆上的力矩(大小与方向)。该力矩的取值可在 -2 到 +2 之间的任意值。

在不同环境中尝试不同算法,有助于您更好地理解各种 RL 方案及其挑战。

监控训练进度

RL 环境常包含机器人、摆、小车爬山、电子游戏等。可视化智能体在环境中的动作有助于直观理解策略的表现。

在 Gymnasium 中,env.render() 方法可视化智能体与环境的交互。它以图形方式显示环境的当前状态——游戏画面、摆或倒立摆的位置等。对智能体动作及环境响应进行可视化,有助于监控智能体在训练过程中的表现与进展。

渲染模式有四种:“human”、“rgb_array”、“ansi” 与 “rgb_array_list”。要可视化智能体表现,请使用 “human” 渲染模式。在初始化环境时指定渲染模式。例如:

env = gym.make(‘CartPole-v1’, render_mode=’human’)

执行渲染时,请在智能体每次执行动作(通过调用 .step() 方法)之后调用 .render() 方法。下面的伪代码说明了如何实现:

while not done:
    …
   step, reward, terminated, truncated, info = env.step(action.item())
   env.render()
    …

排查常见错误

Gymnasium 让与复杂 RL 环境的交互变得简单。然而,它是一款持续更新且依赖众多组件的软件。因此,留意一些常见错误类型很有必要。

版本不匹配

  • Gymnasium 版本不匹配: Farama 的 Gymnasium 软件包从 OpenAI 的 Gym 0.26.2 版本分叉而来。旧版 Gym 与新版 Gymnasium 之间存在一些不兼容变更。许多公开实现基于旧版 Gym,可能无法直接在最新版上运行。此时需要回退到旧版本,或调整代码以适配新版本。
  • 环境版本不匹配: 许多 Gymnasium 环境有不同版本。例如,CartPole 有 CartPole-v1 与 CartPole-v0 两个版本。尽管环境行为大体一致,但某些参数(如回合长度、回报阈值等)可能不同。在一个版本上训练的策略,换到另一个版本可能表现不佳。您需要更新训练参数并针对每个环境版本重新训练策略。
  • 依赖版本不匹配: Gymnasium 依赖 NumPy 与 PyTorch 等组件。截止 2024 年 12 月,这些依赖的最新版本为 numpy 2.1.3 与 torch 2.5.1。但 Gymnasium 与 torch 1.13.0 与 numpy 1.23.3 的配合最佳。若您在已预装这些依赖的环境中安装 Gymnasium,可能会遇到问题。我们建议在全新的 Conda 环境中安装并使用 Gymnasium。

收敛问题

  • 超参数: 与其他机器学习算法类似,RL 策略对学习率、折扣因子等超参数较为敏感。建议进行实验并手动调参,或使用网格搜索、随机搜索等自动化技术。
  • 探索与利用: 对某些策略类(如 PPO),智能体采用双管齐下策略:探索环境以发现新路径,并基于已知路径贪心地最大化回报。探索过多会导致策略不收敛;探索不足则可能永远无法尝试到最优路径。因此,平衡探索与利用至关重要。训练中也常在早期回合优先探索,后期回合侧重利用。

训练不稳定

  • 学习率过大: 若学习率过高,策略参数在每步更新幅度太大,可能错过最优解。常见对策是逐步衰减学习率,确保在训练收敛时进行更小、更稳定的更新。
  • 过度探索: 动作选择中的随机性(熵)过大,会阻碍收敛并导致相邻步骤间损失函数波动较大。为实现稳定且可收敛的训练过程,应在探索与利用之间取得平衡。
  • 算法选择不当: 在动作与状态空间较大的复杂环境中,诸如策略梯度等简单算法可能导致训练不稳定。此时更推荐使用 PPO、信赖域策略优化(TRPO)等更稳健的算法,这些算法可避免每步进行过大的策略更新,因而更稳定。
  • 随机性: RL 算法对初始状态与动作选择的随机性非常敏感。当一次训练运行不稳定时,有时可通过更换随机种子或重新初始化策略来改善稳定性。

结语

在本教程中,我们回顾了 RL 的基本原理,介绍了作为软件包的 Gymnasium 及其用于对接各类 RL 环境的简洁 API,并展示了如何编写 Python 程序来实现一个简单的 RL 算法并将其应用于 Gymnasium 环境。

在理解本教程的基础知识后,我建议使用 Gymnasium 环境,将 RL 概念应用于实际问题,如出租车路径优化与股票交易仿真。

FAQs

Gymnasium 在强化学习中的作用是什么?

Gymnasium 自带诸多预构建环境,用于测试和开发 RL 算法。它为这些环境以及新的自定义环境提供了统一的接口,这使实现与评估 RL 算法更为容易。

使用 OpenAI Gymnasium 时是否只能使用内置环境?

不止于此。除了 60 多个预构建环境,Gymnasium 还允许您通过声明状态与动作空间,并定义环境对各种动作的响应来创建新环境。

Gym 与 Gymnasium 有何区别?

简而言之,由 Farama Foundation 维护的 Gymnasium 是 OpenAI 已不再维护的 Gym 的全新升级版本。Gymnasium 预计可作为 Gym 0.26.2 的无缝替代。

基于策略与基于价值的 RL 方法有何区别?

在基于策略的方法(如策略梯度)中,智能体直接修改策略参数,以寻找能带来最大期望回报的策略。

在基于价值的方法中,智能体学习价值函数。学得最优价值函数有助于推导出最优策略。

手写算法是否是解决 RL 问题的最佳且唯一方式?

从零写代码是理解不同 RL 算法的最佳方式。但在生产中,可使用 Stable Baselines3、RLib、CleanRL 等工具。它们提供常见 RL 算法的预构建实现,您需根据环境进行配置与微调。

Arun Nanda

作者

Arun Nanda

Arun 曾是一位初创公司创始人,喜欢构建新事物。他目前正探索人工智能的技术与数学基础。他乐于分享自己的所学,因此会写作记录。

除了 DataCamp,您还可以在 Medium、Airbyte 和 Vultr 阅读他的文章。

主题