Main Content

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 y una capa softmax.

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.

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 y una capa softmax.

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

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

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 y una capa totalmente conectada.

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

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

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.

Especifique las capas y cree un objeto dlnetwork.

inputSize = [64 64 3];
filterSize = 5;
numFilters = 20;
numHiddenUnits = 200;
numClasses = 10;

layers = [
    sequenceInputLayer(inputSize)
    convolution2dLayer(filterSize,numFilters)
    batchNormalizationLayer
    reluLayer
    lstmLayer(numHiddenUnits,OutputMode="last")
    fullyConnectedLayer(numClasses)
    softmaxLayer];

net = dlnetwork(layers);

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.

Para 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];

Para 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];

Capas

CapaDescripción

sequenceInputLayer

Una capa de entrada de secuencias introduce datos secuenciales en una red neuronal y aplica normalización de datos.

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.

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 hacer predicciones sobre nuevos datos, use la función minibatchpredict. Para convertir las puntuaciones de clasificación predichas en etiquetas, use la función scores2label.

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 la RNN, use la función predict y también devuelva y actualice el estado de la red neuronal. 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 y truncado 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 o trunca 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 las opciones de entrenamiento SequenceLength y SequencePaddingValue.

Después de entrenar la red neuronal, puede usar las mismas opciones de relleno y tamaño de minilote cuando use la función minibatchpredict.

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 secuencias en las que la primera dimensión corresponde a las unidades de tiempo, para ordenar los datos por longitud de secuencia, obtenga primero el número de columnas de cada secuencia aplicando size(X,1) 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,1), XTrain);
[sequenceLengthsSorted,idx] = sort(sequenceLengths);
XTrain = XTrain(idx);

Two plots bar charts representing sequence data. The x axis is labeled "Length" and the y axis is labeled "Sequence". The chart on the left has title "Unsorted Data" and shows the original sequence lengths. The chart on the right has title "Sorted Data" and shows that the sequences are sorted by length in ascending order.

Rellenar secuencias

Si la opción de predicción o entrenamiento SequenceLength es "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.

Two plots bar charts representing sequence data. The x axis is labeled "Length" and the y axis is labeled "Sequence". The chart on the left has title "Unsorted Data" and shows the original sequence lengths. The chart on the right has title "Sorted Data" and shows that the sequences are sorted by length in ascending order. Both charts indicate sequences divided into mini-batches using a red line and has a yellow region indicating right-padding. The chart on the right has smaller padding regions.

Truncar secuencias

Si la opción de predicción o entrenamiento SequenceLength es "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.

Two plots bar charts representing sequence data. The x axis is labeled "Length" and the y axis is labeled "Sequence". The chart on the left has title "Unsorted Data" and shows the original sequence lengths. The chart on the right has title "Sorted Data" and shows that the sequences are sorted by length in ascending order. Both charts indicate sequences divided into mini-batches using a red line and has a gray patches indicating discarded data on the right-side of the sequences. The chart on the right has less discarded data.

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 las opciones de entrenamiento SequencePaddingDirection 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".

Two plots bar charts representing sequence data sorted by length. The x axis is labeled "Length" and the y axis is labeled "Sequence". The chart on the left has title "Left-Padding" and shows yellow padding regions on the left of the sequences. The chart on the right has title "Right-Padding" and shows yellow padding regions on the right of the sequences. Both charts indicate sequences divided into mini-batches using a red line.

Two plots bar charts representing sequence data sorted by length. The x axis is labeled "Length" and the y axis is labeled "Sequence". The chart on the left has title "Left-Truncation" and shows gray truncation regions on the left of the sequences. The chart on the right has title "Right-Truncation" and shows gray truncation regions on the right of the sequences. Both charts indicate sequences divided into mini-batches using a red line.

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{:}],1);
sigma = std([XTrain{:}],0,1);
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 minibatchpredict y configurando el argumento Outputs. 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 datos a través de una capa de LSTM con entrada x, salida y y con T unidades de tiempo. En el diagrama, ht determina la salida (también conocida como el estado oculto) y ct denota el estado de celda en la unidad de tiempo t.

Si la capa genera la secuencia completa, entonces genera y1, …, yT, que es equivalente a h1, …, hT. Si la capa genera únicamente la última unidad de tiempo, entonces genera yT, que es equivalente a hT. El número de canales en la salida coincide con el número de unidades ocultas de la capa de LSTM.

Diagram showing flow of data through an LSTM layer. The input time steps are labeled x_1 through x_T. The outputs are labeled y_1 through y_T. The layer consists of multiple LSTM operations. Each LSTM operation receives the hidden state and cell state from the previous operation and passes an updated hidden and cell state to the next operation. The hidden states are labeled h_0 through h_T, where h_0 is the initial state. The cell states are labeled c_0 through c_T, where c_0 is the initial state. The outputs y_t are equivalent to the hidden states h_t.

La primera operación de LSTM utiliza el estado inicial de la 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, la operación utiliza el estado actual de la 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.

Flow diagram of cell and hidden states

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