想象你要出海捕鱼。码头边站着一位经验最丰富的老船长,他抬头看天,斩钉截铁地告诉你:“明天风平浪静,放心出海。”你该不该完全相信他?他给出的只是一个“确定答案”,但万一判断稍有偏差呢?聪明的做法是:同时派出七艘侦察船,每艘船出发的桩位几乎相同却微微错开。刚开始它们紧紧靠在一起,随着时间推移,有的船绕过了暗流,有的船撞上了风浪。七艘船的散开程度,恰好告诉了你“明天到底能不能信”。 气象学中的集合预报(ensemble forecasting)正是这个思路。它不再给出唯一答案,而是通过对初始状态进行微小扰动,生成一组“平行世界”的天气预报,用成员间的离散程度量化不确定性。GraphCast 作为深度学习天气预测模型的代表,凭借图神经网络快速推理的优势,让集合预报从超级计算机的“奢侈品”变成了日常可用的工具。当你说出“明天有 70% 概率下雨”而不只是“明天有雨”时,你就掌握了从确定性思维走向概率思维的钥匙。

岗位关联

掌握集合预报,意味着你能从“给出一个预测”升级为“给出可信的预测区间”——这是 AI 工程师迈向气候决策支持、极端天气预警等高价值应用的关键一步。

目录
  1. 可视化演示
  2. 集合预报原理
  3. AI集合生成
  4. 初始条件扰动
  5. 集合校准技术
  6. 概率评估指标
  7. 集合规模控制
  8. 极端天气应用
  9. 业务化部署
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

集合预报通过多次扰动初始条件生成概率化预测分布,量化预报不确定性,本文讨论AI集合生成方法、扰动策略及集合校准... 切换模式查看不同维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

集合预报的基:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

集合预报原理

老船长只给你一个答案,但你知道任何单一判断都可能因为一时疏忽而偏离真相。于是你改派七艘侦察船,每艘船起步位置几乎相同却又略有差别——它们在海图上画出的轨迹束,就是“集合”的雏形。单看任何一艘船都可能误导你,但七艘船共同勾勒出的范围,却诚实地暴露了未来的不确定性。

在气象学中,确定性预报就像那位老船长,只输出一条路径;集合预报则同时运行多次模拟,每次都从略不同的初始状态出发。GraphCast 这类模型天然适合这件事:它可以在 GPU 上并行推理,将多个成员一次性生成,代价远低于传统数值天气模式(NWP)逐成员积分物理方程。

集合预报的核心对象是一组“平行世界”的预报成员。它们的平均水平代表最可能趋势,成员间的离散程度则用发散度来度量,也就是“船队散开的宽度”。

回到船队比喻:集合平均不是“把各船挤到一条线上”,而是用七条线共同围出可能性的边界。发散度越大,说明天气系统越“敏感”,明天的天气就越难拿捏。

xˉt=1M∑i=1Mxt(i)\bar{x}_t = \dfrac{1}{M}\sum_{i=1}^{M} x^{(i)}_t
公式含义:把 M 条侦察船在第 t 天的位置取平均,得到“船队队长”的位置——这是集合预报最常用的确定性代表。
  1. 集合平均等号左边的 \(\bar{x}_t\) 是所有成员在第 \(t\) 个预报时刻的平均值,相当于船队的“质心”。
    xˉt\bar{x}_t
  2. 求和连加\(\sum_{i=1}^{M}\) 表示把编号为 1 到 M 的成员预报值逐个累加,就像把七艘船的位置逐一标到海图上。
    ∑i=1Mxt(i)\sum_{i=1}^{M} x^{(i)}_t
  3. 成员上标\(x^{(i)}_t\) 中上标 \(i\) 标识第 \(i\) 艘侦察船,下标 \(t\) 是预报的第几天;所有成员都必须对应同一时刻才能比较。
    xt(i)x^{(i)}_t
  4. 平均系数除以 \(M\) 将总和归一化,得到平均预报值;如果 M=7,就是七艘船位置的算术平均。
    1M\dfrac{1}{M}

AI集合生成

传统集合预报像组织一支大船队:每艘船都需要独立的燃料和船员(算力),传统 NWP 每增加一个成员,就要重新积分数小时的物理方程。GraphCast 则像一位能同时“灵魂附体”到七艘船上的船长——它用图神经网络(GNN)在图结构上做消息传递,一次前向推理在秒级完成,GPU 并行让几十个成员几乎同时出发。

关键问题是:如何让同一个 GraphCast 模型产生“不同性格”的成员?有两种主力思路。第一种是输入扰动,在推理时给初始分析场加不同的噪声;第二种是训练随机性,在训练过程中使用随机丢弃(dropout)或注入随机梯度噪声,让模型自己学会表达不确定性。为了让所有成员共同优化,损失函数也要改为“全体成员的平均损失”。

船队的每个成员虽然性格各异,但都服从同一位“总指挥”(共享权重 θ)。这正是 AI 集合与传统 NWP 集合的本质差异:前者用共享模型 + 随机扰动生成多样性,后者用不同初始条件 + 不同物理参数化方案生成多样性。GraphCast 把成本降低了几个数量级,让“全天候派出船队”成为可能。

Lensemble=1M∑i=1Mℓ(G(xt−1(i);θ), yt)\mathcal{L}_{\text{ensemble}} = \dfrac{1}{M}\sum_{i=1}^{M} \ell\left( \mathcal{G}(x^{(i)}_{t-1};\theta),\, y_t \right)
公式含义:集合的损失 = 每个成员预报与真实场差距的平均。M 个成员不是独立训练,而是共享同一个网络参数 θ 协作优化。
  1. 集合损失\(\mathcal{L}_{\text{ensemble}}\) 是这套集合模型的总体训练损失,越小说明整个船队越靠谱。
    Lensemble\mathcal{L}_{\text{ensemble}}
  2. 模型前向\(\mathcal{G}(x^{(i)}_{t-1};\theta)\) 是 GraphCast 对第 \(i\) 个成员上一时刻状态做前向推理,得到当前时刻预测。
    G(xt−1(i);θ)\mathcal{G}(x^{(i)}_{t-1};\theta)
  3. 损失函数\(\ell(\cdot,\cdot)\) 比较预测场与真实观测场 \(y_t\),常用均方误差或空间加权误差。
    ℓ(G(xt−1(i);θ), yt)\ell\left( \mathcal{G}(x^{(i)}_{t-1};\theta),\, y_t \right)
  4. 取平均除以 \(M\) 防止成员数增大导致损失膨胀,也让每个成员的训练贡献均衡。
    1M∑i=1M\dfrac{1}{M}\sum_{i=1}^{M}

初始条件扰动

七艘船在码头出发时,即使停靠桩位只相差几米,经过一周航行也可能被洋流放大成完全不同的命运。这正是混沌理论中著名的“蝴蝶效应”:初始条件的微小差异会随预报时长指数增长。初始条件扰动就是主动制造这些“几米的差异”,它是集合预报多样性的第一来源。

具体怎么做?气象上,数据同化(把观测融入模型得到最优初始场)给出的分析场 \(x^{\text{an}}_0\) 本身带有误差。我们假设这个误差近似服从多元高斯分布,然后围绕分析场采样出 M 个扰动初始场。扰动不能是纯白噪声,因为气象变量在空间上有强相关性——相邻格点的误差不能互相矛盾,否则会产生“不物理”的虚假波动。

实际业务中,最成熟的扰动方法是奇异向量法(找出随时间增长最快的误差方向)和繁殖向量法(用上一轮预报误差滚动生成新扰动)。GraphCast 的集合生成可以复用这些经典策略:先对分析场做扰动,再送入 GNN 并行推理。船队出发的“桩位偏差”越贴近真实误差分布,最终围出的不确定性区间就越可信。

x0(i)=x0an+ε(i),ε(i)∼N(0,Σ)x^{(i)}_0 = x^{\text{an}}_0 + \varepsilon^{(i)},\quad \varepsilon^{(i)} \sim \mathcal{N}(0, \Sigma)
公式含义:第 i 个成员的初始场 = 最优分析场 + 一个从均值为零、协方差为 Σ 的高斯分布中采样的扰动项。Σ 刻画了误差的空间结构。
  1. 初始状态\(x^{(i)}_0\) 是第 \(i\) 个集合成员在预报起点 \(t=0\) 的完整状态场。
    x0(i)x^{(i)}_0
  2. 分析场\(x^{\text{an}}_0\) 是经过数据同化后对真实大气的“最佳估计”,相当于船队出发前对码头定位的最优测量。
    x0anx^{\text{an}}_0
  3. 扰动项\(\varepsilon^{(i)}\) 是第 \(i\) 个成员的专属扰动,均值为零,保证扰动不会系统性地把预报拉偏。
    ε(i)\varepsilon^{(i)}
  4. 协方差矩阵\(\Sigma\) 编码了不同位置误差的幅度和相关结构;实际中常用奇异向量或繁殖向量近似,来模拟“最危险”的增长方向。
    N(0,Σ)\mathcal{N}(0, \Sigma)

集合校准技术

船队多次出海后,你开始记录每次“预报有 70% 概率遇到风浪”时,实际遭遇风浪的比例。如果 10 次里有 7 次,说明船队的自我评估很准;如果只有 4 次,说明船队过于悲观,把概率报高了——这就是校准问题:预报概率与实际发生频率之间的一致性。

一个未校准的集合就像一个过度自信的船员,明明只有五成把握却拍胸脯说“十拿九稳”。可靠性图是最直观的诊断工具:把预报概率分到几个箱子里,统计每个箱子的观测频率,再画成曲线。完美校准的集合,这条曲线会落在 45° 对角线上;偏离越远,说明模型的概率估计越“失真”。

数学上,校准条件写成一个条件概率等式:

常用的再校准方法有等渗回归(isotonic regression)和 Platt 缩放。它们的本质都是“用历史数据当老师”,修正船队长期积累的系统性偏见。校准后的船队不会过度夸张地吓唬你,也不会轻描淡写地瞒报风险——这正是概率预报的诚信基石。

P(yt=1∣p^t=r)=r\mathbb{P}\left( y_t = 1 \mid \hat{p}_t = r \right) = r
公式含义:当模型预报某事件概率为 r 时,该事件实际发生的比例也应当恰好是 r。这是集合预报“诚实摊牌”的数学定义。
  1. 事件发生\(y_t = 1\) 表示目标事件(比如“气温超过 35°C”)在时刻 \(t\) 真的发生了。
    yt=1y_t = 1
  2. 预报概率\(\hat{p}_t = r\) 是集合成员中预报该事件发生的比例,比如 20 个成员有 14 个报超阈值,则 \(r=0.7\)。
    p^t=r\hat{p}_t = r
  3. 条件概率竖线左侧是在给定 \(r\) 的条件下事件发生的概率,等价于统计“预报 70% 时实际发生的频率”。
    P(yt=1∣p^t=r)\mathbb{P}\left( y_t = 1 \mid \hat{p}_t = r \right)
  4. 校准等式当这个频率恰好等于 \(r\) 时,集合完全可靠;否则需要做概率再校准,比如用历史数据拟合一个单调回归函数把 \(r\) 映射成新概率。
    =r= r

概率评估指标

如果让船队每次出发前都写下“明天遇到风浪的概率”,你该如何给它们打分?只算平均误差会忽略不确定性的价值,只看点对的次数又太粗糙。气象学界最常用的统一标尺是 CRPS(连续排序概率评分),它同时惩罚两件事:报得不准,以及概率分布摆得不对。

CRPS 的思想很直观:把集合成员构造成一条经验累积分布函数曲线 \(F(z)\),再把观测值画成一条“阶跃指示曲线”(观测值左侧为 0,右侧为 1)。两条曲线之间围成的阴影面积就是 CRPS——面积越小,预报越好。这个指标一举两得:均值偏了会增大面积,分布太宽或太窄也会增大面积。

对于二分类事件(如“是否会下暴雨”),更常用的是 Brier 评分:\(\text{BS} = \frac{1}{N}\sum_{j=1}^{N}(p_j - o_j)^2\),直接比较预报概率和实际观测 0/1 值的平方差。CRPS 和 Brier 的区别在于:CRPS 面向连续变量,Brier 面向事件概率,但两者的哲学一致——一支好的船队不仅要知道去哪,还要诚实地告诉大家自己有多确定。

CRPS(F,y)=∫−∞∞(F(z)−1[y≤z])2dz\text{CRPS}(F, y) = \int_{-\infty}^{\infty} \left( F(z) - \mathbf{1}[y \le z] \right)^2 dz
公式含义:CRPS 等于预报累积分布与观测指示函数之间的平方面积。它同时衡量了准确性(离真相近不近)和离散度(分布摆得合不合理)。
  1. 累积分布\(F(z)\) 是集合成员构造的经验 CDF,在任意阈值 \(z\) 处取值 = “成员中预报值 ≤ z 的比例”。
    F(z)F(z)
  2. 观测指示\(\mathbf{1}[y \le z]\) 是一个阶跃函数:当观测值 \(y\) 小于等于 \(z\) 时为 1,否则为 0。
    1[y≤z]\mathbf{1}[y \le z]
  3. 平方差\((F(z) - \mathbf{1}[y\le z])^2\) 在每个 \(z\) 处衡量预报分布与“理想分布”的差距,平方处理消除正负抵消。
    (F(z)−1[y≤z])2\left( F(z) - \mathbf{1}[y \le z] \right)^2
  4. 积分对 \(z\) 从负无穷到正无穷积分,把所有阈值处的差距累加成唯一分数;CRPS 越小表示集合越优秀。
    ∫−∞∞⋯dz\int_{-\infty}^{\infty} \cdots dz

集合规模控制

队伍人数越多,统计上越可靠,但每次出海都要增加补给和燃料。集合预报同样面临规模-算力权衡:成员太少,概率估计抖动大;成员太多,计算成本线性上涨而精度提升越来越有限。从统计角度看,集合平均误差来自两部分的叠加:系统误差(模型本身的结构偏差)和采样误差(成员有限导致的随机波动)。

采样误差与成员数 \(M\) 呈平方根反比关系——这就解释了为什么收益是递减的:从 1 个成员加到 10 个,误差下降非常显著;从 30 个加到 60 个,改善幅度就小得多了。经验上,全球集合 20-50 个成员即可满足大部分业务需求,区域集合 10-20 个也够用。

聪明的船队指挥不会盲目增加船只,而是会做代表性成员遴选:用聚类算法把相似的成员归并,挑出最能代表不同天气情景的少数几艘。GraphCast 由于推理极快,可以把成员数推到传统 NWP 的 2-3 倍,但依然要遵循这个统计规律——把省下的算力投到提高输入数据质量和模型分辨率上,往往比堆砌同质成员更划算。

MSE(M)=σ系统2+σ成员2M\text{MSE}(M) = \sigma^2_{\text{系统}} + \dfrac{\sigma^2_{\text{成员}}}{M}
公式含义:集合平均的总误差 = 系统误差(无法靠加成员消除)+ 采样误差(随成员数 M 增大而减小)。这是“收益递减”的数学根源。
  1. 总误差\(\text{MSE}(M)\) 是包含 \(M\) 个成员时集合平均预报的均方误差,是评估集合整体表现的基本量。
    MSE(M)\text{MSE}(M)
  2. 系统误差\(\sigma^2_{\text{系统}}\) 来自模型本身或观测系统,所有成员共享,因此加再多的船也改变不了。
    σ系统2\sigma^2_{\text{系统}}
  3. 采样误差\(\dfrac{\sigma^2_{\text{成员}}}{M}\) 是成员间方差除以成员数,代表“只派了有限几艘船导致的统计波动”。
    σ成员2M\dfrac{\sigma^2_{\text{成员}}}{M}
  4. 极限行为当 \(M \to \infty\) 时 \(\frac{\sigma^2_{\text{成员}}}{M} \to 0\),总误差逼近系统误差下限——这就是增益递减的根源。
    lim⁡M→∞σ成员2M=0\lim_{M \to \infty} \frac{\sigma^2_{\text{成员}}}{M} = 0

极端天气应用

当七艘侦察船中的四艘突然冲向同一片暴风区时,你不会再纠结“精确到哪一公里登陆”,而是立刻明白:高风险区域已经出现。极端天气预警最需要的就是这种“概率信号”——确定性预报一次说“可能暴雨”但拿不准,决策者无从下手;集合预报给出“60% 概率出现 50mm 以上强降雨”,就能直接触发分级应急响应。

热浪预警同样如此。GraphCast 集合可以针对 2 米温度逐小时输出概率分布,业务部门关心的是“气温越过 41°C 警戒线的概率有多少”。公式非常朴素:统计集合成员中预报值超过阈值 \(\tau\) 的比例。

台风路径预报是集合思想的经典受益者:确定性预报只给出一条路径,集合却画出一个“路径扇面”,每艘船代表一种可能的走向。当扇面覆盖某座城市时,即使中心路径不在那里,也需要提前准备。GraphCast 集合 + 极端概率的联动,让预警从“会不会”升级为“有多大可能、影响面多广”,把不确定性转化为可执行的决策依据。

P^t=1M∑i=1M1[xt(i)≥τ]\hat{P}_t = \dfrac{1}{M}\sum_{i=1}^{M} \mathbf{1}\left[ x^{(i)}_t \ge \tau \right]
公式含义:极端事件概率 = 集合中“预报值超过阈值 τ”的成员占比。20 个成员里有 14 个报超阈值,概率就是 70%。
  1. 阈值事件\(x^{(i)}_t \ge \tau\) 判断第 \(i\) 个成员在时刻 \(t\) 的预报值是否超过警戒值 \(\tau\)。
    xt(i)≥τx^{(i)}_t \ge \tau
  2. 指示函数\(\mathbf{1}[\cdot]\) 是数学里的“开关”,条件成立取 1,不成立取 0,相当于给每艘船投一票。
    1[xt(i)≥τ]\mathbf{1}\left[ x^{(i)}_t \ge \tau \right]
  3. 成员投票\(\sum_{i=1}^{M}\) 把 M 个成员的投票结果相加,得到“报极端天气的船数”。
    ∑i=1M1[xt(i)≥τ]\sum_{i=1}^{M} \mathbf{1}\left[ x^{(i)}_t \ge \tau \right]
  4. 概率归一除以 \(M\) 将票数转化为 0-1 之间的概率,\(\hat{P}_t\) 就是时刻 \(t\) 的极端事件概率。
    P^t=1M∑i=1M\hat{P}_t = \dfrac{1}{M}\sum_{i=1}^{M}

业务化部署

船队出海的最终目的不是观赏风景,而是安全返航并带来渔获。集合预报落到业务系统也需要一条完整的流水线:观测数据入网 → 同化生成分析场 → 扰动得集合成员 → GraphCast 批量推理 → 后处理校准 → 概率产品发布 → 决策者行动。每一步都需要监控和迭代。

在实际部署中,GraphCast 集合通常与确定性预报并行运行,形成“混合预报”:确定性结果用于快速参考,集合结果用于风险评估。两者的比分可以用技能评分来衡量——如果集合预报的 CRPS 比确定性预报的 CRPS 更小,说明集合确实带来了增量价值。

业务系统还要设置决策阈值:例如“集合降雨概率 > 60% 且校准可靠性达标”才触发短信预警。这套阈值需要结合本地历史灾害事件反复调优,并配以实时滚动更新——每 6 小时或 1 小时滚动一次新集合,持续跟踪船队的最新动向。GraphCast 的推理速度让这种高频更新从理论走向工程实践,AI 集合预报不再是昂贵的学术实验,而是真实世界防灾减灾的日常工具。

Skill=1−CRPS集合CRPS确定性\text{Skill} = 1 - \dfrac{\text{CRPS}_{\text{集合}}}{\text{CRPS}_{\text{确定性}}}
公式含义:集合技能 = 1 减去集合 CRPS 与确定性 CRPS 的比值。大于 0 说明集合比单一预报更优,越大优势越明显。
  1. 集合评分\(\text{CRPS}_{\text{集合}}\) 是集合预报的长期平均 CRPS,值越小越好。
    CRPS集合\text{CRPS}_{\text{集合}}
  2. 确定性评分\(\text{CRPS}_{\text{确定性}}\) 是用同一个 GraphCast 单次确定性预报的 CRPS 作为基准。
    CRPS确定性\text{CRPS}_{\text{确定性}}
  3. 比值关系\(\dfrac{\text{CRPS}_{\text{集合}}}{\text{CRPS}_{\text{确定性}}}\) 小于 1 时,集合评分优于确定性评分。
    CRPS集合CRPS确定性\dfrac{\text{CRPS}_{\text{集合}}}{\text{CRPS}_{\text{确定性}}}
  4. 技能指数\(1 -\) 该比值,正数表示集合带来了可量化的技能提升,接近 1 则说明集合几乎完美。
    Skill=1−⋯\text{Skill} = 1 - \cdots

AI 应用场景

海上风电功率预测与运维调度

阶段:概率预报建模与下游决策

解决的问题:风电场的功率输出受风速和风向波动影响,确定性预报无法预测“功率跳崖”风险。传统做法是靠运维人员的经验判断,遇到突发大风只能被动停机。GraphCast 集合预报输出未来 72 小时风速的概率分布后,可以计算“风速超过风机切出阈值”的概率,提前安排风机变桨或运维船出海窗口。

具体案例:某海上风电场接入 GraphCast 集合预报,20 个成员每小时推理一次,当集合中超过 50% 成员预报风速 > 25 m/s 且校准通过时,系统自动触发限功率策略,减少叶片损毁风险,同时把运维窗口安排在风速概率最低的时段。

城市内涝应急预警

阶段:极端事件概率提取与阈值触发

解决的问题:城市排水调度需要知道“这场雨到底会不会超过管网设计标准”,确定性预报的瞬时雨量不确定性太大。GraphCast 集合提供的强降雨概率,让水务部门可以按风险等级分级响应:概率超 30% 备勤、超 60% 预排、超 80% 关闭下穿隧道。

具体案例:某城市气象局部署 GraphCast 集合预报,针对 1 小时累计降水超过 50mm 的事件计算概率。在一次对流天气过程中,集合概率提前 6 小时升至 75%,相关区域提前启动排水泵,内涝积水深度比去年同期同类降雨降低了 40%。

农业霜冻灾害预防

阶段:集合后处理与业务产品集成

解决的问题:果树花期遇到霜冻可能绝收,果农需要提前数小时知道“最低气温会不会低于 0°C”,以便启动防霜风机或熏烟设备。确定性预报的低温值一旦偏差 1°C 就可能错判,集合概率则能给出更稳健的风险信号。

具体案例:某葡萄种植区采用 GraphCast 集合预报,结合地表温度统计降尺度,输出未来 48 小时霜冻概率。当 20 个成员中有 14 个预报最低地表温 < 0°C(概率 70%)时,果园统一启动防霜措施,当年花期冻害损失较往年减少约 60%。

Python 演示

python55 行
import mathimport numpy as np  def norm_pdf(x):    return math.exp(-0.5 * x * x) / math.sqrt(2.0 * math.pi)  def norm_cdf(x):    return 0.5 * (1.0 + math.erf(x / math.sqrt(2.0)))  def crps_gaussian(mu, sigma, y):    """高斯概率预报的CRPS精确解,sigma 为集合发散度"""    z = (y - mu) / sigma    pdf_z = norm_pdf(z)    cdf_z = norm_cdf(z)    return sigma * (z * (2.0 * cdf_z - 1.0) + 2.0 * pdf_z - 1.0 / math.sqrt(math.pi))  def generate_fc(analysis, members=25, steps=12, perturb=0.04):    """用扰动初始条件生成集合成员轨迹,模拟GraphCast批量推理"""    rng = np.random.default_rng(0)    traces = []    for i in range(members):        state = analysis + rng.normal(0.0, perturb)        traj = []        for s in range(steps):            state = 0.75 * state + 0.18 * math.sin(s * 0.8) + 0.12            traj.append(state)        traces.append(traj)    return np.array(traces)  def run():    analysis = 0.5    state = analysis    truth = []    for s in range(12):        state = 0.75 * state + 0.18 * math.sin(s * 0.8) + 0.12        truth.append(state)     fc = generate_fc(analysis, members=25, steps=12)    mu = fc.mean(axis=0)    sigma = fc.std(axis=0)    crps = [crps_gaussian(mu[s], sigma[s], truth[s]) for s in range(12)]     print("lead:s  ensemble_mean  ensemble_spread      CRPS")    for s in range(12):        print("{:>6d}  {:>12.4f}  {:>14.4f}  {:>8.4f}".format(s, mu[s], sigma[s], crps[s]))    print("avg CRPS =", round(float(np.mean(crps)), 4))  if __name__ == "__main__":    run()
目的:演示 GraphCast 集合预报的完整评估闭环——对初始状态加扰动生成 25 个成员,以集合均值 ± 发散度构成高斯概率预报,用 CRPS 精确解逐小时评分。
  1. def crps_gaussian(mu, sigma, y):CRPS 是本章的核心评估指标,这里用高斯假定推出解析解,避免数值积分的开销。
  2. z = (y - mu) / sigma把观测值标准化,衡量“观测值偏离集合中心几个标准差”。
  3. rng.normal(0.0, perturb)对每个成员的初始条件加独立的高斯扰动,模拟码头桩位的微小偏差。
  4. state = 0.75 * state + 0.18 * math.sin(s * 0.8) + 0.12一个简化的“虚拟气象演化”占位方程,用来模拟 GraphCast 的逐步预测行为。
  5. fc.mean(axis=0)对 25 个成员求平均,得到集合平均预报(船队质心轨迹)。
  6. fc.std(axis=0)计算成员间的标准差,即发散度,代表预报不确定性。
  7. crps = [crps_gaussian(mu[s], sigma[s], truth[s]) ...]对每个预报时刻独立计算 CRPS,得到整条预报序列的评分曲线。
  8. print("avg CRPS =", ...)输出平均分数,越小说明这套集合预报的“准确度 + 诚实度”综合表现越好。

常见误区

误区我一直以为集合预报就是把 GraphCast 跑很多次再取平均,平均结果跟直接跑一次确定性预报差不多,集合只是多了点平滑效果。

正解集合平均虽然常被当作确定性代表输出,但它的价值远不止“平滑曲线”。集合平均消除了单次初始误差的随机偏差,通常比单次预报更稳定。更重要的是,集合成员之间的离散度提供了确定性预报永远给不出的信息——概率区间。你不可能从一条路径里算出“70% 概率超阈值”,只有船队整体才能回答这类问题。

为何常见:因为集合平均画出来的曲线形状确实和确定性预报相似,而发散度需要额外查看成员分布才会注意到,初学者很容易只看平均线而忽略整体信息。

误区既然集合是通过多个成员来量化不确定性,那成员数从 10 加到 100,预报质量肯定也会成倍提升,预算充足就应该堆成员。

正解成员数对采样误差的影响遵循 \(\sqrt{M}\) 反比关系,从 1 个到 10 个改善显著,从 20 个到 100 个改进几乎可以忽略。真正决定集合质量的是成员的多样性——如果扰动方法不科学,一百个高度相似的成员等价于一个成员。GraphCast 快速推理确实降低了加成员的成本,但算力应该优先用于提高扰动质量和模型精度。

为何常见:直觉上“样本越多越可靠”,但没注意到系统误差这个不可消除的下限,误以为误差会随成员数无限下降。

误区看到集合成员的轨迹像扇子一样散开,就觉得模型“懵了”,预报肯定不靠谱,应该直接看确定性预报的路径。

正解发散度大并不等于“预报错误”,它反映的是当前天气系统对初始条件的敏感程度。在强对流、台风等混沌性强的天气里,大发散是正确且必要的——它在诚实地告诉你“这件事本来就很难预测”。错误的反而是高自信地报出一条精准路径,最后却偏离实际。评估集合好坏应当用 CRPS 等综合指标,而不是单纯看发散度大小。

为何常见:人的直觉是“越统一越可信、越分散越不可信”,但天气预测里的正确态度是把不确定性当作信息本身,而不是噪声。

误区我一直以为集合预报必须用不同的 AI 模型或不同厂商的预测系统,像投多个专家的票,GraphCast 单独一个模型做不了集合。

正解集合预报的核心是“初始条件集合”和“模型多样性”两个维度的组合。单模型 + 初始扰动是最经典的集合方式,GraphCast 完全可以用自身 + 扰动生成高质量集合。多模型超级集合(multi-model superensemble)只是进一步提升多样性的手段,但它的计算和维护成本高得多,不是必要条件。

为何常见:因为看到很多论文讲“多模式集合平均效果更好”,误以为多模型是定义性特征,忘记了集合策略是分层的:初始扰动、参数扰动、模型扰动都是可选维度。

误区GraphCast 既然是深度学习模型,我直接对它的输出预测场上加随机噪声,不就能得到一组“集合成员”了嘛,还省去扰动输入。

正解对输出场加纯随机噪声会破坏气象变量之间的空间结构(比如相邻格点的温度不可能剧烈矛盾),还会让集合成员的物理一致性变差。正确做法是在初始条件层面施加符合误差协方差的扰动,或者通过训练期的随机性(如随机权重平均)让模型学会生成多样而自洽的预测。扰动层面选错了,得到的“船队”只是涂抹了海浪涂装的同一艘船。

为何常见:深度学习中经常用输出侧增强(如温度缩放、噪声注入)来校准不确定性,初学者容易把这个思路误搬到集合预报中,没有意识到气象场有强空间相关性。

面试题

Q1. 集合预报的核心目标是什么?

单选题 · easy

  • A.提升单次预报的精度
  • B.量化预报的不确定性← 正确答案
  • C.减少模型的推理时间
  • D.增加观测数据总量

答案:B。集合预报通过多个扰动成员给出概率分布,核心是量化不确定性。提升单次精度是确定性模型的任务,减少推理时间与集合目标无直接关系,增加数据量是数据同化的话题。

Q2. GraphCast 生成集合成员最直接的方式是?

单选题 · easy

  • A.对初始分析场加扰动← 正确答案
  • B.替换网络激活函数
  • C.扩大训练数据集规模
  • D.将输出分辨率加倍

答案:A。对初始分析场施加符合误差分布的扰动,是集合预报最经典的成员生成方式。修改网络结构或数据集属于模型迭代范畴,提高分辨率只改变输出精细度,都不产生“多成员”。

Q3. 关于集合发散度,下列说法正确的是?

单选题 · mid

  • A.发散度越大预报一定越错
  • B.发散度衡量成员的离散程度← 正确答案
  • C.发散度与预报时长无关
  • D.发散度必须等于零才可用

答案:B。发散度是成员间差异的统计量,刻画预报不确定性。它随预报时长增大通常上升,但大发散并不代表错误,而是在警告系统可预测性低;零发散反而意味着集合失去了意义。

Q4. 集合校准的目的是什么?

多选题 · mid

  • A.让预报概率与实际频率一致← 正确答案
  • B.修正预报的系统性偏差← 正确答案
  • C.让所有成员收敛到同一答案
  • D.提升概率预报的可靠性← 正确答案

答案:ABD。校准追求的是“预报概率 70% 时事件实际发生约 70%”,即概率-频率一致(A),手段包括修正系统偏差(B),最终提升可靠性(D)。让成员收敛到同一答案(C)与集合预报理念背道而驰。

Q5. CRPS 评分的主要特点是什么?

单选题 · mid

  • A.只衡量预报平均值误差
  • B.同时衡量准确性和概率分布质量← 正确答案
  • C.只关注极端事件是否发生
  • D.用于比较 GPU 的推理速度

答案:B。CRPS 对累积分布函数与观测指示函数逐点比较,既惩罚均值偏离也惩罚分布形态不合理,是“准确 + 诚实”的统一标尺。

Q6. 集合成员数从 M 增加到 2M,理论上采样误差如何变化?

单选题 · hard

  • A.减少到原来的一半
  • B.保持不变
  • C.约减少为原来的 1/√2← 正确答案
  • D.与成员数同步翻倍

答案:C。采样误差项为 \(\sigma^2/M\),标准差为 \(\sigma/\sqrt{M}\),成员翻倍时标准差变为 \(1/\sqrt{2}\)。这正是集合规模收益递减的根源。

Q7. 极端天气概率预报中,集合预报的价值体现在哪些方面?

多选题 · hard

  • A.输出极端事件的发生概率← 正确答案
  • B.识别低概率高影响的情景← 正确答案
  • C.完全消除预报误差
  • D.支持分级预警的决策支撑← 正确答案

答案:ABD。集合能计算“超过阈值 τ 的成员占比”作为极端概率,并捕获确定性预报可能遗漏的尾部风险,为分级预警提供依据。但没有任何方法能完全消除预报误差。

Q8. 集合成员在预报初期接近、后期发散,其主要原因是?

单选题 · easy

  • A.数值计算的舍入误差
  • B.混沌动力学放大初始差异← 正确答案
  • C.显示器像素分辨率限制
  • D.观测传感器的信号漂移

答案:B。大气是混沌系统,初始微小误差随时间指数增长,导致成员后期明显发散。舍入误差和传感器漂移存在但不是主导,分辨率限制显然不相关。

Q9. 实际业务中通常用哪个统计量作为集合的确定性代表?

单选题 · mid

  • A.集合中位数或集合平均← 正确答案
  • B.集合中最大的成员
  • C.集合中最小的成员
  • D.随机选取一个成员

答案:A。集合平均或中位数能代表成员的中心趋势,可显著抑制单次预报的随机误差。取极值会偏向风险端点,随机选取则完全浪费集合信息。

Q10. 平衡集合规模与算力成本的合理策略有哪些?

多选题 · hard

  • A.用聚类算法遴选代表性成员← 正确答案
  • B.强行降低成员的扰动多样性
  • C.利用 GPU 并行批量推理加速← 正确答案
  • D.不训练模型而是随机猜测结果

答案:AC。聚类遴选可以在减少成员数的同时保留主要天气情景,GPU 并行推理则利用 GraphCast 的优势摊薄单成员成本。降低多样性会损害集合的意义,随机猜测则完全不可行。