强化学习入门:从核心概念到PPO实战,掌握AI决策算法
30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度在探索如何让机器像人类一样通过“试错”来学习并做出决策时强化学习无疑是最具吸引力的范式之一。无论是游戏AI击败世界冠军还是机器人学会复杂行走其背后都闪耀着强化学习算法的智慧。然而对于初学者而言面对马尔可夫决策过程、价值函数、策略梯度等一连串术语以及DQN、PPO、A3C等琳琅满目的算法常常感到无从下手。本文旨在为你构建一条清晰的学习路径从最核心的经典算法原理讲起结合直观比喻和关键公式推导帮助你真正理解强化学习是如何工作的并为后续深入深度强化学习打下坚实基础。无论你是相关专业的学生还是希望将RL应用于机器人控制、游戏AI或资源调度等领域的开发者都能从本文中获得系统性的入门指导。1. 强化学习核心概念与框架在深入算法之前我们必须建立一个统一且清晰的概念框架。强化学习研究的是智能体Agent如何在一个环境Environment中通过采取行动Action来最大化累积奖励Cumulative Reward的问题。1.1 基本要素与交互流程想象一下训练一只小狗你环境在它智能体完成坐下动作后给予零食奖励。它通过多次尝试逐渐学会“坐下”这个动作能带来好处。强化学习的交互过程与此类似可以抽象为以下循环状态State, s环境当前情况的描述。例如在象棋游戏中棋盘上所有棋子的位置就是状态。动作Action, a智能体基于当前状态可以做出的选择。例如移动某个棋子。奖励Reward, r环境对智能体动作的即时反馈。赢得比赛获得正奖励1输掉比赛获得负奖励-1平局或中间步骤可能为0。策略Policy, π智能体的“大脑”是一个从状态到动作的映射函数。它决定了在某个状态下该采取什么动作。策略可以是确定性的如a π(s)也可以是随机性的如a ~ π(a|s)表示按概率分布选择动作。智能体与环境的交互过程是一个序列s0 - a0 - r1, s1 - a1 - r2, s2 - ...。智能体的目标不是最大化即时奖励而是最大化从当前时刻开始的所有未来奖励的累积和也称为回报Return, G。1.2 核心概念价值函数与贝尔曼方程由于未来具有不确定性我们通常考虑回报的期望值并引入折扣因子 γGamma 0 ≤ γ ≤ 1来权衡近期奖励和远期奖励的重要性。折扣回报定义为G_t r_{t1} γ * r_{t2} γ^2 * r_{t3} ...。基于此衍生出两个核心的价值函数状态价值函数 Vπ(s)在状态s下遵循策略π所能获得的期望回报。它回答了“处于这个状态有多好”的问题。动作价值函数 Qπ(s, a)在状态s下执行动作a后再遵循策略π所能获得的期望回报。它回答了“在这个状态下做这个动作有多好”的问题。它们之间的关系由贝尔曼期望方程描述这是强化学习理论的基石Vπ(s) Σ_a π(a|s) * Σ_{s‘, r} p(s‘, r| s, a) * [ r γ * Vπ(s‘) ]Qπ(s, a) Σ_{s‘, r} p(s‘, r| s, a) * [ r γ * Σ_{a‘} π(a‘|s‘) * Qπ(s‘, a‘) ]其中p(s‘, r| s, a)是环境的状态转移概率。这个方程本质上是一个递归关系一个状态或状态-动作对的价值等于即时奖励加上下一个状态的折扣价值的期望。最优策略π*是能最大化价值函数的策略。对应的最优价值函数满足贝尔曼最优方程V*(s) max_a Σ_{s‘, r} p(s‘, r| s, a) * [ r γ * V*(s‘) ]Q*(s, a) Σ_{s‘, r} p(s‘, r| s, a) * [ r γ * max_{a‘} Q*(s‘, a‘) ]如果我们能求解出Q*(s, a)那么最优策略就是简单地选择能使Q值最大的动作π*(s) argmax_a Q*(s, a)。2. 环境准备与工具说明理论学习需要与实践结合。为了运行后续的算法示例我们需要准备一个标准的开发环境。以下配置是强化学习实验的常见起点操作系统Windows 10/11 macOS 或 Linux (如 Ubuntu 20.04)。Linux 在兼容性上通常有更好表现。编程语言Python 3.8 或 3.9。这是强化学习生态最主流的语言。关键库gym/gymnasium由 OpenAI 发起现已移交维护的标准强化学习环境库提供了从简单文本到复杂机器人仿真的多种环境。numpy用于高效的数值计算。pytorch或tensorflow用于实现深度神经网络。本文示例将使用 PyTorch因其动态图特性更易于理解和调试。matplotlib用于结果可视化。你可以通过以下命令快速创建环境并安装依赖以 Conda 为例# 创建并激活一个名为 rl_tutorial 的 Python 3.9 环境 conda create -n rl_tutorial python3.9 conda activate rl_tutorial # 安装核心库 pip install gymnasium numpy matplotlib # 安装 PyTorch (请根据你的CUDA版本前往官网选择对应命令此处以CPU版本为例) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu我们将主要使用gymnasium中的CartPole-v1平衡车环境作为教学示例。它的状态空间是连续的车的位置、速度、杆的角度、角速度动作空间是离散的向左或向右推车目标是在杆子不倒下的情况下尽可能保持平衡是一个经典的入门测试床。3. 经典表格型强化学习算法当状态和动作空间较小且离散时我们可以用表格来存储价值函数Q(s, a)。这类方法直观地体现了强化学习的核心思想。3.1 时序差分学习SARSA 与 Q-Learning这两种算法都是基于时序差分Temporal-Difference, TD的学习方法其核心是利用当前估计来更新之前的估计无需等待一个完整回合结束。SARSA (State-Action-Reward-State-Action)是一个同策略On-policy算法即它评估和改进的是它实际执行的那个策略。 其更新公式为Q(s_t, a_t) ← Q(s_t, a_t) α * [ r_{t1} γ * Q(s_{t1}, a_{t1}) - Q(s_t, a_t) ]其中α是学习率。注意a_{t1}是根据当前策略在s_{t1}状态下实际选择的动作。Q-Learning则是异策略Off-policy算法的代表。它学习的是最优价值函数Q*而行为策略如 ε-greedy可以不同于目标策略greedy。 其更新公式为Q(s_t, a_t) ← Q(s_t, a_t) α * [ r_{t1} γ * max_{a} Q(s_{t1}, a) - Q(s_t, a_t) ]关键区别在于它使用的是下一个状态s_{t1}下所有动作中最大的Q值而不是实际采取的动作的Q值。下面是一个 Q-Learning 解决CliffWalking环境的简化示例import numpy as np import gymnasium as gym env gym.make(CliffWalking-v0) n_states env.observation_space.n n_actions env.action_space.n # 初始化 Q 表 Q_table np.zeros((n_states, n_actions)) alpha 0.1 # 学习率 gamma 0.99 # 折扣因子 epsilon 0.1 # ε-greedy 探索率 n_episodes 500 for episode in range(n_episodes): state, _ env.reset() done False while not done: # ε-greedy 策略选择动作 if np.random.random() epsilon: action env.action_space.sample() # 探索 else: action np.argmax(Q_table[state]) # 利用 next_state, reward, terminated, truncated, _ env.step(action) done terminated or truncated # Q-Learning 更新 best_next_action np.argmax(Q_table[next_state]) td_target reward gamma * Q_table[next_state, best_next_action] * (not done) td_error td_target - Q_table[state, action] Q_table[state, action] alpha * td_error state next_state print(训练结束。测试最终策略) # 使用贪婪策略测试 state, _ env.reset() done False total_reward 0 while not done: action np.argmax(Q_table[state]) next_state, reward, terminated, truncated, _ env.step(action) done terminated or truncated total_reward reward state next_state print(f测试回合总奖励: {total_reward})3.2 算法对比与理解同策略 vs 异策略SARSA 更“保守”因为它考虑到探索策略如ε-greedy可能带来的风险在类似“悬崖漫步”这种有负奖励陷阱的环境中学习到的路径会更安全。Q-Learning 更“激进”直接学习最优策略但在探索过程中可能因为冒险而获得更多负奖励。偏差Bias与方差VarianceQ-Learning 使用max操作会引入最大化偏差可能导致对某些动作的价值高估。SARSA 则没有这个问题但可能方差较大。后来的算法如Double Q-Learning就是为了解决这个问题而设计的。4. 深度强化学习当神经网络遇见RL对于状态空间连续或巨大的问题如图像输入表格法不再可行。深度强化学习DRL使用深度神经网络作为函数近似器来拟合价值函数或策略。4.1 深度Q网络DQN及其改进DQN 是深度强化学习的里程碑它用神经网络Q(s, a; θ)参数化 Q 函数解决了高维状态输入的问题。其核心创新在于两点经验回放Experience Replay将智能体与环境交互的经验(s, a, r, s‘, done)存储在一个缓冲区中训练时从中随机采样一批数据。这打破了数据间的相关性使训练更稳定。目标网络Target Network使用一个结构相同但参数更新较慢的网络Q(s, a; θ-)来计算 TD 目标y r γ * max_{a‘} Q(s‘, a‘; θ-)。主网络Q(θ)的参数θ通过最小化损失函数L(θ) E[(y - Q(s, a; θ))^2]来更新。定期将主网络参数复制给目标网络。这解决了目标值随学习过程不断变化的问题。以下是 DQN 的核心训练循环伪代码# 初始化主网络 Q目标网络 Q_target参数相同经验回放缓冲区 D for episode in range(total_episodes): state, _ env.reset() done False while not done: # 用 ε-greedy 策略选择动作 action select_action(state, Q, epsilon) next_state, reward, terminated, truncated, _ env.step(action) done terminated or truncated # 存储经验 D.append((state, action, reward, next_state, done)) state next_state # 训练步骤 if len(D) batch_size: # 随机采样一批经验 batch sample(D, batch_size) # 计算 TD 目标 with torch.no_grad(): # 用目标网络计算下一个状态的最大 Q 值 next_q_values Q_target(batch.next_states) max_next_q next_q_values.max(1)[0] # 如果回合结束则没有未来的奖励 target batch.rewards gamma * max_next_q * (~batch.dones) # 计算当前 Q 值 current_q Q(batch.states).gather(1, batch.actions.unsqueeze(1)).squeeze(1) # 计算损失并更新主网络 loss F.mse_loss(current_q, target) optimizer.zero_grad() loss.backward() optimizer.step() # 定期更新目标网络软更新或硬更新 if episode % target_update 0: Q_target.load_state_dict(Q.state_dict())后续的改进算法如Double DQN解耦动作选择和目标值计算缓解高估、Dueling DQN将Q值分解为状态价值V和优势函数A学习更高效和Prioritized Experience Replay给重要的经验样本更高采样概率都进一步提升了性能和稳定性。4.2 策略梯度方法从直接优化策略出发与基于价值的方法先学价值函数再导引策略不同策略梯度方法直接参数化策略π(a|s; θ)并通过梯度上升来优化策略参数θ以最大化期望回报J(θ)。其核心是策略梯度定理∇θ J(θ) ∝ E_{πθ} [∇θ log π(a|s; θ) * Q^{πθ}(s, a)]REINFORCE算法是蒙特卡洛策略梯度的一个实现。它使用一个完整回合的回报G_t作为Q^{πθ}(s, a)的无偏估计但方差很大。Actor-Critic框架结合了策略梯度Actor负责选择动作和价值函数近似Critic负责评价动作用 Critic 学到的价值函数如V(s)或A(s, a)来替代蒙特卡洛回报G_t作为基准减少方差。Critic 通常通过 TD 误差来学习。4.3 近端策略优化PPOPPO 是目前最流行、最实用的策略梯度算法之一它通过一个简单的裁剪机制解决了传统策略梯度算法如TRPO中步长难以确定、更新不稳定、计算复杂的问题。PPO 的核心思想是在更新策略时限制新策略与旧策略的差异不能太大从而保证更新的稳定性。它通过优化一个替代目标函数来实现L^{CLIP}(θ) E_t [ min( ratio_t * A_t, clip(ratio_t, 1-ε, 1ε) * A_t ) ]其中ratio_t π_θ(a_t|s_t) / π_θ_old(a_t|s_t)是新旧策略的概率比。A_t是优势函数估计例如用 GAE 计算表示动作a_t相对于平均水平的优势。ε是一个超参数如 0.2用于限制ratio_t的变化范围。这个公式的直观理解是如果动作的优势A_t是正的我们希望增加这个动作的概率即ratio_t增大但通过clip函数将其限制在[1-ε, 1ε]内防止更新过大。如果A_t是负的我们希望减少这个动作的概率同样进行限制。min操作确保了最终目标是未裁剪目标和裁剪目标的下界是一个悲观估计从而避免因过度优化某个样本而导致的性能崩溃。PPO 通常与 Actor-Critic 架构结合并采用广义优势估计GAE来更高效地估计优势函数A_t。以下是 PPO 算法的大致流程# 初始化策略网络Actorπ_θ 和价值网络CriticV_φ for iteration in range(total_iterations): # 1. 收集数据用当前策略 π_θ 与环境交互 N 个时间步存储 (s, a, r, s‘, log_prob_old, ...) trajectories collect_trajectories(env, π_θ, num_stepsN) # 2. 计算优势估计和回报 # 使用价值网络 V_φ 和 GAE 公式计算每个时间步的优势 A_t advantages compute_gae(trajectories, V_φ, gamma, lambda_gae) # 计算每个时间步的回报-to-go (用于价值网络训练) returns advantages trajectories.values # 简化表示 # 3. 优化阶段对收集到的数据随机打乱进行多轮小批量更新 for epoch in range(K): # K 通常为 3-10 for batch in dataloader(trajectories): # 重新计算新策略的动作概率比 log_probs_new π_θ(batch.states, batch.actions) ratio torch.exp(log_probs_new - batch.log_probs_old) # 计算裁剪的 PPO 目标函数 surr1 ratio * batch.advantages surr2 torch.clamp(ratio, 1.0 - clip_epsilon, 1.0 clip_epsilon) * batch.advantages actor_loss -torch.min(surr1, surr2).mean() # 更新价值网络 (Critic)拟合回报 values_pred V_φ(batch.states) critic_loss F.mse_loss(values_pred, batch.returns) # 总损失可加入熵正则项鼓励探索 total_loss actor_loss critic_coef * critic_loss - entropy_coef * entropy optimizer.zero_grad() total_loss.backward() optimizer.step() # 4. 可选同步新旧策略参数θ_old ← θ4.4 异步优势演员-评论家A3CA3C 是 DRL 分布式训练的先驱。它创建多个并行的“工作者”线程每个线程都有自己的环境副本和网络参数。工作者独立地与各自的环境交互、计算梯度然后异步地将梯度更新到一个共享的全局网络参数中。这种方式不仅大大加快了数据收集速度而且由于不同工作者探索环境的不同部分并发的梯度更新起到了类似集成和稳定训练的效果。A3C 的每个工作者本质上运行的是一个带 n 步回报的 Advantage Actor-Critic 算法。其“异步”更新虽然简单但避免了经验回放对大量内存的需求并能在线学习。不过后来的A2C同步版和更先进的IMPALA等算法在某些任务上表现更稳定。5. 算法实战用PyTorch实现PPO解决CartPole让我们用一个完整的 PyTorch 实现来巩固对 PPO 的理解。我们将训练一个智能体玩CartPole-v1。import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import gymnasium as gym import numpy as np from collections import deque import matplotlib.pyplot as plt # 1. 定义 Actor-Critic 网络 class ActorCritic(nn.Module): def __init__(self, state_dim, action_dim): super().__init__() # 共享的特征提取层 self.fc1 nn.Linear(state_dim, 64) self.fc2 nn.Linear(64, 64) # Actor 层输出动作概率分布 self.actor nn.Linear(64, action_dim) # Critic 层输出状态价值 self.critic nn.Linear(64, 1) def forward(self, x): x F.relu(self.fc1(x)) x F.relu(self.fc2(x)) logits self.actor(x) value self.critic(x) return logits, value def get_action(self, state): state torch.FloatTensor(state).unsqueeze(0) logits, _ self.forward(state) probs F.softmax(logits, dim-1) dist torch.distributions.Categorical(probs) action dist.sample() log_prob dist.log_prob(action) return action.item(), log_prob.item() def get_value(self, state): state torch.FloatTensor(state).unsqueeze(0) _, value self.forward(state) return value.item() # 2. 计算 GAE (广义优势估计) def compute_gae(next_value, rewards, masks, values, gamma0.99, tau0.95): values values [next_value] gae 0 returns [] advantages [] for step in reversed(range(len(rewards))): delta rewards[step] gamma * values[step 1] * masks[step] - values[step] gae delta gamma * tau * masks[step] * gae advantages.insert(0, gae) returns.insert(0, gae values[step]) return advantages, returns # 3. PPO 主训练循环 def train_ppo(env_nameCartPole-v1, num_episodes1000, max_steps500, lr3e-4, gamma0.99, tau0.95, clip_epsilon0.2, ppo_epochs4, batch_size32): env gym.make(env_name) state_dim env.observation_space.shape[0] action_dim env.action_space.n model ActorCritic(state_dim, action_dim) optimizer optim.Adam(model.parameters(), lrlr) episode_rewards [] for episode in range(num_episodes): state, _ env.reset() log_probs, values, rewards, masks [], [], [], [] episode_reward 0 # 收集一个回合的数据 for _ in range(max_steps): action, log_prob model.get_action(state) value model.get_value(state) next_state, reward, terminated, truncated, _ env.step(action) done terminated or truncated log_probs.append(log_prob) values.append(value) rewards.append(reward) masks.append(1 - done) # 如果结束mask为0否则为1 state next_state episode_reward reward if done: break # 计算最后一个状态的价值用于GAE next_value model.get_value(state) advantages, returns compute_gae(next_value, rewards, masks, values, gamma, tau) # 转换为张量 returns torch.FloatTensor(returns) advantages torch.FloatTensor(advantages) values torch.FloatTensor(values) log_probs torch.FloatTensor(log_probs) states torch.FloatTensor(np.array([env.reset()[0] for _ in range(len(rewards))])) # 简化处理实际应从轨迹中获取 # PPO 优化阶段 for _ in range(ppo_epochs): # 随机打乱索引 indices torch.randperm(len(rewards)) for start in range(0, len(indices), batch_size): end start batch_size batch_indices indices[start:end] batch_states states[batch_indices] batch_actions torch.LongTensor([env.action_space.sample() for _ in range(len(batch_indices))]) # 简化实际应从轨迹中获取动作 batch_old_log_probs log_probs[batch_indices] batch_returns returns[batch_indices] batch_advantages advantages[batch_indices] # 计算新策略的概率 logits, values_pred model(batch_states) probs F.softmax(logits, dim-1) dist torch.distributions.Categorical(probs) new_log_probs dist.log_prob(batch_actions) # 计算概率比和裁剪损失 ratio (new_log_probs - batch_old_log_probs).exp() surr1 ratio * batch_advantages surr2 torch.clamp(ratio, 1.0 - clip_epsilon, 1.0 clip_epsilon) * batch_advantages actor_loss -torch.min(surr1, surr2).mean() # Critic 损失 critic_loss F.mse_loss(values_pred.squeeze(), batch_returns) # 熵正则项鼓励探索 entropy dist.entropy().mean() # 总损失 loss actor_loss 0.5 * critic_loss - 0.01 * entropy optimizer.zero_grad() loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), 0.5) # 梯度裁剪 optimizer.step() episode_rewards.append(episode_reward) if (episode 1) % 50 0: avg_reward np.mean(episode_rewards[-50:]) print(fEpisode {episode1}, Avg Reward (last 50): {avg_reward:.2f}) if avg_reward 495: # CartPole-v1 的满分是500 print(fSolved at episode {episode1}!) break env.close() return episode_rewards # 4. 运行训练并绘图 if __name__ __main__: rewards train_ppo(num_episodes300) plt.plot(rewards) plt.xlabel(Episode) plt.ylabel(Total Reward) plt.title(PPO on CartPole-v1) plt.grid(True) plt.show()这段代码提供了一个完整的 PPO 实现框架。注意为了清晰起见数据收集部分做了简化例如states的张量构建。在实际应用中你需要完整存储每个时间步的状态。运行此代码你将看到智能体在几十到一百个回合内就能学会稳定平衡杆子。6. 常见问题与调试技巧深度强化学习以难以调试著称。以下是一些常见问题及其排查思路问题现象可能原因排查与解决思路奖励不上升智能体不学习1. 学习率太大或太小。2. 网络结构不合适太深/太浅。3. 奖励设计不合理稀疏奖励、尺度问题。4. 探索不足ε 太小或熵系数太小。5. 梯度消失/爆炸。1. 尝试经典的学习率如3e-4, 1e-4。使用学习率调度器。2. 从简单的1-2层网络开始。检查激活函数。3. 进行奖励塑形确保奖励能提供足够的学习信号。归一化奖励或优势。4. 增加探索率 ε 或熵正则项的系数。5. 使用梯度裁剪检查网络初始化。训练不稳定奖励波动大1. 批次大小不合适。2. PPO 中 clip 范围 ε 太小。3. 目标网络更新频率不合适DQN。4. 环境随机性大或本身不稳定。1. 增大批次大小通常能稳定训练但会减慢速度。2. 适当增大 ε如从0.1调到0.2或0.3。3. 尝试更慢的目标网络更新软更新或减少硬更新频率。4. 使用多个环境并行采集数据如 VecEnv或对环境进行更彻底的随机种子测试。智能体过早收敛到次优策略1. 探索不足。2. 价值函数估计不准确导致策略更新方向错误。3. 算法陷入局部最优。1. 增加探索如衰减的 ε-greedy 增加熵奖励。2. 确保 Critic 网络训练充分可单独多训练几轮 Critic。检查优势估计GAE的 λ 参数。3. 尝试不同的随机种子。使用种群基算法或添加噪声。训练速度慢1. 环境交互是瓶颈。2. 网络太大。3. 未利用 GPU。1. 使用并行环境如SubprocVecEnv。简化环境或使用更快的模拟器。2. 减小网络规模。3. 确保张量和模型在 GPU 上.to(device)。GPU内存溢出OOM1. 批次大小过大。2. 回放缓冲区或轨迹过长。3. 网络参数量巨大。1. 减小批次大小。2. 限制回放缓冲区大小或轨迹长度。3. 简化网络模型。使用梯度累积来模拟大批次。通用调试流程先在简单环境测试确保算法在CartPole、Pendulum等简单环境上能快速学习再迁移到复杂环境。监控关键指标除了回合总奖励还要监控价值损失、策略损失、熵、梯度范数、探索率等。可视化可视化策略决策过程、价值函数图、注意力图等直观理解智能体的行为。超参数调优系统性地调整学习率、折扣因子、批次大小、网络层数等。可以考虑使用网格搜索或贝叶斯优化工具如 Optuna。7. 工程最佳实践与进阶方向掌握基础算法后要将其应用于实际项目还需遵循以下工程实践代码模块化将网络定义、经验缓冲区、算法更新逻辑、环境包装器等分离成独立模块提高可读性和复用性。配置化管理使用yaml或json文件管理所有超参数便于实验管理和复现。实验记录与可视化使用TensorBoard、Weights Biases (WB)或MLflow等工具记录损失、奖励曲线、超参数、视频等方便对比分析。可复现性固定所有随机种子Python, NumPy, PyTorch, 环境。高效采样对于仿真环境如 MuJoCo, PyBullet使用SubprocVecEnv或Ray进行并行采样极大提升数据收集效率。分布式训练对于超大规模任务学习使用Ray RLLib、Acme或Seed RL等分布式强化学习框架。进阶学习方向基于模型的强化学习MBRL学习环境模型状态转移和奖励函数在模型中进行规划或辅助学习大幅提升样本效率。代表算法Dyna, MBPO, Dreamer。模仿学习与逆强化学习从专家示范中学习策略或奖励函数。适用于奖励函数难以设计的场景。多智能体强化学习MARL研究多个智能体在共享环境中的协作与竞争。算法复杂度急剧上升涉及信用分配、非平稳性等问题。代表算法MADDPG, QMIX, MAPPO。分层强化学习HRL将任务分解为不同时间尺度的子任务高层策略选择子目标底层策略执行。有助于解决长视野任务。代表算法HIRO, HAC。探索技术针对稀疏奖励问题研究更高效的探索方法如基于好奇心的探索ICM、基于状态的计数Hash-based、目标条件强化学习HER。强化学习是一个理论与实践并重的领域。理解算法背后的数学直觉至关重要但最终的精通来自于动手实现、调试和在各种环境中实验。建议从gymnasium的标准环境开始逐步挑战Atari游戏、MuJoCo连续控制任务甚至尝试自己定义环境来解决实际问题。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度