ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

ML-For-Beginners 强化学习实战:把 Q-Learning 从 CartPole 迁移到 Mountain Car 环境(Train Mountain Car 任务解析)

ML-For-Beginners 强化学习实战:把 Q-Learning 从 CartPole 迁移到 Mountain Car 环境(Train Mountain Car 任务解析) ML-For-Beginners 强化学习实战把 Q-Learning 从 CartPole 迁移到 Mountain Car 环境Train Mountain Car 任务解析【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners本文基于 ML-For-Beginners 课程第 8 周强化学习部分的德语任务文档 assignment.md“Train Mountain Car”展开围绕 OpenAI Gym 的统一环境 API讲清 Mountain Car 环境的动作空间、观测空间与奖励机制并说明如何以最小代码改动把课程中已实现的 Q-Learning 算法从 CartPole 迁移到 Mountain Car 上完成训练最终帮助读者掌握“同一算法跨 Gym 环境复用”这一强化学习的核心工作流。任务背景Gym 统一 API 让算法可以“换环境不换代码”这份任务文档的开篇就点出了 OpenAI Gym 的设计前提所有 Gym 环境都共享同一套 API——即相同的reset、step、render方法以及相同的Action Space动作空间与Observation Space观测空间抽象。德语原文的表述是„[OpenAI Gym] wurde so konzipiert, dass alle Umgebungen dieselbe API bereitstellen – d.h. dieselben Methodenreset,stepundrendersowie dieselben Abstraktionen vonAction SpaceundObservation Space. Daher sollte es möglich sein, dieselben Reinforcement-Learning-Algorithmen mit minimalen Codeänderungen an verschiedene Umgebungen anzupassen.“译注Gym 被设计为让所有环境提供相同 API因此相同的强化学习算法只需极少的代码修改即可适配不同环境。这也是本任务在课程中的位置所在在第 8 周前一课CartPole Skating见 8-Reinforcement/2-Gym/README.md 与配套 notebook.ipynb中课程用 Gym 的 CartPole 环境完整实现了一套 Q-Learning而本任务要求学员把这套现成算法搬到 Mountain Car 环境上。前一课之所以值得先读透是因为任务中“最小改动”的起点代码全部来自它。从文档目录结构看德语版课程资料translations/de/8-Reinforcement/2-Gym/下的 README.md、notebook.ipynb与英文原版一一对应文档末尾的免责声明Haftungsausschluss也说明该德语文档由 AI 翻译服务自动生成英文原文才是权威来源对应 8-Reinforcement/2-Gym/assignment.md。Mountain Car 环境动作、观测与奖励机制Mountain CarMountainCar-v0模拟一辆被困在山谷中的车目标是冲出山谷、登上山顶拿到旗帜。它的规则要点在任务文档中全部给出完整整理如下动作空间Action Space每一步从 3 个离散动作中选一个值含义0向左加速Nach links beschleunigen1不加速Nicht beschleunigen2向右加速Nach rechts beschleunigen观测空间Observation Space观测向量只有两个连续值序号观测最小值最大值0车的位置Position des Autos-1.20.61车的速度Geschwindigkeit des Autos-0.070.07与 CartPole 的 4 维观测小车位置、小车速度、杆角度、杆角速度相比Mountain Car 只有 2 维状态离散化的工作量更小这也是它适合作为 CartPole 之后的下一个练习环境的原因。奖励机制与回合终止条件Mountain Car 的奖励系统被文档形容为“相当棘手”ziemlich knifflig规则是当代理到达山顶旗帜位置 0.5时奖励为0当代理位置小于 0.5时每步奖励为-1。回合episode在以下任一条件满足时结束车的位置大于 0.5成功登顶回合长度超过 200 步超时失败。核心难点动力不足必须靠摆荡积累动能文档特别强调了这个问题最关键的“trick”汽车的动力不足以一次性爬上山坡因此唯一成功的方式是左右来回行驶以积累动能Schwung aufzubauen。这意味着策略不能是“始终朝山顶方向加速”的贪心行为——那只会让车在坡上反复打滑。代理必须学会先向山谷另一侧倒退换取势能再冲上坡顶即学会一种延迟满足的多步规划能力。这也正是 Mountain Car 相比 CartPole奖励恒为 1、目标是尽量存活在奖励设计上更“反直觉”的地方它的总回报永远是负数训练目标是让累计 -1 惩罚尽量少并尽快触发“位置 0.5”的终止条件。任务指令用最小改动迁移 Q-Learning 算法任务文档的“Anweisungen”指令部分原文如下德→中把你的强化学习算法改造到能解决 Mountain Car 问题。从 notebook.ipynb 中的现有代码出发替换环境、修改状态离散化函数并尝试以最少的代码改动训练现有算法。然后通过调整超参数来优化结果。注意很可能需要调整超参数算法才能收敛。对照课程提供的代码资产可以拆解出明确的改动清单改动点起点CartPole 课中代码迁移到 Mountain Car环境创建gym.make(CartPole-v1)gym.make(MountainCar-v0)动作空间2 个动作actions (0, 1)3 个动作actions (0, 1, 2)状态离散化4 维观测的discretize/discretize_bins2 维观测位置、速度需重新设定区间与分箱数随机探索np.random.randint(env.action_space.n)无需改动action_space.n自动变为 3训练主循环、Q-Table、Qbest保存逻辑保持不变保持不变超参数alpha、gamma、epsilon需要重新调参使算法收敛值得注意的是env.action_space.n、env.reset()、env.step(a)、done标志等调用都与具体环境无关这是 Gym 统一 API 带来的直接收益——真正需要改的只有环境名、离散化函数和动作数。起点代码解析CartPole 课里的 Q-Learning 是怎么写的任务要求“从现有代码出发”而这份代码在 8-Reinforcement/2-Gym/README.md 中逐块讲解配套可运行 notebook 为 8-Reinforcement/2-Gym/notebook.ipynb。下面按源码逐段梳理作为迁移的参照系。1. 环境初始化与观测范围import sys !{sys.executable} -m pip install gym import gym import matplotlib.pyplot as plt import numpy as np import randomenv gym.make(CartPole-v1) print(env.action_space) print(env.observation_space) print(env.action_space.sample())用env.observation_space.low/env.observation_space.high可以打印出观测各维度的上下界——这一步对 Mountain Car 迁移尤其重要因为 Mountain Car 的位置界是 (-1.2, 0.6)、速度界是 (-0.07, 0.07)离散化分箱必须依据这些真实区间来设置。2. 状态离散化两种方法Q-Learning 要求状态是有限离散值集而 Gym 的观测是连续实数因此需要离散化。课程给了两种实现方法一线性缩放取整def discretize(x): return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int))方法二分箱binsdef create_bins(i, num): return np.arange(num1)*(i[1]-i[0])/num i[0] ints [(-5, 5), (-2, 2), (-0.5, 0.5), (-2, 2)] # 各参数取值区间 nbins [20, 20, 10, 10] # 各参数分箱数 bins [create_bins(ints[i], nbins[i]) for i in range(4)] def discretize_bins(x): return tuple(np.digitize(x[i], bins[i]) for i in range(4))课程明确指出discretize的缩放取整方式下状态取值可能无界状态总数不可知discretize_bins则状态总数完全可控各维度分箱数的乘积。对于 Mountain Car推荐采用分箱法位置区间 (-1.2, 0.6) 和速度区间 (-0.07, 0.07) 都是已知有界的正好满足“若已知某值的区间可将其划分为若干个 bins”这一前提。一个符合课程思路的参考写法是# Mountain Car 参考离散化位置 12 箱、速度 10 箱箱数可再调 pos_bins create_bins((-1.2, 0.6), 12) vel_bins create_bins((-0.07, 0.07), 10) def discretize_mc(x): return (np.digitize(x[0], pos_bins), np.digitize(x[1], vel_bins))该示例是按课程 README 中discretize_bins的模式改写、供任务作答参考的并非仓库自带代码分箱数量属于可自由实验的超参数箱数越多状态越精细但 Q-Table 越大、收敛越慢。3. Q-Table 结构与qvalues辅助函数因为discretize方式下状态维度无法精确预知课程没有使用 20x20x10x10x2 的张量而是用字典表示 Q-Table以 (状态, 动作) 对为键Q {} actions (0, 1) # Mountain Car 中应改为 (0, 1, 2) def qvalues(state): return [Q.get((state, a), 0) for a in actions]qvalues(state)返回该状态下所有动作的 Q 值列表未访问过的 (状态, 动作) 对默认取 0。迁移到 Mountain Car 时这段逻辑完全不用动只需把actions扩到 3 元组。4. 超参数与训练主循环课程设定的超参数code block 10及其含义# hyperparameters alpha 0.3 # 学习率每步按多大比例更新 Q-Table 当前值 gamma 0.9 # 折扣因子未来奖励相对于当前奖励的权重 epsilon 0.90 # 探索/利用因子90% 的情况按 Q-Table 概率采样动作10% 随机动作训练主循环code block 11含课程提到的两处改进——按 5000 次迭代打印平均累计奖励、保存历史最优 Q-TableQbestdef probs(v, eps1e-4): v v - v.min() eps v v / v.sum() return v Qmax 0 cum_rewards [] rewards [] for epoch in range(100000): obs env.reset() done False cum_reward 0 while not done: s discretize(obs) if random.random() epsilon: # 利用按 Q-Table 概率分布选动作 v probs(np.array(qvalues(s))) a random.choices(actions, weightsv)[0] else: # 探索随机选动作 a np.random.randint(env.action_space.n) obs, rew, done, info env.step(a) cum_reward rew ns discretize(obs) Q[(s, a)] (1 - alpha) * Q.get((s, a), 0) alpha * (rew gamma * max(qvalues(ns))) cum_rewards.append(cum_reward) rewards.append(cum_reward) if epoch % 5000 0: print(f{epoch}: {np.average(cum_rewards)}, alpha{alpha}, epsilon{epsilon}) if np.average(cum_rewards) Qmax: Qmax np.average(cum_rewards) Qbest Q cum_rewards []其中 Q 值更新就是标准的 Q-Learning 更新式Q(s,a) ← (1-α)Q(s,a) α(rew γ·max_a Q(s,a))。迁移时注意两点差异会直接影响行为奖励语义不同Mountain Car 的rew除终止步外恒为 -1cum_reward是负值且随步数增长越来越负。因此“平均累计奖励越高越好”的监控指标依然成立越接近 0 越好但数值量级与 CartPole 的 195 分标准完全不同——Mountain Car 的成功判据应是平均用步数显著下降或在 200 步上限内登顶的比例上升。训练步数放大CartPole 单回合最多 500 步Mountain Car 单回合最长 200 步但每个 episode 都需要 20~60 步摆荡才可能成功样本效率更低epoch总量与epsilon的退火策略需要重新实验文档已明确提示“很可能需要调整超参数才能收敛”。5. 训练进度可视化课程用移动平均来平滑随机训练的波动code block 12这段代码可直接复用def running_average(x, window): return np.convolve(x, np.ones(window) / window, modevalid) plt.plot(running_average(rewards, 100))原始rewards曲线每次 episode 的累计奖励噪声很大取 100 的滑动平均后才能看出收敛趋势对应课程插图 train_progress_runav.png。6. 部署验证按概率分布选动作训练完成后用与训练时一致的策略运行仿真并render()观察行为obs env.reset() done False while not done: s discretize(obs) env.render() v probs(np.array(qvalues(s))) a random.choices(actions, weightsv)[0] obs, _, done, _ env.step(a) env.close()课程还留了两个进阶挑战迁移到 Mountain Car 同样适用Task 3课程保存了历史最优Qbest用Qbest覆盖Q再演示对比行为差异Task 4把“按概率分布采样动作”改为np.argmax直接选 Q 值最大的动作观察平衡/登顶表现是否更稳定。评分标准Rubric任务文档给出的三级评分标准完整保留如下德译中标准优秀Vorbildlich合格Angemessen待改进VerbesserungswürdigQ-Learning 算法成功从 CartPole 示例迁移而来代码改动最小且能在200 步以内解决登顶取旗问题从网络获取了新的 Q-Learning 算法但文档良好或迁移了现有算法但未达到预期效果未能成功迁移任何算法但采取了实质性解题步骤如实现了状态离散化、Q-Table 数据结构等“优秀”档实际上给出了可量化的验收指标 200 步登顶——这恰好与环境的回合上限200 步呼应意味着策略必须接近最优效率地摆荡。相关资源与作答路径完成本任务时仓库中可直接引用的材料有德语文档本身translations/de/8-Reinforcement/2-Gym/assignment.md及其英文权威原文 8-Reinforcement/2-Gym/assignment.md起点代码CartPole Q-Learning 全量实现8-Reinforcement/2-Gym/notebook.ipynb、逐块讲解见 8-Reinforcement/2-Gym/README.md德语版 translations/de/8-Reinforcement/2-Gym/README.md前序课程离散棋盘上的 Q-Learning 原型本课程的算法思想源头8-Reinforcement/1-QLearning/README.md 与 8-Reinforcement/1-QLearning/notebook.ipynb参考实现目录8-Reinforcement/2-Gym/solution/ 下提供了 notebook.ipynb 解答另有 Rsolution/R与 Juliasolution/Julia语言的解答说明。小结这份 “Train Mountain Car” 任务的价值在于它用最精炼的方式演示了 Gym 统一 API 的红利算法骨架Q-Table 字典、qvalues、ε-策略、Q 值更新式、Qbest保存一行不改只需替换环境名、重写 2 维观测的离散化函数、把动作集从 2 扩到 3再针对 Mountain Car 的负奖励与 200 步上限重新调参就能把 CartPole 的平衡策略训练流程复用到“摆荡登顶”这一需要延迟满足的新问题上。掌握这一迁移流程后面对 Gym 中其他经典控制环境文档也提到 Gym 的环境从 CartPole 一直到 Atari 游戏时都可以沿用同样的思路起步。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表