2026/10/20 15:11:19

虚拟电厂协同优化与时序预测:两大算法组合的工程落地与避坑指南

虚拟电厂协同优化与时序预测:两大算法组合的工程落地与避坑指南 最近好几个做电力系统优化的同行都在问同一个问题多虚拟电厂的协同调度模型搭好了博弈关系也写清楚了结果一跑优化算法就卡住——要么单次评估太慢要么粒子群迭代半天不收敛。另一边做负荷预测和新能源出力预测的朋友也在吐槽说变量一多、序列一长注意力模型训练起来极其不稳定收敛曲线一跳一跳的换了几个结构效果都上不去。这两条线看起来一个是电网调度、一个是数据挖掘但我实际上手之后发现它们的内核高度一致都是在不确定性和计算资源双重约束下想办法找到稳定、可复现的解。前者用 ACPSO-EI-Kriging 解决评估贵、搜不干净的问题后者用 APVP-MHA-MTL 解决耦合强、捕捉不到长程依赖的问题。这篇文章就把我自己实现这两套方法时的完整思路、关键参数、踩过的坑和排查过程整理出来代码结构、调参路线、避雷点都直接摆出来供参考。无论你是准备发论文还是在写学位论文或者只是做工程落地验证里面这些细节应该都用得上。1. 先说清楚这两个方向到底在解决什么问题1.1 多虚拟电厂主从博弈的核心难点虚拟电厂的本质是把分散的分布式电源、储能、可控负荷聚合成一个整体参与调度和交易。多虚拟电厂场景里各个虚拟电厂之间存在利益博弈这也是 Stackelberg 主从博弈最常见的应用方式上层是虚拟电厂运营商制定电价信号或者功率调度指令下层是用户聚合商或者单个分布式资源根据上层信号做出最优响应。上层策略一变下层的响应就会跟着变整个系统需要反复迭代才能达到均衡。这听起来不复杂真正做起来却有两个硬骨头。第一个硬骨头是单次评估太贵。下层的响应不是简单一个函数算出来的它可能涉及交流潮流校验、储能充放电约束、需求响应潜力估算甚至还要调用外部求解器。每评估一次可能要几秒钟甚至几分钟而粒子群这类群体算法一次迭代就要评估几十个粒子跑到几百代就是上万次评估时间上完全无法接受。第二个硬骨头是收敛质量差。目标函数本身是非凸、非线性、多峰的——电价定高了用户响应过度整体收益反而下降电价定低了激励不足灵活性资源不参与调节收益也差。这种多峰特性让普通粒子群非常容易陷入局部最优振翅飞不出去。所以这个问题本质上是一个评估成本受限条件下的全局优化问题。把这两个痛点拆开解决方案的思路就比较清楚了先用便宜好算的代理模型替代昂贵评估再用改进的优化算法在代理模型上做全局探索配合一个自适应的补采样机制来纠偏。1.2 多变量时间序列预测的核心难点多变量时间序列预测典型场景包括电力负荷预测、风电功率预测、交通流量预测、工业过程状态预测。输入是多个变量的历史序列输出是未来一段时间的目标变量。难点同样集中在两个层面上。第一个层面是变量之间的耦合关系。以负荷预测为例气温、湿度、风速、节假日、历史负荷、同区域不同类型用户的用电模式这些变量之间的影响有强有弱、有即时作用也有延迟滞后。同一个时间点上变量之间存在横向的交互不同时间步之间又存在纵向的长期依赖。要把这两层关系同时建模普通RNN结构会面临长程遗忘问题一维卷积的感受野又受限于卷积核大小想覆盖足够的时序跨度就必然加深网络层数参数量一下子失控。第二个层面是训练稳定性问题。多头注意力机制对序列依赖的建模能力很强尤其是对长程信号的捕捉能力显著优于循环结构但它在训练时极其敏感。学习率稍微大一点loss直接飙到NaN学习率小一点又迟迟收敛不动。多任务学习加入之后主任务和辅助任务的损失量级不一致梯度方向互相拉扯更放大了这种不稳定。这两难加在一起让多变量时序预测变成了一个结构设计和训练策略双重要求都很高的任务。所谓 APVP-MHA-MTL核心就是针对这些痛点做三个层面的改进加入自适应变分视角来稳定隐变量的分布形态用多头注意力捕捉跨变量和跨时间步的耦合关系再用多任务学习让模型从辅助任务中借力提升主任务的泛化能力。1.3 为什么选这两套算法组合结合我自己复现和调优的经验这两套组合都不是拍脑袋堆砌出来的底层逻辑非常一致。ACPSO-EI-Kriging 的组合逻辑是便宜模型探路、昂贵模型纠偏。Kriging 模型负责用少量真实评估点建立响应面ACPSO 在响应面上做全局寻优期望改进EI作为补采样准则告诉算法哪个位置虽然当前预测不是最优但有可能有潜力值得用真实评估去验证一次。这种框架在结构优化、飞行器外形设计、天线设计里被反复验证过直接搬到虚拟电厂博弈场景里也成立。APVP-MHA-MTL 的组合逻辑是注意力捕捉关系、多任务补充信息、变分约束稳定分布。MHA 解决的是该看哪里的问题MTL 解决的是信息不够用的问题APVP 解决的是训练不稳定的问题。三个模块分工明确不是简单的网络堆叠。读到这里你会发现这两套方法其实共享同一个方法论把可控的计算资源花在最有价值的位置上。在博弈优化里最宝贵的是真实评估次数在时序预测里最宝贵的是模型对不同分布模式的适应能力。想明白这一点后面的参数配置和调参方向才不会跑偏。2. ACPSO-EI-Kriging多虚拟电厂主从博弈的落地细节2.1 代理模型选型Kriging 凭什么是首选构建代理模型的常见选择有这么几种多项式回归、径向基函数代理、神经网络代理、Kriging克里金模型。我并不是没有尝试过其他方案最初也试过用神经网络做代理拟合能力强是没错但小样本场景下极容易过拟合而且无法输出预测的不确定性置信区间。后来换成 Kriging才把整个框架理顺。原因有三条。第一条Kriging 自带不确定性估计。它本质上是一种高斯过程模型在给出预测均值的同时还能给出预测方差。ACPSO-EI-Kriging 这条线最关键的 EI 准则正好需要方差信息。EI 的计算不仅看预测值本身够不够好还看这个位置的预测不确定性有多大——不确定性大的位置更值得去补算一次真实值。神经网络代理只能输出一个点估计这个信息给不了。第二条Kriging 对训练数据量的要求比较友好。这种博弈场景下真实评估样本往往非常宝贵通常初始只取几十个样本点要在这种小样本条件下拟合出一个相对平滑的响应面Kriging 的插值特性比神经网络更可靠。Kriging 在样本点处能够精确通过真值样本稀疏区域的预测也保持平滑不会出现神经网络那种在样本点上疯狂振荡的问题。第三条Kriging 的调参空间相对可控。核函数的选择、超参数的上下限、噪声项的设定这些直接影响拟合效果但每个参数的含义都很明确出了问题能定位。实际工具实现上Python 可以用 scikit-learn 的 GaussianProcessRegressorMATLAB 可以用 fitrgp。我自己更常用的是 Python 版本核函数优先尝试 Matérn 核nu2.5一个原因是它比 RBF 核在高维空间里更稳另一个原因是它对响应面平滑程度的假设没有那么苛刻。如果数据有明显噪声还需要把 alpha 噪声项设成一个小正数比如 1e-6避免模型在真实评估点上出现过拟合的尖峰。2.2 ACPSO 的改进点混沌初始化与自适应惯性权重标准粒子群在解决高维非凸问题时的痛点很明确初始粒子群如果分布不均粒子集中挤在局部区域后期就非常难逃出局部最优惯性权重如果始终不变全局探索和局部开发之间的节奏就失衡。ACPSO 的改动主要有两个。第一个改动是混沌初始化。混沌映射具备确定性系统生成伪随机序列的特点比标准随机数的分布更均匀。我使用的是 Logistic 映射迭代公式是 x(n1) μ x(n) (1 - x(n))μ 取 4.0 时系统处于完全混沌状态生成的序列在 [0,1] 空间里遍历性很好。具体做法是先由混沌映射生成一组长度为种群规模的序列再映射到每个决策变量的上下界范围作为初始粒子位置初始速度仍然随机生成。这样做的收益非常直观种群在一开始就覆盖了更大的搜索空间后期陷入局部最优的概率显著下降。第二个改动是自适应惯性权重。我的实现里惯性权重 w 不是随时间单调递减的固定函数而是同时考虑当前迭代进度和粒子群聚合度两个因素。聚合度用当前种群所有粒子适应度的离散程度来衡量适应度差异很大时说明种群还在分散探索w 取大值鼓励粒子飞远一些适应度差异小说明种群开始聚集w 取小值让粒子精细搜索当前区域。同时再叠加一个随迭代轮数缓慢衰减的基准值保证算法后期收敛。简化后的伪代码如下。w_base w_max - (w_max - w_min) * (iter / max_iter) fitness_std np.std(pbest_values) fitness_range np.max(pbest_values) - np.min(pbest_values) 1e-8 w w_base * (1.0 beta * (1.0 - fitness_std / fitness_range)) w min(w_max * 1.1, max(w_min * 0.9, w))速度更新公式则是标准形式v w * v c1 * r1 * (pbest - x) c2 * r2 * (gbest - x) x x v这里 c1 和 c2 我习惯都取 1.8 附近。在多个测试问题上对比过1.8 这个取值在探索能力和收敛速度之间的平衡最稳。边界处理方面还有一个细节容易忽略。粒子飞出边界时位置要拉回到边界但速度必须强制改为 0 并稍微减少这个维度的影响否则粒子会反复以高速冲撞边界前期看起来在搜索实际上大量计算都浪费在边界位置上。这个点我在调参时踩过后来在每个维度上加了越界衰减因子才解决。2.3 EI 采样机制别让代理模型把方向带偏代理模型再准本质上也是近似。纯用代理模型去做全局寻优最大的风险是优化算法一旦落到响应面上的某个伪最优点而这个位置的真实值其实很差那么后续所有迭代都会在这个区域空转。EIExpected Improvement准则的作用就是防止这种情况。EI 的核心思想是对一个候选点我们不仅关心它的预测值相对当前最优解提升了多少还要考虑它的不确定性有多大。表达式可以通俗地改写为三部分当前最优值与预测均值的差距、预测标准差对提升概率的放大效应、以及不确定性本身带来的正项。直观理解就是均值说得再好方差太小也未必值得去试均值一般但方差很大反而值得花一次真实评估去验证。实现流程上我是每迭代若干代做一次补采样而不是每代都做。每代的补采样开销太大几十个真实评估点很快就会被用完。我采用的策略是先在 Kriging 模型上用 ACPSO 搜索出当前代理模型下的最优候选点计算该点的 EI 值。如果 EI 值大于阈值比如初始最优值的 1% 或设定好的 0.01就用真实评估函数计算这个点的真值把新样本点追加进 Kriging 的训练集重新训练代理模型。如果 EI 小于阈值说明代理模型对自己当前最优很有把握不需要再补充真实评估继续优化即可。每隔固定代数补采样一次、EI 超阈值再触发补采样两个条件配合形成一个自适应补采机制。这样既保证了总评估次数不超标又能让代理模型在关键区域持续获得真实信息的修正。举个直观的例子初始 30 个采样点建立 Kriging 模型每 5 代检查一次 EI最终总真实评估次数控制在 60 到 70 次之间就能获得稳定可靠的主从博弈均衡解速度上比直接跑粒子群快一个数量级以上。2.4 关键参数速查与调优路线下面这张参数表是我在多个虚拟电厂博弈案例中反复调试后总结的默认配置可以作为起点参考。参数推荐范围说明种群规模25~40决策变量维度越高取值越靠上限最大迭代次数60~100迭代次数不是越多越好要看 EI 触发频率惯性权重 w 范围0.4~0.9自适应计算时在此区间内动态调整加速常数 c1 / c21.5~2.0默认取 1.8混沌映射参数 μ4.0确保完全混沌状态Kriging 核函数Matérn(nu2.5)高维稳健性优先初始采样点数量5×维度 ~ 10×维度太少拟合不稳太多浪费评估次数EI 补采阈值0.01 或最优值的 1%低于此值停止补采样真实评估总次数上限初始采样 补采 ≤ 80根据实际计算预算约束调参时有一条非常重要的思路不要一上来就调优化算法先确认 Kriging 模型自身的拟合质量。我的做法是在少数样本点上反复做交叉验证观察预测值和真实评估值的散点图。如果散点明显偏离对角线说明代理模型还没建立可靠这时候改粒子群参数毫无意义。模型的拟合还不够好时优先增加初始采样点数量或者调整核函数参数边界让响应面更贴合。另外提醒一点做多虚拟电厂场景时决策变量往往由电价信号和功率分配指令混合组成它们的取值范围和量纲差距很大。电价可能在几百元每兆瓦时量级功率可能是几十到几百兆瓦如果不做归一化直接丢给 Kriging距离度量会被量纲大的变量主导会严重影响拟合效果。我已经养成了把所有决策变量统一映射到 [0,1] 区间的习惯后面的一切操作都建立在这个基础上做完再映射还原到真实物理量。3. APVP-MHA-MTL多变量时间序列预测的实现要点3.1 多变量预测的痛点比想象中多先聊一个实际工程中常见的问题输入变量 20 维预测步长 24 步模型结构看起来轰轰烈烈效果比简单线性回归好不了多少。这种结果往往不是因为模型不行而是因为结构设计时忽略了变量之间的动态耦合关系。举个例子预测一个区域的电力负荷历史负荷当前值、前一小时负荷、温度当前值、温度前一小时和两小时前、湿度、风速这些变量对预测目标的贡献方式完全不同。有的变量是即时影响比如温度突变后负荷马上就变化有的是延迟影响比如大型建筑的供冷系统在温度升高后一个多小时才拉高用电。多头注意力的价值恰恰在这里不同注意力头可以学习不同的时间尺度依赖关系一个头专注于相邻几个时间步的短期趋势另一个头专注于跨越十几个时间步的周期性信号这种分工是 RNN 和普通前馈网络很难做到的。但注意力机制也不是天然就能正确学到这些关系。位置编码、遮挡策略、特征维度的排列方式其中任何一个环节出了问题模型就会退化成看了一堆信息却不知道优先级是什么的状态。很多同学实现多头注意力时注意力头之间很快就趋同了所有头学到的是同一个模式这就是结构设计上的浪费。3.2 MHA 和 MTL 的结构衔接APVP-MHA-MTL 的结构设计我的习惯做法是分层明确。底层是一个共享的多头注意力编码器负责从多变量的历史序列中提取共享表示中间层是变分约束层对共享表示施加分布约束顶层才是多个任务头主任务是负荷预测或目标变量预测辅助任务按场景选择。结构示意如下。import torch import torch.nn as nn class MHAEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super().__init__() self.pos_embed PositionalEncoding(d_model) self.blocks nn.ModuleList([ TransformerEncoderBlock(d_model, nhead) for _ in range(num_layers) ]) def forward(self, x): x self.pos_embed(x) for block in self.blocks: x block(x) # 内部包含因果mask和残差连接 return x class APVPHead(nn.Module): def __init__(self, d_model, latent_dim): super().__init__() self.mu_proj nn.Linear(d_model, latent_dim) self.logvar_proj nn.Linear(d_model, latent_dim) def forward(self, x): mu self.mu_proj(x) logvar self.logvar_proj(x) return mu, logvar class MTLEndToEnd(nn.Module): def __init__(self, d_model, nhead, num_layers, latent_dim, n_tasks): super().__init__() self.encoder MHAEncoder(d_model, nhead, num_layers) self.apvp APVPHead(d_model, latent_dim) self.task_heads nn.ModuleList([ nn.Linear(latent_dim, 1) for _ in range(n_tasks) ]) def forward(self, x): shared self.encoder(x) mu, logvar self.apvp(shared) z reparameterize(mu, logvar) # 重参数化采样 preds [head(z) for head in self.task_heads] return preds, mu, logvar这里的 APVP 层我把它理解为自适应变分视角的约束层。核心想法是共享表示不能是任意乱七八糟的分布而要尽量拟合一个标准的先验分布在此基础上再采样出用于下游任务预测的隐变量。这么做一方面能压制高频噪声对表示的干扰同时在多任务共享时不同任务的梯度不会把隐变量的分布拉扯到奇怪方向上。它的 KL 散度损失与下游任务损失相加形成联合训练目标。为什么叫自适应因为这个变分约束的强度会随着训练进度动态调整训练初期约束弱一些让模型先学会基本映射训练后期约束强一些帮助模型收敛到更稳定的表示空间。多任务头的设计也比较讲究。辅助任务不是随便选的要选和主任务信息互补但判断标准不同的预测目标。比如主任务是预测未来 24 小时负荷辅助任务就可以选择预测未来 24 小时温度或者识别未来一天属于工作日还是节假日。辅助任务能够通过共享编码器迫使模型学习更通用的环境特征而不会只盯着目标变量死记硬背。3.3 训练时的数据预处理要留神多变量时序预测的数据处理坑位特别多。第一个是标准化问题。很多人在归一化时习惯用整个数据集的均值和标准差这是严格禁止的。测试集的统计信息一旦混入训练过程就是变相的标签泄漏。正确的做法是只基于训练集计算均值和方差测试集用同样参数来归一化。第二个是滑窗构造。滑窗长度、预测步长、滑动步长这三个参数直接决定样本量。有一个经验关系我用了很久滑窗长度至少应该是预测步长的 3 到 5 倍否则模型无法接触到足够的上下文信息。滑动步长通常取 1虽然样本量很大但在训练时注意相邻窗口之间高度重叠会导致严重的过拟合倾向需要通过较大的 dropout 率或者减小滑动步长来缓解。第三个是时间序列切分。模型评估必须按时间顺序划分训练集、验证集和测试集不能随机打乱。否则模型看到了未来数据验证指标虚高得离谱。我在多个案例里都发现随机切分可以让测试误差直接少掉三到五成但这只是幻觉部署到真实场景马上现原形。第四个是因果遮挡。MHA 在编码器阶段使用时每个时间步只能看到自己和过去的信息未来信息一旦进入注意力视野就是对预测任务的作弊推理时还完全无法复现。代码里实现因果掩码把注意力矩阵的上三角部分置为负无穷所有头部共享这个掩码策略确保不会发生信息泄漏。3.4 训练参数与损失设计的实用配置多任务学习的损失设计是另一个容易出问题的地方。直接把各个任务的损失相加如果某个辅助任务的损失量级远大于主任务模型就会专注于辅助任务把主任务打回原形。我在实现中采用同方差不确定性加权的方式给每个任务分配一个可学习的噪声系数公式给出来大家感受一下total_loss 0.0 for pred, target, log_var in task_list: precision torch.exp(-log_var) task_loss precision * mse_loss(pred, target) log_var total_loss task_loss核心思路很简单模型自己学会给每个任务的损失分配权重预测置信度高的任务自然获得更大权重置信度低的权重小避免一个辅助任务骑在主任务头顶上。加上 APVP 的 KL 散度项后最终目标是final_loss total_loss kl_weight * kld_loss(mu, logvar)kl_weight 这个参数在训练初期设得很小比如 0.001之后随训练次数逐步增大到 0.01 左右。这样设计的原因是 KL 损失太强会拖慢特征学习的进程太弱又起不到约束作用。学习率策略也要重点说明。多头注意力模型最忌讳固定学习率我用的是 warmup 加余弦退火的组合策略。前 10 个 epoch 学习率从 1e-6 线性爬升到峰值如 3e-4再到 40~60 个 epoch 内余弦衰减到 1e-6。峰值学习率太高会引发注意力矩阵的极端值一下就看到 loss 变成 NaN。梯度裁剪也建议打开clip 值 1.0 左右已经够用。3.5 超参数配置速查表参数推荐值说明d_model64~128维度太低表达能力受限太高容易过拟合nhead4~8多注意力头数最好能被 d_model 整除层数2~4网络深了注意力的训练难度显著增大dropout0.1~0.3滑窗重叠度高时取偏大值批量大小32~128根据 GPU 内存调整峰值学习率3e-4~5e-4配合 warmup 使用warmup 轮数5~10建议占训练总轮数的 10%~15%kl_weight 终值0.01~0.1从极小值逐渐增大梯度裁剪阈值1.0防止注意力梯度爆炸时间滑窗长度预测长度×3~5上下文不足则预测精度大减调参时我遵循一个原则每轮实验只改一个变量。如果你同时调整了层数、学习率和滑动窗口模型效果发生变化了你也根本说不清是哪个改动带来了收益后面只能靠玄学调参。我吃过这个亏后来改用类似网格搜索的方式先把关键超参固定再逐项扫描虽然慢一点但每次改动都有结论论文里也能画出清晰的敏感性分析图表。4. 真实跑实验时的常见坑与排查方法4.1 Kriging 代理模型拟合失效表现ACPSO 在代理模型上找到的最优点真实评估值很差甚至比随机采样点还差。排查顺序是这样的。第一步检查输入数据的归一化。决策变量量纲不一致会直接毁掉距离度量这是最高频的原因。第二步检查初始采样点的分布是否覆盖整个边界区域。有些决策变量的最优值恰恰在可行域的边界附近初始样本如果只在中心区域附近采样Kriging 在边界区域的插值可信度非常低。第三步检查核函数的超参数界限。我遇到过好几次Matérn 核的长度尺度边界设得过窄导致拟合出的响应面平坦得离谱每个位置的预测值都差不多等于均值粒子群在代理模型上完全找不到方向。解决手段也有优先级初始采样点数量加到 10 倍维度以上其次调整 Kriging 的搜索边界最后才考虑换核函数。在场景允许的情况下多采几个点永远是最直接的。4.2 主从博弈迭代不收敛表现上层策略更新后下层响应不断震荡均衡解无法稳定。这种现象在交替优化的博弈问题里很常见根本原因是上下层之间的反馈回路存在时滞效应。上层价格调得太猛下层响应过于剧烈下一轮上层再剧烈修正整个系统就发散或者振荡。我的处理思路是给下层的响应加一层阻尼或者惯性平均。每一轮真实评估得到的下层响应值跟上一轮的响应值做一个指数滑动平均比如 beta 取 0.3~0.5。这样做并不改变问题的均衡解但能显著抑制迭代初期的震荡。另外一个排查点是上层变量的边界设置是否过宽边界过宽意味着粒子可以飞到物理上不可能的电价区间造成下层问题无解每次真实评估都返回一个异常值Kriging 模型被这一两个坏点严重误导。所以对每个决策变量做物理可行性校验比做任何精细调参都值得优先处理。4.3 多头注意力模型的信息泄漏表现测试集指标好得不可思议RMSE 接近零但拿到新数据上一测就崩。信息泄漏的来源通常有二。第一个是因果掩码缺失训练时未来时间步的信息通过注意力权重大摇大摆进入当前时刻的表示。第二个是数据标准化用了全局统计量或者验证集和测试集没有按时间严格切分随机打乱了顺序。判断是否泄漏有个非常实用的方法训练曲线如果 loss 下降进度快得异常比如第一个 epoch 就能把测试损失打到 0.1 以下基本可以确定有泄漏问题。正确做法是每跑一组实验前强制检查三件事注意力矩阵是否应用了因果掩码、标准化参数是不是只用训练集的统计量、序列切分是不是严格按时间顺序。这三个检查花不了五分钟能省下后面几天的无效调参时间。4.4 多任务学习训练失衡表现主任务损失在前期下降很快但到 20 个 epoch 之后就原地踏步辅助任务虽然持续收敛但看不出对主任务有多大帮助。先检查辅助任务是否真的有意义。如果辅助任务和主任务高度同步比如主任务是负荷预测辅助任务是负荷预测的一个平移版本那辅助任务只是在重复主任务没带来额外信息。另一种情况是两个任务的梯度量级差太多简单把损失相加会让大梯度任务占据主导。同方差不确定性加权是我最推荐的解决方案不需要手动调权重网络自己学习分配。如果这样做了还是失衡考虑用梯度阻塞做更彻底的隔离处理把辅助任务的梯度只更新共享编码器但不回传到任务头之前的加深层避免辅助任务的梯度信息在主任务表示里制造干扰。4.5 泛化能力不足换批数据就露馅表现训练和验证的指标都很好一到新场景或者新时间段预测误差直接翻倍。先说最常见的误操作测试集和验证集划分时如果只按一个时间段来保留模型适应的是该时间段的特定模式比如某个季节的负荷特性。跨季节数据一上手模型立刻失效。我的做法是在数据允许的情况下把验证集和测试集分别从多个不同时间段采样让评估阶段就暴露模型的季节性适应问题。第二个常见原因就是模型容量和数据量不匹配。数据量只有几千条却用了四层注意力和 128 维隐变量过拟合是必然结果。先降低层数、提高 dropout 和正则化看看验证集的表现是否改善往往能立竿见影。还有一个很有用的技巧是集成预测。在时序预测任务中用不同随机种子训练多个模型对多个模型的预测结果取平均值在实际环境中能显著降低预测的方差。这个办法会带来额外的训练开销但在学术论文中作为鲁棒性证明也是一个非常干净的加分项。最后分享两点个人体会第一点这两个方向虽然一个叫优化一个叫预测但在真正实施的过程中花费我时间最多的其实都不是核心算法本身而是数据流和评估链路的设计。Kriging 的真实评估点从哪来、EI 补采样的结果如何回流训练、时序预测的滑窗怎么做到不泄漏未来信息——这些工程问题解决到位了算法才能发挥它应有的威力。建议你在动手跑代码之前先把整条数据流画清楚每一步输入输出都检查过一遍再启动实验。第二点是关于实验组织的。我在跑这些实验时严格记录每次改动的效果哪怕是修改了补采样触发间隔或换了一个核函数这种小改动也会单独跑一组对照。这样做一开始会觉得实验速度变慢但到最后论文写实验章节时你会发现每张图表、每个对比都有明确的实验记录支撑根本不需要回炉重跑。这个习惯我后来一直沿用到现在也强烈建议每个做类似方向的人试一试。