Длинные краткосрочные сети памяти

Эта тема объясняет, как работать с последовательностью и данными временных рядов для классификации и задач регрессии с помощью сетей долгой краткосрочной памяти (LSTM). Для примера, показывающего, как классифицировать данные о последовательности с помощью сети LSTM, смотрите, что Классификация Последовательностей Использует Глубокое обучение.

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

Архитектура сети LSTM

Базовые компоненты сети LSTM являются входным слоем последовательности и слоем LSTM. Последовательность ввела входную последовательность слоя или данные временных рядов в сеть. Слой LSTM изучает долгосрочные зависимости между временными шагами данных о последовательности.

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

Эта схема иллюстрирует архитектуру простой сети LSTM для регрессии. Сеть запускается с входного слоя последовательности, сопровождаемого слоем LSTM. Сетевые концы с полносвязным слоем и регрессией выводят слой.

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

Классификация сети LSTM

Чтобы создать сеть LSTM для классификации последовательностей к метке, создайте массив слоя, содержащий входной слой последовательности, слой LSTM, полносвязный слой, softmax слой и классификацию выходной слой.

Установите размер входного слоя последовательности к количеству функций входных данных. Установите размер полносвязного слоя к количеству классов. Вы не должны задавать длину последовательности.

Для слоя LSTM задайте количество скрытых модулей и режима вывода 'last'.

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

Для примера, показывающего, как обучить сеть LSTM для классификации последовательностей к метке и классифицировать новые данные, смотрите, что Классификация Последовательностей Использует Глубокое обучение.

Чтобы создать сеть LSTM для классификации от последовательности к последовательности, используйте ту же архитектуру что касается классификации последовательностей к метке, но установите режим вывода слоя LSTM к 'sequence'.

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

Регрессия сети LSTM

Чтобы создать сеть LSTM для sequence-one регрессии, создайте массив слоя, содержащий входной слой последовательности, слой LSTM, полносвязный слой и регрессию выходной слой.

Установите размер входного слоя последовательности к количеству функций входных данных. Установите размер полносвязного слоя к количеству ответов. Вы не должны задавать длину последовательности.

Для слоя LSTM задайте количество скрытых модулей и режима вывода 'last'.

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

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

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

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

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

Для примера, показывающего, как обучить сеть LSTM для регрессии от последовательности к последовательности и предсказать на новых данных, смотрите, что Регрессия От последовательности к последовательности Использует Глубокое обучение.

Видео сеть классификации

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

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

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

Преобразуйте слои в график слоя и соедините miniBatchSize вывод слоя сворачивания последовательности к соответствующему входу слоя разворачивания последовательности.

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

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

Глубже сети LSTM

Можно сделать сети LSTM глубже путем вставки дополнительных слоев LSTM с режимом вывода 'sequence' перед слоем LSTM. Чтобы предотвратить сверхподбор кривой, можно вставить слои уволенного после слоев LSTM.

Для сетей классификации последовательностей к метке режимом вывода последнего слоя LSTM должен быть '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];

Для сетей классификации от последовательности к последовательности режимом вывода последнего слоя LSTM должен быть '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];

Слои

ФункцияОписание

sequenceInputLayer

Последовательность ввела входные данные о последовательности слоя к сети.

lstmLayer

Слой LSTM изучает долгосрочные зависимости между временными шагами в данных о последовательности и временных рядах.

bilstmLayer

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

sequenceFoldingLayer

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

sequenceUnfoldingLayer

Слой разворачивания последовательности восстанавливает структуру последовательности входных данных после сворачивания последовательности.

flattenLayer

Сглаживать слой сворачивает пространственные размерности входа в размерность канала.

wordEmbeddingLayer (Text Analytics Toolbox™)

Слой встраивания слова сопоставляет словари с векторами.

Классификация, прогноз и прогнозирование

Чтобы классифицировать или сделать прогнозы на новых данных, используйте classify и predict.

Сети LSTM могут помнить состояние сети между прогнозами. Сетевое состояние полезно, когда у вас нет полных временных рядов заранее, или если вы хотите сделать несколько прогнозов на долговременном ряде.

Чтобы предсказать и классифицировать на частях временных рядов и обновить сетевое состояние, используйте predictAndUpdateState и classifyAndUpdateState. Чтобы сбросить сетевое состояние между прогнозами, используйте resetState.

Для примера, показывающего, как предсказать будущие временные шаги последовательности, смотрите, что Временные ряды Предсказывают Используя Глубокое обучение.

Дополнение последовательности, усечение и разделение

Сети LSTM поддерживают входные данные с переменными длинами последовательности. Когда передающие данные через сеть, клавиатуры программного обеспечения, обрезают или разделяют последовательности так, чтобы все последовательности в каждом мини-пакете имели заданную длину. Можно задать длины последовательности, и значение раньше заполняло последовательности с помощью аргументов пары "имя-значение" SequenceLength и SequencePaddingValue в trainingOptions.

Сортировка последовательностей длиной

Чтобы уменьшать объем дополнения или отброшенных данных при дополнении или усечении последовательностей, попытайтесь сортировать данные по длине последовательности. Чтобы отсортировать данные по длине последовательности, сначала получите количество столбцов каждой последовательности путем применения size(X,2) к каждой последовательности с помощью cellfun. Затем отсортируйте длины последовательности с помощью sort и используйте второй вывод, чтобы переупорядочить исходные последовательности.

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

Следующие данные показывают длины последовательности отсортированных и неотсортированных данных в столбчатых диаграммах.

Заполните последовательности

Если вы задаете длину последовательности 'longest', то программное обеспечение заполняет последовательности так, чтобы все последовательности в мини-пакете имели ту же длину как самая длинная последовательность в мини-пакете. Эта опция является значением по умолчанию.

Следующие фигуры иллюстрируют эффект установки 'SequenceLength' к 'longest'.

Усеченные последовательности

Если вы задаете длину последовательности 'shortest', то программное обеспечение обрезает последовательности так, чтобы все последовательности в мини-пакете имели ту же длину как самая короткая последовательность в том мини-пакете. Остающиеся данные в последовательностях отбрасываются.

Следующие фигуры иллюстрируют эффект установки 'SequenceLength' к 'shortest'.

Разделите последовательности

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

Используйте эту опцию, если полные последовательности не умещаются в памяти. Также можно попытаться сократить количество последовательностей на мини-пакет путем установки опции 'MiniBatchSize' в trainingOptions к нижнему значению.

Если вы задаете длину последовательности как положительное целое число, то программные процессы меньшие последовательности в последовательных итерациях. Сеть обновляет сетевое состояние между последовательностями разделения.

Следующие фигуры иллюстрируют эффект установки 'SequenceLength' к 5.

Нормируйте данные о последовательности

Чтобы повторно сосредоточить данные тренировки автоматически в учебное время с помощью нулевой центральной нормализации, установите свойство Normalization sequenceInputLayer к 'zerocenter'. Также можно нормировать данные о последовательности первым вычислением среднего и стандартного отклонения на функцию всех последовательностей. Затем для каждого учебного наблюдения вычтите среднее значение и разделитесь на стандартное отклонение.

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

Данные, которые не помещаются в память,

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

Чтобы узнать больше, смотрите, Обучат сеть Используя Данные о Последовательности Из памяти и Классифицируют текстовые Данные Из памяти Используя Глубокое обучение.

Архитектура слоя LSTM

Эта схема иллюстрирует поток временных рядов, X с C показывает (каналы) длины S через слой LSTM. В схеме, ht и ct обозначьте вывод (также известный как скрытое состояние) и состояние ячейки на временном шаге t, соответственно.

Первый блок LSTM использует начальное состояние сети и первый временной шаг последовательности, чтобы вычислить первый вывод и обновленное состояние ячейки. На временном шаге t блок использует текущее состояние сети (ct1,ht1) и следующий временной шаг последовательности, который вычислит вывод и обновленное состояние ячейки ct.

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

Следующие компоненты управляют ячейкой и скрытое состояние состояния слоя.

КомпонентЦель
Введите логический элемент (i)Управляйте уровнем обновления состояния ячейки
Забудьте логический элемент (f)Уровень управления сброса состояния ячейки (забывает)
Кандидат ячейки (g)Добавьте информацию в состояние ячейки
Выведите логический элемент (o)Управляйте уровнем состояния ячейки, добавленного к скрытому состоянию

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

learnable веса слоя LSTM являются входными весами W (InputWeights), текущие веса R (RecurrentWeights) и смещение b (Bias). Матрицы W, R и b являются конкатенациями входных весов, текущих весов и смещения каждого компонента, соответственно. Эти матрицы конкатенированы можно следующим образом:

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

где i, f, g и o обозначают входной логический элемент, забывают логический элемент, кандидата ячейки, и выводят логический элемент, соответственно.

Состоянием ячейки на временном шаге t дают

ct=ftct1+itgt,

где обозначает продукт Адамара (поэлементное умножение векторов).

Скрытым состоянием на временном шаге t дают

ht=otσc(ct),

где σc обозначает функцию активации состояния. Функция lstmLayer, по умолчанию, использует гиперболическую функцию тангенса (tanh), чтобы вычислить функцию активации состояния.

Следующие формулы описывают компоненты на временном шаге t.

КомпонентФормула
Введите логический элементit=σg(Wixt+​Riht1+bi)
Забудьте логический элементft=σg(Wfxt+​Rfht1+bf)
Кандидат ячейкиgt=σc(Wgxt+​Rght1+bg)
Выведите логический элементot=σg(Woxt+​Roht1+bo)

В этих вычислениях, σg обозначает функцию активации логического элемента. Функция lstmLayer, по умолчанию, использует сигмоидальную функцию, данную σ(x)=(1+ex)1 вычислить функцию активации логического элемента.

Ссылки

[1] Hochreiter, S. и Дж. Шмидхубер. "Долгая краткосрочная память". Нейронное вычисление. Издание 9, Номер 8, 1997, pp.1735-1780.

Смотрите также

| | | | | | | | |

Похожие темы