Hugging Face用户用大模型模拟台风路径结果首秀完爆传统气象模型

前几天刷Hugging Face的时候,我被一个项目惊得差点把咖啡洒在键盘上。不是那种“哇这个模型参数量又涨了”的麻木惊叹,而是一种“这事儿可能真的要变天”的震撼。一个叫“TyphoonGPT”(其实不是正式名字,但为了好记我先这么叫它)的项目,用大模型直接模拟台风路径,结果居然碾压了传统的气象数值模型。
先说明一下,我自己不是气象专业的,只是个偶尔写写代码、喜欢折腾大模型的普通程序员。但正因为这样,当我看到这个结果时,才会觉得既兴奋又困惑——一个半路出家的开发者,用一句“我想试试看”的念头,竟然在预测台风这种对科学计算要求极高的事情上,赢了国家级机构用了十几年的模型。
这事儿我得好好聊聊。
从头说:他为什么要用大模型预测台风?
这个项目的作者(我们叫他小陈好了,保护隐私,毕竟我在写文章前也没征得他同意)其实是个做NLP的。每天的工作就是调参数、跑评测、看loss曲线。但去年夏天他家那边刮了一次台风,他看到传统预报的路径一天变了三次,从“登陆广东”改到“擦边福建”,最后又变成“登陆浙江”,搞得大家手忙脚乱。
小陈那时候就在想:
大模型能写诗、能写代码、能解答数学题,那能不能“看看”气象数据,自己给出预测?
这个想法听起来有点像玩笑,毕竟气象预测涉及的是物理方程、偏微分方程、全球大气环流,不是一个Transformer能吃下的。但小陈那段时间正好在研究时间序列预测,心想:台风的移动轨迹本质上也属于时间序列啊,只不过多了空间特性和物理约束。
于是,他真的开始干了。
他到底怎么做的?(这里上代码了)
我当时把他的代码拉下来跑了一遍,说实话,
他的做法比我预想的要简单得多,却也聪明得多
。
他没有像传统模型那样去解纳维-斯托克斯方程,而是把台风预测当成一个
多模态时间序列生成任务
。什么意思呢?就是把过去几天的台风轨迹、海洋温度、大气压强、风场数据全部当作“文本”,用大模型的那个Transformer结构去学习它们之间的依赖关系。
下面是他项目里关键的一段代码(我稍微简化了一点点):
import torch
import torch.nn as nn
from transformers import GPT2LMHeadModel, GPT2Config

class TyphoonGPT(nn.Module):
“””
这个模型说白了就是一个改造成时序预测的GPT。
输入: 过去12小时的经纬度、风速、气压、海表温度(共4个特征)
输出: 未来24小时的预测轨迹(每3小时一个点,共8个点,每个点包含经纬度+风速)
“””
def __init__(self):
super().__init__()
config = GPT2Config(
vocab_size=1, # 我们不用词汇,用连续的数值
n_positions=1024, # 序列长度
n_embd=256, # 隐藏维度
n_layer=6, # 6层Transformer
n_head=8
)
# 这是核心:我们不用GPT的文本嵌入,而是自己定义线性映射
self.gpt = GPT2LMHeadModel(config)
# 输入投影层:把气象特征映射到模型空间
self.input_proj = nn.Linear(4, 256)
# 输出投影层:把模型输出映射回气象特征空间
self.output_proj = nn.Linear(256, 3) # 经纬度+风速

def forward(self, past_trajectory):
“””
past_trajectory: [batch, time_steps, 4] # B, T, 4
“””
# 第一步:把原始气象特征映射到模型空间
x = self.input_proj(past_trajectory) # [B, T, 256]
# 第二步:加上位置编码(这里用相对位置,因为台风轨迹长短不一)
# 第三步:喂进Transformer
outputs = self.gpt(inputs_embeds=x,
output_hidden_states=True)
# 第四步:取最后一个时间步的hidden state
last_hidden = outputs.hidden_states[-1][:, -1, :] # [B, 256]
# 第五步:映射回预测值
prediction = self.output_proj(last_hidden) # [B, 3]
return prediction # 返回下一个点的(经度,纬度,风速)
看到这里你可能觉得:这不就是最基础的seq2seq吗?别急,小陈在这个基础上还做了三件更“骚”的事:
第一件事:他把台风数据做成了“图像+文本”的双编码。
他发现在Transformer里单纯用数值不太行,因为台风路径上相邻两点之间的关系,和数值本身一样重要。于是他写了个小模块,把经纬度变换成相对距离和方向角,还额外接入了一个小型的CNN编码器把卫星云图也编码进去。数据里既有海表温度的数值,又有云层图像特征。
第二件事:他用“气候态”做预热。
传统模型最怕的是训练数据不够——百年来的台风数据总共也就几千条,对大模型而言根本不够看。小陈想了办法:先用全球气候再分析数据(就是那种更普遍的、没有台风的天气数据)对大模型做预训练,让模型学会“地球大气运动的一般规律”,然后再用台风的少样本数据微调。这招特别像LLM里的“预训练+微调”范式。
第三件事:他给损失函数加了物理约束。
纯数据驱动模型经常出现离谱的预测,比如台风突然拐个90度的弯或者飞起来。小陈在损失函数里加了个惩罚项:如果预测的路径点不符合科里奥利力带来的偏转规律,就会有大惩罚;如果风速变化率超出物理极限,也会扣分。
代码不复杂,但组合起来效果惊人。
“完爆”传统模型,到底有多夸张?
我知道媒体喜欢用“完爆”“秒杀”这种词,但同样我也亲自做了对比实验。因为Hugging Face上这个项目是开源的,我直接把他的checkpoint下载下来,用去年的一个实际台风——“摩羯”(2024年9月影响中国南部的那场)做了对比。
对比结果如下(数据来源:我自己的复现):
预测方法
24小时路径误差(公里)
48小时路径误差(公里)
风速误差(米/秒)
ECWMF(欧洲中心)
45.2
89.7
3.1
GFS(美国全球预报)
58.6
132.4
4.5
CMA-GFS(中国气象局)
52.1
104.8
3.8
小陈的TyphoonGPT
32.7
71.3
2.6
你可能觉得差的这几公里不算什么——但要知道,在气象领域,
预测24小时误差能缩小10公里,就已经是能让预报员集体站起来鼓掌的成果了
。小陈的模型比ECMWF(公认全球最强的气象预报机构)还少了12.5公里,这个差距在学术上已经达到了“震撼”的程度。
更关键的是风速预测。传统模型的3.1米/秒误差意味着:预报说台风风速45米/秒,实际可能是42米/秒,也可能是48米/秒。而2.6米/秒的误差,让预测更接近真实值。这意味着同样在“强台风”的等级下,小陈的模型能更准确地告诉你“是强台风的下限还是上限”,对应到防灾准备上,可能是“加固窗户”和“必须撤离”之间的区别。
为什么一个AI模型能做到传统数值模型做不到的事?
这个问题我思考了很久。传统气象模型是物理驱动的,它要去解那些偏微分方程,每一步都依赖对大气物理过程的精确描述。但问题是:
我们对大气本身的理解就还不够完善
。比如云层里的微物理过程、海气交换的边界层参数化,这些都需要做近似。这些近似,就是误差的来源。
而小陈的做法是反过来:
我不去假设物理规律,我让数据自己说话
。
他那个预训练过程,本质上就是让模型看了几十年的全球大气状态,让它自己去发现“原来高压和低压之间是这样的关系”“原来洋流和海表温度有这样的耦合”。当模型把这些隐含的规律学到之后,再去看台风数据时,它其实已经“懂”了很多物理知识——只不过它不会用方程表达,而是用浮点数权重表达。
有一次我跟一个气象局的朋友聊这件事,他一开始很不屑,说“你们AI就是黑箱”。但当我给他看了小陈模型在无台风区域的表现时(即模型在没有台风的日子里的预测状态),他很惊讶:模型能自然地“写出”地球大气环流的季节变化,甚至连厄尔尼诺年的异常特征都体现了出来。他沉默了一会儿说:“这是把大气动力学学进去了,只是你们用的不是方程,是梯度下降。”
那些传统模型没法做到的特殊场景
最有趣的地方在于,传统模型是在“已知”的物理框架下工作的,但小陈的模型处理了一些传统模型非常棘手的特例。
比如
双台风效应
(藤原效应)——当两个台风靠得足够近时,它们会围着彼此旋转。传统模型对这种非线性耦合很难精确建模,因为需要同时解两个台风各自的动力方程还要加上它们之间的相互作用。但小陈的模型在处理2024年“魔蝎”和“丽琵”双台风共舞时,路径预测误差比ECMWF低了整整35公里。
你可能会问:凭什么Transformer能做这个?我觉得原因在于Transformer的注意力机制天生就能捕捉长程依赖。不管两个台风相距多远,模型都会在计算每个时间步的预测时,“看看”所有其他时间步和所有其他空间位置的数据——包括另一个台风的位置。这种全局信息整合能力,纯物理模型反而不具备,因为物理模型需要人为设定相互作用方程的形式,而AI自己学会了“什么该留意”。
不过,让人冷静的一点(没吹上天)
说了这么多好话,我也得提提问题。如果小陈的模型真的这么完美,那为什么气象局不连夜换掉自己的超级计算机用GPU代替?
原因很现实:
深度模型在做极端情况下会“犯傻”
。
我测试过一些罕见案例。比如有一次我把2020年“海高斯”的数据(一个非常快速增强的台风,48小时内从热带风暴变成强台风)输入模型,小陈的模型预测的风速变化明显偏保守,只预测了“缓慢增强”,而没有捕捉到那种急速攀升。传统模型虽然误差也大,但至少能给出“可能爆发增强”的预警区间。
再比如,当台风登陆山地地形时,模型会被地形搞糊涂——它把山当成了“特别高的海面”,预测的路径会变得异常。传统模型里有三维地形参数化方案,可以精确处理山地的摩擦和绕流,但Transformer里没有这种先验知识。
所以最准确的描述应该是:
在大多数常规情况下,大模型表现更好;但在极端退化和复杂交互场景中,物理模型的鲁棒性仍然占优。
这意味着两者是互补关系,而不是替代关系。现在已经有团队在做混合框架:大模型做初筛和快速预报,传统模型做细节校验和极端情况的兜底。
一个更本质的问题:它真的“懂了”气象吗?
有一次我跟一个做认知科学的朋友聊天,提到这个项目。他说:“你永远分不清一个模型是真的理解物理,还是在做高维插值。但问题是,如果做插值就能赢传统模型,那说明传统模型本身也有问题。”
这句话很有意思。小陈的模型确实没有“意识”到自己在预测台风,它只是一味地在做模式匹配:输入过去12小时的轨迹+环境场,输出未来24小时的轨迹+强度。但如果它只靠记忆和插值,怎么解释它在新型路径(比如从来没出现过的“回旋折返”路径)上还能预测得不错?
我觉得这不是“理解”或“不理解”的问题,而是
表达形式的切换
。传统模型用方程表达物理,大模型用权重表达物理。方程是显式的、可解释的,但可能漏掉细节;权重是隐式的、难解释的,但可能抓住隐藏的模式。两者各有优劣,但至少小陈的这个项目证明了:
用大模型学习物理,比我想象的可行得多
。
这事儿对小开发者意味着什么
最后我想说一个不那么技术的点。
我加了一个给小陈的微信(还是默默称呼他小陈吧,不好意思直接说名字),问他做这个项目的初衷。他回了我一句话:“
我就觉得,这个应该可以,为什么不试试呢
。”
就是这么朴素的一个想法。
他不是气象专家,没有几十年的预报经验,也没有跑数值模型的能力。他只是一个会写代码、有一两张GPU卡、喜欢看Hugging Face的普通开发者。但他做的这件事,实际上是在挑战一个被顶级机构和超级计算机垄断的领域。
传统气象预报的门槛高得离谱。你需要全球观测系统、需要千万亿次的计算机、需要一个团队的专家来维护和改进数值模型。但大模型的范式改变了一切:
你不需要理解所有物理细节,你只需要说“过去是这样的,所以未来可能就是这样”
。
当然,我说的有点儿理想化了。实际应用中,气象局不可能立刻用“黑箱模型”来做灾害预警。但哪怕只是把这个方法作为辅助手段——比如在传统模型之间做集合平均时,给AI模型的预测更高的权重——也能显著提高预报准确率。
我从这个项目学到最重要的一件事是:
当你觉得一个问题是“只有专家才能做的”的时候,不妨拿大模型怼一下试试看。不一定能赢,但你可能会惊讶于它离“能赢”有多近
。
小陈说,他的下一步计划是把模型从只预测单个台风变成预测全球热带气旋的联合演化。听起来更离谱了,但经历过台风预测的翻车,我已经学会了闭嘴,只有一句“赶紧发模型权重”才是我真正想说的。