Main Content

Regresión de secuencia a secuencia mediante deep learning

Este ejemplo muestra cómo predecir la vida útil restante (RUL) de motores mediante deep learning.

Para entrenar una red neuronal profunda con la que predecir valores numéricos a partir de series de tiempo o datos secuenciales, se puede utilizar una red de memoria de corto-largo plazo (LSTM).

Este ejemplo usa el conjunto de datos de simulación de degradación de motores de turbofán descrito en [1]. En el ejemplo se entrena una red de LSTM para predecir la vida útil restante de un motor (mantenimiento predictivo), medida en ciclos, dados los datos de series de tiempo que representan varios sensores del motor. Los datos de entrenamiento contienen datos de series de tiempo simuladas para 100 motores. Cada secuencia varía en longitud y corresponde a una instancia completa de funcionamiento hasta el fallo (RTF). Los datos de la prueba contienen 100 secuencias parciales y los correspondientes valores de la vida útil restante al final de cada secuencia.

El conjunto de datos contiene 100 observaciones de entrenamiento y 100 observaciones de prueba.

Descargar datos

Descargue y descomprima el conjunto de datos de simulación de degradación de motores de turbofán en https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/ [2].

Cada serie de tiempo del conjunto de datos de simulación de degradación de motores turbofán representa un motor diferente. Cada motor comienza con grados desconocidos de desgaste inicial y variación de fabricación. El motor funciona con normalidad al inicio de cada serie de tiempo y desarrolla una avería en algún momento de la serie. En el conjunto de entrenamiento, la magnitud de la avería crece hasta convertirse en un fallo del sistema.

Los datos contienen un archivo de texto comprimido en ZIP con 26 columnas de números, separados por espacios. Cada fila es una instantánea de los datos tomados durante un único ciclo operativo, y cada columna es una variable diferente. Las columnas corresponden a lo siguiente:

  • Columna 1: número de unidad

  • Columna 2: tiempo en ciclos

  • Columnas 3-5: ajustes operativos

  • Columnas 6-26: mediciones de los sensores 1-21

Cree un directorio para guardar el conjunto de datos de simulación de degradación de motores de turbofán.

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

Descargue y extraiga el conjunto de datos de simulación de degradación de motores de turbofán en https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/.

Descomprima los datos del archivo CMAPSSData.zip.

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

Preparar datos de entrenamiento

Cargue los datos mediante la función processTurboFanDataTrain incluida en este ejemplo. La función processTurboFanDataTrain extrae los datos de filenamePredictors y devuelve un arreglo de celdas XTrain y YTrain, que contienen el predictor de entrenamiento y las secuencias de respuesta.

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

Eliminar características con valores constantes

Las características que permanecen constantes en todas las unidades de tiempo pueden influir de forma negativa en el entrenamiento. Busque las filas de datos que tienen los mismos valores mínimos y máximos y elimínelas.

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

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

Visualice el número de características restantes en las secuencias.

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

Normalizar predictores de entrenamiento

Normalice los predictores de entrenamiento para que tengan media cero y varianza unitaria. Para calcular la media y la desviación estándar sobre todas las observaciones, concatene los datos secuenciales horizontalmente.

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

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

Respuestas de recorte

Para obtener más información sobre los datos secuenciales cuando los motores están a punto de fallar, recorte las respuestas en el umbral de 150. Esto hace que la red trate como iguales las instancias con valores de RUL más altos.

thr = 150;
for i = 1:numel(YTrain)
    YTrain{i}(YTrain{i} > thr) = thr;
end

Esta figura muestra la primera observación y la respuesta recortada correspondiente.

Preparar datos para el relleno

Para minimizar la cantidad de relleno que se añade a los minilotes, ordene los datos de entrenamiento por longitud de secuencia. A continuación, elija un tamaño de minilotes que divida los datos de entrenamiento de manera uniforme y reduzca la cantidad de relleno en los minilotes.

Ordene los datos de entrenamiento por longitud de secuencia.

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);

Visualice las longitudes de las secuencias ordenadas en una gráfica de barras.

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

Elija un tamaño de minilotes que divida los datos de entrenamiento de manera uniforme y reduzca la cantidad de relleno en los minilotes. Especifique un tamaño de minilote de 20. Esta figura ilustra el relleno añadido a las secuencias no clasificadas y clasificadas.

miniBatchSize = 20;

Definir la arquitectura de red

Defina la arquitectura de la red. Cree una red de LSTM que conste de una capa de LSTM con 200 unidades ocultas, seguida de una capa totalmente conectada de tamaño 50 y una capa de abandono con probabilidad de abandono del 0,5.

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

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

Especifique las opciones de entrenamiento. Entrene durante 60 épocas con minilotes de tamaño 20 mediante el solver 'adam'. Especifique una tasa de aprendizaje de 0,01. Para evitar que los gradientes exploten, establezca el umbral del gradiente en 1. Para mantener las secuencias ordenadas por su longitud, establezca 'Shuffle' en 'never'.

maxEpochs = 60;
miniBatchSize = 20;

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

Entrenar la red

Entrene la red con trainNetwork.

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

Probar la red

Prepare los datos de prueba mediante la función processTurboFanDataTest incluida en este ejemplo. La función processTurboFanDataTest extrae los datos de filenamePredictors y filenameResponses, y devuelve un arreglo de celdas XTest y YTest, que contienen el predictor de prueba y las secuencias de respuesta, respectivamente.

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

Elimine características con valores constantes con idxConstant, que se calcula a partir de los datos de entrenamiento. Normalice los predictores de prueba con los mismos parámetros que en los datos de entrenamiento. Recorte las respuestas de prueba según el mismo umbral que se ha utilizado en los datos de entrenamiento.

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

Realice predicciones en los datos de prueba con predict. Para que evitar que la función añada relleno a los datos, especifique un tamaño de minilote de 1.

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

La red de LSTM hace predicciones sobre la secuencia parcial por cada unidad de tiempo. En cada unidad de tiempo, la red hace predicciones con el valor en la unidad en la que esté y el estado de la red, que se calcula solo según las unidades de tiempo anteriores. La red actualiza su estado entre cada predicción. La función predict devuelve una secuencia de dichas predicciones. El último elemento de la predicción corresponde a la RUL predicha para la secuencia parcial.

Como alternativa, puede hacer predicciones de una unidad de tiempo cada vez con predictAndUpdateState. Esta opción resulta útil cuando se tienen los valores de las unidades de tiempo que llegan a un flujo. Por lo general, es más rápido hacer predicciones sobre secuencias completas en comparación con hacer predicciones de una unidad de tiempo cada vez. Para ver un ejemplo que muestra cómo pronosticar unidades de tiempo futuras actualizando la red entre predicciones de una sola unidad, consulte Time Series Forecasting Using Deep Learning.

Visualice algunas de las predicciones en una gráfica.

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')

Para una secuencia parcial determinada, la RUL actual predicha es el último elemento de las secuencias predichas. Calcule el error cuadrático medio raíz (RMSE) de las predicciones y visualice el error de predicción en un histograma.

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")

Referencias

  1. Saxena, Abhinav, Kai Goebel, Don Simon y Neil Eklund. "Damage propagation modeling for aircraft engine run-to-failure simulation". En Prognostics and Health Management, 2008. PHM 2008. International Conference on, págs. 1-9. IEEE, 2008.

  2. Saxena, Abhinav, Kai Goebel. "Turbofan Engine Degradation Simulation Data Set". NASA Ames Prognostics Data Repository https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/, NASA Ames Research Center, Moffett Field, CA

Consulte también

| | | |

Temas relacionados