最近忙,抽出时间把之前零零碎碎差一点搞定的文章拿出来分享下。
原创不易,觉得好可以点赞,帮忙转发,对我的认可,我会更有动力去给大家带来优质的知识。
NIPS2016 年的一篇paper,施博士大作。
这篇paper虽然和我前几篇比起来稍微有些古老,本来应该讲完convLSTM紧接着就讲轨迹GRU得,因为两篇算是一个工作的不断延申,但是因为种种原因吧,今天才下笔,但是我感觉无论如何这篇文章都算是大作,并且现在用起来依然效果不算差,所以还是值得重新读几遍,文中所作的工作量也是很大,主要提出了一个降水预测的基准,把整个实验流程中的主要问题和解决方案都指出来了,所以说还是十分值得学习的。
论文链接地址: https://arxiv.org/pdf/1706.03458.pdf
顾名思义,论文名称中特意指出了降水预测这个领域,所以这篇主要的工作还是在这一领域,如果是气象学专业的可能并不陌生,不过和我一样不是这相关人士得可能会陌生了。
这里大致说下,大概就是雷达来实地监测,发出雷达,得到回传数据,形成对应的雷达回波图,每个雷达回波图的像素大概在0-80之间,这个像素值可以通过一个线性变换成降水值,所以简单来说就是时空序列预测问题,你的下一帧得像素预测明白了,自然降水得预测不会差,所以本质还是一个Spatial-Temporal Prediction问题。这个问题我觉得我已经在我的文章系列中反复提到过,可以看我的第一篇概述,也可以随便找一篇,看看第二部分,大致就明白了,这里不赘述了。
这里也不想过多赘述了,其实就是把之前一些研究拿出来对比下。 主要分为三类把,因为那时候还算比较早期,基本上都是lstm的一些操作以及lstm+cnn的一些操作,还没有很好的结合。
之后又稍微提了下SocialLSTM and the Structural-RNN (S-RNN), SocialLSTM 我记得我很久之前稍微看了下感觉还是很复杂的,也很有趣,感兴趣的可以看下,不过它主要针对的问题是人体轨迹方面的时空预测, S-RNN主要基于给与的时空图的预测,具体我这边也没研究过。
本文的创新主要是把可学习卷积引入到时空序列问题中,并且把EF结构重新更加直观的摆明了。
而最大最大的创新和工作量在于降水预测问题的benchmark。
①这是这篇文章中的 EF结构
②而这个是ConvLSTM中所描述的
③而他们的原始状态Seq2Seq是这样的
当然这样我们看还是不直观,我把这三幅图弄在一起给大家看下
seq2seq模型结构我想不用我多说了,因为大家都很熟悉应该,如果不熟悉,哪天我总结发下,也可以把代码coding部门一同介绍给大家,这篇paper中提出的EF主要的区别在于引入上下采样,以及预测的方向也就是Forcaster结构中的数据流的方向 倒置了。
那为什么要加入上下采样呢?经过实战你就明白了,没有上下采样你的机器会受不了,但是如果你的机器算力非常强倒也可以尝试不加,但是算起来速度太慢了,反而加上上下采样效果也很不错,速度快了,也不是那么吃显卡了。
那设计的时候为什么要倒置呢,其实文中也写得很清楚。
主要的原因还是他认为high-level state提取的是一个偏向全局的时空信息,而low-level的能更加的影响预测,我个人感觉他这里这么设计,可能很单纯,就是因为发现没人这么做过,这么做完之后发现效果确实在降水预测问题中好了, 哈哈哈。 但是他后面我红色圈起来的部分还是很讲究的,可以随意的去插入rnn层,不需要跳过连接来聚合低级信息。
这里把其中一个block给出,不赘述了,可以翻看我写的ConvLSTM模型,就是从那里演变过来的,公式如下:
如果输入为全部都为0,reset gate全为一
则
那基本上就相当于没有update了。
这句话的意思就好比,你的卷积操作中的超参数都定了,比如kernel size、padding和dilation都定下来了。 那基本上可以说你想卷积的那个location领域的点是固定的了。
而很多的信息其实他对应的邻域的点是及其不固定的,比如台风问题中,台风眼的旋转,移动都是变化万分的,如果只关注某个location的周围几个点可能并非关系密切,所以可学习的卷积渗入了。。
每次卷积的点是学习得到的最为相关的点。 主要公式:
这里的l是卷积连接的点的个数,其他的通俗一些讲就是通过输入和上一个状态得到两个参数,通过这两个参数以及上一个状态配合输入得到两个门控,再通过门控得到新的状态,之后和GRU的reset gate那边一样的。 这里warp功能是双线性插值的方法来实现的
以及其中的
这里模型部分基本上ok了,具体我觉得模型要理解深透还是要靠代码。
此部分不再对MnistMoving数据集实验做说明,请自行观看,我主要是堆本篇最主要的降水预测基准做说明
这是博士开源的雷达回波图数据集,具体看我标黄部分即可。
需要注意的点,就是降雨问题,不是每天都会降雨,所以是个较为稀疏的问题,可能数据集不是很均衡,所以需要挑出一些有降雨的日子,并且雷达回波图和降水之间有一定的关系式,再来数据有一定的噪声,需要处理。
数据总体如下,5-10月份降水时间较多,并且博士在做实验的时候其实没留下太多的天数,可以看到2009-2014留了862天,不过一天就是240帧,足够玩模型了。
像素的马氏距离大于平均距离乘以三倍标准差为超出正常范围的点,也就是异常点。
这里恕本人才学尚浅,没办法特别清晰的说明这个去噪方式,主要本人不是气象学专业的,这个方式我本人按照我的理解做了一下,发现效果一般,当然我做的数据集不是在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
这个简单,直接判断下就好了
由于分析降水量的分布严重不均匀,其实也可以理解,一个地方不可能成天下暴雨,肯定是小雨的时候偏多些,当然这个还得看地区,比如我家这边冬天就是下雪了,哈哈哈。 所以这里有个常见的问题就是数据很不均匀,所以这里用的方法也比较常规吧,weights loss。
以上是每个像素点所在Rain rate的权重,loss具体算法是mse和mae有一个比例,我个人实战1:1就还不错。
公式如下: i,j为对应像素点,n为第几个frame
使用的是纯粹的mae mse以及降水预测问题中常用的HSS CSI(这两个指标你可以理解为新类型的F1依旧是通过TP,TN,FN,FPl来计算的)
具体参数和网络设计,请大家自行看论文吧,这里说意义不大。 主要用到了optical-flow,2DCNN,3DCNN,ConvGRU,TrajGRU。 很多标识看我的标黄部门,值得注意的是mae,mse自然是越小越好,但是HSS,CSI是越大越好。
作者有对模型结果的置信空间和方差进行分析,以及不同阈值和评价指标之间的相互关系做了分析。
这篇文章并不是一次写完的,文章我反复看了好几遍,上一次看的时候写的,大概半年前,一直没写完,现在过了半年重新读一遍,依然感觉是大作,重拾笔,写完分享给大家。