Contenuto principale

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

Reti neurali con memoria a breve e lungo termine

Questo argomento spiega come lavorare con dati sequenziali e delle serie temporali per le attività di classificazione e regressione, utilizzando reti neurali con memoria a breve e lungo termine (LSTM). Per un esempio che mostra come classificare i dati sequenziali utilizzando una rete neurale LSTM, vedere Classificazione di sequenze utilizzando il Deep Learning.

Una rete neurale LSTM è un tipo di rete neurale ricorrente (RNN) in grado di apprendere le dipendenze a lungo termine tra le fasi temporali dei dati sequenziali.

Architettura della rete neurale LSTM

I componenti di base di una rete neurale LSTM sono un livello di input di sequenza e un livello LSTM. Un livello di input di sequenza immette nella rete neurale dati sequenziali o delle serie temporali. Un livello LSTM apprende le dipendenze a lungo termine tra le fasi temporali dei dati sequenziali.

Questo diagramma illustra l'architettura di una rete neurale LSTM semplice per la classificazione. La rete neurale inizia con un livello di input di sequenza seguito da un livello LSTM. Per prevedere le etichette delle classi, la rete neurale termina con un livello completamente connesso e un livello softmax.

Diagram illustrating the architecture of a simple LSTM neural network for classification.

Questo diagramma illustra l'architettura di una rete neurale LSTM semplice per la regressione. La rete neurale inizia con un livello di input di sequenza seguito da un livello LSTM. La rete neurale termina con un livello completamente connesso.

Diagram illustrating the architecture of a simple LSTM neural network for regression.

Reti LSTM per la classificazione

Per creare una rete LSTM per la classificazione da sequenza a etichetta, creare un array di livelli contenente un livello di input di sequenza, un livello LSTM, un livello completamente connesso e un livello softmax.

Impostare la grandezza del livello di input di sequenza sul numero di feature dei dati di input. Impostare la grandezza del livello completamente connesso sul numero di classi. Non è necessario specificare la lunghezza della sequenza.

Per il livello LSTM, specificare il numero di unità nascoste e la modalità di output "last".

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

Per un esempio che mostra come addestrare una rete LSTM per la classificazione da sequenza a etichetta e come classificare nuovi dati, vedere Classificazione di sequenze utilizzando il Deep Learning.

Per creare una rete LSTM per la classificazione da sequenza a sequenza, utilizzare la stessa architettura della classificazione da sequenza a etichetta, ma impostare la modalità di output del livello LSTM su "sequence".

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

Reti LSTM per la regressione

Per creare una rete LSTM per la regressione da sequenza a singolo, creare un array di livelli contenente un livello di input di sequenza, un livello LSTM e un livello completamente connesso.

Impostare la grandezza del livello di input di sequenza sul numero di feature dei dati di input. Impostare la grandezza del livello completamente connesso sul numero di risposte. Non è necessario specificare la lunghezza della sequenza.

Per il livello LSTM, specificare il numero di unità nascoste e la modalità di output "last".

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

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

Per creare una rete LSTM per la regressione da sequenza a sequenza, utilizzare la stessa architettura della regressione da sequenza a singolo, ma impostare la modalità di output del livello LSTM su "sequence".

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

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

Per un esempio che mostra come addestrare una rete LSTM per la regressione da sequenza a sequenza e come fare previsioni su nuovi dati, vedere Sequence-to-Sequence Regression Using Deep Learning.

Rete di classificazione video

Per creare una rete di Deep Learning per dati contenenti sequenze di immagini, come dati video e immagini mediche, specificare l'input di sequenza delle immagini utilizzando il livello di input di sequenza.

Specificare i livelli e creare un oggetto 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);

Per un esempio che mostra come addestrare una rete di Deep Learning per la classificazione dei video, vedere Classify Videos Using Deep Learning.

Reti LSTM più profonde

È possibile rendere le reti LSTM più profonde inserendo, prima del livello LSTM, livelli LSTM aggiuntivi con la modalità di output "sequence". Per evitare l'overfitting, è possibile inserire livelli di dropout dopo i livelli LSTM.

Per le reti di classificazione da sequenza a etichetta, la modalità di output dell'ultimo livello LSTM deve essere "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];

Per le reti di classificazione da sequenza a sequenza, la modalità di output dell'ultimo livello LSTM deve essere "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];

Livelli

LivelloDescrizione

sequenceInputLayer

Un livello di input di sequenza immette dati sequenziali in una rete neurale e applica la normalizzazione dei dati.

lstmLayer

Un livello LSTM è un livello RNN che apprende le dipendenze a lungo termine tra le fasi temporali dei dati delle serie temporali e dei dati sequenziali.

bilstmLayer

Un livello LSTM bidirezionale (BiLSTM) è un livello RNN che apprende le dipendenze bidirezionali a lungo termine tra le fasi temporali dei dati delle serie temporali o dei dati sequenziali. Queste dipendenze possono essere utili quando si desidera che la RNN apprenda dalle serie temporali complete a ciascun passo temporale.

gruLayer

Un livello GRU è un livello RNN che apprende le dipendenze tra le fasi temporali dei dati delle serie temporali e dei dati sequenziali.

convolution1dLayer

Un livello convoluzionale monodimensionale applica filtri convoluzionali a scorrimento a un input monodimensionale.

maxPooling1dLayer

Un livello di pooling massimo monodimensionale effettua il sottocampionamento dividendo l'input in regioni di pooling monodimensionali e calcolando il massimo di ciascuna regione.

averagePooling1dLayer

Un livello di pooling medio monodimensionale esegue il sottocampionamento dividendo l'input in regioni di pooling monodimensionali, calcolando poi la media di ciascuna regione.

globalMaxPooling1dLayer

Un livello di pooling massimo globale monodimensionale effettua il sottocampionamento producendo il massimo delle dimensioni temporali o spaziali dell'input.

flattenLayer

Un livello di appiattimento comprime le dimensioni spaziali dell'input nella dimensione del canale.

wordEmbeddingLayer (Text Analytics Toolbox)

Un livello di incorporazione delle parole mappa gli indici delle parole ai vettori.

Classificazione, previsione e analisi previsionale

Per fare previsioni su nuovi dati, utilizzare la funzione minibatchpredict. Per convertire i punteggi di classificazione previsti in etichette, utilizzare scores2label.

Le reti neurali LSTM possono ricordare lo stato della rete neurale tra le previsioni. Lo stato RNN è utile quando non si dispone della serie temporale completa in anticipo o se si desidera effettuare più previsioni su una serie temporale lunga.

Per prevedere e classificare parti di una serie temporale e aggiornare lo stato della RNN, utilizzare la funzione predict e, inoltre, restituire e aggiornare lo stato della rete neurale. Per reimpostare lo stato della RNN tra le previsioni, utilizzare resetState.

Per un esempio che mostra come effettuare un'analisi previsionale delle fasi temporali future di una sequenza, vedere Previsione delle serie temporali tramite il Deep Learning.

Riempimento e troncamento delle sequenze

Le reti neurali LSTM supportano dati di input con sequenze di lunghezza variabile. Quando i dati passano attraverso la rete neurale, il software riempie o tronca le sequenze in modo che tutte le sequenze di ogni mini-batch abbiano la lunghezza specificata. È possibile specificare le lunghezze delle sequenze e il valore utilizzato per riempire le sequenze utilizzando le opzioni di addestramento SequenceLength e SequencePaddingValue.

Dopo l'addestramento della rete neurale, è possibile utilizzare la stessa grandezza del mini-batch e le stesse opzioni di riempimento che si utilizzano con la funzione minibatchpredict.

Ordinamento delle sequenze per lunghezza

Per ridurre la quantità di dati di riempimento o di scarto quando si riempiono o si troncano le sequenze, provare a ordinare i dati in base alla lunghezza della sequenza. Per le sequenze in cui la prima dimensione corrisponde ai passi temporali, per ordinare i dati in base alla lunghezza della sequenza, ricavare innanzitutto il numero di colonne di ogni sequenza applicando size(X,1) a ogni sequenza utilizzando cellfun. Quindi ordinare le lunghezze delle sequenze utilizzando sort e utilizzare il secondo output per riordinare le sequenze originali.

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.

Riempimento delle sequenze

Se l'opzione di addestramento o di previsione SequenceLength è "longest", il software riempie le sequenze in modo che tutte le sequenze di un mini-batch abbiano la stessa lunghezza della sequenza più lunga del mini-batch stesso. Questa opzione è l'impostazione predefinita.

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.

Troncamento delle sequenze

Se l'opzione di addestramento o di previsione SequenceLength è "shortest", il software tronca le sequenze in modo che tutte le sequenze di un mini-batch abbiano la stessa lunghezza della sequenza più corta di quel mini-batch. I dati rimanenti nelle sequenze vengono scartati.

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.

Specifica della direzione di riempimento

La posizione del riempimento e del troncamento può avere un impatto sull'addestramento, sulla classificazione e sulla precisione della previsione. Provare a impostare le opzioni di addestramento SequencePaddingDirection su "left" o "right" per verificare quale sia la posizione migliore per i dati.

Dato che i livelli ricorrenti elaborano i dati sequenziali una fase temporale alla volta, quando la proprietà OutputMode del livello ricorrente è "last", qualsiasi riempimento nelle fasi temporali finali può influire negativamente sull’output del livello. Per riempire o troncare i dati sequenziali a sinistra, impostare l'argomento SequencePaddingDirection su "left".

Per le reti neurali sequenza-sequenza (quando la proprietà OutputMode è "sequence" per ogni livello ricorrente), qualsiasi riempimento nelle fasi temporali iniziali può influire negativamente sulle previsioni per le fasi temporali precedenti. Per riempire o troncare i dati sequenziali a destra, impostare l’opzione SequencePaddingDirection su "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.

Normalizzazione dei dati sequenziali

Per ricentrare automaticamente i dati di addestramento al momento dell'addestramento utilizzando la normalizzazione a centro zero, impostare l'opzione Normalization di sequenceInputLayer su "zerocenter". In alternativa, è possibile normalizzare i dati sequenziali calcolando prima la media e la deviazione standard per feature di tutte le sequenze. Quindi, per ogni osservazione di addestramento, sottrarre il valore medio e dividerlo per la deviazione standard.

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

Dati non allocabili in memoria

Utilizzare i datastore per i dati sequenziali, di serie temporali e di segnale quando i dati sono troppo grandi per adattarsi alla memoria o per eseguire operazioni specifiche durante la lettura di batch di dati.

Per saperne di più, vedere Train Network Using Out-of-Memory Sequence Data e Classify Out-of-Memory Text Data Using Deep Learning.

Visualizzazione

Esaminare e visualizzare le feature apprese dalle reti neurali LSTM da dati sequenziali e serie temporali, estraendo le attivazioni utilizzando la funzione minibatchpredict e impostando l'argomento Outputs. Per saperne di più, vedere Visualizzazione delle attivazioni della rete LSTM.

Architettura del livello LSTM

Questo diagramma illustra il flusso di dati attraverso un livello LSTM con input x e output y, con T fasi temporali. Nel diagramma, ht indica l'output (noto anche come stato nascosto) e ct indica lo stato della cella nella fase temporale t.

Se il livello produce l'intera sequenza, produce quindi y1, …, yT che è equivalente a h1, …, hT. Se il livello produce solo l'ultima fase temporale, il livello produce quindi yT che è equivalente a hT. Il numero di canali in output corrisponde al numero di unità nascoste del livello 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 prima operazione LSTM utilizza lo stato iniziale della RNN e la prima fase temporale della sequenza per calcolare il primo output e lo stato aggiornato della cella. Nella fase temporale t, l'operazione utilizza lo stato corrente della RNN (ct1,ht1) e la fase temporale successiva della sequenza per calcolare l'output e lo stato aggiornato della cella ct.

Lo stato del livello è costituito dallo stato nascosto (noto anche come stato di output) e dallo stato della cella. Lo stato nascosto nella fase temporale t contiene l'output del livello LSTM per questa fase temporale. Lo stato della cella contiene le informazioni apprese nelle fasi temporali precedenti. A ciascuna fase temporale, il livello aggiunge o rimuove informazioni dallo stato della cella. Il livello controlla questi aggiornamenti utilizzando le porte.

Questi componenti controllano lo stato della cella e lo stato nascosto del livello.

ComponenteScopo
Porta di input (i)Controllare l'aggiornamento dello stato della cella
Porta di dimenticanza (f)Controllare il livello di ripristino dello stato della cella (dimenticanza)
Candidato della cella (g)Aggiungere informazioni allo stato della cella
Porta di output (o)Controllare il livello dello stato della cella aggiunto allo stato nascosto

Questo diagramma illustra il flusso di dati nella fase temporale t. Questo diagramma mostra come le porte dimenticano, aggiornano e producono gli stati della cella e gli stati nascosti.

Flow diagram of cell and hidden states

I pesi apprendibili di un livello LSTM sono i pesi di input W (InputWeights), i pesi ricorrenti R (RecurrentWeights) e il bias b (Bias). Le matrici W, R e b sono rispettivamente le concatenazioni dei pesi di input, dei pesi ricorrenti e del bias di ogni componente. Il livello concatena le matrici in base a queste equazioni:

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

dove i, f, g e o indicano rispettivamente la porta di input, la porta di dimenticanza, il candidato della cella e la porta di output.

Lo stato della cella nella fase temporale t è dato da

ct=ftct1+itgt,

, dove indica il prodotto di Hadamard (moltiplicazione di vettori elemento per elemento).

Lo stato nascosto nella fase temporale t è dato da

ht=otσc(ct),

, dove σc indica la funzione di attivazione dello stato. Per impostazione predefinita, la funzione lstmLayer utilizza la funzione tangente iperbolica (tanh) per calcolare la funzione di attivazione dello stato.

Queste formule descrivono i componenti nella fase temporale t.

ComponenteFormula
Porta di inputit=σg(Wixt+Riht1+bi)
Porta di dimenticanzaft=σg(Wfxt+Rfht1+bf)
Candidato della cellagt=σc(Wgxt+Rght1+bg)
Porta di outputot=σg(Woxt+Roht1+bo)

In questi calcoli, σg indica la funzione di attivazione della porta. Per impostazione predefinita, la funzione lstmLayer utilizza la funzione sigmoidale data da σ(x)=(1+ex)1, per calcolare la funzione di attivazione della porta.

Riferimenti

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

Vedi anche

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

Argomenti