Badge

不是所有代理模型都一样。高斯过程适合小数据+需要不确定性,MLP适合生产部署+需要梯度,树模型适合表格特征——选错方法等于浪费宝贵的CFD计算时间。本文从数据效率、推理速度、不确定性、梯度可用性等七个维度系统对比四种主流方法,并给出明确的选型决策树。

一、为什么选型是代理模型项目中最关键的决策

CFD代理模型的研发链路中,方法选择是第一个不可逆的决策。选错方法的代价不是”稍微差一点”——而是整个训练数据收集策略、部署方式、后续可维护性都跟着走偏了。

四种方法的核心差异可以用一个表概括:

维度 高斯过程 (GP) 多层感知器 (MLP) 随机森林 (RF) 梯度提升 (GB)
数据效率 ⬆⬆ 最高 ⬆ 高(+物理约束) ➡ 中 ➡ 中
推理速度 ⬇ 慢(O(N)) ⬆⬆ 最快 ⬆ 快 ⬆ 快
不确定性输出 ✅ 天然 ❌ 需额外方法 ❌ 无 ❌ 无
梯度可用 ✅ 解析梯度 ✅ 自动微分 ❌ 不可微 ❌ 不可微
外推能力 ⬆ 好(核选择) ⬆ 好(物理约束) ⬇⬇ 差 ⬇⬇ 差
超参调优难度 ⬇ 低 ⬇⬇ 高 ⬇⬇ 低 ⬆ 中
可导出ONNX ❌ 不可 ✅ 可 ✅ 可(skl2onnx) ✅ 可(skl2onnx)

下面逐一深入分析。

二、高斯过程回归(GP)

2.1 原理简述

GP将函数视为一个随机过程的样本。训练后,在每个输入点上给出高斯后验分布——均值是预测,方差是不确定性:

f(x)X,y,xN(μ(x),σ2(x)) f(x_*) | X, y, x_* \sim \mathcal{N}(\mu(x_*), \sigma^2(x_*))

其中:

μ(x)=K(x,X)[K(X,X)+σn2I]1y \mu(x_*) = K(x_*, X)[K(X, X) + \sigma_n^2 I]^{-1}y σ2(x)=k(x,x)K(x,X)[K(X,X)+σn2I]1K(X,x) \sigma^2(x_*) = k(x_*, x_*) - K(x_*, X)[K(X, X) + \sigma_n^2 I]^{-1}K(X, x_*)

2.2 数据效率

GP是四种方法中数据效率最高的。原因有二:

  1. 贝叶斯框架自动进行Occam剃刀——复杂度和数据量自动平衡
  2. 核函数编码了函数光滑性的先验信念

经验法则:对于CFD代理模型的典型维度(d=7-9),GP通常需要10d到30d个训练样本——即70到270个CFD案例。

2.3 不确定性的真实价值

GP天然输出不确定性,这不仅是学术装饰——在工程中有两个具体应用:

主动学习:在下一次CFD采样前,问”哪个点的预测最不确定?”然后在那里做CFD。这确保CFD计算时间被花在最需要的地方。

xnext=argmaxxσ(x) x_{\text{next}} = \arg\max_x \sigma(x)

安全边界:在做出设计决策时,不只是看预测值,还看这个预测有多靠谱:

1
2
3
cl_pred, cl_std = gp_model.predict(x, return_std=True)
if cl_std > 0.05: # 预测不确定性太大
print("需要额外CFD验证,不采用代理模型预测")

2.4 核心局限

推理慢:GP推理需要计算测试点与所有训练点的核函数,O(N)O(N) 的时间复杂度。训练是 O(N3)O(N^3)

不能导出ONNX:非参数模型的推理依赖全量训练数据。这意味着不能把GP部署到C++飞控中去——它留在Python/Julia层面,做离线分析和主动学习。

在高维(d > 20)表现变差:核函数在高维空间中的”距离”概念会失效。不过CFD代理模型的输入维度(d < 10)通常不触发这个问题。

2.5 最佳使用场景

  • 🔬 贝叶斯优化:用不确定性引导下一次采样
  • 📊 设计空间探索:需要知道”哪里预测可靠,哪里需要更多数据”
  • 🧪 小数据场景:只有50-150个CFD案例时,GP是首选

三、多层感知器(MLP)

3.1 原理简述

MLP用多层全连接网络逼近函数:

f^(x)=WLσ(WL1σ()+bL1)+bL \hat{f}(x) = W_L \cdot \sigma(W_{L-1} \cdot \sigma(\cdots) + b_{L-1}) + b_L

训练通过反向传播和梯度下降最小化MSE损失:

L=1Ni=1N(f^(xi)yi)2+λkPk(f^) \mathcal{L} = \frac{1}{N}\sum_{i=1}^{N}(\hat{f}(x_i) - y_i)^2 + \lambda \sum_{k} \mathcal{P}_k(\hat{f})

其中 Pk\mathcal{P}_k 是物理约束惩罚项——这是MLP独有的优势。

3.2 物理约束:MLP的杀手锏

MLP可以方便地在损失函数中注入物理先验:

1
2
3
4
5
6
7
8
9
10
11
12
from prandtl.physics import Monotonicity, BoundaryValue, Convexity

surrogate.fit(X, Y, method="mlp", physics=[
Monotonicity(param_idx=0, sign=1, weight=0.1),
# CL随迎角单调递增

BoundaryValue({"alpha": 0.0, "camber": 0.0}, {"CL": 0.0}, weight=10.0),
# 对称翼型零迎角时升力为零

Convexity(param_idx=0, weight=0.05),
# 升力曲线在附着流区域是凸的
])

这在数据稀少的区域尤为重要——物理约束确保了模型在未见过的输入点上不会做出”物理上不可能”的预测。GP通过核函数编码了光滑性,但没有这种针对特定物理规律的软约束能力。

3.3 生产部署优势

MLP是唯一可以同时满足以下所有部署要求的:

  • ✅ 推理速度:< 0.1ms(满足400Hz飞控刷新率)
  • ✅ 可导出:ONNX支持,C++/C#/Java加载
  • ✅ 自动微分:梯度几乎免费,适合逆设计和优化
  • ✅ 生产级:行业标准,所有云和边缘平台支持

3.4 核心局限

超参数调优需要经验:隐藏层数、每层宽度、学习率、正则化强度——调优空间大。但CFD代理的输入维度低(d < 10),一个简单的 [64, 64, 32] MLP架构通常就够用了。

无天然不确定性:需要Ensemble(训练5个MLP取方差)或MC Dropout。这会增加2-10倍的计算开销。

3.5 最佳使用场景

  • 🚀 生产部署:实时仿真、飞控中的气动查询
  • 🔄 逆设计:需要梯度信息优化几何参数
  • 实时应用:400Hz以上的飞控刷新率
  • 🔗 工业集成:导出ONNX嵌入C++/C#系统

四、随机森林(RF)

4.1 原理简述

随机森林用Bootstrap聚合构建多棵决策树:

f^RF(x)=1Bb=1BTb(x) \hat{f}_{\text{RF}}(x) = \frac{1}{B}\sum_{b=1}^{B} T_b(x)

每棵树在bootstrap样本上训练,且每次分裂只考虑特征的随机子集。

4.2 在CFD代理中的表现

随机森林在表格特征工程场景中表现不错——当输入是精心设计的工程参数(如雷诺数、翼型类别编码、展弦比等),RF可以自动捕获特征交互。

但CFD代理模型的输入通常是连续物理参数(迎角、马赫数、弯度等),这削弱了RF的优势。决策树本质上学习分段常函数:

T(x)=j=1Jcj1[xRj] T(x) = \sum_{j=1}^{J} c_j \cdot \mathbf{1}[x \in R_j]

这个结构导致:

  • ❌ 输出不光滑(阶梯状),不是连续函数
  • ❌ 外推完全失效(超出训练范围输出常数)
  • ❌ 不可微,不能用于需要梯度的场景

4.3 什么时候用RF

如果输入包含分类变量(如翼型类型:对称/弯度/超临界)和表格型混合特征——RF是天然的选择。但在纯连续物理参数的CFD代理中,GP和MLP通常更好。

4.4 最佳使用场景

  • 📋 混合特征:连续+分类变量的输入空间
  • 🛡️ 异常值容错:RF对CFD求解器偶尔的收敛失败不敏感
  • 🔍 特征重要性分析:天然输出特征重要性排名

五、梯度提升(GB)

5.1 原理简述

梯度提升逐步训练弱学习器来减少残差:

f^GB(t)(x)=f^GB(t1)(x)+ηht(x) \hat{f}_{\text{GB}}^{(t)}(x) = \hat{f}_{\text{GB}}^{(t-1)}(x) + \eta \cdot h_t(x)

其中 ht(x)h_t(x) 是用残差梯度训练的决策树。

5.2 与RF的关键区别

特性 随机森林 梯度提升
训练方式 并行(Bootstrap) 串行(逐步减少残差)
偏差-方差 主要降低方差 同时降低偏差和方差
训练速度 天然并行 必须串行
过拟合风险 中(需早停)
精度上限 中高 高(表格数据SOTA)

5.3 在CFD代理中的角色

GB在Kaggle表格数据比赛中常年占据前列,但在CFD代理中的适用性受限于:

  1. 外推能力差:和RF一样的树模型通病——在训练数据范围外的预测是常数
  2. 输出不光滑:虽然是分段常函数的加权组合,但实际操作中外推处仍无法给出光滑合理的外推
  3. 不可微:不能用于需要梯度的逆设计和优化

5.4 最佳使用场景

  • 🏆 精度优先:表格特征+足够数据时,GB通常精度最高
  • 📊 特征工程密集型:当输入是手工构造的复杂工程特征
  • 🎯 有充足数据+不需要外推:如翼型数据库查询(已知范围内插值)

六、选型决策树

根据你的具体需求,按以下决策树选择:

代理模型方法选型决策树

七、数据预算与精度预期

经验数据(基于CFD代理模型文献和Prandtl框架验证):

样本数 GP R² (典型 d=7) MLP R² (典型 d=7) RF R² (典型 d=7)
50 0.85-0.92 0.75-0.85 0.70-0.80
100 0.92-0.96 0.85-0.93 0.80-0.88
200 0.95-0.98 0.93-0.97 0.88-0.94
500 0.97-0.99 0.96-0.99 0.93-0.97

:上表是典型范围,实际精度取决于具体流动物理的复杂度和输入空间的实际有效维度。光滑附着流的精度远高于分离流/激波区域。

关键观察

  • GP在小样本(N < 100)明显优于其他方法
  • MLP在大样本(N > 300)追平甚至超越GP(尤其在加入物理约束后)
  • 树模型在整个范围内系统性落后(对光滑函数不擅长)

八、混合策略:取长补短

实践中最优方案往往是混合的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 阶段1:用GP做主动学习,高效收集数据
gp_model = pr.Surrogate(method="gp")
X, Y = initial_samples()

for i in range(active_learning_rounds):
gp_model.fit(X, Y)
x_next = gp_model.propose_next(X) # 选不确定性最高的点
y_next = run_cfd(x_next)
X, Y = append(X, x_next), append(Y, y_next)

# 阶段2:用MLP+物理约束做最终训练和部署
mlp_model = pr.Surrogate(method="mlp")
mlp_model.fit(X, Y, physics=[...])
mlp_model.export("surrogate.onnx")

这结合了GP的主动学习优势和MLP的生产部署优势。

九、选择Prandtl框架的理由

上面的所有代码示例都基于Prandtlpip install prandtl-cfd),原因如下:

需求 Prandtl支持
统一API:fit/predict/validate ✅ 所有方法共用
GP后端 ✅ GPyTorch ExactGP,自动核选择
MLP+物理约束 ✅ 单调性/凹凸性/边界值
ONNX导出 ✅ MLP支持
采样器 ✅ LHS/Sobol/均匀采样
解析函数验证 ✅ 零CFD开发
从GP切换到MLP ✅ 一行参数变化

其他框架对比:

| 框架 | 定位 | CFDGPGPMLP | 物理约束 | ONNX |
|——|——|:—:|:—:|:—:|:—:|
| GPyTorch | GP专用库 | ✅ | ❌ | ❌ | ❌ |
| scikit-learn | 通用ML | ✅ | ✅ | ❌ | ✅ |
| PhysicsNeMo | 物理ML全栈 | ✅ | ✅ | ✅ | ✅ |
| Prandtl | CFD代理专用 | ✅ | ✅ | ✅ | ✅ |

十、总结

场景 推荐方法 理由
小数据 + 需要知道预测是否靠谱 GP 天然不确定性,数据效率最高
生产部署 + 实时推理 MLP + ONNX 微秒级推理,跨平台部署
逆设计 + 梯度优化 MLP 自动微分,梯度几乎免费
混合特征 + 异常值多 RF 对非光滑数据和异常值稳健
最高纯预测精度 GB 表格数据SOTA
最优综合方案 GP主动学习 → MLP部署 取各方法所长

代理模型的方法选择不是”哪个最好”的问题——而是”哪个最适合你的约束和场景”的问题。理解每个方法的优势边界,比迷信一个”最佳方法”更重要。

参考文献

  1. Rasmussen, C. E., & Williams, C. K. I. (2006). Gaussian Processes for Machine Learning. MIT Press.
  2. Breiman, L. (2001). Random Forests. Machine Learning, 45(1), 5-32. DOI: 10.1023/A:1010933404324
  3. Friedman, J. H. (2001). Greedy Function Approximation: A Gradient Boosting Machine. The Annals of Statistics, 29(5), 1189-1232.
  4. Gardner, J. R., et al. (2018). GPyTorch: Blackbox Matrix-Matrix Gaussian Process Inference with GPU Acceleration. NeurIPS 2018.
  5. Prandtl: CFD代理模型框架. https://github.com/goodisok/prandtl
  6. Chen, T., & Guestrin, C. (2016). XGBoost: A Scalable Tree Boosting System. KDD 2016. arXiv: 1603.02754
  7. Raissi, M., Perdikaris, P., & Karniadakis, G. E. (2019). Physics-informed neural networks. Journal of Computational Physics, 378, 686-707. DOI: 10.1016/j.jcp.2018.10.045