Deecamp深度学习降水预测总结

先做个广告
https://mp.weixin.qq.com/s/fHgaCpReeZnwdn-F92Woog 欢迎关注这个公众号 MeteoAI ,一群有才华、有理想的年轻人的交流平台。

正文:

Deecamp 夏令营是创新工场举办的面向在校学生的 AI 夏令营,时长为 4 周左右。第 1 周主要为上课。上课老师包括来自产业界和学界的李开复、吴恩达、周志华、张潼、 孙剑、俞扬等老师,主讲内容包括 CV、NLP、强化学习、自动驾驶、知识图谱、GAN 和模 型压缩等的应用和发展现状。大佬的讲解的确深入浅出,受益颇多。

后面 3 周为项目实践,我们分到的课题为天气预报—基于深度学习提高降水预报的时空 准确度。这次任务的主要目的是利用历史观测数据和气象模式的预报数据来预报未来 24 小时的降水。

这个问题的难度其实还是挺大的, 在预报时长上算是短期气象预报。如果没有气象模式的预报结果,那这个任务其实是短时气象预报的核心任务。

数千名科学家都曾想方设法研究,称其为 973 项目都不为过。不过这次有了气象模式的帮助,算是站在巨人肩膀上工作。

气象模式发端于1922 年理查森开始利用流体运动方程预报天气运动。自1946 年冯诺依曼制 造第一台计算机后,数值气象预报变成可能。近年来数值气象预报在气象业务中扮演着顶梁柱的决策,成为气象预报不可或缺的判断依据。

  1. 任务分析

(1)预测时长+预测区域

这个任务可以简化为一下建模内容:

观测数据 G histime, feature1, width, height
气象模式数据 M [pretime, feature2, width, height] (t(0)-t(24))
目标 降水场 P [pretime, 1, width, height] (t(0)-t(24))
在这里插入图片描述
上图中红色区域就是我们需要预测的时次,其他时次都是已知资料。预报区域为北京及其周边地区。
在这里插入图片描述

降水预测可以分为两部分:晴雨预测+降水量数值预测。晴雨预测其实就是二分类问题, 相对来说应该比较容易实现。

(2)数据预处理

气象分析和统计结果表明,降水与局地地形密切相关,如北京地区,降水多发生在北京西山背风坡一侧,多呈西南-东北走向。

另外,降水也具有多时间周期性特征,比如一年中, 降水夏季较多,一天之中,降水多发生在午后和傍晚。

因此,需要对空间和时间信息进行编码,空间特征直接使用地形高度信息,时间信息的话,将不同月份和一天中的不同时次采用三角函数进行编码。另外,还需要将所有特征进行 归一化或者标准化。

  1. 方案尝试

2.1 随机森林

(1)只使用历史观测数据

随机森林是一个比较友好的易解释的模型,且在运用的时候,不需要对各个特征进行归一化操作。另外,由于没有特征变化过程,所以我们可以轻易看到feature importance,是一个很不错的特征选取模型。

刚开始先尝试了随机森林,首先测试的是只用观测数据,上一个时次或上几个时次的观 测变量作为特征去预报未来几个时次。这种情况下,我们需要将气象要素特征由二维场变成一维,即把像素点看成是孤立的点,不考虑周边的像素,牺牲空间信息,去做一个晴雨或降水的预测。结果如下图:
在这里插入图片描述

这种情况下,预测未来一两个小时的晴雨分类还稍微可以,但是越往后就越糟糕。另外,对于新生降水,模型预测能力还是挺弱的。

(2)历史观测+模式预报

如果加入模式的预报信息做修正的话,随机森林的24小时预报效果其实更多的向数值预报结果靠拢,没有明显提高。

•优点: 可解释,简单•缺点: 无特征变换、不能 GPU 运算

2.2 TCN 模型

随机森林做虽然可以做回归和预测,但是实际上并没有能很好的表达空间信息和时间信息。另外,由于没有特征变换能力,模型学到的东西比较浅,可能没有办法学习到各个特征之间的复杂组合和其与降水的作用关系。而深度学习可以很好的做特征变换,提取复杂信息。

考虑到降水具有一定的时间相关性,因此时序信息是比较重要的。TCN (Temporal Convolutional Network),时间卷积网络,是一种能够处理时间序列数据的网络结构,相比传统的循环网络如 RNN\GRU\LSTM 等,TCN 则可以直接利用卷积强大的特性,跨时间步提取特征。作者表示在许多任务上可以超越传统 RNN。结构如下图所示:

在这里插入图片描述
参考作者的模型实现方法,我们同样将特征二维场拉平,进行时序预测,但是在该任务上,模型表现不佳。

当时分析觉得可能有两方面的原因:

•a. TCN 模型牺牲了空间信息;•b. 没 有尝试使用 Encoder-Decoder 模型;•c. 中期降水本来就很难预测。

由于时间有限,我们并没有来得及就 TCN 模型做更多修改和应用。

•优点: 跨时间步提取时序特征;•缺点: 丢失了空间信息。

2.3 卷积+循环

前面提到过,降水既具有空间特征,也具有时序特征,因此尝试将卷积和循环,结合起来,或许可以改善结果。

(1)ConvGRU2D/ConvLSTM2D

施行健《Machine Learning for Spatiotemporal Sequence Forecasting and Its Application to Nowcasting》的文章提出了 ConvLSTM2D,主要思想是将 LSTM 中的门中的点乘操作换成了卷 积操作,使得模型同时具体提取时间和空间特征的能力,原理还是比较简单的,具体公式如下图:
在这里插入图片描述
在这里插入图片描述

ConGRU原理和 ConvLSTM 基本一样,不过参数较少,在大多数任务上,效果并不比 ConvLSTM2D 好。ConvLSTM2D 的大放异彩是在雷达回波的外推上,2018 年天池挑战赛 Tianchi IEEE ICDM 2018 就是预测雷达回波,第 1、2 名使用的是 TrajGRU(后面再做介绍),第 3 名使 用的就是 ConvLSTM2D,传统的追踪流体运动的方法—光流法取得了第 4、5 的成绩。

这里我们使用了第 1、2 名的模型结构。如下图:
在这里插入图片描述
在这里插入图片描述

其实上面两个模型设计思路都差不多,encoder 降采样,decoder 上采样,每一次 ConvLSTM 都使用一次状态传输[state_h,state_c]到 decoder,作为 decoder 的 Convlstm2D 的 初始状态。这种上采用+下采样+状态传输的方式在图像分割(语义分割)中很常见,比如 U-net 结构(后面会介绍)。大体框架如此,我们以历史观测信息+模式历史预报信息为encoder的输入,以模式预报信息为decoder 的输入,这样理论上是能够保证模型可以很好的获取历史空间和时间信息,并能在数值预报基础上做修正。当然,理论归理论,实际的模型效果并没有想象中的好。后面我们尝试对这个模型做了很多变种,比如,采取ResNet 结构,构建残差网络,加快训练过程。

模型的输出中,受到 ML 同学的启发我们做了两个输出,一个是 softmax 做晴雨分类, 一个是直接做回归。另外,考虑到晴雨分类中,晴、雨数据严重失衡,我们采取了一些独特损失函数,包括:分类常用交叉熵损失、IOU 损失(类似降水 TS 评分)、解决分类中数据不均 衡的 Focal loss、回归常用的 MSE 损失。将这些组合起来,进行训练。训练结果如下图:

在这里插入图片描述

静态图太多,不方便全放上去,这里选取了四个时次的预报结果,左、中、右分别为数 值预报、真实观测和我们的模型 Unet-ConvLSTM 的模型结果。
在这里插入图片描述
从图中可以看出,数值预报结果有如下几个缺点:

•a.容易误报,即预报降水区域往往较 真实值偏大;•b.预报降水量强度偏大。这是所有模式都容易犯的错误,无可厚非。

这里我们的模型 Unet-ConvLSTM 能够有效的降低数值模式的空报和数值偏大的问题。但是其实不能解决问题,因为降水是强随机事件,模式很容易漏报一些突然产生的强雨带。

我们的模型因为受到数值模式的预报结果的影响,对于数值模式没能预测到的新生雨带, Unet-ConvLSTM 也并不能有很好的预测能力。

其实为了解决这个新生雨带的预测难题,我们想到了使用序列自回归模型,即 seq2seq模型。简单来说,在 encoder 阶段使用历史观测+历史数值预报,decoder阶段,使用历史输入的最后一个时刻作decoder 的第 1 时刻(t1)的输入,来预测 t1 个时刻的降水,然后使用 t1 预测+t1 时刻的降水数值预报结果,作为 t2 时刻的输入,得到 t2 时刻的降水值,即 t2 预 测,t2 预测+t2 的降水数值预报结果 ,作为 t3 时刻的输入,以此类推。

每个时刻加入数值预报结果,是为了修正降水预报误差,而在训练的时候,解码器使用 了观测信息,是能够使得模型学习到不同于数值预报结果的能力的。同样使用了残差网络和特定损失。

在这里插入图片描述
在训练该模型的时,损失下降不是特别明显,在训练集上,能看到该模型具有一定能力 的。在进行推断(inference) 的时候,效果并没有表现得如训练集好。由于当时项目已经接 近尾声,我们没有太多的时间进行再训练和调参。觉得挺遗憾的,希望以后有机会能再好好 试试这个模型。当然 24 小时预测还是难度相当大的。

在这里插入图片描述

爬过的坑:

•a. 因为 ConvLSTM2 已经在 keras 和 Tensorfow.keras 中 layers 层中有了,因此我们刚开始是使 tf.keras 来搭建模型,但是在进行状态[h,c]传递时候,会发生 initial_state Assertion Error,这 个错误的的修正方法可见我的博客[1]。但是后面还是遇到问题,后面我们在 github 上找了一个 pytorch 的 ConvLSTM,回头有时间我写篇博客介绍介绍。•b. Tensorflow2.0 版本越来越像 keras 了,封装是做得不错的,但是还是有许多隐藏的 bug, 比如没有 tf.placeholder。大家求稳的话,建议使用 tensorflow1.14 版本就好。•c. Tf2 版本现在有一个好处,就是所见即所得,不需要 tf.session 才能运行了。另外,Tensor 和 np.array 之间的转换也比一起方便多了。•d. 现在 pytorch 使用者越来越多了,这次也花了 1 天时间速成了一下。其实封装过程类似 keras。在搭建模型的时候,可以函数式,也可以写成类,建议后者。不太友好之处在于数 据类型的转换挺麻烦的,np.array/tensor/cpu/gpu。我程序 bug 最多的地方就是数据类型。不过用惯了就好了。具体友好的入门教程可以参考 ldt 的博客[2]

(2)Traj GRU

TrajGRU(轨迹GRU)是施行健《 Deep learning for precipitation nowcasting: A benchmark and a new model》这篇文章里面提出来的,之前的 ConvLSTM2D 是使用卷积来捕捉特征,追 踪流体。而 Traj GRU 具体是使用双线性插值来追踪质点。
在这里插入图片描述

为什么 Traj GRU,从公式上可以看到,它可以突破了卷积核大小的限制,即获取周边信 息的时候,是通过双线性插值从全局获取最佳信息。当然理论如此,但是实际在应用上,有 一定局限性,表现在:

•a. 双线性插值算法比较耗费时计算资源和时间;•b. 对选旋转特性比 较强的流体,TrajGRU 的表现效果比较好,比如旋转的手写字体识别,气象上具有旋转特性 的场景还是挺多的,比如 台风、云团等,或许可以试试。综合来说,通常表现效果不如 ConvLSTM2D。•c. 容易存在随时间模糊现象,比如预测 10 小时,头几个小时会比较清晰,越往后,预测结果越模糊。

在计算代价高,效果不如 ConvLSTM2D 的情况下,我们也试了试 TrajGRU,但是效果表 现不是很好,这里就带过。另外,施行健的 TrajGRU 是用 MXNET 实现的,不太常用,这次我们的小伙伴用Tensorflow 和 Pytorch 实现了一遍[3], 施行健这篇文章下载链接见文末[4] 以及MeteoAI的推送很给力,这方面的总结很到位。

总之,卷积+循环能力本身是不弱的,但是降水随机性,非线性和混沌效应太强了。

2.4 U-net 结构

U-net 采用的是一个包含下采样和上采样的网络结构。

下采样用来逐渐展现环境信息,而上采样的过程是结合下采样各层信息和上采样的输入信息来还原细节信息,并且逐步还原 图像精度。结构图如下:
在这里插入图片描述

具体了解可以参考这个ML同学的博客[5] Unet 目前多用于图像分割领域,主要是医学影像的识别和分割。由于其表现较为卓越,我们这次也尝试使用 U-net 结构进行预测。

(1) Attention-Unet 只基于模式数据

由于模式预报和要预报时次的一对一关系。那本身可以看成是一个视频图像分割的问题。这里在空间上就采用了 U-net 的结构,并加入空间的 attention 机制来引入局地特异性。使用这个模型的时候,有两种尝试,

•a. 2D U-net ,即使用一个时刻的数值预报结果去预测这 个时刻的降水,而各个预报时刻之间没有发生关系。即牺牲了时间序列信息,重复提取空间 信息;•b. 3D U-net,中间卷积使用 Conv3D 来表示,这样的话输入的时候就可以多个时次的图片一起输入,为[Batch, Timesteps, Width, Height, Channels]。这种把时间维度当作卷积对象的3D卷积,其获取时序信息的能力是值得怀疑的。但是这种结构空间信息提取能力的确很强。
在这里插入图片描述

(2)Temperal Attention U-net 只基于模式数据

为了能有效的提取时序信息,后面又尝试了状态传输的 TAU-net(Temperal Attention U-net), 如下图,每个时间步单独预测,但是其中间生成的状态(或生成的特征)会向下一个时间步传输。

在这里插入图片描述
(3)ConvLSTM-TAU-net 结合了观测数据
在这里插入图片描述

这里又尝试了序列自回归的 ConvLSTM 和 TAU-net 的结合。下图给出了 TAU-net 表现得较好的一些个例。
在这里插入图片描述
在这里插入图片描述

总结下这个模型的效果:

•a. 具备一定的新生雨带预测能力,但是不很稳定。•b. 站在模式预报基础上,晴雨分类效果稍微有所提升。降水强度预测相比数值结果偏 弱。•c. 预测结果较为平滑,这是模型中上采样和下采样手段的结果,回头有机会可以试试空洞卷积。 ML 同学同样也做了一些总结,链接见文末。[6]

  1. 总结

首先说结果,这为期三周的尝试,并没有得到满意的结果,还是有点沮丧的。但是这并不意味着深度学习和机器学习的失败。

客观总结失败原因:

(1)数据量较少。这次我们拿到的是 2016-2018 的三年的数据,虽然数据总量在 6T左右,但是剥开来看,还是很不够用的。

因为北京降水少,且主要集中在夏季,而夏季降水中, 又以短时降水为主,且降水落区相比晴天区域又少得可怜。因此如果以小时为计量单位的话, 真正满足训练要求的数据不到 1/10。也就是说,数据少,且严重不均衡。后期如果要尝试 这个,一定要备好至少 10 年的数据。

(2)24 小时降水是强随机性、非线性、强混沌事件,本身可预测性较低。当然有点开脱的嫌疑。从前面深度学习在气象上成功的例子来看,比如 2018 年的 AI challenger 的气象预报,主要是气象要素(温压湿风)的 24-72 小时预测。

要素预测是单点的时序预测,本身周期性较强,遵循很强的物理规律,因此普通的LSTM\seq2seq\lightgbm 就可以做到不错的效果。

比如,前面提到过的 2018 年的天池的雷达回波预测,但是它最多也就是预测 1 个小时。在1个小时内,雷波回波主体基本都在,有迹可循,光流法和 Traj GRU 等可以很好的追 踪流体,因此理论上也不难预测。

如果换成 1 小时降水预测,我相信普通的 RNN+CNN 也可 以做出不错的结果。但是 24 小时预测,降水主体会突然消失、生成,物理上的规律或许可 以捕捉这个过程(比如我们的数值模式),但是对于深度学习来说,可能还不能很好的反映多 个物理量与降水之间的复杂响应关系,对于生消规律把握不清。

这也是我们的模型在训练的时候,总是容易出现 loss 振荡现象的原因之一吧。要避免这个问题的话,其实可以考虑训练两个模型 A 和 B,即反映降水逐渐减弱的过程的模型 A 和降水逐渐增强的模型 B,但是要做 24 小时降水的话,可能更适用于层状云降水 吧。

启发总结:

(1)完备特征和模型融合。

如果不依赖于数值模式的预报结果,仅仅使用历史观测做外推预测,那可能需要更加完备的特征,比如卫星、雷达观测。在模型设计上,可以使用模型 融合,比如雷达预测模型和气象要素预测模型的融合等。在降水强度的预测上,可以结合残 差网络,使用多分类预测,比如小雨、中雨、大雨等。

(2)尝试使用更强的特征提取器。

最近 NLP 领域发展迅速,RNN(包括 LSTM)已经逐渐走 向历史,Attention 机制和 Transformer 已经走向序列处理舞台中央,因此可以考虑将 Transformer 使用在气象要素预测和气象信息提取中去。

(3)独特的 loss 设置。

不同的任务需要设置不同的损失,气象上以前多用 MSE\MAE, 或者两者给与不同权重,Huber 损失为平滑平均绝对误差,可以减少异常值的干扰,也可以 多用在气象上。另外,分类任务中,除了交叉熵,Dice\IOU 损失也可以多尝试,对于数据不 均衡问题,可以试试物体检测中常用的损失,如我们这次用到的 Focal loss。

(4)深度森林 GcForest。

深度学习一直以来以解释性不强被许多学术理论派所不接受。看过《机器学习》西瓜书的应该都知道南京 AI 研究院院长周志华老师,深度森林模型是周 志华和冯霁博士在 2017 年 2 月提出来,这个模型采用树集成方法,在参数很少的情况下, 可以达到与 DNN(深度神经网络)相媲美的效果,可解释下也较强。缺点是只能 CPU 运算, 不过气象最不缺的就是 CPU 集群。采取这个模型应该可以方便的知道哪些特征更重要,且 能够在此基础上实现端到端的预测。具体了解可以参考这个链接[7]。

(5)GCN,图卷积神经网络。

气象上的观测站分布并不是标准网格的,但是彼此或许有 联系,这个时候的 GCN 图卷积网络或许可以派得上用处,可以直接略去站点数据到网格数 据的插值过程,避免插值带来的误差。当然具体运用还要看情况。

(6)GAN,对抗生成网络。

前面提到过,对于突发的降水事情,预测难度很高。如果不 考虑背后的物理规律,使用 GAN 来训练模拟降水分布场,或许可以起到一定作用。对于序 列数据,也可以采用类似 seq-GAN 的思想来做。

另外,感谢创新工场和北京城市气象研究所,感谢队友,感谢前端和设计师,以后一定抽空学习学习前端。气象数据如此庞大,正是深度学习的用武之处。希望更多同仁能多关注这方面的东西, 共同促进深度学习和气象的融合,为气象预报水平的提高贡献力量!

References

[1] 我的博客: https://blog.csdn.net/weixin_43718675/article/details/88925451
[2] ldt 的博客: https://blog.csdn.net/Leon_winter/article/details/88372210
[3] TrajGRU: with Tensorflow 和 Pytorch: https://github.com/CNALeon007/TrajGRU
[4] 下载链接见文末: https://www.hko.gov.hk/research_forum/RF2018_dyyeung.pdf
[5] ML同学的博客: https://blog.csdn.net/maliang_1993/article/details/82084983
[6] ML 同学总结: https://blog.csdn.net/maliang_1993/article/details/99622197
[7] 这个链接: https://blog.csdn.net/sinat_29819401/article/details/60160755

  • 23
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
深度学习是一种人工智能技术,近年来在各个领域都有广泛的应用。其中,深度学习气象领域中的应用越来越受到研究者的重视。本文旨在探讨深度学习技术在降水预测中的应用。 降水预测一直是气象学中一个重要的研究课题。传统的气象学方法主要是利用数学模型和物理原理进行降水的数值模拟,但是这种方法的预测精度受到许多因素的影响,如模型参数选择、数据质量、模拟误差等等。随着深度学习技术的不断发展,基于数据驱动的深度学习方法开始应用于气象领域,取得了一定的预测精度和应用效果。 深度学习通过构建神经网络,可以从大量的历史降水数据中提取出特征,并利用这些特征对未来的降水进行预测。相对于传统方法,深度学习技术可以更好地处理数据之间的非线性关系,同时可以自适应地进行模型优化,从而提高了预测精度。 在本文中,我们将研究深度学习技术在降水预测中的应用,并通过实验验证其预测精度。具体来说,我们将采集大量历史降水数据,并利用深度学习技术构建降水预测模型。在模型训练过程中,我们将采用常用的深度学习算法,并对模型进行参数调整和优化。最终,我们将通过对模型进行测试和评估,验证深度学习技术在降水预测中的应用效果,并对未来的研究方向进行探讨。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值