exponenta event banner

Регрессия последовательности к последовательности с использованием глубокого обучения

В этом примере показано, как предсказать оставшийся срок службы (RUL) двигателей с помощью глубокого обучения.

Чтобы обучить глубокую нейронную сеть предсказывать числовые значения по данным временных рядов или последовательностей, можно использовать сеть длительной кратковременной памяти (LSTM).

В этом примере используется набор данных моделирования деградации турбовентиляторного двигателя, как описано в [1]. Пример обучает сеть LSTM предсказывать оставшийся срок службы двигателя (прогностическое обслуживание), измеренный в циклах, с учетом данных временных рядов, представляющих различные датчики в двигателе. Учебные данные содержат смоделированные данные временных рядов для 100 двигателей. Каждая последовательность варьируется по длине и соответствует экземпляру полного прогона до отказа (RTF). Данные испытаний содержат 100 частичные последовательности и соответствующие значения оставшегося срока службы в конце каждой последовательности.

Набор данных содержит 100 учебных наблюдений и 100 тестовых наблюдений.

Загрузить данные

Загрузите и распакуйте набор данных моделирования деградации турбовентиляторного двигателя из https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/ [2].

Каждый временной ряд набора данных моделирования деградации турбовентиляторного двигателя представляет различный механизм. Каждый двигатель запускается с неизвестными степенями начального износа и изменения изготовления. Двигатель работает нормально в начале каждого временного ряда, и в какой-то момент во время серии возникает неисправность. В обучающем комплекте разлом нарастает по величине до отказа системы.

Данные содержат сжатые в формате ZIP текстовые файлы с 26 столбцами чисел, разделенными пробелами. Каждая строка представляет собой снимок данных, полученных в течение одного рабочего цикла, и каждый столбец является отдельной переменной. Столбцы соответствуют следующему:

  • Столбец 1 - Номер единицы

  • Столбец 2 - Время в циклах

  • Столбцы 3-5 - Рабочие настройки

  • Колонки 6-26 - Измерения датчиков 1-21

Создайте каталог для хранения набора данных моделирования деградации турбовентиляторного двигателя.

dataFolder = fullfile(tempdir,"turbofan");
if ~exist(dataFolder,'dir')
    mkdir(dataFolder);
end

Загрузите и извлеките набор данных моделирования деградации турбовентиляторного двигателя из https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/.

Распакуйте данные из файла CMAPSSData.zip.

filename = "CMAPSSData.zip";
unzip(filename,dataFolder)

Подготовка данных обучения

Загрузите данные с помощью функции processTurboFanDataTrain прилагается к этому примеру. Функция processTurboFanDataTrain извлекает данные из filenamePredictors и возвращает массивы ячеек XTrain и YTrain, которые содержат обучающий предиктор и последовательности ответа.

filenamePredictors = fullfile(dataFolder,"train_FD001.txt");
[XTrain,YTrain] = processTurboFanDataTrain(filenamePredictors);

Удаление элементов с постоянными значениями

Функции, которые остаются постоянными для всех временных шагов, могут негативно повлиять на обучение. Найдите строки данных с одинаковыми минимальными и максимальными значениями и удалите строки.

m = min([XTrain{:}],[],2);
M = max([XTrain{:}],[],2);
idxConstant = M == m;

for i = 1:numel(XTrain)
    XTrain{i}(idxConstant,:) = [];
end

Просмотрите количество оставшихся элементов в последовательностях.

numFeatures = size(XTrain{1},1)
numFeatures = 17

Нормализация обучающих предикторов

Нормализуйте обучающие предикторы, чтобы иметь нулевое среднее и единичную дисперсию. Чтобы рассчитать среднее и стандартное отклонение по всем наблюдениям, объедините данные последовательности по горизонтали.

mu = mean([XTrain{:}],2);
sig = std([XTrain{:}],0,2);

for i = 1:numel(XTrain)
    XTrain{i} = (XTrain{i} - mu) ./ sig;
end

Ответы на клип

Чтобы узнать больше из данных последовательности, когда механизмы близки к отказу, обрезайте ответы на пороге 150. Это позволяет сети обрабатывать экземпляры с более высокими значениями RUL как равные.

thr = 150;
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

[sequenceLengths,idx] = sort(sequenceLengths,'descend');
XTrain = XTrain(idx);
YTrain = YTrain(idx);

Просмотр отсортированных длин последовательностей в гистограмме.

figure
bar(sequenceLengths)
xlabel("Sequence")
ylabel("Length")
title("Sorted Data")

Выберите размер мини-партии, который равномерно разделяет обучающие данные и уменьшает количество дополнений в мини-партиях. Укажите размер мини-партии 20. На этом рисунке показано дополнение, добавленное к несортированным и отсортированным последовательностям.

miniBatchSize = 20;

Определение сетевой архитектуры

Определите архитектуру сети. Создайте сеть LSTM, состоящую из уровня LSTM с 200 скрытыми блоками, а затем полностью подключенного уровня размером 50 и уровня отсева с вероятностью отсева 0,5.

numResponses = size(YTrain{1},1);
numHiddenUnits = 200;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(50)
    dropoutLayer(0.5)
    fullyConnectedLayer(numResponses)
    regressionLayer];

Укажите параметры обучения. Обучение для 60 эпох с мини-партиями размера 20 с использованием решателя 'adam'. Укажите коэффициент обучения 0,01. Для предотвращения разузлования градиентов установите порог градиента равным 1. Чтобы сохранить сортировку последовательностей по длине, установите 'Shuffle' кому 'never'.

maxEpochs = 60;
miniBatchSize = 20;

options = trainingOptions('adam', ...
    'MaxEpochs',maxEpochs, ...
    'MiniBatchSize',miniBatchSize, ...
    'InitialLearnRate',0.01, ...
    'GradientThreshold',1, ...
    'Shuffle','never', ...
    'Plots','training-progress',...
    'Verbose',0);

Обучение сети

Обучение сети с помощью trainNetwork.

net = trainNetwork(XTrain,YTrain,layers,options);

Тестирование сети

Подготовка тестовых данных с помощью функции processTurboFanDataTest прилагается к этому примеру. Функция processTurboFanDataTest извлекает данные из filenamePredictors и filenameResponses и возвращает массивы ячеек XTest и YTest, которые содержат тестовые предикторные и ответные последовательности соответственно.

filenamePredictors = fullfile(dataFolder,"test_FD001.txt");
filenameResponses = fullfile(dataFolder,"RUL_FD001.txt");
[XTest,YTest] = processTurboFanDataTest(filenamePredictors,filenameResponses);

Удаление элементов с постоянными значениями с помощью idxConstant рассчитывается на основе данных обучения. Нормализуйте предикторы теста, используя те же параметры, что и в данных обучения. Закрепите ответы на тесты на том же пороге, что и для обучающих данных.

for i = 1:numel(XTest)
    XTest{i}(idxConstant,:) = [];
    XTest{i} = (XTest{i} - mu) ./ sig;
    YTest{i}(YTest{i} > thr) = thr;
end

Прогнозирование тестовых данных с помощью predict. Чтобы предотвратить добавление дополнений к данным, укажите размер мини-пакета 1.

YPred = predict(net,XTest,'MiniBatchSize',1);

Сеть LSTM делает прогнозы по частичной последовательности один шаг за один раз. На каждом временном шаге сеть прогнозирует использование значения на этом временном шаге и состояние сети, вычисленное только из предыдущих временных шагов. Сеть обновляет свое состояние между каждым предсказанием. predict функция возвращает последовательность этих прогнозов. Последний элемент предсказания соответствует предсказанному RUL для частичной последовательности.

Кроме того, можно сделать прогнозы один шаг за один раз с помощью predictAndUpdateState. Это полезно при наличии значений временных шагов, поступающих в поток. Обычно быстрее делать прогнозы по полным последовательностям по сравнению с тем, чтобы делать прогнозы по одному шагу за раз. Пример прогнозирования будущих временных шагов путем обновления сети между прогнозами одного временного шага см. в разделе Прогнозирование временных рядов с использованием глубокого обучения.

Визуализация некоторых предсказаний на графике.

idx = randperm(numel(YPred),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 thr + 25])
    title("Test Observation " + idx(i))
    xlabel("Time Step")
    ylabel("RUL")
end
legend(["Test Data" "Predicted"],'Location','southeast')

Для данной частичной последовательности предсказанный текущий RUL является последним элементом предсказанных последовательностей. Вычислите среднеквадратическую ошибку (RMSE) предсказаний и визуализируйте ошибку предсказания в гистограмме.

for i = 1:numel(YTest)
    YTestLast(i) = YTest{i}(end);
    YPredLast(i) = YPred{i}(end);
end
figure
rmse = sqrt(mean((YPredLast - YTestLast).^2))
histogram(YPredLast - YTestLast)
title("RMSE = " + rmse)
ylabel("Frequency")
xlabel("Error")

Ссылки

  1. Саксена, Абхинав, Кай Гебель, Дон Симон и Нил Эклунд. «Моделирование распространения повреждений для имитации обкатки двигателя самолета». В Prognostics and Health Management, 2008. PHM 2008. Международная конференция, стр. 1-9. IEEE, 2008.

  2. Саксена, Абхинав, Кай Гебель. «Набор данных моделирования деградации турбовентиляторного двигателя». https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/ хранилища данных NASA Ames Prognostics, Исследовательский центр NASA Ames, Моффетт Филд, Калифорния

См. также

| | | |

Связанные темы