【时空序列预测第九篇】Deep Learning for Precipitation Nowcasting: A Benchmark and A New Model

前言

最近忙,抽出时间把之前零零碎碎差一点搞定的文章拿出来分享下。

原创不易,觉得好可以点赞,帮忙转发,对我的认可,我会更有动力去给大家带来优质的知识。

一、Address

NIPS2016 年的一篇paper,施博士大作。

这篇paper虽然和我前几篇比起来稍微有些古老,本来应该讲完convLSTM紧接着就讲轨迹GRU得,因为两篇算是一个工作的不断延申,但是因为种种原因吧,今天才下笔,但是我感觉无论如何这篇文章都算是大作,并且现在用起来依然效果不算差,所以还是值得重新读几遍,文中所作的工作量也是很大,主要提出了一个降水预测的基准,把整个实验流程中的主要问题和解决方案都指出来了,所以说还是十分值得学习的。

论文链接地址:
https://arxiv.org/pdf/1706.03458.pdf

二、Introduction and Model

2.1 时空序列问题与降水预测问题

顾名思义,论文名称中特意指出了降水预测这个领域,所以这篇主要的工作还是在这一领域,如果是气象学专业的可能并不陌生,不过和我一样不是这相关人士得可能会陌生了。

这里大致说下,大概就是雷达来实地监测,发出雷达,得到回传数据,形成对应的雷达回波图,每个雷达回波图的像素大概在0-80之间,这个像素值可以通过一个线性变换成降水值,所以简单来说就是时空序列预测问题,你的下一帧得像素预测明白了,自然降水得预测不会差,所以本质还是一个Spatial-Temporal Prediction问题。这个问题我觉得我已经在我的文章系列中反复提到过,可以看我的第一篇概述,也可以随便找一篇,看看第二部分,大致就明白了,这里不赘述了。

2.2 相关研究及本文创新

2.2.1 相关研究

这里也不想过多赘述了,其实就是把之前一些研究拿出来对比下。
主要分为三类把,因为那时候还算比较早期,基本上都是lstm的一些操作以及lstm+cnn的一些操作,还没有很好的结合。

之后又稍微提了下SocialLSTM and the Structural-RNN (S-RNN), SocialLSTM 我记得我很久之前稍微看了下感觉还是很复杂的,也很有趣,感兴趣的可以看下,不过它主要针对的问题是人体轨迹方面的时空预测, S-RNN主要基于给与的时空图的预测,具体我这边也没研究过。

2.2.2 本文创新

本文的创新主要是把可学习卷积引入到时空序列问题中,并且把EF结构重新更加直观的摆明了。

而最大最大的创新和工作量在于降水预测问题的benchmark。

2.3 模型

2.3.1 EF结构

①这是这篇文章中的 EF结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vpBrT73-1589462337028)(https://imgkr.cn-bj.ufileos.com/0a29bad5-cbaa-4ef3-bec8-83ea1c29411e.png)]

②而这个是ConvLSTM中所描述的

③而他们的原始状态Seq2Seq是这样的


当然这样我们看还是不直观,我把这三幅图弄在一起给大家看下


seq2seq模型结构我想不用我多说了,因为大家都很熟悉应该,如果不熟悉,哪天我总结发下,也可以把代码coding部门一同介绍给大家,这篇paper中提出的EF主要的区别在于引入上下采样,以及预测的方向也就是Forcaster结构中的数据流的方向
倒置了。


那为什么要加入上下采样呢?经过实战你就明白了,没有上下采样你的机器会受不了,但是如果你的机器算力非常强倒也可以尝试不加,但是算起来速度太慢了,反而加上上下采样效果也很不错,速度快了,也不是那么吃显卡了。

那设计的时候为什么要倒置呢,其实文中也写得很清楚。

主要的原因还是他认为high-level state提取的是一个偏向全局的时空信息,而low-level的能更加的影响预测,我个人感觉他这里这么设计,可能很单纯,就是因为发现没人这么做过,这么做完之后发现效果确实在降水预测问题中好了, 哈哈哈。
但是他后面我红色圈起来的部分还是很讲究的,可以随意的去插入rnn层,不需要跳过连接来聚合低级信息。

2.3.2 ConvGRU模型

这里把其中一个block给出,不赘述了,可以翻看我写的ConvLSTM模型,就是从那里演变过来的,公式如下:

Z t = σ ( W x z ∗ X t + W h z ∗ H t − 1 ) R t = σ ( W x r ∗ X t + W h r ∗ H t − 1 ) H t ′ = f ( W x h ∗ X t + R t ∘ ( W h h ∗ H t − 1 ) ) H t = ( 1 − Z t ) ∘ H t ′ + Z t ∘ H t − 1 \begin{aligned} \mathcal{Z}_{t} &=\sigma\left(\mathcal{W}_{x z} * \mathcal{X}_{t}+\mathcal{W}_{h z} * \mathcal{H}_{t-1}\right) \\ \mathcal{R}_{t} &=\sigma\left(\mathcal{W}_{x r} * \mathcal{X}_{t}+\mathcal{W}_{h r} * \mathcal{H}_{t-1}\right) \\ \mathcal{H}_{t}^{\prime} &=f\left(\mathcal{W}_{x h} * \mathcal{X}_{t}+\mathcal{R}_{t} \circ\left(\mathcal{W}_{h h} * \mathcal{H}_{t-1}\right)\right) \\ \mathcal{H}_{t} &=\left(1-\mathcal{Z}_{t}\right) \circ \mathcal{H}_{t}^{\prime}+\mathcal{Z}_{t} \circ \mathcal{H}_{t-1} \end{aligned} ZtRtHtHt=σ(WxzXt+WhzHt1)=σ(WxrXt+WhrHt1)=f(WxhXt+Rt(WhhHt1))=(1Zt)Ht+ZtHt1

2.3.2 Trajectory GRU模型


如果输入为全部都为0,reset gate全为一



H t = H t − 1 \mathcal{H}_{t}=\mathcal{H}_{t-1} Ht=Ht1

那基本上就相当于没有update了。


这句话的意思就好比,你的卷积操作中的超参数都定了,比如kernel size、padding和dilation都定下来了。
那基本上可以说你想卷积的那个location领域的点是固定的了。


而很多的信息其实他对应的邻域的点是及其不固定的,比如台风问题中,台风眼的旋转,移动都是变化万分的,如果只关注某个location的周围几个点可能并非关系密切,所以可学习的卷积渗入了。。


每次卷积的点是学习得到的最为相关的点。
主要公式:
U t , V t = γ ( X t , H t − 1 ) Z t = σ ( W x z ∗ X t + ∑ l = 1 L W h z l ∗ warp ⁡ ( H t − 1 , U t , l , V t , l ) ) R t = σ ( W x r ∗ X t + ∑ l = 1 L W h r l ∗ warp ⁡ ( H t − 1 , U t , l , V t , l ) ) H t ′ = f ( W x h ∗ X t + R t ∘ ( ∑ l = 1 L W h h l ∗ warp ⁡ ( H t − 1 , U t , l , V t , l ) ) ) H t = ( 1 − Z t ) ∘ H t ′ + Z t ∘ H t − 1 \begin{aligned} \mathcal{U}_{t}, \mathcal{V}_{t} &=\gamma\left(\mathcal{X}_{t}, \mathcal{H}_{t-1}\right) \\ \mathcal{Z}_{t} &=\sigma\left(\mathcal{W}_{x z} * \mathcal{X}_{t}+\sum_{l=1}^{L} \mathcal{W}_{h z}^{l} * \operatorname{warp}\left(\mathcal{H}_{t-1}, \mathcal{U}_{t, l}, \mathcal{V}_{t, l}\right)\right) \\ \mathcal{R}_{t} &=\sigma\left(\mathcal{W}_{x r} * \mathcal{X}_{t}+\sum_{l=1}^{L} \mathcal{W}_{h r}^{l} * \operatorname{warp}\left(\mathcal{H}_{t-1}, \mathcal{U}_{t, l}, \mathcal{V}_{t, l}\right)\right) \\ \mathcal{H}_{t}^{\prime} &=f\left(\mathcal{W}_{x h} * \mathcal{X}_{t}+\mathcal{R}_{t} \circ\left(\sum_{l=1}^{L} \mathcal{W}_{h h}^{l} * \operatorname{warp}\left(\mathcal{H}_{t-1}, \mathcal{U}_{t, l}, \mathcal{V}_{t, l}\right)\right)\right) \\ \mathcal{H}_{t} &=\left(1-\mathcal{Z}_{t}\right) \circ \mathcal{H}_{t}^{\prime}+\mathcal{Z}_{t} \circ \mathcal{H}_{t-1} \end{aligned} Ut,VtZtRtHtHt=γ(Xt,Ht1)=σ(WxzXt+l=1LWhzlwarp(Ht1,Ut,l,Vt,l))=σ(WxrXt+l=1LWhrlwarp(Ht1,Ut,l,Vt,l))=f(WxhXt+Rt(l=1LWhhlwarp(Ht1,Ut,l,Vt,l)))=(1Zt)Ht+ZtHt1

这里的l是卷积连接的点的个数,其他的通俗一些讲就是通过输入和上一个状态得到两个参数,通过这两个参数以及上一个状态配合输入得到两个门控,再通过门控得到新的状态,之后和GRU的reset gate那边一样的。
这里warp功能是双线性插值的方法来实现的

M c , i , j = ∑ m = 1 H ∑ n = 1 W I c , m , n max ⁡ ( 0 , 1 − ∣ i + V i , j − m ∣ ) max ⁡ ( 0 , 1 − ∣ j + U i , j − n ∣ ) \mathcal{M}_{c, i, j}=\sum_{m=1}^{H} \sum_{n=1}^{W} \mathcal{I}_{c, m, n} \max \left(0,1-\left|i+\mathbf{V}_{i, j}-m\right|\right) \max \left(0,1-\left|j+\mathbf{U}_{i, j}-n\right|\right) Mc,i,j=m=1Hn=1WIc,m,nmax(0,1i+Vi,jm)max(0,1j+Ui,jn)

以及其中的

这里模型部分基本上ok了,具体我觉得模型要理解深透还是要靠代码。

三、Experiments

此部分不再对MnistMoving数据集实验做说明,请自行观看,我主要是堆本篇最主要的降水预测基准做说明

3.1 HKO-7数据集

这是博士开源的雷达回波图数据集,具体看我标黄部分即可。

需要注意的点,就是降雨问题,不是每天都会降雨,所以是个较为稀疏的问题,可能数据集不是很均衡,所以需要挑出一些有降雨的日子,并且雷达回波图和降水之间有一定的关系式,再来数据有一定的噪声,需要处理。

数据总体如下,5-10月份降水时间较多,并且博士在做实验的时候其实没留下太多的天数,可以看到2009-2014留了862天,不过一天就是240帧,足够玩模型了。

3.2 去噪denoise

3.2.1 利用马氏距离去噪


像素的马氏距离大于平均距离乘以三倍标准差为超出正常范围的点,也就是异常点。

这里恕本人才学尚浅,没办法特别清晰的说明这个去噪方式,主要本人不是气象学专业的,这个方式我本人按照我的理解做了一下,发现效果一般,当然我做的数据集不是在HKO上的,HKO已经有做好的了,我在新的数据集上用本方法进行去噪,效果一般,并没有那么的好,当然也可能是我自己理解的不对。

因为时间比较久远,我只找到了这个版本的代码,这里贴出,有想法的可以留言和我一起讨论下。(只贴出核心部分代码)

def denoise(dat_arr):

    dat_arr = dat_arr.flatten()
    dat_mean = np.mean(dat_arr)
    dat_arr = dat_arr.T
    # print(len(features_T))

    D = np.cov(dat_arr)
    D = np.expand_dims(D, axis=0)
    D = np.expand_dims(D, axis=0)
    D_1 = np.linalg.pinv(D)

    m_dis = []
    for i in range(len(dat_arr)):
        delta = dat_arr[i] - dat_mean
        d = np.sqrt(np.dot(np.dot(delta, D_1), delta.T))
        m_dis.append(d)
    m_dis = np.array(m_dis)

    dis_mean = np.mean(m_dis)
    dis_std = np.std(m_dis)
    threshold = dis_mean + 3 * dis_std
    true_false = np.any([m_dis > threshold])
    if true_false == True:
        for i in range(len(m_dis)):
            if m_dis[i] > threshold:
                dat_arr[i] = 0

    print("denoise is over")
    return dat_arr

3.2.2 去除其他类型噪声

这个简单,直接判断下就好了

3.3 loss损失


由于分析降水量的分布严重不均匀,其实也可以理解,一个地方不可能成天下暴雨,肯定是小雨的时候偏多些,当然这个还得看地区,比如我家这边冬天就是下雪了,哈哈哈。
所以这里有个常见的问题就是数据很不均匀,所以这里用的方法也比较常规吧,weights loss。


以上是每个像素点所在Rain rate的权重,loss具体算法是mse和mae有一个比例,我个人实战1:1就还不错。

公式如下: i,j为对应像素点,n为第几个frame

B − M S E = 1 N ∑ n = 1 N ∑ i = 1 480 ∑ j = 1 480 w n , i , j ( x n , i , j − x ^ n , i , j ) 2 \mathrm{B}-\mathrm{MSE}=\frac{1}{N} \sum_{n=1}^{N} \sum_{i=1}^{480} \sum_{j=1}^{480} w_{n, i, j}\left(x_{n, i, j}-\hat{x}_{n, i, j}\right)^{2} BMSE=N1n=1Ni=1480j=1480wn,i,j(xn,i,jx^n,i,j)2 and B − M A E = 1 N ∑ n = 1 N ∑ i = 1 480 ∑ j = 1 480 w n , i , j ∣ x n , i , j − \mathrm{B}-\mathrm{MAE}=\frac{1}{N} \sum_{n=1}^{N} \sum_{i=1}^{480} \sum_{j=1}^{480} w_{n, i, j} | x_{n, i, j}- BMAE=N1n=1Ni=1480j=1480wn,i,jxn,i,j
x ^ n , i , j ∣ \hat{x}_{n, i, j} | x^n,i,j

3.4 评价指标

使用的是纯粹的mae mse以及降水预测问题中常用的HSS CSI(这两个指标你可以理解为新类型的F1依旧是通过TP,TN,FN,FPl来计算的)

3.5 实验结果

具体参数和网络设计,请大家自行看论文吧,这里说意义不大。
主要用到了optical-flow,2DCNN,3DCNN,ConvGRU,TrajGRU。
很多标识看我的标黄部门,值得注意的是mae,mse自然是越小越好,但是HSS,CSI是越大越好。

作者有对模型结果的置信空间和方差进行分析,以及不同阈值和评价指标之间的相互关系做了分析。

四、Conclusions

  • 把可学习卷积引入到时空序列模型中, 提出了TrajGRU模型
  • 重新定义了EF结构
  • 对降水问题提供了一个工作量很大,很全面的benchmark,并对很多子问题进行了研究,比如预处理、imbalance

这篇文章并不是一次写完的,文章我反复看了好几遍,上一次看的时候写的,大概半年前,一直没写完,现在过了半年重新读一遍,依然感觉是大作,重拾笔,写完分享给大家。

  • 20
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值