第2章:强化学习的实现

把 Q 学习写成可手算、可重放的 C 循环,明确探索、合法动作和终止状态的更新边界。

学习目标

  • 能用“怎样证明一次 Q 更新使用的是旧值、合法动作和正确的终止语义,而不是“看起来收敛”的偶然运行?”解释本页问题,并把结论限制在官方 2017 年版目录范围内
  • 能逐项重建“可靠的 Q 学习实现必须保存更新前值和 TD 目标,并在终止转移切断未来价值。”的输入、状态、公式与中间证据
  • 能对“令旧 Q 为 0.4、奖励为 1、学习率为 0.5;终止转移的目标是 1,新 Q 为 0.7。若误加下一状态垃圾值,第一处偏差就在目标计算。”完成一次手算或逐步重放,而不是只观察最终奖励
  • 能注入“终止状态继续自举下一状态价值”,定位首个分岔并用重置回到相同初值

为什么从这个问题开始

怎样证明一次 Q 更新使用的是旧值、合法动作和正确的终止语义,而不是“看起来收敛”的偶然运行? 可靠的 Q 学习实现必须保存更新前值和 TD 目标,并在终止转移切断未来价值。 “第2章:强化学习的实现”的学习目标不是复述原书目录,而是把目录约束转成可以计算、运行、失败和复位的教学合同。为 q21.c 类迷宫程序建立数组、动作掩码、TD 目标和 episode 生命周期的完整合同。

先写预测:在同一初值下,如果故障“终止状态继续自举下一状态价值”被启用,最先变化的是输入、转移、TD 目标、激活、梯度还是评价哈希?运行后若观察不一致,应缩小结论并检查第一处差异,不能用更长训练覆盖它。

来源、版次与版权边界

欧姆社官方书页确认小高知宏著、2017 年 10 月 14 日出版、208 页、ISBN 978-4-274-22114-9,并公开四章详细目录。官方页同时声明配套压缩包仅供购书者使用;本课程没有下载、缓存或改写该压缩包,只用公开目录核定范围。

技术事实另以《Reinforcement Learning: An Introduction》作者页面《Deep Learning》作者开放页面交叉核对。第2章:强化学习的实现的中文解释、C 片段、交互、数值、反例、练习与答案均为独立教学重写;现代 DQN、经验回放、目标网络或策略梯度若出现,只能明确标成边界,不能倒填为 2017 年原书内容。

术语、对象与前提

  • :用下一个状态最大动作价值构造目标的离策略 TD 方法。
  • :即时奖励与折扣后的下一状态价值之和。
  • :TD 目标减去更新前状态动作价值。
  • :在尝试未知动作与选择当前最优动作之间取舍。
  • :限定状态下允许进入最大值与采样的动作集合。
  • :终止状态错误地继续加入未来价值的缺陷。

必须先声明以下假设:

  • Q 表尺寸覆盖全部状态与动作编号
  • 最大值和随机探索只遍历合法动作
  • 计算目标时读取更新前的 Q 表快照
  • 终止转移的下一状态价值固定为零

实现管线

第2章:强化学习的实现

怎样证明一次 Q 更新使用的是旧值、合法动作和正确的终止语义,而不是“看起来收敛”的偶然运行?

输入与状态合同

环境独立返回状态、动作、奖励、下一状态和终止标记。

必须留下的证据

保存固定种子下的动作来源、合法动作集和转移五元组。

target = r + (done ? 0 : γ max_a Q[next][a]); Q += α(target - Q)

来源边界:欧姆社公开目录核定范围;购书者示例包未下载、未缓存、未改写;本课程代码与实验独立编写。

核心机制与可复算表达

本页主张: 可靠的 Q 学习实现必须保存更新前值和 TD 目标,并在终止转移切断未来价值。

target=r+(done?0:γmaxaQ[next][a]);Q+=α(targetQ)target = r + (done ? 0 : γ max_a Q[next][a]); Q += α(target - Q)

这条主张只在上述四条假设下成立。令旧 Q 为 0.4、奖励为 1、学习率为 0.5;终止转移的目标是 1,新 Q 为 0.7。若误加下一状态垃圾值,第一处偏差就在目标计算。 验收时必须保存“固定种子、合法动作列表、转移五元组、旧 Q、TD 目标、TD 误差、新 Q 和终止分支日志。”,否则最终奖励或损失曲线不足以排除索引、初始化、终止和评价模式错误。

正常轨迹与单故障轨迹

逐步重放

正常轨迹与失败轨迹使用同一输入合同

  1. 01从状态二按固定种子选择合法动作一。
  2. 02环境返回奖励零、下一状态三、未终止。
  3. 03用下一状态合法动作最大值构造 TD 目标。
  4. 04只更新 Q[2][1] 并保存前后值。

不变量:一次转移只允许一个 Q 单元变化,且终止转移的目标不包含任何下一状态价值。

正常轨迹要求同一输入和随机序列得到同一中间状态。故障轨迹只删除一个前提:“终止状态继续自举下一状态价值”。两条轨迹共用其余条件,才能把首个分岔归因到该故障,而不是换了任务、模型或初值。

独立 C 实现片段

double q_update(double old_q, double reward, double next_max,
                double alpha, double gamma, int done) {
    const double target = reward + (done ? 0.0 : gamma * next_max);
    return old_q + alpha * (target - old_q);
}

这段代码由本课程独立编写,只展示“第2章:强化学习的实现”的最小接口,不复制官方购书者压缩包。编译时应启用告警、地址检测和未定义行为检测;运行记录包含输入尺寸、索引、旧值、新值和终止标记。

反例、适用边界与复位

反例与证据

删除一个前提,定位首个错误状态

基线可继续:一次转移只允许一个 Q 单元变化,且终止转移的目标不包含任何下一状态价值。

复位不是只把按钮切回默认值。它必须恢复与“第2章:强化学习的实现”有关的环境、随机数、表格、参数、轨迹和模式开关,并再次确认“一次转移只允许一个 Q 单元变化,且终止转移的目标不包含任何下一状态价值。”。

正式目录逐项深读

第2章 强化学习的实现

目录映射 1/7。 第2章 强化学习的实现在“第2章:强化学习的实现”中承担为 q21.c 类迷宫程序建立数组、动作掩码、TD 目标和 episode 生命周期的完整合同。的一个明确节点。复核时先指出它读取的输入和允许改变的状态,再用“一次转移只允许一个 Q 单元变化,且终止转移的目标不包含任何下一状态价值。”核对结果;不能把目录标题本身当作技术结论。

2.1 强化学习与 Q 学习

目录映射 2/7。 2.1 强化学习与 Q 学习在“第2章:强化学习的实现”中承担为 q21.c 类迷宫程序建立数组、动作掩码、TD 目标和 episode 生命周期的完整合同。的一个明确节点。复核时先指出它读取的输入和允许改变的状态,再用“一次转移只允许一个 Q 单元变化,且终止转移的目标不包含任何下一状态价值。”核对结果;不能把目录标题本身当作技术结论。

2.1.1 强化学习的思路

目录映射 3/7。 2.1.1 强化学习的思路在“第2章:强化学习的实现”中承担为 q21.c 类迷宫程序建立数组、动作掩码、TD 目标和 episode 生命周期的完整合同。的一个明确节点。复核时先指出它读取的输入和允许改变的状态,再用“一次转移只允许一个 Q 单元变化,且终止转移的目标不包含任何下一状态价值。”核对结果;不能把目录标题本身当作技术结论。

2.1.2 Q 学习算法

目录映射 4/7。 2.1.2 Q 学习算法在“第2章:强化学习的实现”中承担为 q21.c 类迷宫程序建立数组、动作掩码、TD 目标和 episode 生命周期的完整合同。的一个明确节点。复核时先指出它读取的输入和允许改变的状态,再用“一次转移只允许一个 Q 单元变化,且终止转移的目标不包含任何下一状态价值。”核对结果;不能把目录标题本身当作技术结论。

2.2 Q 学习的实现

目录映射 5/7。 2.2 Q 学习的实现在“第2章:强化学习的实现”中承担为 q21.c 类迷宫程序建立数组、动作掩码、TD 目标和 episode 生命周期的完整合同。的一个明确节点。复核时先指出它读取的输入和允许改变的状态,再用“一次转移只允许一个 Q 单元变化,且终止转移的目标不包含任何下一状态价值。”核对结果;不能把目录标题本身当作技术结论。

2.2.1 q21.c 程序实现

目录映射 6/7。 2.2.1 q21.c 程序实现在“第2章:强化学习的实现”中承担为 q21.c 类迷宫程序建立数组、动作掩码、TD 目标和 episode 生命周期的完整合同。的一个明确节点。复核时先指出它读取的输入和允许改变的状态,再用“一次转移只允许一个 Q 单元变化,且终止转移的目标不包含任何下一状态价值。”核对结果;不能把目录标题本身当作技术结论。

2.2.2 例题二:寻找目标的学习程序

目录映射 7/7。 2.2.2 例题二:寻找目标的学习程序在“第2章:强化学习的实现”中承担为 q21.c 类迷宫程序建立数组、动作掩码、TD 目标和 episode 生命周期的完整合同。的一个明确节点。复核时先指出它读取的输入和允许改变的状态,再用“一次转移只允许一个 Q 单元变化,且终止转移的目标不包含任何下一状态价值。”核对结果;不能把目录标题本身当作技术结论。

最小可重放记录

unit: 02-reinforcement-implementation/rlc-02-reinforcement-implementation
question: "怎样证明一次 Q 更新使用的是旧值、合法动作和正确的终止语义,而不是“看起来收敛”的偶然运行?"
initial_state: fixed_and_hashed
normal_trace: saved
fault: "终止状态继续自举下一状态价值"
first_divergence: required
invariant: "一次转移只允许一个 Q 单元变化,且终止转移的目标不包含任何下一状态价值。"
artifact: "固定种子、合法动作列表、转移五元组、旧 Q、TD 目标、TD 误差、新 Q 和终止分支日志。"
reset: restore_environment_rng_tables_weights_trace_and_mode

这份记录把“第2章:强化学习的实现”的目录坐标、输入、故障和证据绑在一起。复核者应先盲跑正常轨迹,再注入故障,最后执行恢复与复位;任何依赖隐藏操作者或上一轮状态的运行都不合格。

练习与答案

练习

问题 1: 旧 Q 为 0.4、奖励为 1、学习率为 0.5 且已终止,新 Q 是多少?

问题 2: 为什么 argmax 必须使用合法动作掩码?

问题 3: 怎样确认评价没有继续学习?

本页回顾

可靠的 Q 学习实现必须保存更新前值和 TD 目标,并在终止转移切断未来价值。 掌握“第2章:强化学习的实现”的标准是:能声明假设、手算关键值、逐步解释 C 状态变化、制造一个最小反例,并证明“一次转移只允许一个 Q 单元变化,且终止转移的目标不包含任何下一状态价值。”在复位后仍然成立。

名词解释

本章出现的专业名词,用大白话再讲一遍。

Q 学习
用下一个状态最大动作价值构造目标的离策略 TD 方法。
TD 目标
即时奖励与折扣后的下一状态价值之和。
TD 误差
TD 目标减去更新前状态动作价值。
探索利用
在尝试未知动作与选择当前最优动作之间取舍。
合法动作掩码
限定状态下允许进入最大值与采样的动作集合。
终止自举
终止状态错误地继续加入未来价值的缺陷。

讨论

评论区加载中…