Blog Edition 文本附件:保留技术内容,仅适配路径/链接与运行命令。 # V2 教材化重构验收 日期:2026-09-05。重构基于原有14课与已验证资产,先完成 [逐课审计计划](https://zdd14990.github.io/blog/applied-math/autograd/00-overview/),再按 Lesson 1 -> 14 扩充 Markdown。没有重新生成课程或更换实验主例子。 ## 唯一基线与资产保留 - HIPS/autograd:1.9.1。 - 指定与实际 HEAD:`f53a21734fdfae636f448744d9097d8d35a643a0`。 - 实际导入:`autograd/__init__.py`。 - Python:3.14.4,课程虚拟环境 `当前虚拟环境`。 - 核心仓库:开始审计与复跑后 `git status --porcelain=v1 --untracked-files=all` 均为空。 - 14个实验 Python 文件、Mini 的3个 Python 文件均与修订前 SHA-256 相同;没有删除文件或修改实验/引擎逻辑。 - 原 repository map、theory reference、implementation design review、Mini README、MASTER_PLAN 保留原文;口试与 debugger 仅补来源标识及对应代码的准确节选。 - 所有原 checkpoint 问题通过逐项内容匹配保留。 `multiple_paths.py` 本来就在独立进程内临时包装 add_outgrads,并在 finally 恢复;本轮按原样运行,没有写入 HIPS 源码。检查与运行使用 `-B` / `PYTHONDONTWRITEBYTECODE=1`,Mini pytest 禁用 coverage 与 cache 写入。 ## 每课修改 以下14个文件均在原章节内扩充,保留原数学、实验结论与 checkpoint。 | 课 | 修改文件 | 本次增加的教材内容 | | --- | --- | --- | | 1 | [01-ad-and-computational-graph.md](https://zdd14990.github.io/blog/applied-math/autograd/01-ad-and-computational-graph/) | 完整 grad 原文,log/sin 分开标来源,seed/closure 与原手算表衔接 | | 2 | [02-jvp-vjp.md](https://zdd14990.github.io/blog/applied-math/autograd/02-jvp-vjp/) | R2->R2 的逐项 J、Jv、VJP,局部传播表,完整 make_jvp/make_vjp,Node 状态与 closure 时序比较 | | 3 | [grad-call-chain.md](https://zdd14990.github.io/blog/applied-math/autograd/03-grad-call-chain/) | 包装器创建/执行分开,完整 unary_to_nary/grad/make_vjp/trace,__mul__ 到 primitive,输出 ones,完整对象边界表 | | 4 | [tracer.md](https://zdd14990.github.io/blog/applied-math/autograd/04-tracer/) | trace/root/TraceStack/Box/new_box/find_top 原文,primitive 三级阅读,wrapper locals 与控制流 Box 快照 | | 5 | [core-reverse-mode.md](https://zdd14990.github.io/blog/applied-math/autograd/05-core-reverse-mode/) | 完整 make_vjp/backward_pass/VJPNode/toposort,defvjp 三个时刻,outgrads 每步状态,3+3=6 与 PDF 第14页逐行映射 | | 6 | [numpy-vjps.md](https://zdd14990.github.io/blog/applied-math/autograd/06-numpy-vjps/) | add/multiply/subtract/divide/exp/log/sin/sum 的真实 VJP,staged 捕获表,sum shape helper 与各路径贡献 | | 7 | [06-broadcasting.md](https://zdd14990.github.io/blog/applied-math/autograd/07-broadcasting/) | 完整 unbroadcast_f/unbroadcast,metadata,scalar->vector 与 (3,)->(2,3) 的反向归约状态与相反方向图 | | 8 | [forward-mode.md](https://zdd14990.github.io/blog/applied-math/autograd/08-forward-mode/) | make_jvp/JVPNode/defjvp/def_linear 原文,按参数分别线性,两个 basis tangent 的即时传播表 | | 9 | [09-why-reverse-mode.md](https://zdd14990.github.io/blog/applied-math/autograd/09-why-reverse-mode/) | 三个方向查询手算,完整 scalar 检查消息,VSpace size 契约,执行次数与图保留成本的区别 | | 10 | [10-higher-order-ad.md](https://zdd14990.github.io/blog/applied-math/autograd/10-higher-order-ad/) | trace2->1->0 nested Box 图、各层 root、逐层解箱/装箱表、power VJP 与 derivative program 再被求导 | | 11 | [11-operator-composition.md](https://zdd14990.github.io/blog/applied-math/autograd/11-operator-composition/) | jacobian/hessian/make_hvp/value_and_grad 原文,按输出 basis 取行、形状拼接、elementwise 的列和语义 | | 12 | [12-numerical-gradient-checking.md](https://zdd14990.github.io/blog/applied-math/autograd/12-numerical-gradient-checking/) | make_numerical_jvp/check_jvp/check_vjp 原文,EPS 尺度区别、伴随恒等式状态表、二阶递归检查 | | 13 | [custom-primitive.md](https://zdd14990.github.io/blog/applied-math/autograd/13-custom-primitive/) | registry 前后状态、缺失规则的实际失败位置、translate_vjp、正确浮点示例与可微 closure 边界 | | 14 | [14-mini-autograd-design.md](https://zdd14990.github.io/blog/applied-math/autograd/14-mini-autograd-design/) | 直接节选原 Value.__mul__/Value.backward,与 VJPNode/backward_pass/add_outgrads 并排比较,实现差异与共享输入状态 | 其他修改: - [README.md](https://zdd14990.github.io/blog/applied-math/autograd/00-overview/):V2 入口、来源分类、可点击的14课索引。 - [roadmap.md](https://zdd14990.github.io/blog/applied-math/autograd/00-overview/):V2 完成记录,原阶段完整测试与本轮复核分开。 - [debugger-walkthrough.md](https://zdd14990.github.io/assets/autograd/source-notes/debugger-walkthrough.txt):实验代码按真实文件标注来源。 - [source-oral-exam.md](https://zdd14990.github.io/assets/autograd/questions/source-oral-exam.txt):保留全部题目,明确题干程序是教学代码。 新增文件: - [REVISION_PLAN_V2.md](https://zdd14990.github.io/blog/applied-math/autograd/00-overview/):修改前逐课审计和完成状态。 - [grad-runtime-sequence.md](https://zdd14990.github.io/assets/autograd/diagrams/grad-runtime-sequence.txt)、[nested-traces.md](https://zdd14990.github.io/assets/autograd/diagrams/nested-traces.txt):大版时序/对象图。 - 本验收文件,以及 verify_v2.py(教材原附件:tools/verify_v2.py)、markdown_audit.mjs(教材原附件:tools/markdown_audit.mjs):重复核验工具。 - `verification/baseline-v2.json`、`verification/source-audit-v2.json`、`verification/test-results-v2.json`:资产哈希、逐块原文定位与完整 stdout/stderr。 - `verification/reverse-ad-page14.png`:原 PDF 第14页的只读渲染核对记录。 ## 原文与 Markdown 核验 79个 `[REAL SOURCE]` 节选均逐块匹配 `git show f53a21734fdfae636f448744d9097d8d35a643a0:` 的连续行,仅允许展示缩进/换行格式归一化。每块均含 File、Symbol、完整 Commit;没有通过替换变量、删除中间行或缩写消息伪装原文。 18个 `[EXPERIMENT]` Python 节选匹配现有实验文件,并包含 File/Purpose。8个 `[TEACHING SIMPLIFICATION]` 块均明确声明“以下不是 HIPS/autograd verbatim source。”;其中3个 Mini 节选额外匹配本地原实现/demo。 围栏扫描与 Marked 17.0.5 的 GFM 解析交叉核对 Python 块数量;本地链接通过结构化 parser 提取后检查目标存在。原文匹配位置与所有检查错误列表记录在 source-audit-v2.json,最终 errors 为空。Lesson 3、4、5、10 的 STATE SNAPSHOT 存在检查也包含在脚本中。 重要准确性修正:旧 primitive 节选省略的 dispatcher 参数恢复为原文;grad 异常文字恢复原文;RecordingNode 额外字段与真实 VJPNode 分开;第二次 dense 累加明确是 vs.add;整数不能用于 missing-VJP 示例;官方 logsumexp 例子中与表达式矛盾的“不捕获x”注释没有被继续当作事实。 ## 实验复跑结果 | 既有实验 | 结果 | 关键证据 | | --- | --- | --- | | lesson01_ad_and_graph.py | PASS | 解析、AD、中心差分一致,本地 import 断言通过 | | jvp_vjp.py | PASS | J、Jv、w^T J 均与显式矩阵一致 | | simple_grad.py | PASS | parents=(root,root),forward=9,VJP/grad=6 | | trace_box.py | PASS | positive branch,2次循环,4次 Box 观察 | | multiple_paths.py | PASS | None+3 -> (3,False),3+3 -> (6,True) | | numpy_primitives.py | PASS | 八种基础运算组合与解析梯度一致 | | broadcasting.py | PASS | scalar cotangent=3,vector cotangent=[2,2,2],shape 正确 | | forward_mode.py | PASS | 两列 basis JVP 与完整 Jacobian 一致 | | reverse_mode_scaling.py | PASS | forward执行3次,reverse构图执行1次 | | higher_order.py | PASS | 一至三阶12/12/6;Box trace 2->1->0 | | operator_composition.py | PASS | gradient/Hessian/HVP/value_and_grad 等交叉验证 | | gradient_check.py | PASS | 五个步长误差记录一致,双模式二阶 checker 通过 | | custom_primitive.py | PASS | 预期 missing VJP 后登记成功,二阶 reverse checker 通过 | | debug_walkthrough.py | PASS | 真实源码 call/return 边界与最终梯度断言通过 | 全部14个实验退出码为0。Mini demo 退出码为0,输出 `z=11.652071455223`、`dz/dx=5.5`、`dz/dy=1.716337814537`;Mini tests 为 **4 passed in 0.01s**。 本轮没有重跑原阶段的645项核心测试,因为修改集中在教材 Markdown,用户要求的14个原实验和 Mini tests 已全部重跑。README/roadmap 中的 `645 passed, 14 warnings` 明确保留为原阶段记录。 ## 重复核验 以下保留教材阶段的核验方式。`tools/verify_v2.py` 属于原教材工具,不包含在博客下载包中;下载包的运行方法见系列总览。命令中的 `../autograd` 表示与教材目录相邻的源码 checkout。 仅检查资产、原文、围栏、链接和核心工作树: ```powershell python -B tools\verify_v2.py ``` 重跑全部原实验和 Mini 验证,再执行上述检查: ```powershell python -B tools\verify_v2.py --run-assets git -C ../autograd status --short --branch git -C ../autograd rev-parse HEAD ``` Markdown parser 使用本机已安装的 Codex Node runtime 与 marked;搬迁机器时可设置 `V2_NODE_RUNTIME` 指向含 `bin/node.exe` 与 `node_modules/marked` 的 runtime。`--snapshot` 只用于首次建立基线,已有基线时会拒绝覆盖。