将VAE用于时间序列:生成时间序列的合成数据

news2024/9/21 12:44:13

变分自编码器(VAEs)是一种生成式人工智能,因其能够创建逼真的图像而备受关注,它们不仅可以应用在图像上,也可以创建时间序列数据。标准VAE可以被改编以捕捉时间序列数据的周期性和顺序模式,然后用于生成合成数据。本文将使用一维卷积层策略性的步幅选择灵活的时间维度季节性依赖的先验来模拟温度数据。

我们使用亚利桑那州菲尼克斯市50年的ERA5小时温度数据训练了一个模型。为了生成有用的合成数据,它必须捕捉原始数据的几个特征:

  1. 季节性概况 — 夏季应该比冬季更暖
  2. 昼夜概况 — 白天应该比夜晚更暖
  3. 自相关性 — 数据应该平滑,连续几天的温度应该相似

如果训练数据是平稳的,没有长期趋势,模型表现最佳。但是由于气候变化,温度呈现上升趋势,每十年约上升0.7°F — 这个值来自观测数据,与发表的显示近期各地区变暖趋势的地图一致。为了考虑到温度上升,需要对原始观测数据应用每十年-0.7°F的线性变换,消除上升趋势。

什么是VAE?

变分自编码器将输入数据的维度降低到一个更小的子空间。VAE定义了一个编码器,将观察到的输入转换成一种压缩形式,称为潜在变量。然后一个独特的镜像解码器尝试重建原始数据。编码器和解码器被共同优化,创建一个尽可能少损失信息的模型。

训练中使用的完整损失函数包括:

  • 重建损失: 测量经过往返转换的数据与原始输入的匹配程度
  • 正则化项: 测量潜在变量的编码分布与先验分布的匹配程度

这两个损失项是通过变分推断得出的,目标是最大化观测数据的证据下界(ELBO)。

VAE对训练数据进行特征提取,使得最重要的特征(由潜在变量表示)遵循定义的先验分布。通过对潜在分布进行采样,然后将其解码为原始输入的形式,可以生成新的数据。

一维卷积层

为了模拟温度数据,我们编码器设计成一个具有一维卷积层的神经网络。每个卷积层应用一个核 。由于在整个输入中使用相同的核,卷积层被认为是平移不变的,非常适合具有重复序列模式的时间序列。

左: 作为矩阵运算的卷积层 | 右: 图形表示

通常,输入和输出有几个特征变量。为简单起见,矩阵运算显示了仅有一个特征的输入和输出之间的卷积。

解码器使用转置的一维卷积层(也称为反卷积层)执行与编码器相反的任务。潜在特征被投影到重叠的序列中,以创建一个与输入紧密匹配的输出时间序列。

反卷积层的权重矩阵是卷积矩阵的转置。

完整的模型将几个卷积层和反卷积层堆叠在一起。每个中间的隐藏层扩展潜在变量的范围,使模型能够捕捉数据中的长期效应。

步幅

步幅 — 移动之间的跳跃 — 决定了下一层的大小。卷积层使用步幅来缩小输入,而反卷积层使用步幅将潜在变量扩展回输入大小。它们还有一个次要目的 — 捕捉时间序列中的周期性趋势。

你可以简单的认为选择卷积层的步幅是可以代表数据中的周期性模式。

将多个层堆叠在一起会产生一个由嵌套的子卷积组成的更大的有效周期。

考虑一个卷积网络,它将每小时的时间序列数据提炼成每天四个变量,代表早晨、下午、傍晚和夜晚。一个步幅为4的层将有唯一分配给一天中每个时间的权重,在隐藏层中捕捉昼夜概况。在训练过程中,编码器和解码器学习复制数据中发现的日循环的权重。

卷积利用输入的周期性来构建更好的潜在特征。反卷积将潜在特征转换为重叠的、重复的序列,以生成具有周期性模式的数据。

时间维度

生成图像的VAE通常有数千张预处理成固定宽度和高度的图像。生成的图像将与训练数据的宽度和高度相匹配。

对于这个温度的数据集,我们有一个50年的时间序列。我么可以为每96小时周期分配一个潜在变量。所以想要生成长于4天的时间序列,理想情况下,输出应该是平滑的,而不是在模拟中有离散的96小时块。

所以我门的潜在变量也包括一个可以变化的时间维度。在模型中,潜在空间中的每个时间步对应输入中的96小时。

![]

生成新数据就像从先验中采样潜在变量一样简单,可以选择想要包含在时间维度中的步数。

具有未受约束时间维度的VAE可以生成任意长度的数据。

季节性依赖的先验

在大多数VAE中,潜在变量的每个分量被假定遵循标准正态分布。这个分布,有时被称为先验,被采样然后解码并且生成新的数据。在这种情况下,我们可以选择一个稍微复杂一点的先验,它依赖于一年中的时间。

从季节性先验采样的潜在变量将生成具有随季节变化特征的数据。

在这个先验下,生成的一月数据将与七月数据看起来非常不同,而同一个月生成的数据将共享许多相同的特征。

将一年中的时间表示为一个角度,θ,其中0°是1月1日,180°是7月初,360°又回到1月。先验是一个正态分布,其均值和对数方差是θ的三次三角多项式,其中多项式的系数是在训练过程中与编码器和解码器一起学习的参数。

先验分布参数是θ的周期函数,而且良好行为的周期函数可以通过足够高阶的三角多项式以任何精度级别近似。

左: θ的可视化 | 右: Z的先验分布,用参数m和s表示

季节性数据仅用于先验,不影响编码器或解码器。完整的概率依赖关系在这里以图形方式显示。

上图就是包括先验的概率图模型

代码实现

为了简化训练步骤,我们使用Tensorflow开发这个模型

 fromtensorflow.kerasimportlayers, models

编码器

输入被定义为具有灵活的时间维度。在Keras中,你可以使用

None

指定一个未受约束的维度。

使用

'same'

填充将在输入层附加零,使得输出大小与输入大小除以步幅相匹配。

 inputs=layers.Input(shape=(None,)) # (N, 96*k)  
 x=layers.Reshape((-1, 1))(inputs)  # (N, 96*k, 1)  
   
 # Conv1D parameters: filters, kernel_size, strides, padding  
 x=layers.Conv1D(40, 5, 3, 'same', activation='relu')(x) # (N, 32*k, 40)  
 x=layers.Conv1D(40, 3, 2, 'same', activation='relu')(x) # (N, 16*k, 40)  
 x=layers.Conv1D(40, 3, 2, 'same', activation='relu')(x) # (N, 8*k, 40)  
 x=layers.Conv1D(40, 3, 2, 'same', activation='relu')(x) # (N, 4*k, 40)  
 x=layers.Conv1D(40, 3, 2, 'same', activation='relu')(x) # (N, 2*k, 40)  
 x=layers.Conv1D(20, 3, 2, 'same')(x) # (N, k, 20)  
   
 z_mean=x[: ,:, :10]   # (N, k, 10)  
 z_log_var=x[:, :, 10:] # (N, k, 10)  
 z=Sampling()([z_mean, z_log_var]) # custom layer sampling from gaussian  
   
 encoder=models.Model(inputs, [z_mean, z_log_var, z], name='encoder')
Sampling()

是一个自定义层,从给定均值和对数方差的正态分布中采样数据。

解码器

反卷积是通过

Conv1DTranspose

执行的。

 # input shape: (batch_size, time_length/96, latent_features)  
 inputs=layers.Input(shape=(None, 10)) # (N, k, 10)  
   
 # Conv1DTranspose parameters: filters, kernel_size, strides, padding  
 x=layers.Conv1DTranspose(40, 3, 2, 'same', activation='relu')(inputs) # (N, 2*k, 40)  
 x=layers.Conv1DTranspose(40, 3, 2, 'same', activation='relu')(x) # (N, 4*k, 40)  
 x=layers.Conv1DTranspose(40, 3, 2, 'same', activation='relu')(x) # (N, 8*k, 40)  
 x=layers.Conv1DTranspose(40, 3, 2, 'same', activation='relu')(x) # (N, 16*k, 40)  
 x=layers.Conv1DTranspose(40, 3, 2, 'same', activation='relu')(x) # (N, 32*k, 40)  
 x=layers.Conv1DTranspose(1,  5, 3, 'same')(x) # (N, 96*k, 1)  
   
 outputs=layers.Reshape((-1,))(x) # (N, 96*k)  
   
 decoder=models.Model(inputs, outputs, name='decoder')

先验

先验期望输入已经是[sin(θ), cos(θ), sin(2 θ), cos(2 θ), sin(3 θ), cos(3 θ)]的形式。

Dense

层没有偏置项,这是为了防止先验分布偏离零太远或整体方差过高或过低。

 # seasonal inputs shape: (N, k, 6)  
 inputs=layers.Input(shape=(None, 2*3))   
   
 x=layers.Dense(20, use_bias=False)(inputs) # (N, k, 20)  
 z_mean=x[:, :, :10]  # (N, k, 10)  
 z_log_var=x[:, :, 10:] # (N, k, 10)  
 z=Sampling()([z_mean, z_log_var]) # (N, k, 10)  
   
 prior=models.Model(inputs, [z_mean, z_log_var, z], name='seasonal_prior')

完整模型

损失函数包含一个重建项和一个潜在正则化项。

函数

log_lik_normal_sum

是一个自定义函数,用于计算给定重建输出的观测数据的正态对数似然。计算对数似然需要解码输出周围的噪声分布,这被假定为正态分布,其对数方差由

self.noise_log_var

给出,在训练过程中学习。

对于正则化项,

kl_divergence_sum

计算两个高斯分布之间的Kullback-Leibler散度 — 在这种情况下,是潜在编码分布和先验分布。

 classVAE(models.Model):  
     def__init__(self, encoder, decoder, prior, **kwargs):  
         super(VAE, self).__init__(**kwargs)  
         self.encoder=encoder  
         self.decoder=decoder  
         self.prior=prior  
         self.noise_log_var=self.add_weight(name='var', shape=(1,), initializer='zeros', trainable=True)  
   
     @tf.function  
     defvae_loss(self, data):  
         values, seasonal=data  
         z_mean, z_log_var, z=self.encoder(values)  
         reconstructed=self.decoder(z)  
         reconstruction_loss=-log_lik_normal_sum(values, reconstructed, self.noise_log_var)/INPUT_SIZE  
         seasonal_z_mean, seasonal_z_log_var, _=self.prior(seasonal)  
         kl_loss_z=kl_divergence_sum(z_mean, z_log_var, seasonal_z_mean, seasonal_z_log_var)/INPUT_SIZE  
         returnreconstruction_loss, kl_loss_z  
   
     deftrain_step(self, data):  
         withtf.GradientTape() astape:  
             reconstruction_loss, kl_loss_z=self.vae_loss(data)  
             total_loss=reconstruction_loss+kl_loss_z  
           
         gradients=tape.gradient(total_loss, self.trainable_variables)  
         self.optimizer.apply_gradients(zip(gradients, self.trainable_variables))  
           
         return {'loss': total_loss}

结果

在训练模型后,生成的数据与原始温度数据的季节性/昼夜概况和自相关性相匹配。

总结

构建生成式时间序列建模技术是一个关键领域,其应用远不止于模拟数据。我们这个方法可以适用于数据插补、异常检测和预测等应用。

通过使用一维卷积层、策略性步幅、灵活的时间输入和季节性先验,可以构建一个能够复制时间序列中复杂模式的VAE。让我们合作完善时间序列建模的最佳实践。

本文代码如下:

https://avoid.overfit.cn/post/d7b944fdc95144dc9d9ba694ed1f73fc

作者:David Kyle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何开发一款网店后台多开软件?!

什么是网店后台多开软件? 网店后台多开软件指的是能够同时打开多个网店后台的一款软件,即一个软件上可以登录多个网店后台(如:拼多多店铺后台、抖店店铺后台、快手小店店铺后台、孔网店铺后台、微店店铺后台、小红书店铺后台等等…

Leetcode 34. 二分查找 C++实现

Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置 问题:给你一个按照非递减顺序排列的整数数组 nums ,和一个目标值 target 。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target ,返回 [-1, -1]。你…

Python之PyInstaller打包EXE程序(带音乐加图片等资源)

Python之PyInstaller打包EXE程序(带音乐加图片等资源) 要将你的 Python 程序打包成一个可执行文件(.exe),并确保图片和音乐文件包含在其中,你可以使用 PyInstaller 工具。下面是一个简单的步骤来打包你的程序: 以我的…

Python实现水果忍者(开源)

一、整体介绍: 1.1 前言: 游戏代码基于Python制作经典游戏案例-水果忍者做出一些改动,优化并增加了一些功能。作为自己Python阶段学习的结束作品,文章最后有源码链接。 1.2 Python主要知识: (1&#xf…

FPGA开发——UART回环实现之发送模块的设计和数据回环整体实现

一、简介 在上一篇文章当中我们实现了UART接收模块的相关设计和功能实现,在今天的文章中我们继续实现剩下的发送模块的相关设计和完成完整的串口数据回环的实验。 在文章的最后我会给出完整的工程,给小伙伴们参考。 二、接收模块的基本设计 在接收模块…

如何下载老版本 的mysql

方案1:打开地址,即可 MySQL :: Download MySQL Community Server (Archived Versions) 输入地址 https://downloads.mysql.com/archives/community/ 方案2: MySQL :: Download MySQL Installer https://dev.mysql.com/downloads/windows…

推荐使用阿贝云免费云服务器、免费虚拟主机

官网地址:https://www.abeiyun.com 阿贝云免费云服务器,性价比之选! 不得不说,阿贝云的免费云服务器真的太棒了!不仅免费,还能提供如此优质的服务。服务器的配置虽然不算高端,但对于一般的应用…

【MySQL】数据库约束

系列文章目录 第一章 数据库基础 第二章 数据库基本操作 文章目录 系列文章目录前言约束关键字一览NOT NULLUNIQUEDEFAULTPRIMARY KEY自增主键 FOREIGN KEY总结 前言 在学习了数据库的增删改查操作之后,接下来就需要进阶的学习关键字来完善SQL语句的条件。学习数据…

宝塔部署Django项目(华为云)

1、登录华为云: 2、点击远程登录: 3、打开宝塔网址(华为云选的是centos) 4、在华为终端复制指令点击运行: 会显示安装完成,出现一个页面记录一下,方便以后登录: 5、复制外网面板地址到浏览器地址栏,输入账号,密码登录,在这里进行配置: 一、Django项目的设置以及压…

Gafgyt僵尸网络针对云原生环境,SSH弱密码成GPU挖矿新目标

近日,网络安全研究人员发现了 Gafgyt 僵尸网络的一个新变种,它以 SSH 密码较弱的机器为目标,最终利用其 GPU 计算能力在被攻击的实例上挖掘加密货币。 Aqua Security 研究员 Assaf Morag 在周三的一份分析报告中说:"这表明&…

虎牙的商业化畅想

2024年8月13日,虎牙公司公布了2024年第二季度财报。财报显示,2024年第二季度,虎牙公司总收入达15.4亿元。其中,来自游戏相关服务、广告和其他业务的收入同比增长152.7%至3.1亿元。在非美国通用会计准则下,该季度归属于…

KDP数据平台:以实战案例验证技术领先力

本文由智领云 LeetTools 工具自动生成 申请试用: https://www.leettools.com/feedback/ 在当今快速发展的技术环境中,数据平台的选择对企业的数字化转型和业务发展至关重要。智领云开源KDP(Kubernetes Data Platform)在数据处理和…

状态dp或滑动窗口

前言&#xff1a;这个题目可以用状态dp来做&#xff0c;其实还有一个思路&#xff0c;类似滑动窗口&#xff0c;如果有遇到第二个0&#xff0c;左指针加一 class Solution { public:int longestSubarray(vector<int>& nums) {int n nums.size();vector<vector<…

Mac 自定义键盘快捷键打开系统应用

在 macOS 中&#xff0c;可以通过自定义键盘快捷键来打开系统应用程序。这可以更快捷地访问常用的应用程序&#xff0c;提高工作效率。下面以创建活动监视器快捷键为例介绍“Mac 自定义键盘快捷键打开系统应用”的一般步骤&#xff1a; 创建活动监视器快捷键 键入command空格打…

DVWA | Brute Force通关指南

目录 Low Medium High Impossible Brute force主要是通过爆破达到渗透目的&#xff1a; Low 查看源代码&#xff1a; <?phpif( isset( $_GET[ Login ] ) ) {// Get username$user $_GET[ username ];// Get password$pass $_GET[ password ];$pass md5( $pass );//…

软件工程概述(上)

1、软件的概念、特点和分类 要了解软件工程&#xff0c;首先让我们重新认识一下软件。如今可以说是一个软件定义一切的时代&#xff0c;虽然人工智能发展的如火如荼&#xff0c;但究其本质&#xff0c;核心还是软件。那么&#xff0c;如何给软件下一个定义呢&#xff1f;软件又…

再造行业旗舰爆款,书客L2 Pro重塑医护级”护眼更养眼”,被誉为最强旗舰级标杆!

近日&#xff0c;作为照明领域黑马的SUKER书客正式发布护眼台灯L2 Pro&#xff0c;在各项标准都远超国AA的基础上&#xff0c;推出了RRT2.0红光养眼技术、第三代SDIT自适应调光技术以及全新一代紫光激发全光谱技术等一系列首创护眼黑科技&#xff0c;从强悍的护眼效果到惊艳的光…

《python语言程序设计》2018版第7章第04题Fan类,设计一个名为Fan的类表示一个风扇

8点下课到家也9点多。眼睛抬不起来 明天到周二要为好几十个兄弟姐妹们&#xff0c;完成日志和反馈表&#xff0c;还要保证低错误。明天还要完成单位的一些工作。 哦对了&#xff0c;还有这些兄弟姐妹们的视频。 好先看一下Fan类的代码&#xff0c;它继续存在exCode07 class Fa…

【uni-app】使用天气API做一个天气APP(全过程)- 实况、逐小时、40日

头一次使用uni-app写代码, 现学现卖, 写的不好的地方见谅, 申请个appid就可以运行 切换城市界面比较简单, 城市名称需要符合天气api参数规则, 录入的城市不要带市区县; 格式如: 青岛、铁西、海淀、沛县 APP效果 功能说明 实况天气逐小时预报未来7日天气未来40日天气空气质量详…

【Qt】QWidget的toolTip属性

QWidget的toolTip属性 如果一个GUI程序&#xff0c;界面比较复杂&#xff0c;按钮比较多&#xff0c;使用toolTip可以设置当鼠标悬停在控件上的时候&#xff0c;可以弹出一个提示。 API说明 setToolTip 设置 toolTip. ⿏标悬停在该 widget 上时会有提⽰说明. setToolTipDur…