В этом примере показано, как создать эксперимент глубокого обучения, чтобы найти оптимальные сетевые гиперпараметры и опции обучения для сетей долгой краткосрочной памяти (LSTM) с помощью Байесовой оптимизации. В этом примере вы используете Experiment Manager, чтобы обучить сети LSTM, которые предсказывают остающийся срок полезного использования (RUL) механизмов. Эксперимент использует Турбовентиляторный Набор Данных моделирования Ухудшения Engine, описанный в [1]. Для получения дополнительной информации об обработке этого набора данных для регрессии от последовательности к последовательности смотрите, что Регрессия От последовательности к последовательности Использует Глубокое обучение.
Байесова оптимизация предоставляет альтернативную стратегию широким гиперпараметрам в эксперименте. Вы указываете диапазон значений для каждого гиперпараметра и выбираете метрику, чтобы оптимизировать, и Experiment Manager ищет комбинацию гиперпараметров, которая оптимизирует вашу выбранную метрику. Байесова оптимизация требует Statistics and Machine Learning Toolbox™. Для получения дополнительной информации смотрите Гиперпараметры Эксперимента Мелодии при помощи Байесовой Оптимизации.
RUL получает, сколько рабочих циклов механизм может сделать перед отказом. Чтобы фокусироваться на данных о последовательности из того, когда механизмы будут близко к сбою, предварительно обработайте данные путем усечения ответов в заданном пороге. Эта операция предварительной обработки позволяет сети фокусироваться на поведениях данных о предикторе близко к сбою путем обработки экземпляров с выше значениями RUL как равных. Например, этот рисунок показывает первое наблюдение ответа и соответствующий отсеченный ответ с порогом 150.
Когда вы обучаете нейронную сеть для глубокого обучения, как вы предварительно обрабатываете данные, количество слоев и скрытых модулей, и начальная скорость обучения в сети может влиять на учебное поведение и эффективность сети. Выбор глубины сети LSTM включает балансирующуюся скорость и точность. Например, более глубокие сети могут быть более точными, но занять больше времени, чтобы обучаться и сходиться [2].
По умолчанию, когда вы запускаете встроенный учебный эксперимент для регрессии, Experiment Manager вычисляет потерю и среднеквадратическую ошибку (RMSE) для каждого испытания в вашем эксперименте. Этот пример сравнивает эффективность сети в каждом испытании при помощи пользовательской метрики, которая характерна для проблемного набора данных. Для получения дополнительной информации об использовании пользовательских метрических функций смотрите, Оценивают Эксперименты Глубокого обучения при помощи Метрических функций.
Во-первых, откройте пример. Experiment Manager загружает проект с предварительно сконфигурированным экспериментом. Чтобы открыть эксперимент, в Браузере Эксперимента, дважды кликают имя эксперимента (SequenceRegressionExperiment
).
Встроенные учебные эксперименты состоят из описания, таблицы гиперпараметров, функции настройки и набора метрических функций, чтобы оценить результаты эксперимента. Эксперименты, которые используют Байесовую оптимизацию, включают дополнительные опции ограничить длительность эксперимента. Для получения дополнительной информации смотрите, Конфигурируют Встроенный Учебный Эксперимент.
Поле Description содержит текстовое описание эксперимента. В данном примере описание:
Sequence-to-sequence regression to predict the remaining useful life (RUL) of engines. This experiment compares network performance using Bayesian optimization when changing data thresholding level, LSTM layer depth, the number of hidden units, and the initial learn rate.
Гипертаблица параметров задает стратегию (Bayesian Optimization
) и гиперзначения параметров, чтобы использовать для эксперимента. Для каждого гиперпараметра задайте эти опции:
Область значений — Вводит двухэлементный вектор, который дает нижнюю границу и верхнюю границу действительного - или гиперпараметр с целочисленным знаком, или массив строк или массив ячеек, который перечисляет возможные значения категориального гиперпараметра.
Введите — выбирают real
(гиперпараметр с действительным знаком), integer
(гиперпараметр с целочисленным знаком), или categorical
(категориальный гиперпараметр).
Преобразуйте — выбирают none
(никакое преобразование) или log
(логарифмическое преобразование). Для log
, гиперпараметром должен быть real
или integer
и положительный. При использовании этой опции гиперпараметр ищется и моделируется на логарифмическом масштабе.
Когда вы запускаете эксперимент, Experiment Manager ищет лучшую комбинацию гиперпараметров. Каждое испытание использует новую комбинацию гиперзначений параметров на основе результатов предыдущих испытаний. Этот пример использует эти гиперпараметры:
Threshold
наборы все данные об ответе выше порогового значения, чтобы быть равным пороговому значению. Чтобы предотвратить универсальные данные об ответе, используйте пороговые значения, больше или равные 150. Ограничить набор допустимых значений к 150, 200 и 250, модели Threshold
эксперимента как категориальный гиперпараметр.
LSTMDepth
указывает на количество слоев LSTM, используемых в сети. Задайте этот гиперпараметр как целое число между 1 и 3.
NumHiddenUnits
определяет количество скрытых модулей или объем информации, сохраненный на каждом временном шаге, используемом в сети. Увеличение числа скрытых модулей может привести к сверхподгонке данных и в более длительное учебное время. Сокращение числа скрытых модулей может привести к underfitting данные. Задайте этот гиперпараметр как целое число между 50 и 300.
InitialLearnRate
задает начальную скорость обучения, используемую для обучения. Если скорость обучения является слишком низкой, то обучение занимает много времени. Если скорость обучения слишком высока, то обучение может достигнуть субоптимального результата или отличаться. Лучшая скорость обучения зависит от ваших данных, а также сети, вы - обучение. Эксперимент моделирует этот гиперпараметр на логарифмическом масштабе, потому что область значений значений (0.001 к 0,1) охватывает несколько порядков величины.
В соответствии с Байесовыми Опциями Оптимизации, можно задать длительность эксперимента путем ввода максимального времени (в секундах) и максимальное количество испытаний, чтобы запуститься. Чтобы лучше всего использовать степень Байесовой оптимизации, выполните по крайней мере 30 оценок целевой функции.
Функция Setup конфигурирует обучающие данные, сетевую архитектуру и опции обучения для эксперимента. Вход к функции настройки является структурой с полями от гипертаблицы параметров. Функция настройки возвращает четыре выходных параметра, которые вы используете, чтобы обучить сеть для проблем регрессии изображений. В этом примере функция настройки имеет три раздела.
Загрузите и Предварительно обработайте загрузки Данных, и извлекает Турбовентиляторный Набор Данных моделирования Ухудшения Engine из https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/ [3]. Этот раздел функции настройки также отфильтровывает постоянные ценные функции, нормирует данные о предикторе, чтобы иметь нулевое среднее значение и модульное отклонение, отсекает данные об ответе при помощи численного значения гиперпараметра Threshold
, и случайным образом выбирает учебные примеры, чтобы использовать для валидации.
dataFolder = fullfile(tempdir,"turbofan");
if ~exist(dataFolder,"dir") mkdir(dataFolder); oldDir = cd(dataFolder); filename = "CMAPSSData.zip"; websave(filename,"https://ti.arc.nasa.gov/c/6/", ... weboptions("Timeout",Inf)); unzip(filename,dataFolder); cd(oldDir); end
filenameTrainPredictors = fullfile(dataFolder,"train_FD001.txt");
[XTrain,YTrain] = processTurboFanDataTrain(filenameTrainPredictors);
XTrain = helperFilter(XTrain); XTrain = helperNormalize(XTrain);
thr = str2double(params.Threshold); for i = 1:numel(YTrain) YTrain{i}(YTrain{i} > thr) = thr; end
for i=1:numel(XTrain) sequence = XTrain{i}; sequenceLengths(i) = size(sequence,2); end
[~,idx] = sort(sequenceLengths,"descend");
XTrain = XTrain(idx);
YTrain = YTrain(idx);
idx = randperm(numel(XTrain),10); XValidation = XTrain(idx); XTrain(idx) = []; YValidation = YTrain(idx); YTrain(idx) = [];
Архитектура Сети Define задает архитектуру для сети LSTM для регрессии от последовательности к последовательности. Сеть состоит из слоев LSTM, сопровождаемых полносвязным слоем размера 100 и слоя уволенного с вероятностью уволенного 0,5. Гиперпараметры LSTMDepth
и NumHiddenUnits
задайте количество слоев LSTM и количество скрытых модулей для каждого слоя.
numResponses = size(YTrain{1},1); featureDimension = size(XTrain{1},1); LSTMDepth = params.LSTMDepth; numHiddenUnits = params.NumHiddenUnits;
layers = sequenceInputLayer(featureDimension);
for i = 1:LSTMDepth layers = [layers;lstmLayer(numHiddenUnits,OutputMode="sequence")]; end
layers = [layers fullyConnectedLayer(100) reluLayer() dropoutLayer(0.5) fullyConnectedLayer(numResponses) regressionLayer];
Укажите, что Опции обучения задают опции обучения для эксперимента. Поскольку более глубокие сети занимают больше времени, чтобы сходиться, номер эпох определяется к 300, чтобы гарантировать, что все сетевые глубины сходятся. Этот пример проверяет сеть каждые 30 итераций. Начальная скорость обучения равняется InitialLearnRate
значение от гипертаблицы параметров и отбрасываний на коэффициент 0,2 каждых 15 эпох. С опцией обучения ExecutionEnvironment
установите на "auto"
, эксперимент работает на графическом процессоре, если вы доступны. В противном случае Experiment Manager использует центральный процессор. Поскольку этот пример сравнивает сетевые глубины и обучается в течение многих эпох, использование графического процессора значительно ускоряет учебное время. Используя графический процессор требует Parallel Computing Toolbox™ и поддерживаемого устройства графического процессора. Для получения дополнительной информации смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox).
maxEpochs = 300; miniBatchSize = 20;
options = trainingOptions("adam", ... ExecutionEnvironment="auto", ... MaxEpochs=maxEpochs, ... MiniBatchSize=miniBatchSize, ... ValidationData={XValidation,YValidation}, ... ValidationFrequency=30, ... InitialLearnRate=params.InitialLearnRate, ... LearnRateDropFactor=0.2, ... LearnRateDropPeriod=15, ... GradientThreshold=1, ... Shuffle="never", ... Verbose=false);
Чтобы смотреть функцию настройки, под Функцией Setup, нажимают Edit. Функция настройки открывается в редакторе MATLAB. Кроме того, код для функции настройки появляется в Приложении 1 в конце этого примера.
Раздел Metrics задает дополнительные функции, которые оценивают результаты эксперимента. Experiment Manager выполняет эти функции каждый раз, когда он закончил обучать сеть. Чтобы смотреть метрическую функцию, выберите имя метрической функции и нажмите Edit. Метрическая функция открывается в редакторе MATLAB.
Предсказание RUL механизма требует внимательного рассмотрения. Если предсказание недооценит RUL, обслуживание механизма может быть запланировано, прежде чем это будет необходимо. Если предсказание переоценивает RUL, механизм может перестать работать, в то время как в операции, приводящей к высокой стоимости или безопасности, касается. Чтобы помочь смягчить эти сценарии, этот пример включает метрическую функцию MeanMaxAbsoluteError
это идентифицирует сети, что underpredict или завышают RUL.
MeanMaxAbsoluteError
метрика вычисляет максимальную абсолютную погрешность, усредненную через целый набор обучающих данных. Эта метрика вызывает
функция, чтобы сделать последовательность предсказаний RUL от набора обучающих данных. Затем после вычисления максимальной абсолютной погрешности между каждым учебным ответом и предсказанной последовательностью ответа, функция вычисляет среднее значение всех максимальных абсолютных погрешностей. Эта метрика идентифицирует максимальные отклонения между фактическими и предсказанными ответами. Код для метрической функции появляется в Приложении 3 в конце этого примера.predict
Когда вы запускаете эксперимент, Experiment Manager ищет лучшую комбинацию гиперпараметров относительно выбранной метрики. Каждое испытание в эксперименте использует новую комбинацию гиперзначений параметров на основе результатов предыдущих испытаний. По умолчанию Experiment Manager запускает одно испытание за один раз. Если у вас есть Parallel Computing Toolbox™, можно запустить несколько испытаний одновременно. Для лучших результатов, прежде чем вы запустите свой эксперимент, начинают параллельный пул со стольких же рабочих сколько графические процессоры. Для получения дополнительной информации смотрите Использование Experiment Manager, чтобы Обучить нейронные сети параллельно и Поддержка графического процессора Релизом (Parallel Computing Toolbox).
Чтобы запустить один суд над экспериментом за один раз, на панели инструментов Experiment Manager, нажимают Run.
Чтобы запустить несколько испытаний одновременно, нажмите Use Parallel и затем Запуск. Если нет никакого текущего параллельного пула, Experiment Manager запускает тот с помощью кластерного профиля по умолчанию. Experiment Manager затем выполняет несколько одновременных испытаний, в зависимости от количества параллельных доступных рабочих.
Таблица результатов показывает значения метрической функции для каждого испытания. Experiment Manager указывает на испытание с оптимальным значением для выбранной метрики. Например, в этом эксперименте, 17-е испытание производит самую маленькую максимальную абсолютную погрешность.
В то время как эксперимент запускается, нажмите Training Plot, чтобы отобразить учебный график и отследить прогресс каждого испытания. Прошедшее время для испытания, чтобы завершить учебные увеличения с сетевой глубиной.
В таблице результатов значение MeanMaxAbsoluteError определяет количество, насколько сеть underpredicts или завышает RUL. Значение RMSE Валидации определяет количество, как хорошо сеть делает вывод к невидимым данным. Чтобы найти лучший результат для вашего эксперимента, отсортируйте таблицу результатов и выберите испытание, которое имеет самый низкий MeanMaxAbsoluteError и Валидацию значения RMSE.
Укажите на столбец MeanMaxAbsoluteError.
Кликните по треугольному значку.
Выберите Sort в порядке возрастания.
Точно так же найдите испытание с самой маленькой валидацией RMSE путем открытия выпадающего меню для Валидации столбец RMSE и выбора Sort в порядке возрастания.
Если никакое одно испытание не минимизирует оба значения, рассмотрите предоставление настройки к испытанию, которое занимает место хорошо для каждого значения. Например, в этих результатах, испытайте 17, имеет наименьшее значение MeanMaxAbsoluteError и 12-ю самую маленькую Валидацию значение RMSE. Испытания 3, 11, и 22 имеют меньшую Валидацию значения RMSE, но большие значения MeanMaxAbsoluteError.
Чтобы записать наблюдения о результатах вашего эксперимента, добавьте аннотацию.
В таблице результатов щелкните правой кнопкой по ячейке MeanMaxAbsoluteError лучшего испытания.
Выберите Add Annotation.
В панели Аннотаций введите свои наблюдения в текстовое поле.
Повторите предыдущие шаги для ячейки Validation RMSE.
Чтобы проверить производительность вашего лучшего испытания, экспортируйте обучивший сеть и отобразите предсказанную последовательность ответа для нескольких случайным образом выбранных тестовых последовательностей.
Выберите лучшее испытание в своем эксперименте.
На панели инструментов Experiment Manager нажмите Export.
В диалоговом окне введите имя переменной рабочей области для экспортируемой сети. Именем по умолчанию является trainedNetwork
.
Используйте экспортируемую сеть и Threshold
значение сети как входные параметры помощнику функционирует plotSequences
, который перечислен в Приложении 4 в конце этого примера. Например, в командном окне MATLAB, введите:
plotSequences(trainedNetwork,250)
Графики функций истинные и предсказанные последовательности ответа невидимых тестовых данных.
В Браузере Эксперимента щелкните правой кнопкой по имени проекта и выберите Close Project. Experiment Manager закрывает все эксперименты и результаты, содержавшиеся в проекте.
Эта функция конфигурирует обучающие данные, сетевую архитектуру и опции обучения для эксперимента.
Входной параметр
params
структура с полями от гипертаблицы параметров Experiment Manager.
Вывод
XTrain
массив ячеек, содержащий обучающие данные.
YTrain
массив ячеек, содержащий значения регрессии для обучения,
layers
график слоев, который задает архитектуру нейронной сети.
options
trainingOptions
объект.
function [XTrain,YTrain,layers,options] = SequenceRegressionExperiment_setup1(params) dataFolder = fullfile(tempdir,"turbofan"); if ~exist(dataFolder,"dir") mkdir(dataFolder); oldDir = cd(dataFolder); filename = "CMAPSSData.zip"; websave(filename,"https://ti.arc.nasa.gov/c/6/", ... weboptions("Timeout",Inf)); unzip(filename,dataFolder); cd(oldDir); end filenameTrainPredictors = fullfile(dataFolder,"train_FD001.txt"); [XTrain,YTrain] = processTurboFanDataTrain(filenameTrainPredictors); XTrain = helperFilter(XTrain); XTrain = helperNormalize(XTrain); thr = str2double(params.Threshold); for i = 1:numel(YTrain) YTrain{i}(YTrain{i} > thr) = thr; end for i=1:numel(XTrain) sequence = XTrain{i}; sequenceLengths(i) = size(sequence,2); end [~,idx] = sort(sequenceLengths,"descend"); XTrain = XTrain(idx); YTrain = YTrain(idx); idx = randperm(numel(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); for i = 1:LSTMDepth layers = [layers;lstmLayer(numHiddenUnits,OutputMode="sequence")]; end layers = [layers fullyConnectedLayer(100) reluLayer() dropoutLayer(0.5) fullyConnectedLayer(numResponses) regressionLayer]; maxEpochs = 300; miniBatchSize = 20; options = trainingOptions("adam", ... ExecutionEnvironment="auto", ... MaxEpochs=maxEpochs, ... MiniBatchSize=miniBatchSize, ... ValidationData={XValidation,YValidation}, ... ValidationFrequency=30, ... InitialLearnRate=params.InitialLearnRate, ... LearnRateDropFactor=0.2, ... LearnRateDropPeriod=15, ... GradientThreshold=1, ... Shuffle="never", ... Verbose=false); end
Функция помощника helperFilter
фильтрует данные путем удаления функций с постоянными значениями. Функции, которые остаются постоянными навсегда, продвигаются, может негативно повлиять на обучение.
function [XTrain,XTest] = helperFilter(XTrain,XTest)
m = min([XTrain{:}],[],2);
M = max([XTrain{:}],[],2);
idxConstant = M == m;
for i = 1:numel(XTrain) XTrain{i}(idxConstant,:) = []; if nargin>1 XTest{i}(idxConstant,:) = []; end end end
Функция помощника helperNormalize
нормирует обучение и тестовые предикторы, чтобы иметь нулевое среднее значение и модульное отклонение.
function [XTrain,XTest] = helperNormalize(XTrain,XTest)
mu = mean([XTrain{:}],2);
sig = std([XTrain{:}],0,2);
for i = 1:numel(XTrain) XTrain{i} = (XTrain{i} - mu) ./ sig; if nargin>1 XTest{i} = (XTest{i} - mu) ./ sig; end end end
Эта метрическая функция вычисляет максимальную абсолютную погрешность обучившего сеть, усредненного по набору обучающих данных.
function metricOutput = MeanMaxAbsoluteError(trialInfo) net = trialInfo.trainedNetwork; thr = str2double(trialInfo.parameters.Threshold); filenamePredictors = fullfile(tempdir,"turbofan","train_FD001.txt"); [XTrain,YTrain] = processTurboFanDataTrain(filenamePredictors); XTrain = helperFilter(XTrain); XTrain = helperNormalize(XTrain); for i = 1:numel(YTrain) YTrain{i}(YTrain{i} > thr) = thr; end YPred = predict(net,XTrain,MiniBatchSize=1); maxAbsErrors = zeros(1,numel(YTrain)); for i=1:numel(YTrain) absError = abs(YTrain{i}-YPred{i}); maxAbsErrors(i) = max(absError); end metricOutput = mean(maxAbsErrors); end
Это графики функций истинные и предсказанные последовательности ответа, чтобы позволить вам оценивать эффективность своего обучившего сеть. Эта функция использует функции помощника helperFilter
и helperNormalize
, которые перечислены в Приложении 2.
function plotSequences(net,threshold) filenameTrainPredictors = fullfile(tempdir,"turbofan","train_FD001.txt"); filenameTestPredictors = fullfile(tempdir,"turbofan","test_FD001.txt"); filenameTestResponses = fullfile(tempdir,"turbofan","RUL_FD001.txt"); [XTrain,YTrain] = processTurboFanDataTrain(filenameTrainPredictors); [XTest,YTest] = processTurboFanDataTest(filenameTestPredictors,filenameTestResponses); [XTrain,XTest] = helperFilter(XTrain,XTest); [~,XTest] = helperNormalize(XTrain,XTest); for i = 1:numel(YTrain) YTrain{i}(YTrain{i} > threshold) = threshold; YTest{i}(YTest{i} > threshold) = threshold; end YPred = predict(net,XTest,MiniBatchSize=1); idx = randperm(100,4); figure for i = 1:numel(idx) subplot(2,2,i) plot(YTest{idx(i)},'--') hold on plot(YPred{idx(i)},'.-') hold off ylim([0 threshold+25]) title("Test Observation " + idx(i)) xlabel("Time Step") ylabel("RUL") end legend(["Test Data" "Predicted"],'Location','southwest') end
Saxena, Abhinav, Кай Гоебель, Дон Саймон и Нил Экланд. "Повредите моделирование распространения для симуляции запуска к отказу авиационного двигателя". 2 008 международных конференций по вопросам предзнаменований и медицинского управления (2008): 1–9.
Jozefowicz, Rafal, Войцех Зэремба и Илья Сутскевер. "Эмпирическое исследование текущих сетевых архитектур". Продолжения 32-й международной конференции по вопросам машинного обучения (2015): 2342–2350.
Saxena, Abhinav, Кай Гоебель. "Турбовентиляторный Набор Данных моделирования Ухудшения Engine". НАСА Репозиторий данных Предзнаменований Эймса, https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/, Исследовательский центр Эймса, Поле Moffett, Приблизительно