专栏名称: 中国气象爱好者
气象小知识,气象小科普,台风全程追踪。新浪微博:中国气象爱好者
目录
相关文章推荐
科普中国  ·  医生告诫:这 7 ... ·  昨天  
51好读  ›  专栏  ›  中国气象爱好者

怎样用“阿尔法狗”训练台风?

中国气象爱好者  · 公众号  · 科学  · 2017-06-23 10:03

正文

点击蓝字关注我们

可点击右上角的 …,分享这篇文章


横扫人类棋手的AlphaGo和在路上飞驰的无人车有什么共同之处吗?那就是,它们都使用了深度学习——是它为这些年的人工智能带来了突破性进展。深度学习看起来很强大,那么为什么不试试让它来分析台风的卫星云图呢!

 

由于诸多原因的限制,台风(热带气旋)实测数据较少,大部分台风风速、气压等要素的判断都依赖于卫星云图,并且这一过程主要还是由人工按照经验来完成。尽管现在常用的德沃夏克分析法已经将这一过程流程化、规范化了,但是这种基于经验、人为提取特征的方法在很多情况下并非那么准确,偶尔得到的实测数据也常常和它的结论相去甚远。

 

让我们来尝试在计算机上用深度学习来自动完成这一切。何为深度?多层次的神经网络,使得计算机能够从最原始的像素点开始逐渐抽象出更高层次的特征。何为学习?我们给神经网络输入大量样本并告诉它期望的输出值,让神经网络调整其权值,使它的输出向我们期望的数值靠近(如果想要进一步了解深度学习的具体技术,可以从HintonBengio等人的经典论文中得到了解,当然,在此之前,最好在微积分、概率论和机器学习方面有一定的基础知识)。

 

所以我们要做的就是,给神经网络提供大量台风云图以及它们所对应的风速,让它学习二者之间的联系。更具体一点,就是让它寻找一个函数f(),这个函数f()能够将一个n*m的矩阵(矩阵的元素就是图像中每个像素的灰度值)映射为一个数字(风速)。

听起来不是那么简单,但是深度学习有能力完成这一点。想象我们用肉眼来观看台风云图时,我们会轻松地识别出风眼的位置和形状、以及CDO和螺旋雨带的形态,然后用一系列判断——风眼是否清晰、是否圆润,对流是否足够强,等等,最后,运用我们在气象学方面的先验知识,判断它的风速大概是强还是弱。从一个个像素点到风眼的形态,这一过程对于计算机来说并不是那么简单,好在深度学习正是做这个的!深度学习的优雅之处在于,我们并不需要告诉它这些关于风眼、螺旋雨带的知识,只需要给它提供样本(也就是云图),以及相关的标签(也就是已知它的风速),它会自行学习从云图到风速的关系。这就是所谓的有监督学习。也许,它的网络内部在学习过程中学会了如何提取风眼的特征,尽管我们并没有显式地告诉它这一点;而且我们也无法了解神经网络它究竟是如何看待一张云图的,因为我们看到的它只是由一系列权值相互连接组成的网络。

 

神经网络它究竟是如何学习的?它以每一个张云图作为输入,经过一系列相连的人工神经元的计算,最终得到一个输出值,然后,程序会将这个输出值与给定的标注(也就是我们希望得到的标准风速值)进行比较,计算误差(告诉它高了还是低了),然后,神经网络会将网络中的参数向梯度下降的方向(也就是误差减少的方向)进行调整。我们用每一个训练样本重复上述的过程,并且会进行很多轮,直到误差足够小。最终,经过成千上万个大量样本的训练后,我们的神经网络已经能够很好地拟合训练数据。只要方法得当,神经网络不仅能在训练集合中判断准确,而且还可以具有良好的泛化性能——也就是再给它此前没有见过的新的样本(云图),它也能给出一个准确的输出(风速)。

 

那么我们就开始吧!我们需要什么?大量的样本:从数字台风网上可以方便地找到大量的台风卫星云图,我们用网络爬虫来抓取。样本的标签:数字台风网同时还有对应的JMA风速数据(尽管这一标签可能并不足够准确)。多层神经网络:现在已经有了很多方便的开源深度学习框架,我们用Pytorch来搭建,这是一个使用python语言的开源深度学习框架。


我们从数字台风网上抓取了约两万张台风的红外云图,以及它们对应的风速和气压,范围从1979年之2016年,包含所有台风的全部6小时间隔的云图。在作为训练样本之前,还需要一些额外的处理:由于硬件条件的限制,我们试图尽量轻量级地进行训练,原图512×512的尺寸还是大了一些,并且台风往往只占据图像中心的一小块,所以裁剪原图,只保留中心256×256大小的区域。此外,众所周知台风风速和它云图形态的滞后性,神经网络不仅需要当前的云图作为输入,最好也要6小时前的那张云图,所以我们把这两张图片合并作为一个训练样本。注意到这些图像是灰度图片,RGB三个分量是相同的,所以只保留任一通道即可,比如R通道。为了方便处理,我们将当前的和6小时前的两张图像的R通道合并为一张图像(分别使用R,G通道,B通道不使用),这会让图片呈现出斑斓的色彩。最后,把它的标签信息作为它的文件名,格式是编号_日期时刻_风速_气压.jpg

 

另外,还有一个类别不平衡的问题需要解决。由于风速较低的台风(65kt以下)的云图数量远多于风速较高的台风(大于100kt),如果直接训练,神经网络为了减少整体误差,会将输出结果向更多较低风速的样本靠近,这显然不是我们想看到的。为了解决此问题,需要对高风速的台风云图进行过采样,简单的方法就是多复制几份,使样本的分布趋于均匀(所以在图像的文件名的最后还会再加上一个编号)。

然后,建立神经网络。对于图像处理,卷积神经网络(CNN)是最好的选择,通过卷积核权值共享的方法,极大地减少了参数的数量,这解决了许多问题。我们的网络结构是:2个卷积层和采样层,加上3个全连接层,足够了!我们的输入是256×256×2的张量(图像),采用八个11×11的卷积核,对卷积结果使用ReLU激活函数(为什么是ReLU?要感谢它良好的梯度性质),再在其后的采样层进行6×6的最大值采样,经过如此处理后的结果就是一个41×41×8的中间输出;然后,再次用12×1220个卷积核进行卷积,再进入激活函数以及进行5×5的采样,得到20×6×6的中间输出;随后我们将它展平为20×6×6=720的一维向量,进行三层全连接计算,分别是720808016,161的线性映射加ReLU激活函数,最终的那个1,就是我们想要的目标,图像中台风的——风速。

 

简单计算一下,网络中的可变参数大约有八万余个,很不错了!这个规模对于没有GPU加速内存仅有1.5G的虚拟机已经可以接受了,这算是一个非常轻量的深度学习任务。事实上,网络中卷积核的大小,中间输出的维度,全连接层的大小,甚至是网络的层数和结构,都是可以修改的超参数。以上的参数只是作者本人简单尝试、经验设置的,也许重新调整参数可以达到更好的效果。

 

还有其它的一些零碎细节:使用xavier_uniform()函数对于网络权重进行初始化,有助于优化训练起始的速度;使用Adam随机梯度优化方法,0.001的学习率比较适合;使用L1Loss作为损失函数,简单直观。


 

万事俱备,可以开始训练了。我们要将对两万余张图片划分为训练集(80%)和测试集(20%)。经过对训练集合共10轮的训练,我们的神经网络基本收敛并且达到了可以接受的精度,在训练集上的平均误差下降到8左右,也就是平均每张云图的输出风速会和JMA评定的风速相差8kt。在测试集上,平均误差也下降到了10左右——比训练集略高,因为它们是神经网络完全没有见过的样本。10轮左右的训练是适宜的,此时测试误差基本稳定了。如果继续训练,可以让训练误差继续缩小——但是对优化测试误差没有帮助,很可能会出现过拟合,也就是精确地记住每一个训练样本的特征和它的风速,但泛化性能却会降低——对于没有见过的新样本将会表现很差。


平均10kt的误差也许还不够好。因为有许多因素在阻碍着它的精度:也许是神经网络的规模还不够大,不能够完全地表达输入数据的特征——可以通过在更高配置的环境下用更大规模、更多层的神经网络来训练,但注意,这时训练样本的数量也需要相应地大量增加;可能数据本身的标签就不够准确,这一点非常关键,作为训练的目标就存在误差,也就是JMA评价的风速不够准确——理想的解决方法是,只是用有确定实测台风云图进行训练,可惜,这种样本的数量太少,不足以让神经网络充分学习;还有就是输入的数据不够完备,也许我们需要采用更高精度的云图,更多通道、频段的卫星图像(最好是对流色调强化云图),这一点和第一条是相应的,样本的规模增大了,网络也应增大,需要的样本数也要增加。

 

我们这里使用云图的分辨率较低,并且有显而易见的弊端:“针眼”台风的强度会被大幅地低估,因为神经网络“看不清”它们的风眼。

 

一个简单的方法是使用多个深度神经网络集成,以减少误差。因为它的学习过程使用的是随机梯度优化的方法,所以如果我们进行多次独立的训练,得到的神经网络会不尽相同。也就是说,对于同一张云图,它们的看法会有细微的差别——这很好办,把它们取平均就好了。

 

另外,修改目标函数为气压,可以直接将训练这一神经网络估计台风中心最低气压。

 

需要补充一点,为什么不直接使用数字台风网上的BD对流强化云图?因为BD图像的灰度色阶会让机器感到困惑,我们可以轻易认出来CDGCMGWB环等色阶以及它们的高低关系,但是灰度图像中它们的像素灰度值并非按照从高到低的排列,例如W255B0,而CDG大约是100左右。也就是说,它们的灰度值不能够直接使用。而IR云图从白色(云区)到灰黑(晴空区)的数值是严格递减的,从计算机的角度理解是完全“合理”的。当然,由于对流强化图像对于热带气旋的强度分析至关重要,可以将其预处理后(比如将BD色阶重新映射)再进行使用,相信可以显著地提高分析精度。

 

关于“深度台风”就介绍至此,这是利用深度学习在云图分析方面的一个简单尝试。受益于大量开源工具包的封装,我们可以简单而直观地从更高层次来定义和理解模型,而不必陷入到大量枯燥晦涩的梯度推导和代码编写等工作。欢迎讨论与Fork,相信聪明的你利用深度学习在这一方面可以做得更多、更好。如需源代码,请留言。


1、自动查询天气:我们和中国天气网合作,提供回复城市名查询功能,目前提具体到地级市和县。譬如要查询赤峰天气,请在文本框中输入“赤峰”,点击发送即可;亦可输入“赤峰天气”。

2、合作、约稿、授权:由于微信后台的收件箱已被自动查询天气的消息淹没,小编来不及查看,若有合作、约稿方面的需求,可通过“留言”功能或新浪微博的私信功能和小编取得联系,感谢各位的支持和配合。




中国气象爱好者,有理有趣有温度、有料有货有逼格

本号文章均为原创,转载请取得授权,并注意保持完整性和注明出处


关注请加微信号:qxahz-tybbs或长按二维码