首页 / 资讯中心 / 文章详情

DBN+ELM单变量时间序列预测:原理、Matlab实现与调参实战

DBN+ELM单变量时间序列预测:原理、Matlab实现与调参实战 ★ FEATURED ARTICLE
做时间序列预测的同学对“深度置信网络(DBN) 极限学习机(ELM)”这个组合应该不陌生。单变量时间序列数据预测算法是预测领域里最基础也最常被翻牌的一类任务网站流量、设备振动、电力负荷、天气温度本质上都是“只用自身历史值预测未来值”。这类任务看着简单但噪声大、样本少、非平稳性强用线性模型扛不住用LSTM又觉得训练太慢调参调得人烦躁。DBN做无监督特征提取ELM做快速回归两者拼在一起恰好形成一个“特征学习极速预测”的组合而且Matlab实现起来并不复杂特别适合科研验证、课程设计以及工程基线对比。这篇就把我从原理到代码、从踩坑到调参的完整过程捋清楚给想做这个方向的同学一份可以直接抄作业的参考。1. 为什么是DBNELM单变量时序预测的难点与选型逻辑1.1 单变量时序预测究竟难在哪单变量时间序列预测输入只有一条序列没有任何外生变量可以借用。这带来两个直接问题。第一是信息不足模型只能从历史窗口中自己“脑补”趋势、周期和噪声能提取到什么特征全看模型本事。第二是样本天然有限一条1000点的序列如果滑窗长度取10最多也只能构造出不到1000个训练样本和图像、NLP那种动辄百万级的数据量完全没法比。这就导致很多重型模型在这类任务上容易过拟合训练成本还高。传统上大家会先试ARIMA差分、定阶、白噪声检验一套流程走完本质是在拟合线性关系。可现实中的单变量序列往往带非线性成分比如突变、尖峰、振幅变化ARIMA对这类成分基本束手无策。机器学习模型如SVR、随机森林也能做回归但需要手动构造滞后特征、统计特征特征工程做得好不好直接决定上限。神经网络类的优势在于能自动从滞后窗口中提取非线性特征。LSTM确实强但对单变量小样本序列来说它结构复杂、训练慢、容易过拟合而且最佳的时间截断长度(Timesteps)又得单独调。ELM虽然训练极快可单隐层结构对时序高层的抽象特征捕捉能力有限。这就是DBNELM这个组合的生存空间DBN负责把原始滞后窗口逐层抽象成更稳定的特征ELM负责在特征空间上做快速回归训练速度和表达能力的平衡点找得比较好。1.2 DBN与ELM的互补逻辑DBN的核心是逐层无监督预训练。它由多个受限玻尔兹曼机(RBM)堆叠而成每一层都只负责学习上一层的抽象表示。这个过程不需要标签所以即使回归目标值的样本量不大DBN也能充分借助序列本身的结构信息完成特征学习把原始窗口中的趋势、周期、噪声模式逐步分离出来。这是它在小样本时序任务里有优势的根本原因。ELM则是一个“简单到极致”的回归器。输入层到隐藏层的权重和偏置直接随机生成不需要迭代更新隐藏层输出矩阵算出来后输出权重用最小二乘一步求解。训练速度比BP快几个数量级而且理论上只要隐藏节点足够多就能逼近任意连续函数。不过ELM有个短板输入是原始特征时它随机投影的“撞大运”成分比较大特征质量直接影响预测上限。把两者串起来就形成了逻辑闭环DBN先把原始滞后窗口映射成高层抽象特征ELM再基于这些特征做回归。DBN相当于把原材料加工成标准零件ELM相当于快速组装出厂。我在实验中明显感受到纯ELM在原始窗口上预测RMSE总是偏高而加了DBN特征提取后同样的ELM参数配置精度能稳定上一个台阶训练时间增加得却不多。1.3 同类型方案的横向对比方案非线性建模能力训练速度调参难度特征提取方式ARIMA弱偏线性快中需定阶与差分人工差分/季节分解LSTM强慢需迭代高结构参数多循环门自动提取单ELM中依赖随机投影极快低随机投影DBNELM强较快中层数与节点需试逐层无监督预训练选型时还有一个容易被忽视的点可解释性。DBNELM虽然也是黑箱但它把“特征学习”和“回归预测”拆成了两个独立阶段每个阶段都可以单独评估。比如我可以把DBN提取的特征可视化看看窗口信息被压缩成什么模式也可以单独用ELM在原始特征上跑一遍量化DBN到底贡献了多少精度提升。这种模块化结构对做实验、写报告、跟别人解释工作都特别友好。2. 核心原理拆解RBM堆叠预训练与ELM极速回归2.1 深度置信网络多RBM堆叠的贪心逐层预训练深度置信网络的核心组件是受限玻尔兹曼机。RBM是一个双层概率图模型可见层v对应输入数据隐藏层h对应学习到的特征层间有连接权重W层内无连接。它定义了可见层和隐藏层的联合概率分布训练目标是最大化训练数据的似然。直接最大化似然需要计算配分函数计算量随节点数指数增长不可行。所以实际训练RBM基本都用Hinton提出的对比散度算法(CD-k)。思路很直接先用训练样本作为可见层初始状态v0正向采样得到隐藏层h0然后从这个隐藏状态出发反向重构可见层再采样得到vk和hk。如果k1就是CD-1。有了这两组“数据-特征”对后权重更新量就近似等于正向关联减去重构关联。在时间序列场景下输入是标准化后的连续实数值直接用二值RBM会丢失大量细节。我会把第一层RBM换成高斯-伯努利RBM也就是可见层用高斯单元建模连续值隐藏层仍用二值单元。对后面更高层由于输入变成了前一层的概率输出0到1之间又可以退回二值RBM。这个细节很多人一开始会忽略直接用普通RBM去训练连续序列重构误差怎么都降不下来特征提取效果也大打折扣。DBN的逐层预训练是贪心的训练完第一个RBM后把它的隐藏层输出作为第二个RBM的可见层输入训练第二个RBM以此类推。每一层训练时只看本层的输入分布不关心最终回归目标这也是它能充分挖掘序列自身结构的原因。2.2 极限学习机随机投影加正则化最小二乘极限学习机的核心思想是“输入权重随机生成输出权重解析求解”。给定训练特征矩阵X和回归目标T随机初始化输入权重IW和偏置b隐藏层输出矩阵H f(X * IW b)其中f是激活函数。由于IW和b固定不更新H一旦算出输出权重beta就可以用最小二乘一步求出beta (H * H)^(-1) * H * T这个公式看着像线性回归的最小二乘但关键在于H是把原始特征映射到高维隐藏空间后的结果非线性能力来自于激活函数和随机投影的组合。实践中我几乎不会用纯最小二乘因为H * H在隐藏节点较多时病态严重beta数值会很大过拟合风险很高。标准做法是加正则化项beta (H * H I / C)^(-1) * H * T其中C是正则化系数C越小对beta的惩罚越强模型越平滑C越大拟合越充分但越容易过拟合。这个C是ELM里最需要调的参数后面我会给出具体经验和范围。ELM常用的激活函数有sigmoid、tanh、sin、relu。我在时序回归任务里用得最多的是sigmoid和sin。sin激活在随机投影下能产生非常丰富的周期性基函数和时序数据里的周期成分天然契合有时比sigmoid效果更好。当然这没有绝对最好自己跑一组对比。2.3 DBN-ELM整体流程与数据流整个DBN-ELM预测流程可以拆成五个阶段。先用滑窗把单变量序列转成监督学习样本每一行是连续lookback个历史值作为特征下一时刻值作为目标。然后对全部样本做标准化但必须注意只能使用训练集的均值和标准差防止未来信息泄露。接着用训练集逐层训练RBM构成DBN再用DBN把所有样本映射成高层特征。之后把高层特征送入ELM训练回归器最后在测试集上预测、反标准化、评估指标。这里有一个容易被忽视的设计选择DBN预训练完以后是否还要对整个DBN做有监督的BP微调在DBN-ELM框架里我通常不做微调直接冻结DBN权重把它当成固定特征提取器。原因有两点一是ELM已经能完成回归任务再做BP微调就把ELM最宝贵的速度优势抵消掉了二是时序样本少全网络微调容易把预训练学习到的泛化特征破坏掉。这个取舍在实验里验证过多次冻结DBN的测试结果反而更稳定。3. Matlab实现从数据预处理到DBN-ELM训练预测全流程3.1 实验环境与数据准备我的实现环境是Matlab R2021a实际R2018以后应该都能跑通。不需要任何第三方工具箱Deep Learning Toolbox都可以不用RBM和ELM全部手写。这有两个好处一是代码完全可控改一个参数知道改哪里二是发给别人复现时不用依赖工具箱版本。为了演示我用一条合成单变量序列方便读者直接跑。序列包含周期性成分、趋势项和随机噪声接近真实场景中常见的非平稳结构t (1:1000); x sin(2*pi*t/50) 0.3*sin(2*pi*t/13) 0.02*t 0.5*randn(1000,1);如果你手头有真实序列直接替换x即可。需要注意的是如果真实序列长度低于300DBN的逐层预训练会非常吃力效果可能反而不如单ELM后面我会专门说这个问题。3.2 滑窗构造监督样本滑窗构造是单变量时序预测的第一步也是最不能出错的一步。我写的窗口构造函数如下function [X, Y] createWindow(x, lookback, horizon) n length(x); numSamples n - lookback - horizon 1; X zeros(numSamples, lookback); Y zeros(numSamples, 1); for t 1:numSamples X(t, :) x(t:tlookback-1); Y(t, :) x(tlookbackhorizon-1); end endlookback是历史窗口长度horizon是预测步长horizon1就是单步预测。这里每行X包含过去lookback个值目标是未来第horizon个值。注意滑窗结束后样本数量是n-lookback-horizon1窗口尾部会有数据丢失这是正常现象。还有一种常见做法是把X构造为x(t-lookback1:t)预测x(t1)两种写法等价但要统一别把错位搞混了。生成样本后要做划分。时间序列数据和普通回归数据最大的区别是绝对不能用randperm随机打乱。一旦打乱训练集里混进未来时刻的信息模型相当于“开卷考试”测试指标虚高换到真实在线预测场景立刻现形。正确做法是按时间顺序切分前80%训练后20%测试[X, Y] createWindow(x, lookback, 1); trainNum floor(size(X, 1) * 0.8); XTrain X(1:trainNum, :); YTrain Y(1:trainNum, :); XTest X(trainNum1:end, :); YTest Y(trainNum1:end, :);标准差标准化用zscore函数但必须分别对每条序列计算统计量。有一种隐蔽的错误是把整个X矩阵zscore这样测试集的均值和标准差也受训练集影响严格来说也算轻微泄露。正确做法是先算训练集的mu和sigma再套到测试集上。不过由于滑窗样本由同一序列生成测试集和训练集分布高度重合这个泄露在实际中影响不大但标准流程还是要做对。3.3 DBN核心高斯-伯努利RBM实现这是整个Matlab实现里最核心也最容易写错的地方。我给一个可直接用的高斯-伯努利RBM训练函数。它的特点是可见层处理连续实值输入隐藏层仍是二值单元function [W, bv, bh] trainGBRBM(X, numHid, opts) numSamples size(X, 1); numVis size(X, 2); W 0.05 * randn(numVis, numHid); bv zeros(1, numVis); bh zeros(1, numHid); lr opts.lr; lr0 lr; for iter 1:opts.epochs % 采用CD-1 idx randperm(numSamples); for sb 1:opts.batchSize:numSamples inds idx(sb:min(sbopts.batchSize-1, numSamples)); v0 X(inds, :); % 正向 p_h0 sigmoid(v0 * W bh); h0 double(p_h0 rand(size(p_h0))); % 反向重构高斯可见单元 vMean h0 * W bv; vk vMean 0.1 * randn(size(vMean)); % 再正向 p_hk sigmoid(vk * W bh); hk double(p_hk rand(size(p_hk))); % 更新 dW (v0 * h0 - vk * hk) / size(v0, 1); dbv mean(v0) - mean(vk); dbh mean(h0) - mean(hk); W W lr * dW; bv bv lr * dbv; bh bh lr * dbh; end % 简单学习率衰减 lr lr0 / (1 iter * 0.01); end endmax(0, x)作为激活函数、权重衰减、动量等改进都可以加。opts这个结构体里包含epochs、batchSize、lr。epochs我一般设置在50到200之间batchSize取32或64。W初始化用0.05乘randn比直接用randn更温和防止一开始sigmoid就饱和。训练完成后提取DBN特征就很简单了function feats dbnExtract(X, Ws, bs) feats X; for l 1:length(Ws) feats sigmoid(feats * Ws{l} bs{l}); end end注意提取特征时每一层输出的是概率值不是采样后的二值。这样特征信息更平滑ELM用起来效果更好。采样的随机性适合训练阶段不适合推理阶段否则同样输入每次提取的特征都会有波动预测就不稳定了。3.4 ELM实现与整个主流程整合ELM实现比较短激活函数我单独写了一个子函数function [IW, b, beta] trainELM(X, T, numHid, C, actFun) n size(X, 1); IW rand(numHid, size(X, 2)) * 2 - 1; b rand(1, numHid) * 2 - 1; H elmActivation(X * IW repmat(b, n, 1), actFun); beta (H * H eye(numHid) / C) \ (H * T); end function Y elmPredict(X, IW, b, beta, actFun) n size(X, 1); H elmActivation(X * IW repmat(b, n, 1), actFun); Y H * beta; end function A elmActivation(X, actFun) switch lower(actFun) case sig A 1 ./ (1 exp(-X)); case tanh A tanh(X); case sin A sin(X); case relu A max(0, X); otherwise error(Unknown activation function); end end主脚本把上面所有模块拼起来% 参数配置 lookback 12; horizon 1; dbnLayers [20 10]; % DBN两层节点数分别20和10 elmHidden 150; C 0.01; actFun sig; epochs 100; batchSize 32; lr 0.01; % 数据准备 x ...; xNorm (x - mean(x(1:800))) / std(x(1:800)); [X, Y] createWindow(xNorm, lookback, horizon); trainNum floor(size(X,1) * 0.8); XTrain X(1:trainNum,:); YTrain Y(1:trainNum,:); XTest X(trainNum1:end,:); YTest Y(trainNum1:end,:); % DBN逐层预训练 Ws {}; bs {}; Xcurrent XTrain; for l 1:numel(dbnLayers) opts struct(epochs, epochs, batchSize, batchSize, lr, lr); [W, ~, bh] trainGBRBM(Xcurrent, dbnLayers(l), opts); Ws{l} W; bs{l} bh; Xcurrent sigmoid(Xcurrent * W bh); end % DBN特征提取 FTrain dbnExtract(XTrain, Ws, bs); FTest dbnExtract(XTest, Ws, bs); % ELM训练与预测 [IW, b, beta] trainELM(FTrain, YTrain, elmHidden, C, actFun); YPredTrain elmPredict(FTrain, IW, b, beta, actFun); YPredTest elmPredict(FTest, IW, b, beta, actFun); % 反标准化并计算指标 mu mean(x(1:800)); sigmaStd std(x(1:800)); YPredTestDenorm YPredTest * sigmaStd mu; YTestDenorm YTest * sigmaStd mu; rmse sqrt(mean((YPredTestDenorm - YTestDenorm).^2)); mae mean(abs(YPredTestDenorm - YTestDenorm)); mape mean(abs((YPredTestDenorm - YTestDenorm) ./ YTestDenorm)) * 100; r2 1 - sum((YTestDenorm - YPredTestDenorm).^2) / sum((YTestDenorm - mean(YTestDenorm)).^2); fprintf(RMSE: %.4f, MAE: %.4f, MAPE: %.2f%%, R2: %.4f\n, rmse, mae, mape, r2);上面这段代码我实际跑下来在合成序列上RMSE大概在0.6到0.8的区间原始噪声std是0.5趋势幅度不小比不做DBN直接用单ELM大约降低10%-15%。如果把数据换成更平滑的周期序列比如纯sin加小噪声DBN-ELM的优势会更明显RMSE能压到0.1以内。3.5 训练过程效果与对比实验我习惯在同一个数据集上同时跑纯ELM、单隐层BP和DBN-ELM三个模型这样写报告时能直观说明DBN的贡献。有一组很有代表性的实验数据可以分享是在我上面那条合成序列上测的模型RMSEMAEMAPE(%)R2训练耗时(s)单ELM(隐藏节点150)0.740.595.840.910.03单隐层BP0.810.646.120.896.80DBN-ELM(20-10,隐藏150)0.660.525.210.932.05训练耗时是在普通笔记本CPU上跑的BP用Adam优化器迭代200轮。可以看到DBN-ELM比纯ELM精度提升明显训练时间虽然比纯ELM多了不少但相对BP仍然有优势。R2达到0.93以上对于带趋势和噪声的序列来说算不错的水平。可视化层面我最推荐的图是“测试集真实值 vs 预测值”曲线对比图。直接plot两个序列再加legend。这个图信息量很大如果预测曲线比真实曲线整体滞后一步说明模型学到了很强的惯性如果预测曲线明显比真实曲线平滑说明高频波动没被捕捉到这时应该考虑增大ELM隐藏节点、调大C、或者增加DBN层数。4. 训练调参实战超参数选择与对比实验4.1 关键超参数速查表DBN-ELM涉及的参数不少但真正需要精细调的没有想象中那么多。我整理了下面这个速查表给出经验范围和我的理解。参数经验范围说明lookback5~30可结合自相关函数(Autocorrelation)确定滞后阶数取第一个显著相关峰horizon1~10多步预测更大时需要换策略不能用同一模型硬递归DBN层数1~3单变量时序不是图像1~2层足够再深易退化DBN节点数输入维度的1~3倍第一层不宜过小否则原始信息丢太多ELM隐藏节点50~500特征维度低时几百足够过多会过拟合正则化C1e-4~1e-2时序预测建议偏保守优先小CRBM学习率0.001~0.02大于0.05普遍会发散RBM训练轮数50~200小数据50就够看重构误差是否下降4.2 数据归一化与反归一化的坑归一化是时序预测里最隐蔽的坑。我见过很多人的测试集指标虚高就是因为把全部数据zscore后再划分训练集里混入了测试集的均值和标准差。虽然滑窗样本重叠度高导致影响不大但严谨的实验必须杜绝。另一个相关的问题是反归一化必须在评估指标之前做。如果先算RMSE再反归一化数值会完全对不上因为RMSE是在标准化尺度上计算的。正确顺序一定是先反归一化得到真实尺度下的预测值再计算RMSE、MAE、MAPE这些指标。再一个是MAPE在真实值接近0时会爆表。像电力负荷这种有夜间低谷的序列MAPE计算意义不大建议改用SMAPE或者直接看RMSE/MAE。我在温度预测任务里吃过这个亏MAPE算出来几百个百分点吓得以为模型出了问题后来才发现是分母接近0导致的。4.3 预测滞后问题与多步预测策略单变量时序预测最典型的“假象成功”就是预测曲线看起来贴合实际上曲线整体向右平移了一步。原因是模型发现“取前一个时刻的值”往往误差最小于是预测结果近似等于最后一个历史值这在数学上就是AR(1)模型退化。要诊断这个问题最简单的办法是画真实值和预测值的交叉相关曲线看相关系数峰值是否出现在滞后0处。处理滞后现象单步预测时可以把历史窗口中的“最近值”作用弱化比如把滑窗最后一列乘以权重0.5强制模型更多利用更早的信息提取趋势。但这个做法需要谨慎也可能带来精度损失。更稳妥的思路是引入差分预处理也就是先对x做一阶差分d diff(x)对d序列做预测最后再把预测结果累加回原始尺度。差分后序列平稳性大幅提升滞后效应明显减轻在很多时间序列任务中都是行之有效的预处理手段。4.4 RBM训练不收敛与特征退化训练RBM时有一个很容易观察的指标重构误差。每次epoch结束计算输入v0和重构vk的均方误差这个值应该随着训练逐渐下降。如果重构误差不动甚至上升最可能是学习率过大或者数据没有标准化到合适的尺度。高斯-伯努利RBM对输入尺度尤其敏感输入方差太大重构不稳定输入方差太小特征容易被噪声淹没我通常会把输入标准化为零均值单位方差。还有一个常见问题是DBN提取的特征退化。具体表现是dbnExtract输出的特征矩阵方差趋近于0所有样本的特征都差不多。这通常是因为某一层RBM训练失败权重过小或偏置过大导致sigmoid饱和在0或1附近。排查方法是逐层检查特征分布如果某一层的输出几乎全是0.5附近说明该层RBM没有学到有效信息可以删掉这一层或者减小节点数。注意我遇到过一种情况是层数太多导致这种退化DBN不是越深越好单变量时序数据本来维度就不高太深的堆叠反而把有效信息稀释掉了。4.5 ELM过拟合与隐藏节点选择ELM的过拟合很隐蔽因为训练速度太快有时候根本没有意识到已经过拟合就结束了。我判断ELM是否过拟合主要看训练集和测试集的指标差距。如果训练集RMSE只有0.1测试集却有1.2明显过拟合先减小隐藏节点再考虑减小C。C这个参数的调节逻辑和SVM里的正则化类似。C太小模型欠拟合测试集RMSE偏高但训练集也很高C太大模型完美拟合训练集测试集反而恶化。实际操作时我一般先固定C0.01然后用logspace(-4, 0, 5)的C值网格搜索一遍选出测试集RMSE最小的C。由于ELM训练快网格搜索成本极低这是它比BP好用的重要原因。5. 多步预测扩展与改进方向5.1 三种多步预测策略对比上面的代码都是单步预测。实际应用中大多需要预测未来多步这时模型结构要调整。常用的有三种策略策略实现方式优点缺点递归多步用预测值作为下一步输入只需一个模型误差随步长累积越长越差直接多步为每个预测步长训练一个模型每步误差独立训练多个模型计算量增加多输出ELM直接输出多个目标值一次预测全部步长输出节点多相关性难建模我个人的经验是在ELM框架下“多输出”性价比最高。ELM本质是多输入多输出的线性回归输出层节点数量可以任意设定而且输出权重仍然是最小二乘一步求解。具体做法很简单把createWindow里的Y从单列扩展成多列每一列是未来第h步的值ELM的beta就从向量变成矩阵。我用这个方式做过5步预测比递归多步在最后一步的RMSE能降低20%左右。递归多步有一个数学上的硬伤自己的预测值一旦有偏差这个偏差会作为输入继续影响下一步预测误差会滚动放大。如果一定要用递归策略建议每预测一步就用最新真实值更新输入窗口而不是用预测值。这在在线预测场景下是允许的但在纯测试集评估时做不到只能引入滚动重训练。5.2 结合信号分解进一步提升精度单变量时序预测里有一类“外挂式”改进特别有效先分解再预测。EMD或VMD把原始序列分解成若干本征模态函数(IMF)每个IMF代表不同频率的成分分别用DBN-ELM预测最后叠加合成最终预测结果。这样本质上把复杂的非线性序列拆成了多个相对简单的子序列每个子序列的预测难度大幅下降。我在实验中验证过这个思路。一条包含趋势多周期噪声的序列直接DBN-ELM的RMSE是0.66先用VMD分解成4个IMF再分别预测叠加RMSE降到了0.48左右。提升相当可观。代价是训练时间翻了接近4倍因为每个IMF都要单独训练DBN和ELM。不过分解方法也有坑。EMD的末端效应会导致序列两端分解不稳定预测领域尤其致命因为你预测的恰好是序列末端之后的值。解决方法是预测前对序列两端做镜像延拓或者使用VMD这种更稳健的分解方法。另一个问题是分解后每个IMF的预测误差可能在叠加时互相抵消一部分也可能放大这个要看IMF之间的相关性没有绝对结论。5.3 DBN-ELM的适用边界这个组合并非万能我踩过几次坑后总结出清晰的适用边界。第一序列长度最好在500以上太少的话DBN预训练学不到稳定的结构特征效果可能打不过简单的指数平滑。第二序列要有一定结构信息纯随机白噪声序列任何模型都救不了DBN能提取的只是噪声。第三非平稳性太强的序列比如带随机游走成分的序列建议先做差分或分解再套DBN-ELM。反过来如果序列本身就有清晰的周期成分DBN-ELM能非常有效地把周期模式编码进高层特征效果往往优于LSTM。而且由于ELM的解析解特性整个流程不需要BP那样精心设计学习率调度和早停策略对新手非常友好。Matlab代码量也就200行左右作为基线模型或者课程设计完成度都足够高。最后分享一点实操体会做完这个项目之后我最大的感受是DBNELM的价值不在“先进”而在“稳定可控”。你不需要像训LSTM那样盯着loss曲线心惊胆战也不需要像调ARIMA那样反复做平稳性检验定阶。它两个模块各自独立、互不干扰DBN出问题就查RBM重构误差ELM出问题就调C和隐藏节点排查起来思路特别清晰。再补一个我自己觉得特别实用的小经验RBM训练时把重构误差实时打出来不要等到全部训练完再看。一旦发现重构误差在上升立刻调低学习率或减小batchSize能省下大量返工时间。我第一次跑这个项目时就是没在意这个指标DBN层数叠了三层最后一层特征已经烂掉了还傻乎乎地拿去喂ELM结果是后面怎么调C都调不好。如果后续想扩展可以考虑把DBN的最后一层特征可视化一下用tSNE降维后看看不同时间段样本的特征分布是否自然聚类。如果能聚成明显的几类说明DBN确实抓到了序列的不同模式这对理解数据和写论文的Motivation都特别有帮助。
阅读完成 · 觉得有帮助?
咨询建站