培养潜在的颂歌与不规则采样时间序列数据网络
这个例子展示了如何培养潜在的常微分方程(ODE) autoencoder在不规则的时间间隔与采样时间序列数据。
大多数深度学习模型对时间序列数据(例如,复发性神经网络)需要定期采样时间序列数据,以火车。也就是说,序列的元素必须对应宽度固定的时间间隔。
学习不规则采样时间序列的动态数据,您可以使用一个潜在的ODE模型[1,2]。潜在的ODE模型是一个变分autoencoder (VAE)[3],学习时间序列的动态数据。autoencoder是一种模型训练来复制其输入的输入转换为一个潜在的空间(编码步骤)和重建输入从潜在的表示(解码步骤)。训练一个autoencoder不需要带安全标签的数据。
与大多数autoencoders,潜在的ODE模型不是完全复制其输入训练。相反,该模型学习的动态输入数据,你可以指定一组目标时间戳,模型预测相应的值。
这个图表显示了模型的结构。
训练一个潜在的ODE模型需要很长时间运行。这个例子中,默认情况下,跳过pretrained模型训练和负载。火车模型相反,设置doTraining
旗帜真正的
。
doTraining = false;
加载数据
加载不规则的正弦波数据集。该数据集包含1000综合生成的具有不同频率的正弦波,抵消、噪声。每个序列使用相同的不规则采样的时间戳。
负载irregularSineWaves
想象第一序列通过循环通道的阴谋。竖线强调时间戳的阴谋。因为不规则的正弦波数据集只包含一个频道,这段代码只显示一个单一的情节。
numChannels =大小(值,1);idx = 1;图t = tiledlayout (numChannels, 1);标题(t)“观察”+ idx)为i = 1: numChannels nexttile情节(tspan挤压(值(我idx:)),标记=“。”);包含(“t”)ylabel (“价值”)参照线(tspan”:“)结束
准备培训资料
把训练和测试数据使用trainingPartitions
功能,附加到例子作为支持文件。金宝app要访问这个函数,打开生活的脚本示例。使用80%的数据进行训练和剩下的20%进行测试。
numObservations =大小(值,2);[idxTrain, idxTest] = trainingPartitions (numObservations [0.8 - 0.2]);idxTrain, sequencesTrain =值(::);idxTest, sequencesTest =值(::);
创建数据存储输出训练和测试数据。
dsTrain = arrayDatastore (sequencesTrain IterationDimension = 2);dst = arrayDatastore (sequencesTest IterationDimension = 2);
初始化参数模型可学的
这个例子列车VAE,编码器使用递归神经网络(RNN),称为ODE-RNN[2]和译码器是一个神经的颂歌。编码器将序列映射到一个固定长度的潜在表示。这潜在的参数化表示高斯分布。使用这些编码模型样本的高斯分布参数并将抽样数据传递到解码器。
这个图表显示了模型的结构。
编码器是一种ODE-RNN。它反转输入序列,最后输入编码器是第一解码器的输出。ODE-RNN更新的代表,因为它读取的每个时间步逆转数据使用一个蒙面的复发性单元(格勒乌)和一个ODE求解器进行求解。ODE-RNN连接输入数据和格勒乌隐藏状态的操作和进步这格勒乌操作的输出时间根据神经的颂歌。格勒乌操作使用更新后的状态只有时间步骤指定的面具。
这个图表显示了编码器的结构。
这个图表显示的结构ODE-RNN过程数据的时间步。在这个图中, 表示时间步的值, 表示掩码值, 是隐藏状态格勒乌的输出操作。
译码器需要的表示和建构的输入序列指定目标时间戳。解码器通过潜在的表示和目标时间戳到神经的颂歌,连接神经的颂歌与潜在表示输出,将连续数据传递给一个完全连接操作,烟输出与输入序列。
这个图表显示了译码器的结构。
训练模型,创建一个包含可学的结构参数对潜在的颂歌。初始化模型可学的参数使用latentODEParameters
功能,附加到这个例子作为支持文件。金宝app要访问这个函数,打开生活的脚本示例。函数初始化可学的参数完全连接的取样和格勒乌操作narrow-normal分布(高斯分布的均值为零,标准差为0.01)。
指定模型hyperparameters:
一个编码器ODE大小为105
一个编码器RNN 40的大小
110解码器ODE的大小
潜在的大小为32
encoderODEHiddenSize = 100;encoderRNNHiddenSize = 40;decoderODEHiddenSize = 100;latentSize = 10;inputSize = numChannels;参数= latentODEParameters (inputSize encoderODEHiddenSize、encoderRNNHiddenSize latentSize, decoderODEHiddenSize);
定义模型函数
定义模型函数用于深度学习模型。
模型函数
的模型
函数,定义的模型函数部分的示例中,模型可学的参数作为输入,源时间戳和相应的序列值和面具,和目标时间戳。函数返回到目标时间戳相对应的预测值。
编码器的功能
的编码器
函数,定义的编码器的功能部分的示例中,需要编码器可学的参数作为输入,源时间戳、和相应的序列值和面具。函数返回的表示。
译码器的功能
的译码器
函数,定义的译码器的功能部分的示例中,需要解码器可学的参数作为输入,目标时间戳,潜在的表示。函数返回到目标时间戳相对应的预测值。
定义模型损失函数
的modelLoss
函数,定义的损失函数模型部分的示例中,模型可学的参数作为输入,时间戳和相应的序列值和面具。函数返回的梯度模型损失和损失对可学的参数。模型损失函数使用
损失数量的输入样本的观察和规范化。
指定培训选项
为培训指定这些选项:
200年火车时代与mini-batch大小为50。
训练一个初始的学习速率为0.0025。
衰变速率的每次迭代学习速率成倍增长0.999,直到达到0.00025。
火车使用CPU。神经ODE模型有时火车速度比在GPU在CPU上。
numEpochs = 200;miniBatchSize = 50;initialLearnRate = 2.5 e - 3;minLearnRate = 2.5的军医;decayRate = 0.999;executionEnvironment =“cpu”;
火车模型
火车模型在一个定制的训练循环使用损失函数modelLoss
。
配置一个minibatchqueue
对象读取的数据。
预处理mini-batches使用
preprocessMiniBatch
函数,列出的Mini-Batch预处理功能部分的例子。这个函数输出mini-batch随着时间序列步骤随机移除和相应的面具和目标序列。指定mini-batch输出格式
“认知行为治疗”
(通道、批量、时间)。指定的硬件环境mini-batch输出。
numOutputs = 3;mbqTrain = minibatchqueue (dsTrain numOutputs,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“认知行为治疗”“认知行为治疗”“认知行为治疗”),…OutputEnvironment = [executionEnvironment executionEnvironment executionEnvironment]);
初始化学习速率。
learnRate = initialLearnRate;
亚当的初始化参数解算器。
trailingAvg = [];trailingAvgSq = [];
更新进度条的培训进度监控,计算训练迭代的总数。
numObservationsTrain =大小(sequencesTrain, 2);numIterationsPerEpoch =装天花板(numObservationsTrain / miniBatchSize);numIterations = numIterationsPerEpoch * numEpochs;
火车模型在一个定制的训练循环。对于每一个时代,洗牌的训练数据。
循环的mini-batches训练数据。每一次迭代:
更新学习速率使用指数衰减。
计算模型和梯度使用损失
dlfeval
函数和modelLoss
函数。更新可学的参数使用
adamupdate
函数。记录培训损失的培训进度监控。
如果doTraining%初始化培训进度监控。监控= trainingProgressMonitor (…指标=“TrainingLoss”,…信息= [“LearnRate”“时代”]);班长。包含=“迭代”;%在时代循环。时代= 0;迭代= 0;而时代< numEpochs & & ~班长。停止时代=时代+ 1;%洗牌的训练数据。洗牌(mbqTrain);%循环训练数据。而hasdata (mbqTrain) & & ~班长。停止迭代=迭代+ 1;%更新学习速率。learnRate = max (decayRate * learnRate minLearnRate);%读mini-batch的数据。[X,面具,T] =下一个(mbqTrain);%计算损失模型和梯度。(损失,梯度)= dlfeval (@modelLoss、参数tspan X,面具,T);%更新可学的参数。(参数、trailingAvg trailingAvgSq) = adamupdate(参数、渐变…trailingAvg trailingAvgSq,迭代,learnRate);%更新培训进度监控。recordMetrics(监控、迭代TrainingLoss =损失);updateInfo(监控、LearnRate = LearnRate时代=(时代+“的”+ numEpochs));班长。进步= 100 *(迭代/ numIterations);结束结束%保存模型。保存(“irregularSineWavesParameters.mat”,“参数”,“tspan”);其他的s =负载(“irregularSineWavesParameters.mat”);参数= s.parameters;miniBatchSize = s.miniBatchSize;结束
测试模型
使用测试数据通过创建一个测试模型mini-batch队列,随机从序列中删除时间步长和使用训练有素的潜在ODE模型来预测值删除。
创建一个mini-batch队列预处理测试数据使用相同的步骤作为训练数据。
numOutputs = 2;numOutputs mbqTest = minibatchqueue (dst,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“认知行为治疗”“认知行为治疗”),…OutputEnvironment = [executionEnvironment executionEnvironment]);
指定目标时间戳来匹配原始输入时间邮票。
tspanTarget = tspan;
作出预测通过循环mini-batch队列和数据模型。
欧美= [];而hasdata (mbqTest) [X,面具]= (mbqTest);Y =模型(参数、tspan X, tspanTarget面具=面具);欧美=猫(2次Y);结束
计算均方根误差。
rmse =√意味着(sequencesTest -欧美)。^ 2,“所有”))
rmse = 1 (C)×1 (B)×1 (T)单一dlarray 0.1589
在一个柱状图可视化的错误。
呃= sequencesTest -欧美;图错= extractdata(错);直方图(err)包含(“错误”)ylabel (“频率”)标题(“测试RMSE = "+字符串(rmse))
预测使用新数据
重构测试序列与1000 0到5之间的等距的时间戳。
创建一个包含测试数据的mini-batch队列。
预处理数据使用preprocessMiniBatchPrtedictors
的函数,该函数创建mini-batches没有删除任何时间序列数据的步骤。
numOutputs = 1;numOutputs mbqNew = minibatchqueue (dst,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatchPredictors,…MiniBatchFormat =“认知行为治疗”,…OutputEnvironment = executionEnvironment);
指定1000 0到5之间的等距的时间戳作为目标时间戳。
tspanTarget = linspace (0, 1000);
预测在mini-batch循环队列。
YNew = modelPredictions(参数、tspan mbqNew tspanTarget);
查看预测的数组的大小。
大小(YNew)
ans =1×31 200 1000
想象第一个预测通过绘制散点图的输入,然后绘制预测序列。
画出输入数据。
idx = 1;X = sequencesTest (:, idx:);图t = tiledlayout (numChannels, 1);标题(t)“输入序列”)为i = 1: numChannels nexttile散射(tspan,挤压(X))包含(“t”)ylabel (“价值”)结束
绘制预测值。
为i = 1: numChannels nexttile (i)在情节(tspanTarget挤压(YNew(我idx:)));结束标题(t)“预测序列”)传说([“输入数据”“预测”),位置=“东南”);
金宝app支持功能
模型函数
的模型
函数,介绍了定义模型函数部分的示例中,模型可学的参数作为输入,源时间戳tspan
和相应的序列值和面具,目标时间戳tspanTarget
。函数返回预期的值Y
对应于目标时间戳。
这个图表显示了结构模型的功能。
神经颂歌解码器可以输入序列均值和方差的高斯分布的抽样值由其潜在的编码表示。
函数Y =模型(参数、tspan X, tspanTarget, args)参数tspan X tspanTarget args参数。掩码= dlarray(真正的(大小(X)),“认知行为治疗”)结束掩码= args.Mask;Z =编码器(parameters.Encoder tspan X,面具=面具);%的表示分割成均值和方差。latentSize =大小(Z, 1) / 2;μ= Z (1: latentSize,:);σ= abs (Z (latentSize + (1: latentSize):));%取样的潜在分布。ε= randn(大小(μ),像= X);Z =ε。*σ+μ;Z = dlarray (Z,“CB”);%解码的表示。Y =解码器(parameters.Decoder, tspanTarget, Z);结束
编码器的功能
的编码器
函数,介绍了定义模型函数部分的示例中,需要编码器可学的参数作为输入,源时间戳tspan
,相应的序列值和面具。函数输出的表示。
这个图表显示了编码器的结构。
编码器反转输入序列,最后输入编码器是第一解码器的输出。ODE-RNN更新的代表,因为它读取的每个时间步逆转数据使用一个蒙面的复发性单元(格勒乌)和一个ODE求解器进行求解。ODE-RNN连接输入数据和格勒乌隐藏状态的操作和进步这格勒乌操作的输出时间根据神经的颂歌。格勒乌操作使用更新后的状态只有时间步骤指定的面具。
这个图表显示了神经的结构ODE-RNN过程数据的时间步。在这个图中, 表示时间步的值, 表示掩码值, 是隐藏状态格勒乌的输出操作。ODE求解器的步骤是一个简单的固定步欧拉方法的性能。
函数Z =编码器(参数、tspan X, args)参数tspan X args参数。掩码= dlarray(真正的(大小(X)),“认知行为治疗”)结束掩码= args.Mask;%逆转时间。tspan =翻转(tspan, 2);X =翻转(X, 3);掩码=翻转(面具,3);%初始化RNN的隐藏状态。hiddenSize =大小(parameters.gru.RecurrentWeights, 2);[~,batchSize sequenceLength] =大小(X);h = 0 (hiddenSize, batchSize = X);h = dlarray (h,“CB”);latentSize =大小(parameters.ODE.fc1.Weights, 2);%解决ODE-RNN在一个循环中。为t = 1: sequenceLength-1 ZPrev = h (1: latentSize,:);%解决ODE。Zt型=欧拉(@odeModel [tspan (t) tspan (t + 1), ZPrev, parameters.ODE);%连接RNN的输入数据输入在香奈儿维度。Zt型= dlarray (Zt型,“认知行为治疗”);Xt = X (:,:, t);Zt型=猫(1、Zt型Xt);% RNN的一步。inputWeights = parameters.gru.InputWeights;recurrentWeights = parameters.gru.RecurrentWeights;偏见= parameters.gru.Bias;[Z, hnew] =格勒乌(Zt型h, inputWeights recurrentWeights,偏差);%更新RNN状态,数据不会丢失。h = hnew。*面具(:,:,t) + h。* (1-mask (:,:, t));结束%应用输出变换。重量= parameters.fc1.Weights;偏见= parameters.fc1.Bias;Z = fullyconnect (Z,重量、偏差);Z =双曲正切(Z);重量= parameters.fc2.Weights;偏见= parameters.fc2.Bias;Z = fullyconnect (Z,重量、偏差);结束
译码器的功能
的译码器
函数,介绍了定义模型函数部分的示例中,需要解码器可学的参数作为输入,目标时间戳tspanTarget
和潜在的表示Z
。函数返回到目标时间戳相对应的预测值。
这个图表显示了译码器的结构。
函数Y =解码器(参数、tspanTarget Z)%应用神经颂歌操作。Y = dlode45 (parameters.ODE @odeModel, tspanTarget, Z,…RelativeTolerance = 1 e - 3,…AbsoluteTolerance = 1的军医);%连接在时间维度。Z = dlarray (Z,“认知行为治疗”);Y =猫(3,Z, Y);%应用完全连接操作。重量= parameters.fc.Weights;偏见= parameters.fc.Bias;Y = fullyconnect (Y,重量,偏差);结束
损失函数模型
的modelLoss
函数,模型可学的参数作为输入,源时间戳tspan
,相应的序列值和面具。函数返回的梯度模型损失和损失对可学的参数。
模型损失函数使用 损失数量的输入样本的观察和规范化。
函数(损失,梯度)= modelLoss(参数、tspan X,面具,T)%模型传球前进。tspanDecoder = tspan;Y =模型(参数、tspan X, tspanDecoder面具=面具);%重建的损失。损失= = l2loss (Y, T,减少“没有”);%规范化non-missing元素的数量。损失=总和(损失,3[1])。/笔(面具,[1 3]);=意味着损失(损失);%梯度。梯度= dlgradient(损失、参数);结束
模型的预测函数
的modelPredictions
函数,模型可学的参数作为输入,源时间戳tspan
、mini-batch队列的数据和目标时间戳tspanTarget
。函数返回该模型预测Y
。
函数Y = modelPredictions (tspanTarget参数、tspan兆贝可),Y = [];而hasdata(兆贝可)%读mini-batch验证数据。X =下一个(兆贝可);%模型传球前进。YBatch =模型(参数、tspan X, tspanTarget);Y =猫(2 Y YBatch);结束结束
ODE模型函数
这个函数odeModel
作为输入函数的输入t
(未使用),y
卷积和ODE函数参数包含重量和偏见。函数返回的输出神经网络有三个完全连接层与双曲正切操作。
编码器和解码器使用神经的颂歌。神经颂歌是颂歌形式的问题 在哪里 是一个与输入神经网络 和可学的参数 。在这种情况下,编码器和译码器神经颂歌使用相同的神经网络 包括三个完全使用双曲正切激活它们之间的连接操作。
这个图表显示了神经网络的结构。
函数z = odeModel (~ y参数)权重= parameters.fc1.Weights;偏见= parameters.fc1.Bias;z = fullyconnect (y,重量,偏差);z =双曲正切(z);重量= parameters.fc2.Weights;偏见= parameters.fc2.Bias;z = fullyconnect (z,重量、偏差);z =双曲正切(z);重量= parameters.fc3.Weights;偏见= parameters.fc3.Bias; z = fullyconnect(z,weights,bias);结束
Mini-Batch预处理功能
的preprocessMiniBatch
函数使用这些步骤:预处理数据
预处理使用的预测因子
preprocessMiniBatchPredictors
函数。创建一个mini-batch目标相匹配的输入数据。
随机集50序列数据为零的时间步骤,创建一个面具表明缺失值。
函数[X,面具,T] = preprocessMiniBatch(伊势亚)X = preprocessMiniBatchPredictors(伊势亚);掩码= true(大小(X));T = X;%去除随机时间的步骤。[~,numObservations numTimestamps] =大小(X);为n = 1: numObservations idx = randsample (numTimestamps, 50);idx = (idx)进行排序;X (: n idx) = 0;面具(:n idx) = false;结束结束
小批量预测预处理功能
的preprocessMiniBatchPredictors
函数进行预处理mini-batch预测通过提取出序列数据从输入单元阵列,将它变成一个数字阵列连接的内容第二个维度。
函数X = preprocessMiniBatchPredictors(伊势亚)X =猫(2,伊势亚{:});结束
向前欧拉解算器
的欧拉
函数作为输入ODE函数f
,时间的内部t
,输入值y
、颂歌参数和可选名称参数MaxStepSize
,指定步长迭代间隔。远期欧拉函数返回的输出。向前欧拉函数是一个快速的ODE求解器但是通常比自适应少准确和灵活解决歌唱等dlode45
。
函数欧拉(y = f t y参数,参数)参数f t y参数arg游戏。StepSize = 0.1;结束stepSize = args.StepSize;t1 = t (1);t2 = t (2);t2 = min (t2, t1 - stepSize);tspan = t1: stepSize: t2;y = y;为i = 1:元素个数(tspan) 1 y = y + (t - t (i + 1)(我))* f (t y参数);结束结束
参考书目
[1],瑞奇·t·Q。,Yulia Rubanova, Jesse Bettencourt, and David Duvenaud. “Neural Ordinary Differential Equations.” Preprint, submitted December 13, 2019. https://arxiv.org/abs/1806.07366
[2]尤利娅•Rubanova瑞奇·t·陈,大卫Duvenaud。“潜在的常微分方程Irregularly-Sampled时间序列“预印本,2019年7月8日提交。https://arxiv.org/abs/1907.03907
[3]Diederik P Kingma,麦克斯威灵电机。“Auto-Encoding变分贝叶斯。”Preprint, submitted, submitted December 20, 2013. https://arxiv.org/abs/1312.6114
另请参阅
dlode45
|dlarray
|dlfeval
|dlgradient
|fullyconnect
|minibatchqueue
|l2loss
|格勒乌