
从 CartPole 到 Mountain CarML-For-Beginners 强化学习篇的 Q-Learning 环境迁移实战【免费下载链接】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 仓库强化学习章节的 Train Mountain Car 作业assignment.it.md对应英文原版 assignment.md展开它要求读者把前一课在 CartPole 环境中训练好的 Q-Learning 算法用最小代码改动迁移到 Mountain Car 环境并调参使其收敛。读完本文你将完整掌握 Mountain Car 环境的动作空间、观察空间、奖励机制与终止条件以及状态离散化、Q-Table 构建、超参数调整等把表格型 Q-Learning 应用到连续状态环境的整套方法论。1. 为什么同一套 Q-Learning 算法可以跨环境复用作业开篇给出的核心前提是OpenAI Gym 被设计成所有环境都提供同一套 API——相同的reset、step、render方法以及相同的action space动作空间与observation space观察空间抽象。因此应该只需对代码做极少改动就能把同一个强化学习算法适配到不同环境上。这个统一 API的说法在本仓库中并非空谈。前导课程 8-Reinforcement/2-Gym/README.md 演示了 CartPole 环境下这套 API 的实际用法env gym.make(CartPole-v1) print(env.action_space) print(env.observation_space) print(env.action_space.sample())env.reset() done False while not done: obs, rew, done, info env.step(env.action_space.sample()) env.close()step每次返回四元组(obs, rew, done, info)当前观察、即时奖励、终止标志与附加信息。只要新环境遵循同样的四元组协议训练主循环里的算法逻辑就无需重写——这正是 Mountain Car 作业可行性的理论基础也是作业评分改动最小化的衡量标准。2. Mountain Car 环境详解2.1 问题设定与动作空间Mountain Car 环境包含一辆卡在山谷中的汽车见文首配图。目标是在每一步执行下列三个动作之一最终逃出山谷、到达山顶抓住旗帜值含义0向左加速1不加速2向右加速这个环境的关键难点在于小车引擎功率不足无法一次性冲上山。唯一的成功策略是左右来回行驶、反复积攒动量momentum最终借惯性翻过右侧山脊。这意味着策略必须有远见——短期内向左背离目标方向加速反而是正确行为而这正是考验 Q-Learning 能否学到时序依赖策略的地方。2.2 观察空间与 CartPole 的 4 维观察不同Mountain Car 的观察空间只有两个实数序号观察量最小值最大值0汽车位置-1.20.61汽车速度-0.070.07注意与 CartPole 的一个重要差异Mountain Car 的位置和速度都有确定的上/下界可从env.observation_space.low/env.observation_space.high读取。这一点让分箱离散化成为比 CartPole 课程中discretize缩放取整更自然的选择——状态总数可以被精确控制。2.3 奖励机制与回合终止Mountain Car 的奖励系统相当棘手原文用词 rather tricky规则如下当智能体到达山顶旗帜处位置 0.5时奖励为0当智能体位置小于 0.5 时每一步奖励为-1。回合在满足以下任一条件时终止汽车位置大于 0.5抓住旗帜成功回合步数超过200步超时失败。由此可以推断两个训练要点奖励信号全是非正的0 或 -1智能体的目标等价于最小化累计惩罚即尽快在 200 步内到达位置 0.5。200 步既是失败阈值也是成功标准作业要求算法在少于 200 步内抓住旗帜即成功回合的累计奖励应落在 (-200, 0] 区间内且越接近 0 越好。3. 作业要求从现有 notebook 起步做最小改动作业原文的Instructions部分给出了明确的任务边界将我们的强化学习算法改编为求解山地车问题。从现有的 notebook.ipynb 代码出发替换为新环境修改状态离散化函数尝试让现有算法以最小的代码修改量完成训练。并通过调整超参数来优化结果。注意为了让算法收敛很可能需要进行超参数调整。起点代码就是 CartPole 课程配套的 8-Reinforcement/2-Gym/notebook.ipynb完整可运行版本见 solution/notebook.ipynb。下面按迁移顺序盘点其中需要保留与需要改动的核心构件。3.1 状态离散化必须修改的部分CartPole 版本提供了两种离散化函数Mountain Car 的改编就建立在这套方法之上# 方式一线性缩放取整CartPole 课程默认采用 def discretize(x): return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int))# 方式二分箱bins np.digitize def 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))CartPole 之所以选择方式一是因为其 4 维观察中有 2 维理论上无界分箱区间只能凭经验估计而 Mountain Car 的两个观察量都有明确边界方式二的分箱方案可以直接复用把位置区间 (-1.2, 0.6) 和速度区间 (-0.07, 0.07) 各划分为若干箱。例如各取 10 箱状态空间大小就是 10 × 10 100完全可以用二维数组或字典表示 Q-Table。迁移时的离散化函数大致形如按作业修改状态离散化函数的要求改编pos_bins create_bins((-1.2, 0.6), 10) # 位置 10 箱 vel_bins create_bins((-0.07, 0.07), 10) # 速度 10 箱 def discretize(x): return (np.digitize(x[0], pos_bins), np.digitize(x[1], vel_bins))箱数的取舍是典型的精度—状态数权衡箱越细策略越精细但状态空间越大、样本覆盖越慢。这是作业中调参优化结果的第一个可调旋钮。3.2 Q-Table 结构保留字典方案改动作元组由于离散化后状态仍可能出现极端值或采用缩放取整方案CartPole 课程采用了字典而非固定形状张量来存 Q-TableQ {} actions (0, 1) # CartPole左/右 两个动作 def qvalues(state): return [Q.get((state, a), 0) for a in actions]以(state, action)元组为键、Q 值为值查表缺失时默认返回 0。迁移到 Mountain Car 时这段结构原样保留唯一改动是把actions从(0, 1)改为(0, 1, 2)与 Mountain Car 的三值动作空间对齐。3.3 超参数与训练主循环基本不改只换环境CartPole 课程的训练循环对应 notebook 的 code block 10/11是迁移的骨架# 超参数 alpha 0.3 # 学习率Q 值朝目标更新的步长 gamma 0.9 # 折扣因子未来奖励的权重 epsilon 0.90 # 探索/利用因子以此概率按 Q 表采样否则随机 def 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 表概率分布采样动作 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) # Bellman 更新 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 # 保留历史最优 Q 表 cum_rewards []其中env.action_space.n会随环境自动变为 3env gym.make(...)换成 Mountain Car 环境后整个循环的算法逻辑一行都不用动——这就是作业强调minimal code modifications的由来。4. 让 Mountain Car 收敛超参数调整要点作业特别提示很可能需要调参才能收敛。结合 CartPole 课程 README.md 中Varying hyperparameters一节给出的经验迁移时有三类可调项学习率alpha可从一个接近 1 的值开始并逐步衰减——训练后期 Q 表中的好值不应被新样本完全覆盖。CartPole 示例采用固定的 0.3迁移时可以直接以此为基线。探索因子epsilon从较低值起步、缓慢增大到接近 1该课程把按 Q 表概率采样记为 exploit 分支让智能体后期更多利用已学策略。状态分辨率离散化箱数位置/速度各 10 箱是常用起点若策略在山顶附近冲不过去可尝试加密位置箱。判断收敛的正确姿势与 CartPole 课程一致用滑动平均平滑每回合累计奖励再作图而不是看单回合曲线单回合长度从个位数到 200 步剧烈波动原始曲线几乎不可读def running_average(x, window): return np.convolve(x, np.ones(window)/window, modevalid) plt.plot(running_average(rewards, 100))对 Mountain Car 而言收敛的可操作定义来自作业评分标准成功回合是在 200 步以内抓住旗帜位置超过 0.5 时回合提前终止。由于成功回合奖励接近 0、失败回合为 -200训练后期np.average(cum_rewards)若稳定落在远好于 -200 的水平例如 -1 附近且几乎不再下降即可视为算法达标。与 CartPole 课程相同的稳健性技巧也适用于此保留Qmax对应的历史最优Qbest避免后期训练破坏已经学好的 Q 值。5. 评分标准Rubric作业原文的评分表如下三个等级分别对应最小改动的成功迁移文档完整的借用但未达目标未成功但有实质性进展等级评分标准优秀ExemplaryQ-Learning 算法从 CartPole 示例成功改编代码改动最小化且能在200 步以内解决抓旗问题。合格Adequate从外部资料采用了新的 Q-Learning 算法但文档完备或采用了现有算法但未达到期望结果。待改进Needs Improvement未能成功采用任何算法但朝解法迈出了实质性步骤已实现状态离散化、Q-Table 数据结构等。这张表也划定了作业的及格线即便算法尚未收敛完成状态离散化函数、(state, action)字典式 Q-Table、训练主循环这三个构件仍会被认定为实质性进展——换言之第 3 节列出的构件本身就是可交付成果。6. 小结与延伸阅读这篇作业的价值在于演示了表格型 Q-Learning 的环境可迁移性Gym 统一 API 把环境差异压缩到gym.make一行、离散化函数与动作元组三处改动而 Bellman 更新、epsilon 采样、Qbest快照等核心逻辑跨环境通用。Mountain Car 又额外引入了两个 CartPole 没有的练习点——观察空间有界时的分箱策略设计以及全非正奖励下的收敛判定。仓库中可继续深入的入口8-Reinforcement/2-Gym/README.mdCartPole 课程的完整教学含两种离散化方法的对比与训练曲线分析8-Reinforcement/2-Gym/notebook.ipynb 与 8-Reinforcement/2-Gym/solution/notebook.ipynb作业要求从现有代码出发的起点与完整可运行参考实现8-Reinforcement/1-QLearning/README.md更早期基于自研棋盘环境的 Q-Learning 入门课Bellman 方程与 Q 值更新的推导出处8-Reinforcement/2-Gym/translations/assignment.zh-cn.md 等其他语言版本的同一作业文本。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考