3. 机器学习代理模型基础

在数值求解流程中引入机器学习,最核心的转变是把“每次重新计算”变成“先预测、再校正”。代理模型(surrogate model)并不替代物理求解器本身,而是承担求解流程中那些重复、昂贵、但输入输出关系相对稳定的组件。理解这一点,才能正确选择回归还是分类,以及如何设计监督学习目标与训练数据。

一、回归与分类在求解器中的分工

回归模型输出连续量,适合近似那些本身就是实数值的组件:例如迭代初值预测、松弛因子估计、局部通量修正、残差收敛速度预测、材料本构参数映射。分类模型输出离散标签,适合近似“判断型”组件:例如某个网格单元是否进入湍流模型、某步迭代是否应触发重启动、线性系统该选哪个预条件子、时间步是否需要截断。

关键区别不在算法,而在目标量的语义。若下游组件需要的是一个数值并参与算术运算,用回归;若下游是分支选择、开关或类别判定,用分类。实践中常见错误是把本应回归的量(如修正系数)硬做成分类,导致量化误差被放大到整个迭代链。

以一个典型的迭代求解器为例:每次迭代需要给出初值 x0、松弛因子 ω、以及是否切换到更强预条件子的判断。前两者是回归目标,后者是分类目标。三者共享同一份迭代状态特征(残差范数、残差下降率、条件数估计、当前迭代步数等),但训练目标完全不同。

二、监督学习目标的设计

设计目标时,先问“代理模型预测错了,下游会怎样”。这决定了损失函数与标签构造方式。

对于回归组件,若下游对偏差敏感且偏差方向有代价差异,应避免只用均方误差。例如预测松弛因子时,偏大可能导致发散,偏小则收敛慢,此时可用非对称损失或在样本加权上体现。若预测的是迭代初值,目标是“让后续迭代步数最少”,那么标签不应是某个“正确初值”,而应是使收敛最快的初值——这需要从求解日志中反推,而不是人工标注。

对于分类组件,标签往往来自求解过程中的实际决策记录:某步是否发散、是否触发重启动、最终选用了哪个预条件子。这里要注意标签泄漏:不能用包含未来信息的特征(如最终收敛步数)去预测当前步的决策。特征必须严格来自决策时刻之前可观测的量。

目标设计的一个实用原则:代理模型的输出应当能直接嵌入原有求解器接口,替换掉被代理的组件,而不改变调用方代码。这迫使目标定义与接口语义对齐。

三、训练数据生成策略

代理模型的训练数据来自求解器本身。常见策略有三类:

  • 参数扫描采样:在物理参数空间(如雷诺数、时间步长、网格尺度)上做拉丁超立方或 Sobol 采样,每个样本跑一次完整求解,记录组件级输入输出。适合覆盖广域行为。
  • 迭代轨迹采样:不追求参数多样性,而是从少量求解过程的每一步迭代中提取样本。这类数据天然带有“过程性”,特别适合预测收敛行为、松弛因子等与迭代状态强相关的量。
  • 主动采样:先用少量数据训练初版代理模型,在预测不确定性高的区域补充求解,迭代扩充。适合高维参数空间下控制数据成本。

无论哪种策略,都要保证训练分布覆盖部署分布。代理模型最危险的失效不是精度略低,而是在训练分布外的输入上给出看似合理却错误的预测,并被求解器当作真值使用。因此数据生成时应记录每个样本的参数范围,部署时对超出范围的输入做回退到原求解器的保护。

下面这张图展示了一个迭代求解器中代理组件的信号链:从求解器状态提取特征,分别送入回归与分类代理,输出再回注到求解流程,并保留一条回退路径。

代理组件在迭代求解器中的信号链 求解器状态 残差范数 下降率 / 条件数 迭代步数 特征构造 归一化 滑动窗口统计 范围检查 回归代理 初值 x0 / 松弛因子 ω 连续修正量 分类代理 预条件子选择 重启动 / 截断判断 回注求解流程 替换原组件输出 继续迭代 记录新样本 回退路径 超出训练分布 → 原求解器 迭代轨迹 → 训练样本回流

四、一个可执行的训练数据构造示例

假设我们要为一维稳态扩散方程求解器训练一个预测“最优松弛因子”的回归代理。求解器采用 Jacobi 迭代,参数为网格数 N 与扩散系数 D。数据生成流程如下:

# 示例参数(合理假设,非实测)
N_list = [32, 64, 128, 256]
D_list = [0.1, 0.5, 1.0, 2.0, 5.0]
omega_grid = [0.5, 0.7, 0.9, 1.1, 1.3, 1.5]

for N in N_list:
    for D in D_list:
        best_omega, best_iters = None, inf
        for w in omega_grid:
            iters = run_jacobi(N, D, omega=w, tol=1e-6, max_iter=5000)
            if iters < best_iters:
                best_iters, best_omega = iters, w
        record(N, D, best_omega, best_iters)

这里标签 best_omega 不是解析最优值,而是网格搜索得到的最优离散值——这正是“从求解日志反推标签”的典型做法。特征可取 [log N, log D, N·D],目标为 best_omega。训练后用留出的参数组合验证:若预测的 ω 使迭代步数不超过网格最优步数的 1.1 倍,即可认为代理可用。

分类代理的数据构造类似,但标签来自决策记录。例如记录每次迭代是否在 50 步内残差下降超过两个数量级,作为“是否切换预条件子”的正负样本。注意正负样本比例往往严重不均衡,需在训练时做重采样或类别加权。

五、部署时的判断依据

代理模型上线后,最需要观察的不是训练集精度,而是部署分布上的行为一致性。建议在求解器中同时运行代理输出与原组件输出(仅在小比例样本上),比较两者差异;当差异超过阈值或输入特征超出训练范围时,自动回退到原求解器。这样既享受加速,又不让代理的错误悄悄污染整个求解结果。

回归与分类的选择、目标的设计、数据的生成,三者是同一个决策链上的环节:目标语义决定模型类型,模型类型决定标签构造方式,标签构造方式又决定数据采样策略。把这条链理顺,代理模型才真正成为求解器的可靠组件,而不是一个精度不明的黑盒。