想象你在海边小镇开了一家民宿,客人问你:“老板,十天后能出海吗?”你没法抬头看天就回答。小镇气象站没有水晶球,却有一位特别的气象邮差——他不在出发时写下一封“十天后的信”,而是每 6 小时往相邻村庄传一次口信:温度、风、气压、湿度,一棒接一棒。40 棒之后,口信就变成了第十天的天气草图。这位邮差就是 GraphCast。它不看星象、不背物理公式,而是靠学习过去 50 年全球天气“复盘档案”,学会如何把此刻的天气接力下去。这篇文章会陪你拆开邮差的背包:他如何认识地球这张大棋盘、如何与邻居交换消息、如何一棒一棒跑完 10 天,以及他跑得快、跑得准,却也有不敢说“我不确定”的时候。
掌握 GraphCast 的 10 天预测原理,等于把深度学习时代最前沿的“AI for Science”解码器装进工具箱,能帮你在气象、能源、防灾等场景中更早、更稳地做出决策。
可视化演示
展示预测精度衰减、自回归误差累积及变量级评估的三模态交互动画。
本节配有交互动效(进入视口后自动加载,约 3KB)。
预测精度衰减 GraphCast IFS ACC=f(day) 十天预测精度随时间递减GraphCast在90%变量上优于传统IFS模式
气象预测为何难
十天后能否出海,难在哪儿?大气不是一个房间里的温度计,而是覆盖全球、横跨几十公里高空、由无数气团组成的复杂流体。任何一次观测都只是给地球拍了一张不完整的快照。更要命的是,初始状态差一点点,几天后的天气轨迹就可能差出十万八千里,这就像气象邮差在分岔路口接到的口信稍微模糊一点,后面每个村子听到的版本都不一样。
从数学上看,天气预报可以理解为从“当前全球天气状态”到“未来某时刻天气状态”的一个映射。天气状态不是单个数字,而是一个巨大的高维张量:经纬度网格数、垂直层数、气象变量数三者相乘,才构成完整的天气全貌。传统数值模式用物理方程把这个映射一步一步算出来,而 GraphCast 想用神经网络直接学出这个映射。
- 全局天气状态$\mathbf{x}_{t}$ 表示 $t$ 时刻的全球天气状态,它是所有网格点、所有高度层、所有气象变量的总装。
- 维度乘积$V \times L \times P$ 分别代表网格点数、大气垂直层数、气象变量数,三者相乘得到状态向量的总维度。
- 预测映射$\hat{\mathbf{x}}_{t + h}$ 是模型对 $t+h$ 时刻天气的估计,$f$ 是学出来的预测函数。
球面图建模
\displaystyle G = (\mathcal{V}, \mathcal{E}), \qquad
\mathbf{A}_{ij} = \begin{cases} 1, & v_j \in \mathcal{N}(v_i) \\ 0, & \text{otherwise} \end{cases}
> 图结构用邻接矩阵记录每个节点的邻居关系。第 $i$ 个村庄和第 $j$ 个村庄相邻,矩阵对应位置就记为 1,否则记为 0。1. 图的定义:$G = (\mathcal{V}, \mathcal{E})$ 表示一张图由节点集合 $\mathcal{V}$ 和边集合 $\mathcal{E}$ 组成。$$\displaystyle G = (\mathcal{V}, \mathcal{E})$$2. 节点集合:$\mathcal{V}$ 中的每个节点代表一个网格社区,携带当地温度、气压、风速等信息。$$\displaystyle \mathcal{V} = \{v_1, v_2, \dots, v_N\}$$3. 边集合:$\mathcal{E}$ 中的每条边代表两个节点之间可以传递消息,近似模拟空气在空间的连续相互作用。$$\displaystyle \mathcal{E} = \{(v_i, v_j)\}$$4. 邻接矩阵:$\mathbf{A}_{ij}$ 用 0/1 标记 $v_j$ 是否为 $v_i$ 的邻居,是多尺度图被计算机读懂的“通讯录”。$$\displaystyle \mathbf{A}_{ij} = \begin{cases} 1, & v_j \in \mathcal{N}(v_i) \\ 0, & \text{otherwise} \end{cases}$$有了这张全球村际通讯录,GraphCast 才开始真正工作。但邮差不能只是机械地传话,它还需要判断哪些口信重要、哪些扰动该忽略,这就是图神经网络中消息传递要做的事。消息传递机制
想象一个小村庄收到四邻传来的口信:东边送来一阵暖风,西边报来一片阴云,南边提醒气压下降,北边说湿度升高。村民不会直接把四条口信原封不动再传给下一个村子,而是先在心里汇总,再结合自己的状态,生成一条新口信。图神经网络的消息传递,就是把这个过程数学化。
每个节点先让邻居生成“消息”,再把所有邻居的消息聚合起来,最后更新自己的隐藏状态。这个过程可以重复很多层。一层消息传递只传到邻居,两层就能传到“邻居的邻居”。几十层之后,某个遥远大洋上的天气扰动,就能绕着地球传到你的海边小镇。
消息传递让 GraphCast 不用等着全球数据一次到位,而是像水波一样一圈一圈扩散信息。可要让不同村庄能交换消息,GraphCast 还必须先把五花八门的天气观测统一成“标准信封”。
- 隐藏状态$\mathbf{h}_u^{(l)}$ 是节点 $u$ 在第 $l$ 层消息传递后携带的信息状态,相当于村民手中的“当前口信”。
- 邻居集合$\mathcal{N}(u)$ 是与节点 $u$ 相邻的节点集合,只允许本村和邻村直接通信。
- 消息函数$\psi$ 根据中心节点 $u$、邻居 $v$、边特征 $\mathbf{e}_{uv}$ 生成一条消息,决定“这段口信该怎么包装”。
- 聚合运算$\bigoplus$ 把所有邻居的消息汇成一个总体信号,常见做法是求和或取平均。
- 更新函数$\phi$ 把聚合结果与节点自身状态融合,得到新一轮隐藏状态 $\mathbf{h}_u^{(l+1)}$。
编码解码架构
海边小镇用摄氏度,内陆城市用百帕,高空气流用米每秒。如果邮差不先做翻译,这些数字根本无法放在一起比较。GraphCast 的第一步是编码:把温度、气压、风速、湿度等输入变量转换成统一维度的隐藏向量。这一步通常在“编码器”中完成。
编码之后,所有节点的隐藏向量进入“处理器”,也就是多层图神经网络,在图上反复进行消息传递。处理完成后,“解码器”再把抽象的隐藏向量翻译回人类能读懂的气象变量。GraphCast 在训练时,会拿历史真实天气当标准答案,计算预测结果和标准答案之间的误差,然后反向调整模型参数。
- 预测误差$\hat{y}_{i,j} - y_{i,j}$ 是第 $i$ 个样本、第 $j$ 个变量的预测值与真实值之差。
- 平方惩罚$( \cdot )^2$ 对误差取平方,让大误差受到更重的惩罚。
- 方差归一化除以 $\sigma_j^2$ 是为了把不同物理量放到同一把尺子上,单位不同也能公平比较。
- 批量平均$\frac{1}{|\mathcal{B}|}\sum_{i \in \mathcal{B}}$ 表示在一个训练批次中取平均,让模型不是只记住某一天,而是学会普遍规律。
自回归推演
\displaystyle \hat{\mathbf{x}}_{t+6h} = f_\theta(\mathbf{x}_t, \mathbf{x}_{t-6h}), \qquad
\hat{\mathbf{x}}_{t+12h} = f_\theta(\hat{\mathbf{x}}_{t+6h}, \mathbf{x}_t)
> 6 小时预测的模型,用自己上一棒的结果继续预测下一棒,这就是“自回归滚动推演”。每一棒都在地面上跑步,而不是靠火箭直接跳到终点。1. 第一棒输入:$\mathbf{x}_t$ 和 $\mathbf{x}_{t-6h}$ 分别代表当前状态和上一时刻状态,二者一起告诉模型天气正在如何变化。$$\displaystyle \mathbf{x}_t, \quad \mathbf{x}_{t-6h}$$2. 学习到的模型:$f_\theta$ 是带参数 $\theta$ 的 GraphCast 模型,已经学会把两个连续状态映射成下一状态。$$\displaystyle f_\theta(\cdot)$$3. 第一步预测:$\hat{\mathbf{x}}_{t+6h}$ 是模型自己生成的、6 小时后的天气状态。$$\displaystyle \hat{\mathbf{x}}_{t+6h} = f_\theta(\mathbf{x}_t, \mathbf{x}_{t-6h})$$4. 滚动递推:$\hat{\mathbf{x}}_{t+12h}$ 使用的是“自己上一棒预测出的状态”作为新输入,这就是误差也会跟着接力下去的来源。$$\displaystyle \hat{\mathbf{x}}_{t+12h} = f_\theta(\hat{\mathbf{x}}_{t+6h}, \mathbf{x}_t)$$自回归的优势是模型只需要学会短期预测,结构简单;风险也显而易见:每一棒的小误差都会传给下一棒,10 天后误差可能被放大。GraphCast 的训练和推理都考虑了这种滚动过程,力求让误差增长尽量缓慢。精度与性能
这位气象邮差跑完 40 棒,结果到底准不准?DeepMind 团队用欧洲中期天气预报中心 ECMWF 的 ERA5 再分析数据训练 GraphCast,再把它和 ECMWF 高精度业务模式 HRES 放在同一张考卷上比较。考卷上有 2760 个验证目标,覆盖不同气象变量、不同气压层、不同地区、不同起报时刻和不同预报时效。
结果,GraphCast 在 90.2% 的验证目标上比 HRES 误差更小。同时,它完成一个完整的全球 10 天预报只需不到 1 分钟,而传统数值模式往往需要超级计算机耗费数小时。GraphCast 并不是“所有指标全面碾压”,但在如此多的目标上稳定领先,已经足够说明数据驱动气候预测的潜力。
邮差跑得快、胜率高,让人激动。但我们也要冷静看看他的行李箱里还缺什么:概率、极端天气、物理守恒,这些都是优化与局限的关键词。
- 验证目标数$2760$ 代表考卷上的题目总数,包括不同变量、地区、气压层和预报时效。
- 指示函数$\mathbb{1}[\cdot]$ 当方括号内条件成立时取 1,否则取 0,相当于一场“谁更准谁得分”的裁判。
- 误差比较$E_{\mathrm{GC},k}$ 和 $E_{\mathrm{HRES},k}$ 分别是 GraphCast 和 HRES 在第 $k$ 个验证目标上的误差,常用 RMSE 或 MAE。
- 平均胜率$S$ 对所有目标求平均,$0.902$ 表示 GraphCast 赢了约九成考题。
优化与局限
GraphCast 的高效,来自它对“稀疏图”的利用。地球网格虽然节点数量大,但真正需要传递消息的边并不像全连接网络那样爆炸。推理时,计算量主要由图中边的数量决定,而不由网格点数的平方决定。这让 GraphCast 可以在单块 TPU 上快速完成 10 天预报。
不过,这位气象邮差也有明显短板。第一,他是个“确定性邮差”:同样输入只会得到同一个答案,不会主动告诉你“我有 70% 的把握明天雨量超过 50 毫米”。在做灾害决策时,概率信息往往比单点数字更有用。第二,极端天气在历史数据中很稀少,模型容易把罕见的台风、热浪“平滑”掉。第三,数据驱动模型并不天然遵守能量守恒、质量守恒等物理定律,需要在训练目标和结果检查上做更多约束,才能真正进入严谨的业务流程。
GraphCast 证明了 AI 可以从数据中学会复杂物理系统的重要规律,但它也提醒我们:模型跑得快不代表理解一切。把确定性预测变成可靠决策,还需要结合概率建模、物理约束和人类经验。
- 层数$L$ 表示图神经网络中消息传递的总层数,每一层都让信息多扩散一圈。
- 每层边数$|\mathcal{E}^{(\ell)}|$ 是第 $\ell$ 层图中的边的数量,代表这一层要传递多少条消息。
- 求和$\sum_{\ell=1}^{L}$ 把所有层的边数加起来,总计算量大致与这个总和同阶。
- 复杂度记号$O(\cdot)$ 表示数量级,帮助我们忽略常数,只看规模增长趋势。
AI 应用场景
风电场发电功率预估
阶段:模型推理与下游预测
解决的问题:传统风电场只能依赖未来 1-3 天的数值天气预报,遇到突发天气调整容易措手不及。GraphCast 能快速提供 10 天全球天气推演,把它接入风电功率曲线模型,就能提前规划设备检修和电网调度。
具体案例:某海上风电场运维团队每天早上拉取 GraphCast 10 天风场预测,结合风机功率曲线估算每个时段的发电量。当预测到第 7 天有一次强风过程时,系统会自动提醒停机保护,减少叶片过载风险。
航空长航线改道
阶段:决策支持与路径优化
解决的问题:洲际飞行需要提前了解高空急流位置,顺风飞能省油,逆风飞则要多带燃油。传统气象产品的更新频率和时滞可能让长航线错过最佳路径。GraphCast 的快速全球预测可以作为航路规划层的气象底座。
具体案例:一家航空公司利用 GraphCast 预测未来 3-7 天的 250hPa 高空风场,在起飞前 24 小时自动生成多条候选航线,再结合燃油成本和空域限制选出最优路径,单次跨洋航班平均节省约 2% 燃油。
防灾应急资源预置
阶段:风险预警与人机协同
解决的问题:灾害应急部门往往只有逐日更新的官方预报,对中长期趋势掌握不足。GraphCast 提供的 10 天温度、降水趋势可以帮助应急团队提前把物资调到高风险区域,而不是等预警发布后再仓促运输。
具体案例:某沿海城市应急管理局在台风季期间,每天查看 GraphCast 的 10 天累积降水预测图。当模型指出某流域未来 8 天可能持续强降水时,应急系统自动生成沙袋、抽水泵、救援艇的预置清单,并推送给乡镇负责人。
Python 演示
import numpy as np def build_grid_graph(rows, cols): src = [] dst = [] def idx(r, c): return r * cols + c for r in range(rows): for c in range(cols): u = idx(r, c) for dr, dc in ((-1, 0), (1, 0), (0, -1), (0, 1)): nr, nc = r + dr, c + dc if 0 <= nr < rows and 0 <= nc < cols: src.append(u) dst.append(idx(nr, nc)) return np.array(src), np.array(dst) def message_passing(x, src, dst, theta=0.35, hops=2): out = x.copy() for _ in range(hops): agg = np.zeros_like(out) for s, d in zip(src, dst): agg[d] += out[s] deg = np.bincount(dst, minlength=out.size) mean_neighbor = agg / np.maximum(deg, 1) out = (1 - theta) * out + theta * mean_neighbor return out def autoregressive_daily(x, src, dst, days=10): snapshots = [x.copy()] for _ in range(days): x = message_passing(x, src, dst) right = x[:, 1:].copy() x[:, :-1] += 0.02 * right snapshots.append(x.copy()) return np.stack(snapshots) def main(): np.random.seed(7) rows, cols = 5, 7 x0 = 0.2 + 0.8 * np.random.rand(rows, cols) src, dst = build_grid_graph(rows, cols) hist = autoregressive_daily(x0, src, dst, days=10) for day in (1, 5, 10): print("day %d: mean=%.3f max=%.3f" % (day, hist[day].mean(), hist[day].max())) print("10天滚动预测完成") if __name__ == "__main__": main()
def build_grid_graph(rows, cols):构建二维网格图,把每个网格点变成图节点。src.append(u); dst.append(idx(nr, nc))记录一条由当前节点指向邻居节点的有向边。agg[d] += out[s]节点 d 累加所有邻居节点 s 传来的信息,这是消息聚合的核心。mean_neighbor = agg / np.maximum(deg, 1)把累加结果除以入度,得到邻居平均值。out = (1 - theta) * out + theta * mean_neighbor按比例融合自身状态和邻居信息,完成一次节点更新。right = x[:, 1:].copy()取右侧网格的天气值,模拟天气系统向右传播的简单强迫项。hist = autoregressive_daily(x0, src, dst, days=10)用前一天的预测结果作为下一天输入,完成 10 天滚动推演。
常见误区
误区我以为是 GraphCast 把大气物理方程写进了神经网络,所以才能超越传统数值模式。它计算每一步时应该在解纳维-斯托克斯方程吧?
正解GraphCast 在推理时并不显式求解物理方程。它是数据驱动模型,从 ECMWF 的 ERA5 再分析数据中学习“天气状态如何演化”。真正用物理方程做积分的是 ECMWF 的高分辨率业务模式 HRES。
为何常见:天气预报自古以来依赖物理模型,大家很容易默认 AI 模型只是“给物理方程加速”,忽略了它完全可以端到端地从数据中学习。
误区输入今天的天气,输出直接就是第十天的天气图,像生成一张未来照片一样。
正解GraphCast 采用自回归滚动预测。它先预测 6 小时后的状态,再把预测结果作为输入预测下一个 6 小时,这样反复 40 次才得到 10 天预报。
为何常见:“10 天预测”听起来像直接拍一张 10 天后的快照,而自回归这种“自己给自己递接力棒”的结构对新读者不够直观。
误区GraphCast 赢了 ECMWF 90.2% 的比赛,说明地球上 90.2% 的地方它都预测得更准。
正解90.2% 是论文里 2760 个验证目标中 GraphCast 胜出的比例。这些目标是不同变量、不同气压层、不同地区、不同预报时效的组合,不代表每个网格点、每个时刻都全面领先。
为何常见:论文摘要中的单个百分比容易被简化成“地区覆盖率”,但气象验证体系远比一个数字复杂。
误区GraphCast 要想更准,只要把 0.25° 网格继续加密到 0.1°,性能自然提高。
正解更高分辨率会带来更多节点和边,也会带来更大计算量,但不一定意味着更好。GraphCast 的精度来自数据质量、多尺度图结构和训练策略,分辨率只是其中一个因素。
为何常见:普通用户习惯用“像素越高照片越清晰”类比天气模型,却忽略了气象预报的误差还来自初始观测、物理参数化和训练数据,不止是网格密度。
误区既然 GraphCast 能预测 10 天天气,它应该也能告诉我“明天下雨的概率是 70%”。
正解GraphCast 本质上是确定性模型,给定同样输入会输出同一个点预测,它没有天然的概率表达能力。要获得概率预报,需要额外做集合扰动或接入其他不确定性估计算法。
为何常见:如今很多机器学习模型都输出置信度,公众很容易把“预测值”和“概率分布”混为一谈,尤其当产品界面展示置信区间时。
面试题
Q1. GraphCast 在 10 天预报中,推进一个时间步代表多长?
- A.每 3 小时推进一步
- B.每 6 小时推进一步← 正确答案
- C.每 12 小时推进一步
- D.每天直接推进一步
答案:B。GraphCast 把天气演化切成 6 小时一棒,10 天共 40 棒。它是一棒接一棒地自回归滚动,而不是一步跨过 10 天,因此 A/C/D 都不对。
Q2. GraphCast 的训练数据主要来自下列哪一项?
- A.地面气象观测站实时数据
- B.ECMWF 的 ERA5 再分析数据← 正确答案
- C.全球气象卫星云图的即时拼图
- D.传统数值模式输出的降尺度结果
答案:B。GraphCast 从 ERA5 再分析中学习历史天气演变,ERA5 是一份经过重建和同化的全球气象档案,给邮差提供一致的标准答案。实时观测、云图拼图和降尺度输出都不是主训练集。
Q3. 论文中“90.2%”通常表示什么?
- A.全球 90.2% 地区都比 HRES 更好
- B.2760 个验证指标中胜出的比例← 正确答案
- C.训练集上达到的像素准确率
- D.10 天预报里第 9 天的技能得分
答案:B。90.2% 是 GraphCast 在 2760 个验证目标上的胜率,覆盖变量、气压层、地区和预报时效。它不直接等于“地区覆盖率”,也不是图像分类中的准确率。
Q4. GraphCast 的预测方式包含哪些特点?
- A.数据驱动天气预测← 正确答案
- B.图神经网络滚动预测← 正确答案
- C.纯物理方程积分预测
- D.自回归生成十天目标← 正确答案
答案:ABD。GraphCast 是数据驱动模型,用图神经网络逐 6 小时自回归生成 10 天目标。C 是传统数值模式的思路,GraphCast 在推理时不显式积分物理方程,因此不选。
Q5. 消息传递机制通常包含下列哪些环节?
- A.邻居消息生成← 正确答案
- B.邻居消息聚合← 正确答案
- C.中心节点更新← 正确答案
- D.全局排序剪枝
答案:ABC。每个节点先生成消息,再把邻居发来的消息聚合,最后更新自身隐藏状态。全局排序剪枝不是消息传递的标准环节,因此 D 不选。
Q6. GraphCast 的一次 6 小时预测,通常使用什么作为输入?
- A.当前和上一时刻两个天气态← 正确答案
- B.最近 7 天逐小时观测序列
- C.未来 10 天的气候平均态
- D.地面观测与卫星云图两张图
答案:A。GraphCast 把“上一棒”和“当前棒”两个连续天气态作为输入,预测下一棒。直接把未来平均态或两张静态图送入模型,会破坏它学习到的天气演化节奏。
Q7. 自回归滚动预测最需要警惕的问题是什么?
- A.预测误差会随步骤累积← 正确答案
- B.模型推理速度越来越慢
- C.输入数据量不断减少
- D.图结构自动发生改变
答案:A。每一步预测都会把上一步误差带进下一步,40 棒后误差可能被放大。固定模型的推理速度、输入数据量和图结构不会因为滚动而自动改变,因此 B/C/D 都不成立。
Q8. GraphCast 使用多尺度网格的主要好处是什么?
- A.捕捉大尺度天气系统← 正确答案
- B.保留局部地形细节← 正确答案
- C.减少所有物理方程求解
- D.提升消息传递效率← 正确答案
答案:ABD。多尺度网格把粗细网格连成一张图,既能传播大尺度系统,也能保留局部细节,同时用稀疏边降低计算量。减少物理方程不是模型目标,模型本来就不显式求解方程,因此 C 不选。
Q9. GraphCast 面对极端天气时的一个已知短板是什么?
- A.没有显式的不确定性估计← 正确答案
- B.无法输出任何温度数值
- C.只能做春夏季预报
- D.必须人工输入台风中心
答案:A。GraphCast 输出的是确定性点预测,对“预报到底有多没底”没有直接答案。它仍能输出温度,也不限于特定季节或依赖人工台风输入,因此 B/C/D 错误。
Q10. 为什么 GraphCast 推理复杂度常用“边数”而非“节点数”衡量?
- A.稀疏消息只遍历邻边← 正确答案
- B.节点数必须等于网格数
- C.边数总小于节点数
- D.图网络不包含激活函数
答案:A。GraphCast 的图很稀疏,消息传递真正消耗计算的是遍历所有边。节点数可以接近网格点数,但复杂度仍需看边的规模和层数;C 和 D 不是复杂度衡量的原因。