《强化学习与深度学习:通过C语言模拟》权威学习地图

《强化学习与深度学习:通过C语言模拟》权威学习地图逐项覆盖官方目录,以C程序、手算更新、交互实验和失败对照重建原书证据链。

为什么先冻结数组与状态合同

、、、、、共同构成本页坐标。按原书四章推进:先建立强化学习、深度学习与深度强化学习的关系,再实现 Q 学习,随后实现分层网络与卷积网络,最后把网络作为 Q 函数近似器完成两个迷宫程序。

本书的价值不在于使用 C 语言追求大规模训练,而在于把算法压缩到可逐行检查的内存和循环。所有状态、动作、神经元、卷积位置和权重都必须有明确索引;所有随机选择都必须可复现;所有 episode 与训练样本开始前都必须明确哪些数组清零、哪些参数保留。

证据账本至少保存输入、合法动作掩码、环境转移、即时奖励、更新前 Q 值、TD 目标、各层激活、输出误差、隐藏层误差、权重更新和终止标记。最终累计奖励只是结果,不足以排除数组越界、未初始化内存、错误动作索引、符号反转或终止状态继续 bootstrap。

数学骨架

δt=rt+1+γmaxaQ(st+1,a)Q(st,at)\delta_t=r_{t+1}+\gamma\max_aQ(s_{t+1},a)-Q(s_t,a_t) QQ+αδtQ\leftarrow Q+\alpha\delta_t y=f(Wx+b)\mathbf y=f(\mathbf W\mathbf x+\mathbf b) L=12(yTDQ(s,a;θ))2L=\frac12\left(y_{\mathrm{TD}}-Q(s,a;\theta)\right)^2

公式进入 C 循环前逐项映射变量:写清标量与数组、输入和输出长度、旧值和新值、学习率与折扣因子的范围。浮点运算后检查有限值;argmax 只遍历合法动作;网络目标只修改被选择动作的输出,其他输出保持当前预测。

三段可编译核心

typedef struct {
    int state;
    int action;
    double reward;
    int next_state;
    int terminal;
} EvidenceRow;
void assert_finite(const double *values, int count) {
    for (int i = 0; i < count; ++i)
        if (!isfinite(values[i])) abort();
}
int main(void) {
    seed_rng(7);
    reset_all_state();
    run_fixed_episode();
    verify_saved_evidence();
    return 0;
}

代码片段刻意保留显式循环和状态结构。复现时使用编译器告警、地址/未定义行为检测和固定种子;对每个数组维度增加断言,并将环境、学习器和评价器分开,避免评价过程继续更新 Q 表或网络权重。

权威目录逐项讲解

第1章 强化学习与深度学习(第1章 強化学習と深層学習)

官方目录项“第1章 強化学習と深層学習”对应第1章 强化学习与深度学习。它把Q学习连接到分层网络:先写输入数组、索引含义和状态版本,再逐行说明循环、分支与赋值对应哪一步算法。C 程序没有框架替你检查广播、自动微分或 episode 生命周期,所以数组边界、合法动作、初始化和终止条件本身就是算法的一部分。

最小复现固定迷宫、样本、权重初值和随机种子,先预测改变一个变量后最早变化的状态、Q 值、激活、局部误差或卷积元素,再保存更新前后值。针对“第1章 强化学习与深度学习”,验收标准是:4个章标题和32个编号节/小节必须逐项可导航;q21.c、nn1.c、nn2.c、nn3.c、q21dl.c、q22dl.c 的输入、状态和更新证据均可重放。若首个证据不一致,停止长期训练,从零初始化内存并检查索引、符号、学习率和 bootstrap 边界。

第2章 强化学习的实现(第2章 強化学習の実装)

官方目录项“第2章 強化学習の実装”对应第2章 强化学习的实现。它把C语言模拟连接到反向传播:先写输入数组、索引含义和状态版本,再逐行说明循环、分支与赋值对应哪一步算法。C 程序没有框架替你检查广播、自动微分或 episode 生命周期,所以数组边界、合法动作、初始化和终止条件本身就是算法的一部分。

最小复现固定迷宫、样本、权重初值和随机种子,先预测改变一个变量后最早变化的状态、Q 值、激活、局部误差或卷积元素,再保存更新前后值。针对“第2章 强化学习的实现”,验收标准是:4个章标题和32个编号节/小节必须逐项可导航;q21.c、nn1.c、nn2.c、nn3.c、q21dl.c、q22dl.c 的输入、状态和更新证据均可重放。若首个证据不一致,停止长期训练,从零初始化内存并检查索引、符号、学习率和 bootstrap 边界。

第3章 深度学习技术(第3章 深層学習の技術)

官方目录项“第3章 深層学習の技術”对应第3章 深度学习技术。它把分层网络连接到卷积网络:先写输入数组、索引含义和状态版本,再逐行说明循环、分支与赋值对应哪一步算法。C 程序没有框架替你检查广播、自动微分或 episode 生命周期,所以数组边界、合法动作、初始化和终止条件本身就是算法的一部分。

最小复现固定迷宫、样本、权重初值和随机种子,先预测改变一个变量后最早变化的状态、Q 值、激活、局部误差或卷积元素,再保存更新前后值。针对“第3章 深度学习技术”,验收标准是:4个章标题和32个编号节/小节必须逐项可导航;q21.c、nn1.c、nn2.c、nn3.c、q21dl.c、q22dl.c 的输入、状态和更新证据均可重放。若首个证据不一致,停止长期训练,从零初始化内存并检查索引、符号、学习率和 bootstrap 边界。

第4章 深度强化学习(第4章 深層強化学習)

官方目录项“第4章 深層強化学習”对应第4章 深度强化学习。它把反向传播连接到深度强化学习:先写输入数组、索引含义和状态版本,再逐行说明循环、分支与赋值对应哪一步算法。C 程序没有框架替你检查广播、自动微分或 episode 生命周期,所以数组边界、合法动作、初始化和终止条件本身就是算法的一部分。

最小复现固定迷宫、样本、权重初值和随机种子,先预测改变一个变量后最早变化的状态、Q 值、激活、局部误差或卷积元素,再保存更新前后值。针对“第4章 深度强化学习”,验收标准是:4个章标题和32个编号节/小节必须逐项可导航;q21.c、nn1.c、nn2.c、nn3.c、q21dl.c、q22dl.c 的输入、状态和更新证据均可重放。若首个证据不一致,停止长期训练,从零初始化内存并检查索引、符号、学习率和 bootstrap 边界。

七类实现证据

输入与内存合同

固定数据、迷宫和随机种子,声明所有静态数组的容量、有效长度与所有权。每次 episode 开始前写明状态、轨迹和梯度是否清零;释放或复用动态内存时保留唯一责任方,编译器告警必须视为失败。

环境转移合同

环境函数只根据当前状态与动作产生下一状态、奖励和终止标记,不读取 Q 表或网络参数。非法动作在进入学习器前拒绝;同一状态动作在确定性迷宫中必须得到相同转移,随机环境则保存随机数序列。

Q学习合同

保存旧 Q、即时奖励、下一状态合法动作最大值、TD 目标、TD 误差和新 Q。终止状态的未来值固定为零,argmax 与探索采样必须使用同一合法动作集合,更新后的值不能被误用于同一步目标。

网络前向合同

逐层保存加权和与激活,偏置只加一次,输入和输出节点次序与状态/动作编码一致。对 nn1.c、nn2.c、nn3.c 和深度强化程序使用相同的激活定义与数值范围,防止训练和评价路径分叉。

反向传播合同

先计算输出层局部误差,再用更新前权重传播到隐藏层,最后统一更新参数。用中心有限差分核对一个权重;若符号、量级或相对误差不满足容差,禁止增加隐藏单元或训练轮数。

卷积与融合合同

卷积要声明步幅、边界、核翻转约定与输出尺寸,手算一个窗口。Q 学习与网络融合时,网络所有动作输出先复制到目标数组,只替换所选动作的 TD 目标,并确保终止转移不访问下一状态网络输出。

回退与评价合同

评价从固定初态开始,冻结探索率和学习开关,不读取上一 episode 的隐藏状态或梯度。出现分叉时依次回退环境、Q 目标、前向、反向和参数更新;最小样例一致后才运行书中的完整迷宫。

常见失败与边界

本章回顾

按原书四章推进:先建立强化学习、深度学习与深度强化学习的关系,再实现 Q 学习,随后实现分层网络与卷积网络,最后把网络作为 Q 函数近似器完成两个迷宫程序。验收底线是:4个章标题和32个编号节/小节必须逐项可导航;q21.c、nn1.c、nn2.c、nn3.c、q21dl.c、q22dl.c 的输入、状态和更新证据均可重放。掌握标准是能在运行前预测首个变化,逐行解释 C 循环,复现实验,解释失败样本,并证明评价不改变学习状态。

讨论

评论区加载中…