《强化学习与深度学习:通过C语言模拟》全书总复习

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

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

、、、、、共同构成本页坐标。用同一条证据链串联全书:环境产生转移,Q 学习构造 TD 误差,神经网络执行前向和反向传播,深度强化学习把 TD 目标写入所选动作输出并更新参数。

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

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

数学骨架

(st,at,rt+1,st+1)E(s_t,a_t,r_{t+1},s_{t+1})\sim\mathcal E yt=rt+1+γmaxaQ(st+1,a)y_t=r_{t+1}+\gamma\max_aQ(s_{t+1},a) θL=(Q(st,at;θ)yt)θQ(st,at;θ)\nabla_\theta L=(Q(s_t,a_t;\theta)-y_t)\nabla_\theta Q(s_t,a_t;\theta) θt+1=θtηθL\theta_{t+1}=\theta_t-\eta\nabla_\theta L

公式进入 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章 强化学习与深度学习。它把环境转移连接到网络前向:先写输入数组、索引含义和状态版本,再逐行说明循环、分支与赋值对应哪一步算法。C 程序没有框架替你检查广播、自动微分或 episode 生命周期,所以数组边界、合法动作、初始化和终止条件本身就是算法的一部分。

最小复现固定迷宫、样本、权重初值和随机种子,先预测改变一个变量后最早变化的状态、Q 值、激活、局部误差或卷积元素,再保存更新前后值。针对“第1章 强化学习与深度学习”,验收标准是:能从固定迷宫和固定初值预测首个变化,手算一次 Q 表更新和一次网络更新,并证明训练前后评价都不读取旧 episode 状态。若首个证据不一致,停止长期训练,从零初始化内存并检查索引、符号、学习率和 bootstrap 边界。

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

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

最小复现固定迷宫、样本、权重初值和随机种子,先预测改变一个变量后最早变化的状态、Q 值、激活、局部误差或卷积元素,再保存更新前后值。针对“第2章 强化学习的实现”,验收标准是:能从固定迷宫和固定初值预测首个变化,手算一次 Q 表更新和一次网络更新,并证明训练前后评价都不读取旧 episode 状态。若首个证据不一致,停止长期训练,从零初始化内存并检查索引、符号、学习率和 bootstrap 边界。

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

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

最小复现固定迷宫、样本、权重初值和随机种子,先预测改变一个变量后最早变化的状态、Q 值、激活、局部误差或卷积元素,再保存更新前后值。针对“第3章 深度学习技术”,验收标准是:能从固定迷宫和固定初值预测首个变化,手算一次 Q 表更新和一次网络更新,并证明训练前后评价都不读取旧 episode 状态。若首个证据不一致,停止长期训练,从零初始化内存并检查索引、符号、学习率和 bootstrap 边界。

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

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

最小复现固定迷宫、样本、权重初值和随机种子,先预测改变一个变量后最早变化的状态、Q 值、激活、局部误差或卷积元素,再保存更新前后值。针对“第4章 深度强化学习”,验收标准是:能从固定迷宫和固定初值预测首个变化,手算一次 Q 表更新和一次网络更新,并证明训练前后评价都不读取旧 episode 状态。若首个证据不一致,停止长期训练,从零初始化内存并检查索引、符号、学习率和 bootstrap 边界。

七类实现证据

输入与内存合同

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

环境转移合同

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

Q学习合同

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

网络前向合同

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

反向传播合同

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

卷积与融合合同

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

回退与评价合同

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

常见失败与边界

本章回顾

用同一条证据链串联全书:环境产生转移,Q 学习构造 TD 误差,神经网络执行前向和反向传播,深度强化学习把 TD 目标写入所选动作输出并更新参数。验收底线是:能从固定迷宫和固定初值预测首个变化,手算一次 Q 表更新和一次网络更新,并证明训练前后评价都不读取旧 episode 状态。掌握标准是能在运行前预测首个变化,逐行解释 C 循环,复现实验,解释失败样本,并证明评价不改变学习状态。

讨论

评论区加载中…