Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Redes neuronales de memoria de corto-largo plazo

En este tema se explica cómo trabajar con datos secuenciales y de series de tiempo en tareas de clasificación y regresión usando redes neuronales de memoria de corto-largo plazo (LSTM). Para ver un ejemplo de cómo clasificar datos secuenciales mediante una red neuronal de LSTM, consulte Clasificación de secuencias mediante deep learning.

Una red neuronal de LSTM es un tipo de red neuronal recurrente (RNN) que puede aprender dependencias a largo plazo entre unidades de tiempo de datos secuenciales.

Arquitectura de red neuronal de LSTM

Los componentes principales de una red neuronal de LSTM son una capa de entrada de secuencias y una capa de LSTM. Una capa de entrada de secuencias introduce datos secuenciales o de series de tiempo en la red neuronal. Una capa de LSTM aprende dependencias a largo plazo entre las unidades de tiempo de los datos secuenciales.

Este diagrama ilustra la arquitectura de una red neuronal de LSTM sencilla para clasificación. La red neuronal comienza con una capa de entrada de secuencias seguida de una capa de LSTM. Para predecir las etiquetas de clase, la red neuronal termina con una capa totalmente conectada, una capa softmax y una capa de clasificación de salida.

Este diagrama ilustra la arquitectura de una red neuronal de LSTM sencilla para regresión. La red neuronal comienza con una capa de entrada de secuencias seguida de una capa de LSTM. La red neuronal termina con una capa totalmente conectada y una capa de regresión de salida.

Este diagrama ilustra la arquitectura de una red neuronal para la clasificación de vídeo. Para introducir secuencias de imagen en la red neuronal, utilice una capa de entrada de secuencias. Para utilizar capas convolucionales para extraer características, es decir, para aplicar operaciones convolucionales a cada cuadro de los vídeos de forma independiente, utilice una capa de pliegue de secuencias seguida de las capas convolucionales y, después, la capa de despliegue de secuencias. Para utilizar las capas de LSTM para aprender a partir de vectores de secuencias, utilice una capa aplanada seguida de las capas de LSTM y de salida.

Redes de LSTM de clasificación

Para crear una red de LSTM para la clasificación secuencia a etiqueta, cree un arreglo de capas que contenga una capa de entrada de secuencias, una capa de LSTM, una capa totalmente conectada, una capa softmax y una capa de clasificación de salida.

Establezca el tamaño de la capa de entrada de secuencias en el número de características de los datos de entrada. Establezca el tamaño de la capa totalmente conectada en el número de clases. No es necesario especificar la longitud de la secuencia.

Para la capa de LSTM, especifique el número de unidades ocultas y el modo de salida 'last'.

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Para ver un ejemplo de cómo entrenar una red de LSTM para una clasificación secuencia a etiqueta y clasificar nuevos datos, consulte Clasificación de secuencias mediante deep learning.

Para crear una red de LSTM para una clasificación secuencia a secuencia, utilice la misma arquitectura que para la clasificación secuencia a etiqueta, pero establezca el modo de salida de la capa de LSTM en 'sequence'.

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Redes de LSTM de regresión

Para crear una red de LSTM para la regresión secuencia a uno, cree un arreglo de capas que contenga una capa de entrada de secuencias, una capa de LSTM, una capa totalmente conectada y una capa de regresión de salida.

Establezca el tamaño de la capa de entrada de secuencias en el número de características de los datos de entrada. Establezca el tamaño de la capa totalmente conectada en el número de respuestas. No es necesario especificar la longitud de la secuencia.

Para la capa de LSTM, especifique el número de unidades ocultas y el modo de salida 'last'.

numFeatures = 12;
numHiddenUnits = 125;
numResponses = 1;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numResponses)
    regressionLayer];

Para crear una red de LSTM para una regresión secuencia a secuencia, utilice la misma arquitectura que para la regresión secuencia a uno, pero establezca el modo de salida de la capa de LSTM en 'sequence'.

numFeatures = 12;
numHiddenUnits = 125;
numResponses = 1;

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

Para ver un ejemplo de cómo entrenar una red de LSTM para la regresión secuencia a secuencia y predecir nuevos datos, consulte Regresión de secuencia a secuencia mediante deep learning.

Red de clasificación de vídeo

Para crear una red de deep learning para datos que contengan secuencias de imágenes como datos de vídeo e imágenes médicas, especifique la entrada de secuencias de imagen mediante la capa de entrada de secuencias.

Para utilizar capas convolucionales para extraer características, es decir, para aplicar operaciones convolucionales a cada cuadro de los vídeos de forma independiente, utilice una capa de pliegue de secuencias seguida de las capas convolucionales y, después, la capa de despliegue de secuencias. Para utilizar las capas de LSTM para aprender a partir de vectores de secuencias, utilice una capa aplanada seguida de las capas de LSTM y de salida.

inputSize = [28 28 1];
filterSize = 5;
numFilters = 20;
numHiddenUnits = 200;
numClasses = 10;

layers = [ ...
    sequenceInputLayer(inputSize,'Name','input')
    
    sequenceFoldingLayer('Name','fold')
    
    convolution2dLayer(filterSize,numFilters,'Name','conv')
    batchNormalizationLayer('Name','bn')
    reluLayer('Name','relu')
    
    sequenceUnfoldingLayer('Name','unfold')
    flattenLayer('Name','flatten')
    
    lstmLayer(numHiddenUnits,'OutputMode','last','Name','lstm')
    
    fullyConnectedLayer(numClasses, 'Name','fc')
    softmaxLayer('Name','softmax')
    classificationLayer('Name','classification')];

Convierta las capas en una gráfica de capas y conecte la salida miniBatchSize de la capa de pliegue de secuencias a la entrada correspondiente de la capa de despliegue de secuencias.

lgraph = layerGraph(layers);
lgraph = connectLayers(lgraph,'fold/miniBatchSize','unfold/miniBatchSize');

Para ver un ejemplo de cómo entrenar una red de deep learning para la clasificación de vídeo, consulte Classify Videos Using Deep Learning.

Redes de LSTM más profundas

Puede hacer más profundas las redes de LSTM insertando capas de LSTM adicionales con el modo de salida 'sequence' antes de la capa de LSTM. Para evitar un sobreajuste, puede insertar capas de abandono después de las capas de LSTM.

En el caso de redes de clasificación secuencia a etiqueta, el modo de salida de la última capa de LSTM debe ser 'last'.

numFeatures = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits1,'OutputMode','sequence')
    dropoutLayer(0.2)
    lstmLayer(numHiddenUnits2,'OutputMode','last')
    dropoutLayer(0.2)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

En el caso de redes de clasificación secuencia a secuencia, el modo de salida de la última capa de LSTM debe ser 'sequence'.

numFeatures = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits1,'OutputMode','sequence')
    dropoutLayer(0.2)
    lstmLayer(numHiddenUnits2,'OutputMode','sequence')
    dropoutLayer(0.2)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Capas

CapaDescripción

sequenceInputLayer

Una capa de entrada de secuencias introduce datos secuenciales en una red neuronal.

lstmLayer

Una capa de LSTM es una capa de RNN que aprende dependencias a largo plazo entre unidades de tiempo de series de tiempo y datos secuenciales.

bilstmLayer

Una capa de LSTM bidireccional (BiLSTM) es una capa de RNN que aprende dependencias bidireccionales a largo plazo entre unidades de tiempo de series de tiempo y datos secuenciales. Estas dependencias pueden resultar útiles cuando quiera que la RNN aprenda de series de tiempo completas en cada unidad de tiempo.

gruLayer

Una capa GRU es una capa de RNN que aprende dependencias entre unidades de tiempo de series de tiempo y datos secuenciales.

convolution1dLayer

Una capa convolucional 1D aplica filtros convolucionales deslizantes a la entrada 1D.

maxPooling1dLayer

Una capa de agrupación máxima 1D realiza un submuestreo dividiendo la entrada en regiones de agrupación 1D y, después, calculando el máximo de cada región.

averagePooling1dLayer

Una capa de agrupación media 1D realiza un submuestreo dividiendo la entrada en regiones de agrupación 1D y, después, calculando la media de cada región.

globalMaxPooling1dLayer

Una capa de agrupación máxima global 1D realiza un submuestreo generando el máximo del tiempo o de las dimensiones espaciales de la entrada.

sequenceFoldingLayer

Una capa de pliegue de secuencias convierte un lote de secuencias de imágenes en un lote de imágenes. Utilice una capa de pliegue de secuencias para realizar operaciones convolucionales en las unidades de tiempo de las secuencias de imágenes de forma independiente.

sequenceUnfoldingLayer

Una capa de despliegue de secuencias restaura la estructura secuencial de los datos de entrada tras el pliegue de secuencias.

flattenLayer

Una capa aplanada contrae las dimensiones espaciales de la entrada a la dimensión del canal.

wordEmbeddingLayer (Text Analytics Toolbox)

Una capa de word embedding asigna índices de palabras a vectores.

Clasificación, predicción y pronóstico

Para clasificar o hacer predicciones sobre datos nuevos, utilice classify y predict.

Las redes neuronales de LSTM pueden recordar el estado de la red neuronal entre predicciones. El estado de RNN resulta útil cuando no se tienen las series de tiempo completas con antelación o si se desea hacer múltiples predicciones sobre una serie de tiempo larga.

Para predecir y clasificar partes de una serie de tiempo y actualizar el estado de RNN, utilice predictAndUpdateState y classifyAndUpdateState. Para restablecer el estado de RNN entre predicciones, utilice resetState.

Para ver un ejemplo de cómo pronosticar unidades de tiempo futuras de una secuencia, consulte Pronóstico de series de tiempo mediante deep learning.

Relleno, truncamiento y división de secuencias

Las redes neuronales de LSTM admiten datos de entrada con diferentes longitudes de secuencia. Cuando se pasan datos a través de la red neuronal, el software rellena, trunca o divide las secuencias para que todas las secuencias de cada minilote tengan la longitud especificada. Puede especificar las longitudes de secuencia y el valor utilizados para rellenar las secuencias con los argumentos de par nombre-valor SequenceLength y SequencePaddingValue en trainingOptions.

Tras entrenar la red neuronal, utilice el mismo tamaño de minilote y las opciones de relleno cuando utilice las funciones classify, predict, classifyAndUpdateState, predictAndUpdateState y activations.

Ordenar secuencias por longitud

Para reducir la cantidad de relleno o de datos descartados cuando rellene o trunque secuencias, pruebe a ordenar los datos por longitud de secuencia. Para ordenar los datos por longitud de secuencia, obtenga primero el número de columnas de cada secuencia aplicando size(X,2) a cada secuencia con cellfun. A continuación, ordene las longitudes de secuencia con sort y utilice la segunda salida para reordenar las secuencias originales.

sequenceLengths = cellfun(@(X) size(X,2), XTrain);
[sequenceLengthsSorted,idx] = sort(sequenceLengths);
XTrain = XTrain(idx);

Las siguientes figuras muestran las longitudes de secuencia de los datos ordenados y sin ordenar en gráficas de barras.

Rellenar secuencias

Si especifica la longitud de secuencia 'longest', el software rellena las secuencias de forma que todas las secuencias de un minilote tengan la misma longitud que la secuencia más larga del minilote. Esta es la opción por defecto.

Las siguientes figuras ilustran el efecto de rellenar datos secuenciales hasta la longitud de la secuencia más larga de cada minilote.

Truncar secuencias

Si especifica la longitud de secuencia 'shortest', el software trunca las secuencias de forma que todas las secuencias de un minilote tengan la misma longitud que la secuencia más corta de ese minilote. Los datos restantes de las secuencias se descartan.

Las siguientes figuras ilustran el efecto de truncar datos secuenciales hasta la longitud de la secuencia más corta de cada minilote.

Dividir secuencias

Si establece la longitud de secuencia en un valor entero, el software rellena todas las secuencias de un minilote hasta la longitud de secuencia más larga del minilote. A continuación, el software divide cada secuencia en secuencias más pequeñas de la longitud especificada. Si se produce la división, el software crea minilotes adicionales. Si la longitud de secuencia especificada no divide uniformemente las longitudes de secuencia de los datos, entonces los minilotes que contienen las unidades de tiempo finales de las secuencias tienen una longitud más corta que la longitud de secuencia especificada.

Utilice esta opción si las secuencias completas no caben en la memoria. Como alternativa, puede intentar reducir el número de secuencias por minilote ajustando la opción de entrenamiento MiniBatchSize a un valor inferior mediante la función trainingOptions.

Si especifica la longitud de secuencia como un entero positivo, el software procesa las secuencias más pequeñas en iteraciones consecutivas. La red neuronal actualiza el estado de RNN entre las secuencias divididas.

Las siguientes figuras ilustran el efecto de dividir una colección de secuencias en minilotes con una longitud de secuencia de 5.

Especificar la dirección de relleno

La ubicación del relleno y del truncamiento puede afectar a la precisión del entrenamiento, la clasificación y la predicción. Pruebe a establecer la opción 'SequencePaddingDirection' de trainingOptions en 'left' o 'right' y compruebe qué es mejor para los datos.

Dado que las capas recurrentes procesan los datos secuenciales en una unidad de tiempo cada vez, cuando la propiedad OutputMode de la capa recurrente es 'last', cualquier relleno en las unidades de tiempo finales puede influir negativamente en la salida de la capa. Para rellenar o truncar datos secuenciales a la izquierda, establezca la opción SequencePaddingDirection en "left".

Para redes neuronales secuencia a secuencia (cuando la propiedad OutputMode es 'sequence' para cada capa recurrente), cualquier relleno en las primeras unidades de tiempo puede influir negativamente en las predicciones para unidades de tiempo anteriores. Para rellenar o truncar datos secuenciales a la derecha, establezca la opción SequencePaddingDirection en "right".

Las siguientes figuras ilustran el relleno de datos secuenciales a la izquierda y a la derecha.

Las siguientes figuras ilustran el truncamiento de datos secuenciales a la izquierda y a la derecha.

Normalizar datos secuenciales

Para volver a centrar los datos de entrenamiento de forma automática en el momento del entrenamiento mediante la normalización cero a centro, establezca la opción Normalization de sequenceInputLayer en 'zerocenter'. Como alternativa, puede normalizar los datos secuenciales calculando primero la media y la desviación estándar por característica de todas las secuencias. A continuación, en cada observación de entrenamiento, reste el valor de la media y divídala por la desviación estándar.

mu = mean([XTrain{:}],2);
sigma = std([XTrain{:}],0,2);
XTrain = cellfun(@(X) (X-mu)./sigma,XTrain,'UniformOutput',false);

Datos fuera de memoria

Utilice almacenes de datos para datos secuenciales, de series de tiempo y de señal cuando los datos sean demasiado grandes para caber en la memoria o para realizar operaciones específicas cuando se lean los lotes de datos.

Para obtener más información, consulte Train Network Using Out-of-Memory Sequence Data y Classify Out-of-Memory Text Data Using Deep Learning.

Visualización

Investigue y visualice las características aprendidas por las redes neuronales de LSTM a partir de datos secuenciales y de series de tiempo extrayendo las activaciones con la función activations. Para obtener más información, consulte Visualizar activaciones de redes de LSTM.

Arquitectura de la red de LSTM

Este diagrama ilustra el flujo de una serie de tiempo X con C características (canales) de longitud S a través de una capa de LSTM. En el diagrama, ht y ct determinan la salida (también conocida como el estado oculto) y el estado de celda en la unidad de tiempo t, respectivamente.

El primer bloque de LSTM utiliza el estado inicial de RNN y la primera unidad de tiempo de la secuencia para calcular la primera salida y el estado de celda actualizado. En la unidad de tiempo t, el bloque utiliza el estado actual de RNN (ct1,ht1) y la siguiente unidad de tiempo de la secuencia para calcular la salida y el estado de celda actualizado ct.

El estado de la capa consiste en el estado oculto (también conocido como el estado de salida) y el estado de celda. El estado oculto en la unidad de tiempo t contiene la salida de la capa de LSTM para esta unidad de tiempo. El estado de celda contiene la información aprendida en las unidades de tiempo anteriores. En cada unidad de tiempo, la capa añade información a o elimina información del estado de celda. La capa controla estas actualizaciones mediante puertas.

Estos componentes controlan el estado de la celda y el estado oculto de la capa.

ComponenteFinalidad
Puerta de entrada (i)Controlar el nivel de actualización del estado de celda
Puerta de olvido (f)Controlar el nivel de restablecimiento del estado de celda (olvidar)
Candidato a celda (g)Añadir información al estado de celda
Puerta de salida (o)Controlar el nivel de estado de celda añadido al estado oculto

Este diagrama ilustra el flujo de datos en la unidad de tiempo t. Este diagrama muestra cómo las puertas olvidan, actualizan y generan los estados de celda y oculto.

Los pesos que pueden aprenderse de una capa de LSTM son los pesos de entrada W (InputWeights), los pesos recurrentes R (RecurrentWeights) y el sesgo b (Bias). Las matrices W, R y b son concatenaciones de los pesos de entrada, los pesos recurrentes y el sesgo de cada componente, respectivamente. La capa concatena las matrices según estas ecuaciones:

W=[WiWfWgWo],  R=[RiRfRgRo],  b=[bibfbgbo],

donde i, f, g y o determinan la puerta de entrada, la puerta de olvido, el candidato a celda y la puerta de salida, respectivamente.

El estado de celda en la unidad de tiempo t viene dado por

ct=ftct1+itgt,

, donde determina el producto de Hadamard (multiplicación de vectores a nivel de elemento).

El estado oculto en la unidad de tiempo t viene dado por

ht=otσc(ct),

, donde σc determina la función de activación del estado. De forma predeterminada, la función lstmLayer utiliza la función tangente hiperbólica (tanh) para calcular la función de activación del estado.

Estas fórmulas describen los componentes en la unidad de tiempo t.

ComponenteFórmula
Puerta de entradait=σg(Wixt+Riht1+bi)
Puerta de olvidoft=σg(Wfxt+Rfht1+bf)
Candidato a celdagt=σc(Wgxt+Rght1+bg)
Puerta de salidaot=σg(Woxt+Roht1+bo)

En estos cálculos, σg determina la función de activación de la puerta. De forma predeterminada, la función lstmLayer utiliza la función sigmoide dada por σ(x)=(1+ex)1 para calcular la función de activación de la puerta.

Referencias

[1] Hochreiter, S., and J. Schmidhuber. "Long short-term memory." Neural computation. Vol. 9, Number 8, 1997, pp.1735–1780.

Consulte también

| | | | | | | | | | (Text Analytics Toolbox) |

Temas relacionados