Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第 8 讲习题集

四组难度递进:A 概念判断 → B 推导证明 → C 编程实现 → D 开放设计。答案默认折叠,点击展开。 用法:先闭卷做 A 组再对照答案;B 组手写推导(涉及形状与口径的先写清楚);C 组上机跑通验收标准;D 组写成半页方案(方案 + 理由 + 失败判据 + 验证计划,四项缺一不可)。 范围限导览与 8.1–8.6,答案均可在正文定位;正文标「需核实」的量级,答案里保留标注。 两条纪律:涉及科学结论的题,判据必须是可验证的判据(量纲 / 极限 / 独立数据 / 干预 / 守恒 / 分布外误差),「拟合得好」不算判据;涉及真实分歧(GNoME 候选的新颖性、PINN 的适用范围、数据驱动预报与数值模式的对照口径)必须并列两方证据,不站队。

A 组 · 概念判断(8 题)

判定要求:必须给一句话理由或反例,只写「对 / 错」不给分;涉及数字的必须写口径。

A1. 「科学 AI 的主要矛盾是数据太少,所以第一件事是造更多数据。」(定义 8.1.1、8.1.1 直觉框)

答案

错。 主要矛盾是标签稀缺而非数据稀缺:样本(序列、构型、格点观测、仿真轨迹)本来就极多,但「带答案」的样本极少、边际成本极高(一次湿实验、一轮高精度量子化学)。方法上的优先项是自监督、物理标签与主动学习(方法 8.1.1 三张配方),不是「先攒数据再训练」。把「数据多」与「标签多」当一个量,是本讲最常见的起点错误。

A2. 「同一分子整体旋转后,模型给出的能量略有变化;只要变化小于训练误差就不必处理。」(定义 8.1.2、例 8.2.3)

答案

错。 能量是标量,整体旋转 / 平移下必须严格不变;朝向依赖是建模方式缺陷而非数值噪声——模型被迫用容量记住朝向与输出的对应,而这个对应是纯几何的、本该免费。三维旋转群下每个构象有连续无穷多个等价朝向,数据永远穷举不完,代价是样本效率与分布外泛化双降。规则:向量输出(力、坐标、偶极矩)等变,标量输出(能量、距离、二面角)不变。

A3. 「势函数的精度上限由网络表达力和数据量决定,与 DFT 标签怎么算出来的无关。」(8.1.3 思考框、例 8.3.2)

答案

错。 自动标签继承生成器误差:DFT 泛函误差、仿真近似、离散误差都写进训练数据,构成精度上限的一部分;此外还有覆盖率、能量与力的加权、截断半径与长程项、混用不同泛函造成的互相矛盾的标签。所以「免费标签」把误差从标注者转移到物理模型上,验证必须来自独立来源(实验、观测、更高精度计算),不能自证。

A4. 「两个位点在 MSA 上互信息很高,就可以判定它们在空间上相邻(接触)。」(定理 8.2.1、例 8.2.1)

答案

错。 互信息分不开「直接相互作用」与「经第三位点传递的相关」:构造 Xk=XiX_k=X_i、Xj=XkX_j=X_k 的确定性链,三者完全相关,MI(i,j)=1\mathrm{MI}(i,j)=1 bit >0\gt0,而 i,ji,j 没有直接相互作用。去伪三路线:① 全局模型(逆伊辛 / 伪似然,即直接耦合分析类做法)分离耦合与边际;② 用已知结构监督打分函数;③ 端到端方法不显式输出接触图,让注意力直接消费共进化信息。两两位点对共 O(N2)O(N^2) 个,假阳性会随规模堆积。

A5. 「势函数跑的分子动力学没崩、轨迹看起来正常,就说明模拟可信。」(方法 8.3.2、例 8.3.1)

答案

错,这是最危险的一类误判。 势函数常精确但静默地错:单步误差极小却带系统性偏置,长时累积成非物理结果(能量 / 温度缓慢漂移、结构滑出训练范围),而轨迹表面正常。使用前至少四项检查:① 能量—力一致性(有限差分 + 力常数矩阵对称性,不需要 DFT);② NVE 下总能量漂移率与阈值比较;③ 结构分布是否仍在训练范围内(配位数、键长分布);④ 关键统计量(径向分布函数、扩散系数)与高精度参照一致。

A6. 「PINN 用同一套自动微分把方程与稀疏观测放进一个可微目标;既然不需要网格也不需要解数据,它就是通用求解器。」(定义 8.4.3、方法 8.4.2、两方主张)

答案

前半对、后半错。 优势在「信息融合的便利」(反问题、稀疏数据、复杂域、高维),但「不需要解数据」不等于「不需要输入」:方程、边界条件、采样策略、权重、优化预算都要人给;正向高精度求解上常不敌成熟求解器——机制是损失项梯度尺度差若干数量级(优化卡在某一项)、NTK 视角下各项特征值衰减速度不同(网络优先降一项)、谱偏差使激波 / 尖锐层难学。用它就把残差水平与边条件满足度当验收指标报告,而不是只看损失曲线。

A7. 「数据驱动预报模型单步 6 小时 RMSE 很低,可以推断 5 天预报也不错。」(定义 8.5.2、例 8.5.2)

答案

错,三步都不成立。 ① 训练喂真值、推理喂自身输出 → 暴露偏差,输入分布随步数偏离训练分布;② 误差按 ek+1≈JFek+δke_{k+1}\approx J_{\mathcal F}e_k+\delta_k 放大,放大率由动力学决定;③ 若训练只做单步平均误差最小化,最优策略就是输出条件均值——而条件均值必然平滑、极值偏小(统计事实,不是 bug)。关键诊断:同初始场跑 teacher forcing 与 free running 对照,差距随步数扩大即证实暴露偏差;同时单列方差、极值分位数与功率谱。

A8. 「把测试集换成更难的样本(如更极端的温度),就算检验了外推能力。」(定义 8.6.2、方法 8.6.1)

答案

不完整。 随机切分下的「难例子」仍属同分布;真正的分布外检验要改变切分维度——新材料体系 / 化学族、未来时段(按年份切分)、未参与训练的地理区域。而且外推有三条互相独立的判据:① 分布外、② 尺度(更大体系 / 更长时 / 更细网格)、③ 干预(主动改一个变量后预测后果);缺一条都不足以支撑「掌握了机制」。干预判据最强也最难,因为需要真正的实验或受控仿真,而不是「另一批观测」。

B 组 · 推导与证明(6 题)

关键步骤逐条写出,不许写「略」;涉及形状与口径的先写清楚。

B1. 等变与不变的判别与推导。(定义 8.1.2、例 8.2.3)

(1) 判断六个量该用不变还是等变:① 总能量 ② 每原子受力 ③ 原子坐标 ④ 原子间距离 ⑤ 偶极矩向量 ⑥ 二面角。 (2) 设 E(X)E(X) 在整体旋转 R∈SO(3)R\in\mathrm{SO}(3) 与平移 tt 下不变,证明 Fi(X)=−∇xiE(X)F_i(X)=-\nabla_{x_i}E(X) 在旋转下等变、在平移下不变。 (3) 说明「只预测能量、力由 F=−∇EF=-\nabla E 得到」一次买到哪三件事。 (4) 解释「力用独立回归头输出」破坏了什么,以及为什么它表现为长时分子动力学的能量漂移。

提示与答案

(1) ① 不变(标量,旋转正交、平移抵消);② 等变(向量,整体旋转时 Fi↦RFiF_i\mapsto RF_i,平移不变);③ 等变(xi↦Rxi+tx_i\mapsto Rx_i+t);④ 不变(∥(Rxi+t)−(Rxj+t)∥=∥R(xi−xj)∥=∥xi−xj∥\lVert(Rx_i+t)-(Rx_j+t)\rVert=\lVert R(x_i-x_j)\rVert=\lVert x_i-x_j\rVert,正交变换保长度);⑤ 等变(需以相对位置定义才在平移下不变);⑥ 不变(只由四点相对几何决定)。

(2) 令 yi=Rxi+ty_i=Rx_i+t(每个原子同一变换),由不变性 E(Y)=E(X)E(Y)=E(X);把左边看作 XX 的函数对 xix_i 求梯度,链式法则给 ∇xiE(Y)=RT∇yiE(Y)\nabla_{x_i}E(Y)=R^{\mathsf T}\nabla_{y_i}E(Y),于是 Fi(Y)=−∇yiE(Y)=−(RT)−1∇xiE(Y)=−R ∇xiE(X)=R Fi(X),F_i(Y)=-\nabla_{y_i}E(Y)=-(R^{\mathsf T})^{-1}\nabla_{x_i}E(Y)=-R\,\nabla_{x_i}E(X)=R\,F_i(X), 用到了 RR 正交((RT)−1=R(R^{\mathsf T})^{-1}=R)——这就是等变。平移:E(X+t)=E(X)⇒∇xiE(X+t)=∇xiE(X)E(X+t)=E(X)\Rightarrow\nabla_{x_i}E(X+t)=\nabla_{x_i}E(X),故力平移不变。

(3) ① 不变性(能量是标量,天然不变);② 等变性(力作为梯度自动满足 (2));③ 保守性(同一个标量场的梯度 ⇒ 混合偏导可交换 ⇒ 力常数矩阵对称、闭合路径做功为零,例 8.3.1)——三条都不需要数据去学,是「把先验写进结构」的教科书形态。(4) 独立力头一般不是任何标量函数的梯度:沿路径的能量变化与力的积分对不上、绕闭合回路积分不为零(等于系统存在「能量环」),在分子动力学里表现为轨迹缓慢升温 / 降温、长时失效。检测不需要 DFT:有限差分一致性检验 + 力常数矩阵对称性检查(例 8.3.1 第 ③ 步)。

B2. FAPE 与全局坐标 MSE。(定义 8.2.4 及其后推导框)

(1) 说明原始坐标 MSE 为什么会奖励「猜坐标系」。(2) 全局叠合(RMSD 型)消掉了什么、没消掉什么?用数值构造说明「局部错误被平均」。(3) 写出 FAPE 的度量方式,说明它为何既让局部错误无法被平均、又保留全局一致性。(4) 列表对比三种损失对整体位姿 / 局部几何的敏感性,并说明「等变网络 + FAPE」的分工。

提示与答案

(1) Lglobal=∑j∥xj−xj⋆∥2\mathcal L_{\text{global}}=\sum_j\lVert x_j-x_j^\star\rVert^2 依赖整块结构放在哪个坐标系里:同一条链整体旋转 / 平移后物理性质不变而损失值全变,模型于是去猜训练数据的坐标系,把容量浪费在与物理无关的自由度上。

(2) 全局叠合消除了整体位姿,但局部错误会被平均。构造(建立直觉用,非正文数字):100 个残基中 10 个因域内错误偏 3 Å、其余 90 个偏 0.2 Å,则 RMSD≈10×32+90×0.22100=0.936≈0.97 A˚,\mathrm{RMSD}\approx\sqrt{\frac{10\times3^2+90\times0.2^2}{100}}=\sqrt{0.936}\approx0.97\ \text{Å}, 量级上是局部误差乘出错比例的平方根(30.1≈0.953\sqrt{0.1}\approx0.95 Å)——少数错得离谱的残基被开平方稀释,损失几乎没单独惩罚它们。

(3) FAPE 给每个残基定义由骨架原子确定的刚体框架 TiT_i(预测)与 Ti⋆T_i^\star(真值),把点集变换到各自框架里再比较:LFAPE=1Nframes∑i∑j∥Ti−1(xj)−Ti⋆−1(xj⋆)∥\mathcal L_{\text{FAPE}}=\frac1{N_{\text{frames}}}\sum_i\sum_j\lVert T_i^{-1}(x_j)-T_i^{\star-1}(x_j^\star)\rVert(按论文做法可带截断与逐帧对齐)。每个残基邻域的几何都被单独检查一遍,局部错误无法被全局平均;而框架来自预测结构自身(不是逐残基独立最优对齐),全局一致性仍被约束。

(4) 三种损失对照:[原始坐标 MSE] 对整体位姿敏感、对局部几何弱 → 模型学坐标系统;[全局叠合 RMSD] 位姿不敏感、局部仍弱(被平均)→ 局部错误被掩盖;[FAPE] 位姿不敏感、局部强 → 两者同时受约束。分工一句话:等变结构模块解决「整体位姿怎么表示」,FAPE 解决「几何差怎么度量」。

B3. 局部能量分解的复杂度与代价。(定义 8.3.2、例 8.3.2)

(1) 从 E=∑iEi(Ni)E=\sum_iE_i(\mathcal N_i) 论证消息传递开销为 O(Nk)O(Nk),并说明它为何与体系大小无关。(2) 论证「同一套参数适用于 N=10N=10 与 N=105N=10^{5}」与「平移不变自动成立」。(3) 说明与 DFT 的差别为何是数量级上的。(4) 给出这条假设的两个代价,各配一条检查动作。

提示与答案

(1) 每个原子的能量只依赖截断半径 rcr_c 内的邻居(平均 kk 个)。一轮消息传递对每原子聚合 kk 个邻居 → O(Nk)O(Nk);LL 轮后 O(LNk)O(LNk),其中 L,kL,k 与 NN 无关,故随原子数近似线性增长(对照:DFT 解自洽场,通常随电子数高阶增长,且每个构型都要重新迭代)。

(2) ① 可迁移:局部环境的「评价标准」不变,同一组参数对 N=10N=10 与 N=105N=10^{5} 都成立(比固定规模的代理模型值钱);② 平移不变自动成立:Ni\mathcal N_i 只由相对位置构成,整体挪动不改变任何局部环境。

(3) 单点差 103∼10610^{3}\sim10^{6} 倍(DFT 单点 101∼10310^{1}\sim10^{3} s 对势函数前向 10−4∼10−210^{-4}\sim10^{-2} s);整段模拟更直观:10610^{6} 步 MD 用 DFT 约 10710^{7} 秒(≈116 天),用势函数约 10310^{3} 秒(≈17 分钟)(例 8.3.2)。

(4) ① 长程相互作用被截断忽略(静电、色散、电荷转移)→ 对离子晶体、带电体系、大分子聚集误差大;检查:对带电 / 极性体系单独验证,必要时显式加长程项。② 截断半径与近邻集合的选择决定精度与连续性,且数据集中在平衡构型附近时解离 / 断键极限不可信;检查:用含反应路径的数据训练并对势垒专门验证,在目标体系上用 DFT 抽查点核对。总纲:局部性把代价降到线性,也把能力上限锁在训练覆盖的化学空间里(方法 8.3.2)。

B4. PINN 的软约束、残差与梯度病态。(定义 8.4.3、例 8.4.2、方法 8.4.2)

(1) 写出三项损失并说明每个导数由哪一步自动微分给出。(2) 手算热方程 ut=αuxxu_t=\alpha u_{xx} 的两条候选函数残差:u(1)=e−αtsin⁡xu^{(1)}=e^{-\alpha t}\sin x、u(2)=e−αtsin⁡2xu^{(2)}=e^{-\alpha t}\sin2x,给出修正与一般规律。(3) 说明「残差损失下降 ≠ 解对了」,列出验收必须同时报告的三类量。(4) 解释梯度病态与 NTK 不平衡,各给一条处置。

提示与答案

(1) L=Ldata+λr1N∑k∥N[uθ](xk,tk)∥2+λbLbc\mathcal L=\mathcal L_{\text{data}}+\lambda_r\frac1N\sum_k\lVert\mathcal N[u_\theta](x_k,t_k)\rVert^2+\lambda_b\mathcal L_{\text{bc}}。残差里的 ∂tuθ,∂xuθ,∂x2uθ\partial_tu_\theta,\partial_xu_\theta,\partial_x^2u_\theta 全部由对输入 x,tx,t 的自动微分给出(二阶导就是对输入求两次导,可用嵌套 grad,不需要差商)。

(2) u(1)u^{(1)}:ut=−αe−αtsin⁡xu_t=-\alpha e^{-\alpha t}\sin x、uxx=−e−αtsin⁡xu_{xx}=-e^{-\alpha t}\sin x ⇒ r=0r=0(k=1k=1 的正确衰减率 αk2=α\alpha k^2=\alpha 恰好匹配)。u(2)u^{(2)}:ut=−αe−αtsin⁡2xu_t=-\alpha e^{-\alpha t}\sin2x、uxx=−4e−αtsin⁡2xu_{xx}=-4e^{-\alpha t}\sin2x ⇒ r=−αe−αtsin⁡2x+4αe−αtsin⁡2x=3αe−αtsin⁡2x≠0.r=-\alpha e^{-\alpha t}\sin2x+4\alpha e^{-\alpha t}\sin2x=3\alpha e^{-\alpha t}\sin2x\ne0 . 一般规律:u=sin⁡(kx)f(t)⇒f′=−αk2fu=\sin(kx)f(t)\Rightarrow f'=-\alpha k^2f,即 u=e−αk2tsin⁡(kx)u=e^{-\alpha k^2t}\sin(kx) 对任意 kk 都是精确解(高频衰减更快);修正 u(2)u^{(2)} 只需改成 e−4αtsin⁡2xe^{-4\alpha t}\sin2x。

(3) 残差只在采样点上算:覆盖不足、权重失衡、或解在点间剧烈变化时,损失可以很低而解很错。必须同时报告:① PDE 残差的相对量级;② 边界与初条件满足度;③ 与低精度参照解或守恒量的对照(守恒违反率单列,方法 8.4.4)。

(4) 数据项、残差项、边条件项的梯度尺度可差若干数量级 → 优化卡在某一项(公开分析建议按梯度统计做自适应权重);NTK 视角下各项特征值衰减速度不同 → 网络优先降衰减慢的那一项。处置:① 自适应权重 / 梯度归一化,让各项尺度可比;② 改采样与结构(提高高频表达能力、把硬约束写进结构),正向高精度需求直接改用成熟求解器或神经算子。

B5. 误差累积与翻倍时间。(定义 8.5.2、例 8.5.1、即时自测 8.5)

(1) 解 ek+1=geke_{k+1}=ge_k,写出 eke_k 与翻倍步数 k⋆k^\star。(2) 代入 g=1.05g=1.05、1.021.02、0.980.98(Δ=6\Delta=6 h),给出步数与天数,并解释 g<1g\lt1 时发生了什么。(3) 推广到 δk=δ>0\delta_k=\delta\gt0:求通解与稳态,说明「耗散越弱、稳态误差越大」。(4) 解释两条读法纪律:为什么「误差不增长」可能是假象?为什么要分开报告「模型误差」与「系统可预报性」?

提示与答案

(1)(2) ek=gke0e_k=g^ke_0,令 gk=2g^k=2 得 k⋆=ln⁡2/ln⁡gk^\star=\ln2/\ln g(g>1g\gt1)。g=1.05g=1.05:0.6931/0.04879≈14.20.6931/0.04879\approx14.2 步 → 8585 h ≈3.5\approx3.5 天。g=1.02g=1.02:0.6931/0.01980≈35.00.6931/0.01980\approx35.0 步 → 210 h =8.75=8.75 天(口径见勘误第四节)。g=0.98<1g=0.98\lt1 时误差单调衰减、不存在翻倍时刻,半衰期 ln⁡0.5/ln⁡0.98≈34\ln0.5/\ln0.98\approx34 步 ≈8.5 天。含义:放大率从 1.05 降到 1.02,翻倍时间从 3.5 天拉到 8.75 天,等于同误差容限下多获得若干天可用预报(gg 是玩具放大率,真实误差增长随变量、尺度、天气形势变化,需核实)。

(3) ek+1=gek+δe_{k+1}=ge_k+\delta 解得 ek=gke0+δ1−gk1−g (g≠1),e∞=δ1−g (g<1).e_k=g^ke_0+\delta\frac{1-g^k}{1-g}\ (g\ne1),\qquad e_\infty=\frac{\delta}{1-g}\ (g\lt1). g<1g\lt1:误差不再增长但停在非零水平 δ/(1−g)\delta/(1-g),g→1−g\to1^- 时稳态越大(g=0.98g=0.98 时是 50δ50\delta,g=0.9g=0.9 时是 10δ10\delta);g>1g\gt1 时 δ\delta 项同样被逐步放大。

(4) ① 若「误差不增长」,先确认它不是过度平滑:把预报都推成气候平均,误差当然不增长,但预报毫无价值——要同看方差比、极值分位数与功率谱。② 放大率由动力学决定(JFJ_{\mathcal F} 的特征值),混沌系统上任何模型都有可预报性上限;因此两者分开报告才知道哪里还有改进空间(8.5.5 的思考框)。

B6. 梯度校验:最优步长与可达精度。(例 8.4.4)

(1) 写出中心差分 gi≈f(θi+h)−f(θi−h)2hg_i\approx\frac{f(\theta_i+h)-f(\theta_i-h)}{2h} 的两项误差来源与总误差量级 E(h)E(h)。(2) 求 h⋆h^\star 与最低误差(ε≈2.2×10−16\varepsilon\approx2.2\times10^{-16}、M=∣f′′′∣∼1M=\lvert f&#x27;&#x27;&#x27;\rvert\sim1),并说明最优处两项的比例关系。(3) 由此定容差:哪一档可达、哪一档不可达、哪一档说明链路有问题?(4) 说明为什么它该是「可微分仿真里最该先跑的检查」。

提示与答案

(1) 截断误差(泰勒展开):h26f′′′(ξ)∼Mh26\frac{h^2}{6}f&#x27;&#x27;&#x27;(\xi)\sim\frac{Mh^2}{6};舍入误差(两个函数值各带约 ε∣f∣\varepsilon\lvert f\rvert 绝对误差,相减不抵消,再除以 2h2h 放大):∼εh\sim\frac{\varepsilon}{h}(取 ∣f∣∼1\lvert f\rvert\sim1)。故 E(h)≈Mh26+εh.E(h)\approx\frac{Mh^2}{6}+\frac{\varepsilon}{h}.

(2) 令 dEdh=Mh3−εh2=0⇒h3=3εM\frac{dE}{dh}=\frac{Mh}{3}-\frac{\varepsilon}{h^2}=0\Rightarrow h^3=\frac{3\varepsilon}{M}, h⋆=(3εM)1/3≈(3×2.2×10−16)1/3≈8.7×10−6 (量级 ε1/3≈10−5).h^\star=\Bigl(\frac{3\varepsilon}{M}\Bigr)^{1/3}\approx(3\times2.2\times10^{-16})^{1/3}\approx8.7\times10^{-6}\ (\text{量级 }\varepsilon^{1/3}\approx10^{-5}). 由 h⋆3=3ε/Mh^{\star3}=3\varepsilon/M 得截断项 =Mh⋆26=ε2h⋆=\frac{Mh^{\star2}}{6}=\frac{\varepsilon}{2h^\star},恰为舍入项的一半,故 E(h⋆)=32εh⋆≈3.8×10−11E(h^\star)=\frac32\frac{\varepsilon}{h^\star}\approx3.8\times10^{-11}(量级 ε2/3≈10−10\varepsilon^{2/3}\approx10^{-10})。

(3) 双精度下中心差分可达精度在 10−10∼10−1110^{-10}\sim10^{-11}(已是最好的情况):相对误差 <10−6&lt;10^{-6} 是可达且合理的验收门槛;<10−12&lt;10^{-12} 不可达(数值差分本身都到不了);若差到 10−310^{-3} 以上,说明梯度链路有问题(不可微点、参数未参与计算图、实现错误),必须排查。注意强不连续处(接触、相变、激波)校验也会失败——此时应光滑化或退回无梯度方法。

(4) 它不需要真值、成本极低,却能在花掉大量算力之前暴露梯度链路错误,是可微分仿真里唯一的「梯度可信度体检」(方法 8.4.3)。

C 组 · 编程实现(6 题)

环境:numpy / torch 即可。每题给可运行的验收标准(形状断言 / 数值阈值 / 量级关系),参考实现只保留关键行。

C1. 写一个对旋转等变、对平移不变的小网络并断言其对称性,模型取 F(X)i=∑j≠iϕ(∥xi−xj∥)(xi−xj)F(X)_i=\sum_{j\ne i}\phi(\lVert x_i-x_j\rVert)(x_i-x_j)、E(X)=∑i≠jψ(∥xi−xj∥)E(X)=\sum_{i\ne j}\psi(\lVert x_i-x_j\rVert)。

  • 验收标准:① max|F(RX+t)-(R·F(X))| < 1e-5;② |E(RX+t)-E(X)| < 1e-6;③ 置换原子后 EE 不变、FF 按同一置换重排,误差 <1e−5&lt;1e-5;④ 对照组换成 F=WXF=WX,同样断言失败并记录失败量级。
参考实现
import numpy as np; rng = np.random.default_rng(0)
def force(X):                     # 权重只能由"不变标量"构成,向量只能是"坐标差"
    d = np.linalg.norm(X[:, None] - X[None, :], axis=-1)      # 距离:旋转/平移不变
    w = np.tanh(3.0 - d) / (1.0 + d); np.fill_diagonal(w, 0.0)
    return np.einsum('ij,ijd->id', w, X[:, None] - X[None, :])  # 差分:旋转下等变
def energy(X):
    d = np.linalg.norm(X[:, None] - X[None, :], axis=-1)
    return 0.5 * np.exp(-d).sum()                              # 只依赖距离 ⇒ 不变
X = rng.normal(size=(6, 2)); th = rng.uniform(0, 2 * np.pi)
R = np.array([[np.cos(th), -np.sin(th)], [np.sin(th), np.cos(th)]]); t = rng.normal(size=2)
XR = (R @ X.T).T + t
print("等变误差:", np.abs(force(XR) - (R @ force(X).T).T).max(), "不变误差:", abs(energy(XR) - energy(X)))
p = rng.permutation(6)
print("置换误差:", np.abs(force(X)[p] - force(X[p])).max(), abs(energy(X[p]) - energy(X)))
W = rng.normal(size=(2, 2))                                        # 对照组:无对称性
print("对照失败量级:", np.abs(W @ XR.T - (R @ (W @ X.T))).max())   # >> 1e-5

关键:等变性来自「不变标量 × 等变向量」的组合——这正是等变判断的直觉框 说的「把先验写进结构」。

C2. 用有限差分检验 F=−∇EF=-\nabla E,并演示独立力头如何破坏保守性:势取两体 Lennard-Jones(带截断)、手写解析力,用紧凑团簇(所有对距远小于截断半径)。

  • 验收标准:① 解析力 vs 中心差分(h=10−5h=10^{-5})相对误差 <10−6&lt;10^{-6};② 保守场沿真闭合矩形回路(中点法则)的归一化做功 <10−8&lt;10^{-8};③ 加自造旋涡项后同回路归一化做功 >10−4&gt;10^{-4},且与理论值 amp2/(Fmax⁡⋅4 amp)amp^2/(F_{\max}\cdot4,amp) 同量级;④ 力常数矩阵对称性 max⁡∣A−AT∣/max⁡∣A∣<10−6\max\lvert A-A^{\mathsf T}\rvert/\max\lvert A\rvert&lt;10^{-6};⑤ 额外记录:同一条回路若改用左端点法则,保守场也会算出 10−410^{-4} 量级的「假做功」——说明离散化误差可与真实环路同阶(与例 8.4.4 的步长问题同源)。
参考实现
import numpy as np
def E_and_F(X):                                  # LJ 势与解析力(截断 3.0)
    F = np.zeros_like(X); e = 0.0
    for i in range(len(X)):
        for j in range(i + 1, len(X)):
            r = X[i] - X[j]; d = np.linalg.norm(r)
            if d > 3.0: continue                 # 截断:长程项被显式丢掉(见 B3 的代价)
            inv6 = d ** -6; e += 4 * (inv6 ** 2 - inv6)
            fij = 24 * (2 * inv6 ** 2 - inv6) / d ** 2 * r
            F[i] += fij; F[j] -= fij
    return e, F
X = np.array([[0., 0., 0.], [1.1, 0., 0.], [0., 1.2, 0.], [0., 0., 1.3], [0.9, 0.9, 0.8]])  # 对距 1.10–1.77
h, amp = 1e-5, 0.02
F_an = E_and_F(X)[1]; F_fd = np.zeros_like(X)
for c in range(3 * len(X)):                      # 对 15 个坐标逐个中心差分
    i, a = divmod(c, 3); D = np.zeros_like(X); D[i, a] = h
    F_fd[i, a] = -(E_and_F(X + D)[0] - E_and_F(X - D)[0]) / (2 * h)
print("力自洽相对误差: %.2e" % (np.abs(F_fd - F_an).max() / np.abs(F_an).max()))   # ~7e-9
def loop_work(Ffun, steps=200, rule="mid"):      # 真闭合矩形回路,绕原子 0 的 (x,y) 面
    Y = X.copy(); w = 0.0
    for dV in ([amp, 0, 0], [0, amp, 0], [-amp, 0, 0], [0, -amp, 0]):   # 顺序不能乱
        step = np.zeros_like(X); step[0] = np.asarray(dV, float) / steps
        for _ in range(steps):
            Yp = Y + 0.5 * step if rule == "mid" else Y                  # 中点 vs 左端点
            w += float((Ffun(Yp) * step).sum()); Y = Y + step
    return abs(w)
Fmax = np.abs(F_an).max(); norm = Fmax * 4 * amp
G = lambda Y: E_and_F(Y)[1] + 0.5 * np.cross(Y, np.ones(3))   # 自造旋涡:非保守项
w_cons = loop_work(lambda Y: E_and_F(Y)[1]) / norm; w_swirl = loop_work(G) / norm
print("保守场归一化做功 %.2e(理论 0)  旋涡 %.2e(理论 %.2e)"
      % (w_cons, w_swirl, 0.5 * 2 * amp * amp / norm))                    # ~1e-10 vs ~1.4e-3
print("左端点法则下的假做功 %.2e" % (loop_work(lambda Y: E_and_F(Y)[1], rule="left") / norm))
def hess(eps=1e-5):                              # 力常数矩阵(Hessian)
    A = np.zeros((3 * len(X), 3 * len(X)))
    for c in range(3 * len(X)):
        i, a = divmod(c, 3); D = np.zeros_like(X); D[i, a] = eps
        A[:, c] = ((E_and_F(X + D)[1] - E_and_F(X - D)[1]) / (2 * eps)).reshape(-1)
    return A
A = hess(); print("力常数对称性偏差 %.2e" % (np.abs(A - A.T).max() / np.abs(A).max()))  # ~8e-11

提示:回路的顺序与法则都很关键——「+x、−x、+y、−y」是退化路径(面积为零,任何场都不做功),必须按「+x、+y、−x、−y」围成矩形;法则要用中点,否则离散化误差会淹没真实环路。若回路跨过截断面(对距越过 3.03.0),保守场也会算出非零做功——那是截断的代价,不是实现的错(方法 8.3.2 的「长程项」一行)。 两条检查都不需要 DFT 真值,是任何实验之前就该做的体检(例 8.3.1)。

C3. 复算 MSA 互信息并验证「传递效应」:复现例 8.2.1 的四条序列,再构造链式数据(X2=X1X_2=X_1、X3=X2X_3=X_2)。

  • 验收标准:① MI(1,2)\mathrm{MI}(1,2) 与 1.0001.000 bit 差 <10−6&lt;10^{-6},MI(2,3)\mathrm{MI}(2,3)、MI(1,3)\mathrm{MI}(1,3) 与 0.3110.311 bit 差 <10−3&lt;10^{-3};② 链式构造下 MI(1,3)>0.9\mathrm{MI}(1,3)&gt;0.9 bit 而真值中 (1,3)(1,3) 非接触 → 记录一类假阳性;③ 条件互信息 MI(1;3∣2)<0.05\mathrm{MI}(1;3\mid2)&lt;0.05 bit。
参考实现
import numpy as np
from collections import Counter
def H(v):
    n = len(v); return -sum(c / n * np.log2(c / n) for c in Counter(v).values())
def MI(a, b):
    n = len(a); return H(a) + H(b) - H(list(zip(a, b)))     # 熵形式,等价于求和式
def CMI(a, b, c):                                          # 条件互信息:MI(a;b|c)
    tot = 0.0  # 按 a 的取值分层,用条件熵之差算
    for v, cnt in Counter(a).items():
        idx = [i for i in range(len(a)) if a[i] == v]
        w = cnt / len(a)
        tot += w * (H([b[i] for i in idx]) + H([c[i] for i in idx]) -
                    H([(b[i], c[i]) for i in idx]))
    return tot
M = np.array([[0, 0, 0], [0, 0, 0], [1, 1, 1], [1, 1, 0]])   # 例 8.2.1
print([round(MI(M[:, i], M[:, j]), 3) for i, j in ((0, 1), (1, 2), (0, 2))])  # 1.0, .311, .311
s = np.array([0, 1, 0, 1, 1, 0, 1, 0])  # 链式:2 由 1 决定、3 由 2 决定
print("链式 MI(1,3) =", round(MI(s, s), 3), " 条件化后 =", round(CMI(s, s, s), 3))

读法:MI\mathrm{MI} 排序会把「1–3」也当成候选接触;只有条件化(或拟合全局模型、或端到端输出坐标)才能把直接与传递分开(定理 8.2.1)。

C4. 实现 FNO 一层,核对参数量,并说明「参数量与分辨率无关」只是必要条件:配置取 d=2d=2、cv=cw=32c_v=c_w=32、每维保留 kmax⁡=12k_{\max}=12 个模式、实虚两份实数张量。

  • 验收标准:① 按例 8.4.1 的口径——一个复数权重张量(实虚两份)——参数量 =32×32×12×12×2=294912=32\times32\times12\times12\times2=294912;② 若用 rfft 实现、把正 / 负频率做成两个张量,参数量是它的 22 倍(589824589824),并能说清这个 22 倍的来源;③ 3×33\times3 卷积参数量 =9216=9216 且 32×9216=29491232\times9216=294912;④ 同一模块在 (B,32,64,64)(B,32,64,64) 与 (B,32,128,128)(B,32,128,128) 上前向成功、输出形状一致、参数量不随分辨率变化;⑤ 写出跨分辨率误差测试的接口草图,并说明上述断言为何不足以支持「与离散无关」。
参考实现
import torch, torch.nn as nn
class SpectralConv2d(nn.Module):
    """频域线性变换 + 高频截断:k_max 是设计选择(低频主导的先验),不是近似缺陷。"""
    def __init__(self, cin, cout, k1, k2):
        super().__init__()
        s = 1.0 / (cin * cout)  # 缩放:与参考实现一致的初始化尺度
        self.w1 = nn.Parameter(s * torch.rand(cin, cout, k1, k2, 2))   # 低频块
        self.w2 = nn.Parameter(s * torch.rand(cin, cout, k1, k2, 2))   # 负频率块
        self.k1, self.k2 = k1, k2
    def forward(self, x):                                  # x: (B,cin,H,W)
        B, C, H, W = x.shape
        xf = torch.fft.rfft2(x)
        out = torch.zeros(B, self.w1.shape[1], H, W // 2 + 1, dtype=torch.cfloat)
        w1 = torch.view_as_complex(self.w1.contiguous()); w2 = torch.view_as_complex(self.w2.contiguous())
        out[:, :, :self.k1, :self.k2] = torch.einsum("bixy,ioxy->boxy", xf[:, :, :self.k1, :self.k2], w1)
        out[:, :, -self.k1:, :self.k2] = torch.einsum("bixy,ioxy->boxy", xf[:, :, -self.k1:, :self.k2], w2)
        return torch.fft.irfft2(out, s=(H, W))             # 回到物理空间,形状与输入相同
layer = SpectralConv2d(32, 32, 12, 12)
n_spec = sum(p.numel() for p in layer.parameters())   # 两个频率块 × (cin,cout,k1,k2,2)
n_one = n_spec // 2                                   # 单个复数张量的口径 = 例 8.4.1 的 294912
n_conv = 32 * 32 * 9
print(n_spec, n_one, n_conv, 32 * n_conv)             # 589824, 294912, 9216, 294912
assert n_one == 294912 and n_conv == 9216 and 32 * n_conv == n_one and n_spec == 2 * n_one
for R in (64, 128):                                        # 同一模块、两种分辨率
    y = layer(torch.randn(2, 32, R, R))
    assert y.shape == (2, 32, R, R)
    assert sum(p.numel() for p in layer.parameters()) == n_spec  # 参数量与分辨率无关

为什么不够:参数量不变只说明「参数没和网格点绑定」;真正的主张是在函数范数意义下近似同一算子,必须在训练分辨率之外的网格上测相对 L2L^2(方法 8.4.4 第一项),并对含高频 / 间断的解单列(此时 kmax⁡k_{\max} 截断是结构性失效)。

C5. 玩具模型复现误差累积与翻倍时间:迭代 ek+1=gek+δe_{k+1}=ge_k+\delta,步长 6 小时。

  • 验收标准:① 解析式:k⋆=ln⁡2/ln⁡gk^\star=\ln2/\ln g 与天数 k⋆×6/24k^\star\times6/24——g=1.05→14.2g=1.05\to14.2 步 / 3.53.5 天,g=1.02→35.0g=1.02\to35.0 步 / 8.758.75 天(三位有效数字一致);② 离散迭代的首个翻倍步数与解析值之差 ≤1\le1 步(整数取整效应:g=1.05→15g=1.05\to15 步、g=1.02→36g=1.02\to36 步);③ g=0.98g=0.98 断言不存在翻倍时刻,且半衰期(首次降到 e0/2e_0/2 的步数)与 ln⁡0.5/ln⁡0.98≈34\ln0.5/\ln0.98\approx34 步(≈8.5 天)之差 ≤1\le1 步;④ δ>0\delta\gt0 且 g<1g\lt1 时,数值极限与 δ/(1−g)\delta/(1-g) 的相对误差 <10−6&lt;10^{-6}。
参考实现
import numpy as np
def rollout(g, e0=1.0, delta=0.0, steps=20000):
    e = np.empty(steps + 1); e[0] = e0
    for k in range(steps):   # 标量版 e_{k+1} ≈ J e_k + δ_k
        e[k + 1] = g * e[k] + delta
    return e
def doubling(g, e0=1.0):                   # 首次达到 2*e0 的步数;衰减时返回 None
    e = rollout(g, e0); i = np.argmax(e >= 2 * e0); return int(i) if e[i] >= 2 * e0 else None
def halving(g, e0=1.0):                    # 首次降到 e0/2 的步数(g<1 时才有意义)
    e = rollout(g, e0); i = np.argmax(e <= e0 / 2); return int(i) if e[i] <= e0 / 2 else None
for g in (1.05, 1.02, 0.98):
    ana = np.log(2) / np.log(g) if g > 1 else None
    print(g, doubling(g), None if ana is None else round(ana, 2),
          None if ana is None else round(ana * 6 / 24, 2), "天")
assert abs(doubling(1.05) - np.log(2) / np.log(1.05)) <= 1.0     # 15 步 vs 解析 14.2 ≈ 3.5 天
assert abs(doubling(1.02) - np.log(2) / np.log(1.02)) <= 1.0     # 36 步 vs 解析 35.0 = 8.75 天
assert doubling(0.98) is None                                    # 衰减:永不翻倍
assert abs(halving(0.98) - np.log(0.5) / np.log(0.98)) <= 1.0    # ≈35 步 vs 34.1 步 ≈ 8.5 天
e = rollout(0.98, delta=1.0, steps=20000)
assert abs(e[-1] - 50.0) / 50.0 < 1e-6          # 稳态 = δ/(1-g) = 50δ

读法:解析式给趋势,离散迭代只能取整——两者最多差一步,这本身就是「翻倍步数是描述性量而非精确常数」的提醒;数值翻倍时间关于 gg 的曲线在 g→1+g\to1^+ 处急剧增长,这是「模型改进延长预报时效」的机制,也提醒同一模型在稳定系统上好、在混沌系统上差,是任务性质而非模型好坏。

C6. PINN 残差(自动微分)与梯度校验的最优步长:(a) 对解析 u(x,t)u(x,t) 用 torch.autograd.grad 求 utu_t、uxxu_{xx},算热方程残差;(b) 对标量函数扫描中心差分步长。

  • 验收标准:① 精确解 u=e−2αtsin⁡(2x)u=e^{-2\alpha t}\sin(\sqrt2x):max⁡∣r∣<10−10\max\lvert r\rvert&lt;10^{-10};② 非精确解 u=e−αtsin⁡2xu=e^{-\alpha t}\sin2x:max⁡∣r−3αe−αtsin⁡2x∣/max⁡∣3αe−αtsin⁡2x∣<10−6\max\lvert r-3\alpha e^{-\alpha t}\sin2x\rvert/\max\lvert3\alpha e^{-\alpha t}\sin2x\rvert&lt;10^{-6};③ 步长扫描(h∈[10−10,10−2]h\in[10^{-10},10^{-2}],100 个对数点)曲线呈 U 形,最优步长落在 10−7∼10−510^{-7}\sim10^{-5}(本函数实测约 9×10−79\times10^{-7})、最低相对误差落在 10−13∼10−1010^{-13}\sim10^{-10}(实测约 10−1210^{-12});④ 报告两条渐近线(O(h2)O(h^2) 截断、O(1/h)O(1/h) 舍入)的估值,与毛估 h⋆=(3ε/M)1/3≈9×10−6h^\star=(3\varepsilon/M)^{1/3}\approx9\times10^{-6}(M=∣f′′′∣≈0.77M=\lvert f&#x27;&#x27;&#x27;\rvert\approx0.77)比较,并据此说明为什么验收容差定在 10−6∼10−410^{-6}\sim10^{-4} 量级、而 10−1210^{-12} 不是合理门槛。
参考实现
import torch, numpy as np
def residual(u, x, t, alpha=0.1):                 # r = u_t - alpha*u_xx,全部对输入求导
    x = x.clone().requires_grad_(True); t = t.clone().requires_grad_(True); out = u(x, t)
    u_t = torch.autograd.grad(out.sum(), t, create_graph=True)[0]
    u_x = torch.autograd.grad(out.sum(), x, create_graph=True)[0]
    u_xx = torch.autograd.grad(u_x.sum(), x)[0]   # 二阶导:对输入再求一次
    return u_t - alpha * u_xx
xs = torch.linspace(0, 1, 64, dtype=torch.float64); ts = torch.linspace(0, 0.5, 64, dtype=torch.float64)
r1 = residual(lambda x, t: torch.exp(-2 * 0.1 * t) * torch.sin(2 ** 0.5 * x), xs, ts)
r2 = residual(lambda x, t: torch.exp(-0.1 * t) * torch.sin(2 * x), xs, ts)
ref = 3 * 0.1 * torch.exp(-0.1 * ts) * torch.sin(2 * xs)
assert r1.abs().max().item() < 1e-10                          # 精确解残差为零(≈5e-17)
assert ((r2 - ref).abs().max() / ref.abs().max()).item() < 1e-6  # 残差 = 3αe^{-αt}sin2x
f = lambda v: torch.sin(v) + v ** 2                            # 梯度校验扫描
th0 = torch.tensor(0.7, dtype=torch.float64); th = th0.clone().requires_grad_(True)   # 同一张量:输入即求导目标
g_true = torch.autograd.grad(f(th), th)[0]
hs = torch.logspace(-10, -2, 100, dtype=torch.float64)
errs = np.array([abs(((f(th0 + h) - f(th0 - h)) / (2 * h) - g_true).item()) for h in hs])
i = int(errs.argmin())
print("最优步长 %.2e(毛估 h*≈9e-6)  最低误差 %.2e  相对误差 %.2e"
      % (hs.numpy()[i], errs[i], errs[i] / abs(g_true.item())))

读法:误差曲线呈 U 形——左侧被舍入支配(O(1/h)O(1/h) 上翘)、右侧被截断支配(O(h2)O(h^2));实测最优与例 8.4.4 的毛估(h⋆≈8.7×10−6h^\star\approx8.7\times10^{-6}、E≈3.8×10−11E\approx3.8\times10^{-11})同量级(本例函数极光滑、∣f∣≈1\lvert f\rvert\approx1,最低相对误差会落到 10−1210^{-12} 附近——可达精度是函数相关的)。工程结论不变:对整个梯度向量定容差时,相对误差 <10−6&lt;10^{-6} 是稳健门槛,10−1210^{-12} 不能当门槛(换一个 ∣f∣\lvert f\rvert 更大、分量尺度更杂的函数就到不了)。这一步的关键不是抠数字,而是确认「梯度链路没有错」。

D 组 · 开放设计(4 题)

每题写满四件套:方案 + 理由 + 失败判据 + 验证计划;科学结论的判据必须是可验证判据,不接受「拟合得好」。

D1. 场景:筛「无铅钙钛矿光伏成分」,目标带隙落在给定区间且含铅量尽量低;有约 10410^{4} 条 DFT 带隙与少量实验值;算力有限;湿实验预算一年 5 个样品。请给方案并回答:这属于三类任务中的哪一类?验证设计如何避免「拟合得好」冒充成功?

参考方案与评分要点

归类:主任务是反演 / 设计(给定期望性质求成分),外墙用一个正向代理模型打分。流水线:条件生成或成分枚举 / 进化搜索产出候选 → 代理模型打分 + 约束过滤(含铅量、化学可行性)→ 少量高分候选做 DFT 复核 → 3–5 个做合成表征 → 标签回填重训(方法 8.3.3、方法 8.3.4)。 理由:反演多解、欠定(许多成分能给出同一带隙),不适合只做单点回归;打分器必须带不确定性,否则会系统性偏向模型过度自信的区域;实验预算只有 5 个样品,必须用主动学习把预算花在信息量最大的点上。 可验证判据:① 量纲与物理合理性(带隙为正、不随成分突变);② 分布外切分:按元素族 / 结构原型整族留出,另设「按发表年份」的时间切分;③ 尺度外推:在训练区间之外的成分比例上,误差随外推距离温和上升(刚超出就数量级跳变 ⇒ 无外推结构);④ 干预:对 3–5 个候选做合成与表征,比较预测与实测的排序一致性(Spearman),而不只看绝对误差。 失败判据:OOD 下排序能力崩溃(如 Spearman <0.3&lt;0.3)⇒ 只能当候选生成器;高价候选的 DFT 复核带隙偏离区间中心超过 ±0.3 eV 且方向随机 ⇒ 代理误差不可用;5 个样品全部无法合成 ⇒ 可合成性约束没真正进入流程。 验证计划:先做「按族留出」的离线评估 → 小规模 DFT 复核 10–20 个候选(记录泛函、收敛标准、数据库版本)→ 提交 1–2 个低风险候选试点合成 → 把本轮失败样本写进报告(失败样本比成功样本更能暴露判据问题)。 评分要点:归类正确 2 分 + 方案含不确定性 3 分 + 判据可验证(含 OOD 与干预)3 分 + 失败判据与验证计划各 1 分。

D2. 场景:你继承一个机器学习势函数——训练数据为某二元氧化物在 300 K 附近、单一 DFT 泛函、约 10510^{5} 个单点;现在要用它模拟 1200 K 的氧空位扩散。写出适用域声明、使用前检查清单(≥5 条,其中 ≥2 条不需要 DFT 真值)、失败判据与验证计划。

参考方案与评分要点

适用域声明(交付物的一部分):化学空间(元素组合 / 氧化态 / 配位环境)、构型范围(平衡构型附近、无断键与高能缺陷)、温压区间(训练在 300 K 附近,1200 K 属外推)、性质(能量与力;不保证过渡态势垒)、训练来源(单一泛函、数据库版本与日期)、已知盲区(长程静电 / 色散、自旋与电子态)。 检查清单(逐条过 方法 8.3.2):① 能量—力一致性(有限差分 + 力常数对称性)——免 DFT;② NVE 下总能量漂移率与阈值比较——免 DFT;③ 结构分布是否滑出训练范围(配位数、键长分布、局部环境距离度量)——免 DFT;④ 化学空间覆盖:在目标体系(含氧空位、1200 K 采样构型)选 10–20 个代表点做 DFT 抽查;⑤ 解离 / 断键极限与势垒:用含反应路径的数据或 DFT 核算;⑥ 长程项与带电 / 极性体系单独验证;⑦ 明确声明温压区间(1200 K 属外推)。 失败判据:漂移率超阈值 ⇒ 判不可用;力—能量一致性相对误差 >10−6&gt;10^{-6} 量级 ⇒ 先修链路再谈物理;DFT 抽查误差超出可接受带 ⇒ 必须补数据重训;势垒偏差方向不可解释(如系统性高估所有势垒)⇒ 不得用于扩散速率外推。 验证计划:① 先跑 300 K 对照(训练分布内)确认复现训练精度;② 逐温度上推 600 → 900 → 1200 K,记录漂移率与结构分布指标;③ 在 1200 K 上用短时 DFT-MD 或 NEB 核对势垒与扩散系数;④ 对截断半径与训练集大小做敏感性分析;⑤ 报告写明「哪些结论在适用域内、哪些是外推」。 评分要点:适用域声明完整 3 分 + 清单含两条免 DFT 检查 3 分 + 失败判据可执行 2 分 + 验证计划含逐温度上推与 DFT 核对 2 分。

D3. 场景:把某区域预报细化到 1 km,关键后果是极端降水;本地无高分辨率真值标签;算力有限;团队在争论「数据驱动模型能不能替代数值模式」。请给方案(选替代 / 混合 / 加速之一并说明)、评测口径、失败判据、验证计划,并对争论并列两方证据(不站队)。

参考方案与评分要点

方案:从风险最小、收益可测的加速 / 混合起步——用网络替换模式中昂贵的环节(参数化 / 辐射类算子)或做偏差订正,保留动力核心的守恒骨架;「整体替代」只在拿到充分分布外与极端事件证据后才考虑(方法 8.5.3)。下尺度按条件生成处理(低分辨率场 + 地形等静态特征 → 高分辨率场),并显式加入收支一致性约束(质量 / 能量 / 水汽),而非只用像素级损失(下尺度的直觉框)。 评测口径(硬要求):① 同初始场(同一分析场)、同时效、同变量与层次、同评分定义下与业务模式对照;② RMSE 与 ACC 并列——RMSE 对幅度敏感、ACC 尺度不变,例 8.5.3 里形态完美的预报 RMSE 几乎差一倍;③ 极端事件单列(事件定义:阈值 / 区域 / 时段;给样本数与置信区间);④ 时间外推切分(不同年份训练 / 测试),不用随机切分。 失败判据:方差比随步数迅速收缩、功率谱在小尺度系统性偏低 ⇒ 过度平滑(暴露偏差或损失口径,例 8.5.2);极端阈值超阈值频率显著偏低 ⇒ 不可用于灾害场景;细化后收支不一致 ⇒ 下游水文 / 能源模型会拿到自相矛盾的输入。 验证计划:单次强降水个例 → 逐时效误差与方差 / 极值曲线 → 极端事件专项(按类型分组)→ 未参与训练的地形 / 气候区泛化 → 与业务模式同口径对照并注明模式版本。 两方证据(并列):支持数据驱动一方主张——推理极快、可大量生成集合成员、不依赖业务模式代码栈,且中短期若干指标已可与业务模式对照(口径以原文与官方评测为准);谨慎一方主张——纯数据模型失去守恒保证与可解释性,极端事件与外推风险高,初始场质量仍由资料同化决定,「为什么」无法解释。分歧其实是口径:按「替代求解器」评估则边界明显,按「物理约束接口 / 加速器」评估则价值独特——写结论前先声明用哪个口径。 评分要点:三类关系选择有理由 3 分 + 评测口径完整 3 分 + 失败判据 2 分 + 两方证据并列并点出口径差异 2 分。

D4. 场景:同时拿到三项 AI 产出——(a) 符号回归得到的三项速率公式;(b) 程序搜索得到的「标准数据集上更快」的新排序算法;(c) 一个形式化证明候选;预算有限。请为每项选验证器强度与验证预算、写失败判据与两类伪发现,并说明「AI 是在发现还是在高效插值」如何用可检验推论区分。

参考方案与评分要点

验证器强度选择(方法 8.6.2 阶梯:可执行复算 > 形式化检查 > 拟合 + 物理检查 > 主观评审):(b) 属可执行复算级(给代码与输入任何人都能重跑),但要追问「评分器是否覆盖真实需求」(最坏情况、内存与稳定性、边界输入、并发)与「是否只是已知算法的重发现」(与文献含理论下界对照);(c) 属形式化检查级(机器逐行核对),剩下的判断只在「这个定理是否重要」;(a) 最软,要过量纲、极限、独立数据、干预四道检查(例 8.6.2),因此验证预算应压倒性地向它倾斜。 预算分配:硬验证器(b、c)只要算力与阅读成本;软验证器(a)必须预留独立数据采集与干预实验的费用,并按五步流水线逐级加码——第 ① 步(量纲 / 极限)不过关就不必花实验预算。 失败判据:① (a) 量纲不一致,或在浓度 / 温度趋零的已知极限上不退化正确 ⇒ 判为拟合式;② (a) 在独立批次数据上项的结构变化或系数变化超置信区间 ⇒ 判为不稳定;③ (b) 评分器未覆盖的维度上崩溃(最坏情况慢一个数量级)⇒ 判为「在错误目标上很强」;④ (c) 只证明「命题在该形式系统内可证」而无法说明与真实问题的对应 ⇒ 不得当科学结论。 两类伪发现:① 判据产物——「新」依赖比对口径与阈值(数据库版本、相似度阈值一变结论就变;大规模搜索产物常是已知原型的畸变或超胞变体);② 目标错设——验证器只验证它被设计来验证的东西,评分器写错目标时系统会高效地优化出错误目标下的强解(与第 7 讲的奖励错设同构)。 两方主张的可检验推论(思考 8.6.2):若「高效插值」一方正确,推论是把评分器换成人类无法事先定义的评价标准时,这类系统就会失效;若「新的理解载体」一方正确,推论是模型表征应能预测人类尚未写出公式的现象,且预测能被实验证实。两条推论都可用同一套实验框架检验,因此不必先站队即可推进研究;在证据出现前,按验证器强度决定信任级别、按决策表决定输出用途。 评分要点:三档验证器映射正确 3 分 + 预算分配有理由 2 分 + 失败判据与两类伪发现 3 分 + 两方主张写成可检验推论 2 分。