使用贝叶斯优化选择LSTM的训练配置
这个例子展示了如何创建一个深度学习实验,使用贝叶斯优化为长短期记忆(LSTM)网络找到最优的网络超参数和训练选项。在本例中,使用实验管理器训练LSTM网络,预测发动机的剩余使用寿命(RUL)。实验使用了[1]中描述的涡扇发动机退化模拟数据集(见参考文献).有关处理此数据集以进行序列到序列回归的详细信息,请参见使用深度学习的序列到序列回归.
贝叶斯优化提供了一种在实验中清除超参数的备选策略。您可以为每个超参数指定一个值范围,并选择一个要优化的指标,实验管理器将搜索优化所选指标的超参数组合。贝叶斯优化需要统计和机器学习工具箱™。有关更多信息,请参见利用贝叶斯优化调优实验超参数.
RUL捕获发动机在故障前可以运行多少个循环。为了集中关注引擎接近故障时的序列数据,可以通过在指定的阈值处剪切响应来预处理数据。这种预处理操作允许网络通过相等地处理具有较高RUL值的实例,从而专注于接近失败的预测器数据行为。例如,该图显示了第一个响应观测值和对应的剪切响应,阈值为150。
当你训练一个深度学习网络时,你如何预处理数据,层数和隐藏单元的数量,以及网络中的初始学习率都会影响网络的训练行为和性能。选择LSTM网络的深度需要平衡速度和精度。例如,深度网络可以更准确,但需要更长的时间来训练和收敛[2]。
默认情况下,当您运行用于回归的内置训练实验时,实验管理器会计算实验中每个试验的损失和均方根误差(RMSE)。这个例子通过使用特定于问题数据集的自定义度量来比较网络在每次试验中的性能。有关使用自定义度量函数的详细信息,请参见利用度量函数评估深度学习实验.
开放实验
首先,打开示例。实验管理器加载带有预先配置的实验的项目。打开实验,在实验的浏览器,双击实验名称(SequenceRegressionExperiment
).
内置的训练实验由描述、超参数表、设置函数和用于评估实验结果的度量函数集合组成。使用贝叶斯优化的实验包括额外的选项来限制实验的持续时间。有关更多信息,请参见配置内置训练实验.
的描述字段包含实验的文本描述。对于本例,描述如下:
用序列回归法预测发动机剩余使用寿命。本实验比较了在改变数据阈值级别、LSTM层深度、隐藏单元数量和初始学习速率时,贝叶斯优化的网络性能。
的Hyperparameter表指定策略(贝叶斯优化
)和用于实验的超参数值。对于每个超参数,指定以下选项:
范围—输入两元向量,给出实值或整值超参数的上界和下界,或者输入字符串数组或单元格数组,列出类别超参数的可能值。
类型——选择
真正的
(实值hyperparameter),整数
(整值超参数),或分类
(分类hyperparameter)。变换——选择
没有一个
(没有变换)或日志
(对数变换)。为日志
时,超参数必须为真正的
或整数
和积极的。使用此选项,将在对数刻度上搜索超参数并对其建模。
当您运行实验时,实验管理器会搜索超参数的最佳组合。每次试验都使用基于前一次试验结果的超参数值的新组合。下面的例子使用了这些超参数:
阈值
将所有高于阈值的响应数据设置为与阈值相等。为了防止统一响应数据,请使用大于或等于150的阈值。为了将设定的允许值限制在150、200和250,实验模型阈值
作为一个分类超参数。LSTMDepth
网络中使用的LSTM层数。指定该超参数为1到3之间的整数。NumHiddenUnits
确定网络中使用的隐藏单元的数量,或每个时间步骤存储的信息量。增加隐藏单元的数量会导致数据过拟合和训练时间变长。减少隐藏单元的数量会导致数据欠拟合。将此超参数指定为50到300之间的整数。InitialLearnRate
指定用于训练的初始学习率。如果学习率太低,那么训练就需要很长时间。如果学习率太高,那么训练可能会达到次优结果或发散。最佳学习率取决于你的数据以及你正在训练的网络。实验在对数尺度上对这个超参数建模,因为值的范围(0.001到0.1)跨越了几个数量级。
下贝叶斯优化选项,您可以通过输入最大时间(以秒为单位)和要运行的最大试验次数来指定实验的持续时间。为了最好地利用贝叶斯优化的力量,至少要执行30个目标函数评估。
的设置函数为实验配置训练数据、网络架构和训练选项。setup函数的输入是一个包含超参数表字段的结构。setup函数返回四个输出,用于训练图像回归问题的网络。在本例中,setup函数有三个部分。
加载和预处理数据下载并提取涡扇发动机退化仿真数据集https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/[3]。设置函数的这一部分还过滤出常值特征,将预测器数据归一化,使其具有零平均值和单位方差,通过使用超参数的数值来剪辑响应数据
阈值
,并随机选择训练样例用于验证。
dataFolder = fullfile(tempdir,“涡扇”);
如果~存在(dataFolder“dir”mkdir (dataFolder);oldDir = cd(dataFolder);文件名=“CMAPSSData.zip”;websave(文件名,“https://ti.arc.nasa.gov/c/6/”,...weboptions (“超时”正);解压缩(文件名,dataFolder);cd (oldDir);结束
fileametrainpredictors = fullfile(数据文件夹,“train_FD001.txt”);[XTrain,YTrain] = processTurboFanDataTrain(filenameTrainPredictors);
XTrain = helpfilter (XTrain);XTrain = helpnormalize (XTrain);
thr = str2double(params.Threshold);为i = 1:数字(YTrain) YTrain{i}(YTrain{i} > thr) = thr;结束
为i=1:数字(XTrain)序列= XTrain{i};sequenceLengths(i) = size(sequence,2);结束
[~,idx] = sort(sequenceLengths,“下”);XTrain = XTrain(idx);YTrain = YTrain(idx);
idx = randperm(数字(XTrain),10);XValidation = XTrain(idx);XTrain(idx) = [];YValidation = YTrain(idx);YTrain(idx) = [];
定义网络架构定义用于序列到序列回归的LSTM网络的体系结构。该网络由LSTM层和大小为100的全连接层以及退出概率为0.5的退出层组成。的hyperparameters
LSTMDepth
而且NumHiddenUnits
指定LSTM层数和每层的隐藏单元数。
numResponses = size(YTrain{1},1);featureDimension = size(XTrain{1},1);LSTMDepth = params.LSTMDepth;numHiddenUnits = params.NumHiddenUnits;
layers = sequenceInputLayer(featureDimension);
为i = 1:LSTMDepth layers = [layers;lstmLayer(numHiddenUnits,OutputMode=“序列”));结束
layers = [layers fullyConnectedLayer(100) reluLayer() dropoutLayer(0.5) fullyConnectedLayer(numResponses) regressionLayer];
指定培训项目定义实验的训练选项。由于更深的网络需要更长的时间收敛,因此将epoch的数量设置为300以确保所有网络深度收敛。这个例子每30次迭代验证一次网络。初始学习率等于
InitialLearnRate
值,每15个epoch下降0.2倍。有培训选项ExecutionEnvironment
设置为“汽车”
,如果有GPU,实验可以在GPU上运行。否则,实验管理器使用CPU。因为这个例子比较了网络深度并训练了许多时代,所以使用GPU大大加快了训练时间。使用GPU需要并行计算工具箱™和受支持的GPU设备。金宝app有关更多信息,请参见GPU支金宝app持版本(并行计算工具箱).
maxEpochs = 300;miniBatchSize = 20;
选项= trainingOptions(“亚当”,...ExecutionEnvironment =“汽车”,...MaxEpochs = MaxEpochs,...MiniBatchSize = MiniBatchSize,...ValidationData = {XValidation, YValidation},...ValidationFrequency = 30,...InitialLearnRate =参数。InitialLearnRate,...LearnRateDropFactor = 0.2,...LearnRateDropPeriod = 15,...GradientThreshold = 1,...洗牌=“从不”,...Verbose = false);
要检查设置功能,请按设置函数,点击编辑.在MATLAB编辑器中打开设置函数。此外,设置函数的代码出现在附录1在这个例子的最后。
的指标节指定评估实验结果的可选函数。实验管理器每次完成网络训练后都会评估这些功能。选中指标函数的名称,单击,可以查看指标函数编辑.在MATLAB编辑器中打开度量函数。
发动机RUL的预测需要仔细考虑。如果预测低估了RUL,则可能在必要之前安排发动机维护。如果预测高估了RUL,发动机可能会在运行时发生故障,导致高成本或安全问题。为了帮助缓解这些情况,本示例包含了一个度量函数MeanMaxAbsoluteError
它可以识别出预测不足或过度预测RUL的网络。
的MeanMaxAbsoluteError
Metric计算最大绝对误差,在整个训练集上平均。这个指标调用
函数从训练集中做出一系列RUL预测。然后,在计算每个训练响应与预测响应序列之间的最大绝对误差后,该函数计算所有最大绝对误差的平均值。该指标确定了实际响应和预测响应之间的最大偏差。度量函数的代码出现在附录3在这个例子的最后。预测
运行实验
当您运行实验时,实验管理器会搜索与所选指标相关的超参数的最佳组合。实验中的每次试验都使用基于先前试验结果的超参数值的新组合。
训练需要一些时间。要限制实验的持续时间,可以修改贝叶斯优化选项通过减少最大运行时间或最大试验次数。但是,请注意,运行少于30次的试验会阻止贝叶斯优化算法收敛到最优的超参数集。
默认情况下,实验管理器每次运行一个试验。如果您有并行计算工具箱™,您可以同时运行多个试验,或者将试验卸载为集群中的批处理作业。
下的“实验管理器”工具条上,每次运行一个试验模式中,选择
顺序
并点击运行.同时进行多项试验,在模式中,选择
同时
并点击运行.如果当前没有并行池,experimental Manager将使用默认集群配置文件启动一个并行池。然后,根据可用的并行工作人员的数量,实验管理器执行多个同时进行的试验。为了获得最好的结果,在运行实验之前,启动一个具有与gpu一样多的worker的并行池。有关更多信息,请参见使用实验管理器并行训练网络而且GPU支金宝app持版本(并行计算工具箱).将实验卸载为批处理作业模式中,选择
批处理顺序
或批处理同时
,指明你的集群而且池大小,并单击运行.有关更多信息,请参见将实验作为批处理作业卸载到集群.
结果表显示了每个试验的度量函数值。实验管理器用所选指标的最佳值突出显示试验。例如,在本实验中,第23次试验产生的最大绝对误差最小。
当实验正在运行时,单击培训策划展示训练图,跟踪每次试验的进度。试验完成训练所需的时间随着网络深度的增加而增加。
评估结果
在结果表中,MeanMaxAbsoluteError值量化了网络低估或高估RUL的程度。的验证RMSEValue量化了网络泛化未知数据的能力。要找到实验的最佳结果,请对结果表进行排序,并选择结果最低的试验MeanMaxAbsoluteError而且验证RMSE值。
指向MeanMaxAbsoluteError列。
单击三角形图标。
选择升序排序.
的下拉菜单,找到具有最小验证RMSE的试验验证RMSE列和选择升序排序.
如果没有一个试验使这两个值都最小化,那么选择一个在这两个指标上都排名很好的试验。例如,在这些结果中,试验23具有最小的平均最大绝对误差和第七小的验证RMSE。在验证RMSE较低的试验中,只有试验29具有可比较的平均最大绝对误差。这些试验中哪一个更可取,取决于您是喜欢较低的平均最大绝对误差还是较低的验证RMSE。
要记录对实验结果的观察,请添加注释。
在结果表中,右键单击MeanMaxAbsoluteError最好的审判细胞。
选择添加注释.
在注释窗格,在文本框中输入您的观察结果。
控件重复上述步骤验证RMSE细胞。
要在实验中测试最佳试验,请导出训练好的网络,并显示几个随机选择的测试序列的预测响应序列。
在你的实验中选择最好的试验。
在实验管理器将来发布,点击出口>训练网络.
在对话框窗口中,为导出的网络输入工作区变量的名称。默认名称为
trainedNetwork
.使用导出的网络和
阈值
作为辅助函数输入的网络的值plotSequences
,在附录4在这个例子的最后。例如,在MATLAB命令窗口中输入:
plotSequences (trainedNetwork, 200)
该函数绘制未见测试数据的真实响应序列和预测响应序列。
关闭实验
在实验的浏览器,右键单击项目名称,选择关闭项目.实验管理器关闭项目中包含的所有实验和结果。
附录1:设置函数
该功能配置实验的训练数据、网络架构和训练选项。
输入
参数个数
是一个包含来自experimental Manager超参数表字段的结构。
输出
XTrain
包含训练数据的单元格数组。YTrain
是包含用于训练的回归值的单元格数组,层
是定义神经网络架构的层图。选项
是一个trainingOptions
对象。
函数[XTrain,YTrain,layers,options] = SequenceRegressionExperiment_setup1(params) dataFolder = fullfile(tempdir,“涡扇”);如果~存在(dataFolder“dir”mkdir (dataFolder);oldDir = cd(dataFolder);文件名=“CMAPSSData.zip”;websave(文件名,“https://ti.arc.nasa.gov/c/6/”,...weboptions (“超时”正);解压缩(文件名,dataFolder);cd (oldDir);结束fileametrainpredictors = fullfile(数据文件夹,“train_FD001.txt”);[XTrain,YTrain] = processTurboFanDataTrain(filenameTrainPredictors);XTrain = helpfilter (XTrain);XTrain = helpnormalize (XTrain);thr = str2double(params.Threshold);为i = 1:数字(YTrain) YTrain{i}(YTrain{i} > thr) = thr;结束为i=1:数字(XTrain)序列= XTrain{i};sequenceLengths(i) = size(sequence,2);结束[~,idx] = sort(sequenceLengths,“下”);XTrain = XTrain(idx);YTrain = YTrain(idx);idx = randperm(数字(XTrain),10);XValidation = XTrain(idx);XTrain(idx) = [];YValidation = YTrain(idx);YTrain(idx) = [];numResponses = size(YTrain{1},1);featureDimension = size(XTrain{1},1); LSTMDepth = params.LSTMDepth; numHiddenUnits = params.NumHiddenUnits; layers = sequenceInputLayer(featureDimension);为i = 1:LSTMDepth layers = [layers;lstmLayer(numHiddenUnits,OutputMode=“序列”));结束layers = [layers fullyConnectedLayer(100) reluLayer() dropoutLayer(0.5) fullyConnectedLayer(numResponses) regressionLayer];maxEpochs = 300;miniBatchSize = 20;选项= trainingOptions(“亚当”,...ExecutionEnvironment =“汽车”,...MaxEpochs = MaxEpochs,...MiniBatchSize = MiniBatchSize,...ValidationData = {XValidation, YValidation},...ValidationFrequency = 30,...InitialLearnRate =参数。InitialLearnRate,...LearnRateDropFactor = 0.2,...LearnRateDropPeriod = 15,...GradientThreshold = 1,...洗牌=“从不”,...Verbose = false);结束
附录2:筛选和规范化预测维护数据
辅助函数helperFilter
通过删除具有常量值的特征来过滤数据。在所有时间步骤中保持不变的特征会对训练产生负面影响。
函数[XTrain,XTest] = helperFilter(XTrain,XTest) m = min([XTrain{:}],[],2);M = max([XTrain{:}],[],2);idxConstant = M == M;
为i = 1: number (XTrain) XTrain{i}(idxConstant,:) = [];如果nargin>1 XTest{i}(idxConstant,:) = [];结束结束结束
辅助函数helperNormalize
将训练预测器和测试预测器归一化,使其具有零平均值和单位方差。
函数[XTrain,XTest] = helperNormalize(XTrain,XTest) mu = mean([XTrain{:}],2);sig = std([XTrain{:}],0,2);
为i = 1: number (XTrain) XTrain{i} = (XTrain{i} - mu) ./ sig;如果nargin>1 XTest{i} = (XTest{i} - mu) ./ sig;结束结束结束
附录3:计算最大绝对误差的平均值
这个度量函数计算训练网络的最大绝对误差,在训练集上求平均值。
函数metricOutput = MeanMaxAbsoluteError(trialInfo) net = trialInfo. trainednetwork;thr = str2double(trialInfo.parameters.Threshold);fileamepredictors = fullfile(tempdir,“涡扇”,“train_FD001.txt”);[XTrain,YTrain] = processTurboFanDataTrain(filenamePredictors);XTrain = helpfilter (XTrain);XTrain = helpnormalize (XTrain);为i = 1:数字(YTrain) YTrain{i}(YTrain{i} > thr) = thr;结束YPred = predict(net,XTrain,MiniBatchSize=1);maxAbsErrors = 0(1,数字(YTrain));为i=1:numel(YTrain) absError = abs(YTrain{i}-YPred{i});maxAbsErrors(i) = max(absError);结束metricOutput = mean(maxAbsErrors);结束
附录4:规划预测性维护序列
该函数绘制真实和预测的响应序列,以允许您评估训练网络的性能。这个函数使用helper函数helperFilter
而且helperNormalize
,均列于附录2.
函数plotSequences(net,threshold) filenameTrainPredictors = fullfile(tempdir,“涡扇”,“train_FD001.txt”);fileametestpredictors = fullfile(tempdir,“涡扇”,“test_FD001.txt”);fileametestresponses = fullfile(tempdir,“涡扇”,“RUL_FD001.txt”);[XTrain,YTrain] = processTurboFanDataTrain(filenameTrainPredictors);[XTest,YTest] = processTurboFanDataTest(filenameTestPredictors,filenameTestResponses);[XTrain,XTest] = helperFilter(XTrain,XTest);[~,XTest] = helperNormalize(XTrain,XTest);为i = 1: number (YTrain) YTrain{i}(YTrain{i} > threshold) = threshold;YTest{i}(YTest{i} > threshold) = threshold;结束YPred = predict(net,XTest,MiniBatchSize=1);Idx = randperm(100,4);数字为i = 1:数字(idx) subplot(2,2,i) plot(YTest{idx(i)},”——“)举行在情节(YPred {idx (i)},“。”)举行从Ylim([0阈值+25])“试验观察”+ idx(i)) xlabel(“时间步”) ylabel (“原则”)结束传奇([“测试数据”“预测”),位置=“西南”)结束
参考文献
Saxena, Abhinav, Kai Goebel, Don Simon和Neil Eklund。飞机发动机运行故障仿真的损伤传播模型。2008年预测和健康管理国际会议(2008): 1 - 9。
约泽福维茨,拉法尔,沃伊切赫·扎伦巴,伊利亚·苏茨科维尔。循环网络架构的实证探索第32届国际机器学习会议论文集(2015): 2342 - 2350。
Saxena, Abhinav, Kai Goebel。涡扇发动机退化仿真数据集NASA艾姆斯预测数据仓库,https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/美国宇航局艾姆斯研究中心,莫菲特场,加利福尼亚州。