Долгая краткосрочная память (LSTM) слоя
LSTM слоя изучает долгосрочные зависимости между временными шагами во временных рядах и данными последовательности.
Слой выполняет аддитивные взаимодействия, которые могут помочь улучшить градиентный поток в длинных последовательностях во время обучения.
создает слой LSTM и устанавливает layer
= lstmLayer(numHiddenUnits
)NumHiddenUnits
свойство.
устанавливает дополнительные layer
= lstmLayer(numHiddenUnits
,Name,Value
)OutputMode
, Активации, Состояние, Параметры и Инициализация, Скорость Обучения и Регуляризация, и Name
свойства с использованием одного или нескольких аргументов пары "имя-значение". Можно задать несколько аргументы пары "имя-значение". Заключайте каждое имя свойства в кавычки.
NumHiddenUnits
- Количество скрытых модулейКоличество скрытых модулей измерения (также известное как скрытый размер), заданное как положительное целое число.
Количество скрытых модулей соответствует объему информации, запоминаемой между временными шагами (скрытое состояние). Скрытое состояние может содержать информацию от всех предыдущих временных шагов, независимо от длины последовательности. Если количество скрытых модулей слишком велико, слой может перегружаться обучающими данными. Это значение может варьироваться от нескольких десятков до нескольких тысяч.
Скрытое состояние не ограничивает количество временных шагов, которые обрабатываются в итерации. Чтобы разделить ваши последовательности на меньшие последовательности для обучения, используйте 'SequenceLength'
опция в trainingOptions
.
Пример: 200
OutputMode
- Формат выхода'sequence'
(по умолчанию) | 'last'
Формат вывода, заданный как один из следующих:
'sequence'
- Вывод полной последовательности.
'last'
- Вывод последнего временного шага последовательности.
InputSize
- Вход сигнала'auto'
(по умолчанию) | положительное целое число Размер входа, заданный как положительное целое или 'auto'
. Если InputSize
является 'auto'
, затем программа автоматически присваивает размер входа во время обучения.
Пример: 100
StateActivationFunction
- Функция активации для обновления камеры и скрытого состояния'tanh'
(по умолчанию) | 'softsign'
Функция активации для обновления камеры и скрытого состояния, заданная как одно из следующего:
'tanh'
- Используйте гиперболическую функцию тангенса (tanh).
'softsign'
- Используйте функцию softsign .
Слой использует эту опцию как функцию в вычислениях для обновления камеры и скрытого состояния. Для получения дополнительной информации о том, как функции активации используются в слое LSTM, смотрите Long Short-Term Memory Layer.
GateActivationFunction
- Функция активации для применения к воротам'sigmoid'
(по умолчанию) | 'hard-sigmoid'
Функция активации для применения к воротам, заданная как одно из следующего:
'sigmoid'
- Используйте сигмоидную функцию .
'hard-sigmoid'
- Используйте жесткую сигмоидную функцию
Слой использует эту опцию как функцию в расчетах для затворов слоя.
CellState
- Начальное значение состояния камерыНачальное значение состояния камеры, заданное как NumHiddenUnits
-by-1 числовой вектор. Это значение соответствует состоянию камеры во временной шаг 0.
После установки этого свойства вызовы на resetState
функция устанавливает состояние камеры на это значение.
HiddenState
- Начальное значение скрытого состоянияНачальное значение скрытого состояния, заданное как NumHiddenUnits
-by-1 числовой вектор. Это значение соответствует скрытому состоянию во временной шаг 0.
После установки этого свойства вызовы на resetState
функция устанавливает скрытое состояние на это значение.
InputWeightsInitializer
- Функция для инициализации входных весов'glorot'
(по умолчанию) | 'he'
| 'orthogonal'
| 'narrow-normal'
| 'zeros'
| 'ones'
| указатель на функциюФункция для инициализации весов входа, заданная как одно из следующего:
'glorot'
- Инициализируйте входные веса с помощью инициализатора Glorot [4] (также известного как инициализатор Xavier). Инициализатор Glorot независимо выбирает из равномерного распределения с нулем среднего и отклонением 2/(InputSize + numOut)
, где numOut = 4*NumHiddenUnits
.
'he'
- Инициализируйте входные веса с помощью инициализатора He [5]. Инициализатор He производит выборки из нормального распределения с нулем среднего и отклонением 2/InputSize
.
'orthogonal'
- Инициализируйте веса входа с помощью Q, ортогональной матрицы, заданной QR-разложением Z = Q R для случайной матрицы, Z выбранной из модуля нормального распределения. [6]
'narrow-normal'
- Инициализируйте входные веса путем независимой выборки из нормального распределения с нулевым средним и стандартным отклонением 0,01.
'zeros'
- Инициализируйте входные веса с нулями.
'ones'
- Инициализируйте входные веса с таковые.
Указатель на функцию - Инициализируйте входные веса с помощью пользовательской функции. Если вы задаете указатель на функцию, то функция должна иметь вид weights = func(sz)
, где sz
- размер входных весов.
Слой инициализирует входные веса только тогда, когда InputWeights
свойство пустое.
Типы данных: char
| string
| function_handle
RecurrentWeightsInitializer
- Функция для инициализации повторяющихся весов'orthogonal'
(по умолчанию) | 'glorot'
| 'he'
| 'narrow-normal'
| 'zeros'
| 'ones'
| указатель на функциюФункция для инициализации повторяющихся весов, заданная как одно из следующего:
'orthogonal'
- Инициализируйте рекуррентные веса с Q, ортогональной матрицей, заданной QR-разложением Z = Q R для случайной матричной Z, выбранной из модуля нормального распределения. [6]
'glorot'
- Инициализируйте повторяющиеся веса с помощью инициализатора Glorot [4] (также известного как инициализатор Xavier). Инициализатор Glorot независимо выбирает из равномерного распределения с нулем среднего и отклонением 2/(numIn + numOut)
, где numIn = NumHiddenUnits
и numOut = 4*NumHiddenUnits
.
'he'
- Инициализируйте повторяющиеся веса с помощью инициализатора He [5]. Инициализатор He производит выборки из нормального распределения с нулем среднего и отклонением 2/NumHiddenUnits
.
'narrow-normal'
- Инициализируйте рекуррентные веса путем независимой выборки из нормального распределения с нулевым средним и стандартным отклонением 0,01.
'zeros'
- Инициализируйте повторяющиеся веса с нулями.
'ones'
- Инициализируйте повторяющиеся веса с таковыми.
Указатель на функцию - Инициализируйте повторяющиеся веса с помощью пользовательской функции. Если вы задаете указатель на функцию, то функция должна иметь вид weights = func(sz)
, где sz
- размер повторяющихся весов.
Слой инициализирует повторяющиеся веса только тогда, когда RecurrentWeights
свойство пустое.
Типы данных: char
| string
| function_handle
BiasInitializer
- Функция для инициализации смещения'unit-forget-gate'
(по умолчанию) | 'narrow-normal'
| 'ones'
| указатель на функциюФункция для инициализации смещения, заданная как одно из следующего:
'unit-forget-gate'
- Инициализируйте смещение запоминающего устройства с таковые и оставшиеся смещения с нулями.
'narrow-normal'
- Инициализируйте смещение путем независимой выборки из нормального распределения с нулевым средним и стандартным отклонением 0,01.
'ones'
- Инициализируйте смещение с таковые.
Указатель на функцию - Инициализируйте смещение с помощью пользовательской функции. Если вы задаете указатель на функцию, то функция должна иметь вид bias = func(sz)
, где sz
- размер смещения.
Слой инициализирует смещение только тогда, когда Bias
свойство пустое.
Типы данных: char
| string
| function_handle
InputWeights
- Входные веса[]
(по умолчанию) | матрицаВходные веса, заданные как матрица.
Вход веса является конкатенацией четырех матриц входного веса для компонентов (затворов) в слое LSTM. Четыре матрицы объединены вертикально в следующем порядке:
Входной затвор
Забудьте ворота
Кандидат в камеры
Выходной затвор
Входные веса являются настраиваемыми параметрами. При обучении сети, если InputWeights
непусто, тогда trainNetwork
использует InputWeights
свойство как начальное значение. Если InputWeights
пуст, тогда trainNetwork
использует инициализатор, заданный как InputWeightsInitializer
.
Во время обучения InputWeights
является 4*NumHiddenUnits
-by- InputSize
матрица.
RecurrentWeights
- Периодические веса[]
(по умолчанию) | матрицаПериодические веса, заданные как матрица.
Матрица рекуррентного веса является конкатенацией четырех рекуррентных матриц веса для компонентов (ворот) в слое LSTM. Четыре матрицы сгруппированы по вертикали в следующем порядке:
Входной затвор
Забудьте ворота
Кандидат в камеры
Выходной затвор
Рекуррентные веса являются настраиваемыми параметрами. При обучении сети, если RecurrentWeights
непусто, тогда trainNetwork
использует RecurrentWeights
свойство как начальное значение. Если RecurrentWeights
пуст, тогда trainNetwork
использует инициализатор, заданный как RecurrentWeightsInitializer
.
Во время обучения RecurrentWeights
является 4*NumHiddenUnits
-by- NumHiddenUnits
матрица.
Bias
- Смещения слоев[]
(по умолчанию) | числовой векторСмещения слоев для уровня LSTM, заданные как числовой вектор.
Вектор смещения является конкатенацией четырех векторов смещения для компонентов (затворов) в слое LSTM. Четыре вектора объединены вертикально в следующем порядке:
Входной затвор
Забудьте ворота
Кандидат в камеры
Выходной затвор
Смещения слоя являются настраиваемыми параметрами. При обучении сети, если Bias
непусто, тогда trainNetwork
использует Bias
свойство как начальное значение. Если Bias
пуст, тогда trainNetwork
использует инициализатор, заданный как BiasInitializer
.
Во время обучения Bias
является 4*NumHiddenUnits
-by-1 числовой вектор.
InputWeightsLearnRateFactor
- Коэффициент скорости обучения для входных весовКоэффициент скорости обучения для входных весов, заданный как числовой скаляр или числовой вектор 1 на 4.
Программа умножает этот коэффициент на глобальную скорость обучения, чтобы определить коэффициент скорости обучения для входных весов слоя. Для примера, если InputWeightsLearnRateFactor
равен 2, тогда коэффициент скорости обучения для входных весов слоя вдвое превышает текущую глобальную скорость обучения. Программа определяет глобальную скорость обучения на основе настроек, заданных в trainingOptions
функция.
Чтобы управлять значением коэффициента скорости обучения для четырех отдельных матриц в InputWeights
, задайте вектор 1 на 4. Записи InputWeightsLearnRateFactor
соответствуют коэффициенту скорости обучения:
Входной затвор
Забудьте ворота
Кандидат в камеры
Выходной затвор
Чтобы задать одно и то же значение для всех матриц, задайте неотрицательный скаляр.
Пример: 2
Пример:
[1 2 1 1]
RecurrentWeightsLearnRateFactor
- Коэффициент скорости обучения для периодических весовКоэффициент скорости обучения для рекуррентных весов, заданный как числовой скаляр или числовой вектор 1 на 4.
Программа умножает этот коэффициент на глобальный темп обучения, чтобы определить скорость обучения для повторяющихся весов слоя. Для примера, если RecurrentWeightsLearnRateFactor
равен 2, тогда скорость обучения для повторяющихся весов слоя в два раза превышает текущую глобальную скорость обучения. Программа определяет глобальную скорость обучения на основе настроек, заданных в trainingOptions
функция.
Чтобы управлять значением коэффициента скорости обучения для четырех отдельных матриц в RecurrentWeights
, задайте вектор 1 на 4. Записи RecurrentWeightsLearnRateFactor
соответствуют коэффициенту скорости обучения:
Входной затвор
Забудьте ворота
Кандидат в камеры
Выходной затвор
Чтобы задать одно и то же значение для всех матриц, задайте неотрицательный скаляр.
Пример: 2
Пример:
[1 2 1 1]
BiasLearnRateFactor
- Коэффициент скорости обучения для смещенийКоэффициент скорости обучения для смещений, заданный как неотрицательный скаляр или числовой вектор 1 на 4.
Программа умножает этот коэффициент на глобальную скорость обучения, чтобы определить скорость обучения для смещений на этом слое. Для примера, если BiasLearnRateFactor
равен 2, тогда скорость обучения для смещений в слое в два раза превышает текущую глобальную скорость обучения. Программа определяет глобальную скорость обучения на основе настроек, заданных в trainingOptions
функция.
Чтобы управлять значением коэффициента скорости обучения для четырех отдельных векторов в Bias
, задайте вектор 1 на 4. Записи BiasLearnRateFactor
соответствуют коэффициенту скорости обучения:
Входной затвор
Забудьте ворота
Кандидат в камеры
Выходной затвор
Чтобы задать одно и то же значение для всех векторов, задайте неотрицательный скаляр.
Пример: 2
Пример:
[1 2 1 1]
InputWeightsL2Factor
- L2 коэффициент регуляризации для входных весовL2 регуляризационный коэффициент для весов входа, заданный как числовой скаляр или числовой вектор 1 на 4.
Программа умножает этот коэффициент на глобальный коэффициент регуляризации L2, чтобы определить L2 коэффициент регуляризации для входных весов слоя. Для примера, если InputWeightsL2Factor
равен 2, тогда коэффициент регуляризации L2 для входных весов слоя вдвое превышает текущий глобальный коэффициент регуляризации L2. Программа определяет коэффициент регуляризации L2 на основе настроек, заданных в trainingOptions
функция.
Чтобы контролировать значение коэффициента регуляризации L2 для четырех отдельных матриц в InputWeights
, задайте вектор 1 на 4. Записи InputWeightsL2Factor
соответствуют L2 коэффициенту регуляризации:
Входной затвор
Забудьте ворота
Кандидат в камеры
Выходной затвор
Чтобы задать одно и то же значение для всех матриц, задайте неотрицательный скаляр.
Пример: 2
Пример:
[1 2 1 1]
RecurrentWeightsL2Factor
- L2 коэффициент регуляризации для повторяющихся весовL2 регуляризации для рекуррентных весов, заданный как числовой скаляр или числовой вектор 1 на 4.
Программа умножает этот коэффициент на глобальный коэффициент регуляризации L2, чтобы определить L2 коэффициент регуляризации для повторяющихся весов слоя. Для примера, если RecurrentWeightsL2Factor
равен 2, тогда L2 коэффициент регуляризации для повторяющихся весов слоя вдвое превышает текущий глобальный коэффициент регуляризации L2. Программа определяет коэффициент регуляризации L2 на основе настроек, заданных в trainingOptions
функция.
Чтобы контролировать значение коэффициента регуляризации L2 для четырех отдельных матриц в RecurrentWeights
, задайте вектор 1 на 4. Записи RecurrentWeightsL2Factor
соответствуют L2 коэффициенту регуляризации:
Входной затвор
Забудьте ворота
Кандидат в камеры
Выходной затвор
Чтобы задать одно и то же значение для всех матриц, задайте неотрицательный скаляр.
Пример: 2
Пример:
[1 2 1 1]
BiasL2Factor
- L2 коэффициент регуляризации для смещенийL2 регуляризации для смещений, заданный как неотрицательный скаляр или числовой вектор 1 на 4.
Программа умножает этот коэффициент на глобальный коэффициент регуляризации L2, чтобы определить L2 регуляризацию для смещений на этом слое. Для примера, если BiasL2Factor
равен 2, тогда L2 регуляризация для смещений в этом слое в два раза превышает глобальный коэффициент регуляризации L2. Можно задать глобальный коэффициент регуляризации L2 с помощью trainingOptions
функция.
Чтобы управлять значением коэффициента регуляризации L2 для четырех отдельных векторов в Bias
, задайте вектор 1 на 4. Записи BiasL2Factor
соответствуют L2 коэффициенту регуляризации:
Входной затвор
Забудьте ворота
Кандидат в камеры
Выходной затвор
Чтобы задать одно и то же значение для всех векторов, задайте неотрицательный скаляр.
Пример: 2
Пример:
[1 2 1 1]
Name
- Имя слоя''
(по умолчанию) | символьный вектор | строковый скалярИмя слоя, заданное как вектор символов или строковый скаляр. Если Name
установлено в ''
затем программа автоматически присваивает имя во время обучения.
Типы данных: char
| string
NumInputs
- Количество входовКоличество входов слоя. Этот слой принимает только один вход.
Типы данных: double
InputNames
- Входные имена{'in'}
(по умолчанию)Входные имена слоя. Этот слой принимает только один вход.
Типы данных: cell
NumOutputs
- Количество выходовКоличество выходов слоя. Этот слой имеет только один выход.
Типы данных: double
OutputNames
- Выходные имена{'out'}
(по умолчанию)Выходные имена слоя. Этот слой имеет только один выход.
Типы данных: cell
Создайте слой LSTM с именем 'lstm1'
и 100 скрытые модули.
layer = lstmLayer(100,'Name','lstm1')
layer = LSTMLayer with properties: Name: 'lstm1' Hyperparameters InputSize: 'auto' NumHiddenUnits: 100 OutputMode: 'sequence' StateActivationFunction: 'tanh' GateActivationFunction: 'sigmoid' Learnable Parameters InputWeights: [] RecurrentWeights: [] Bias: [] State Parameters HiddenState: [] CellState: [] Show all properties
Включите слой LSTM в Layer
массив.
inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
sequenceInputLayer(inputSize)
lstmLayer(numHiddenUnits)
fullyConnectedLayer(numClasses)
softmaxLayer
classificationLayer]
layers = 5x1 Layer array with layers: 1 '' Sequence Input Sequence input with 12 dimensions 2 '' LSTM LSTM with 100 hidden units 3 '' Fully Connected 9 fully connected layer 4 '' Softmax softmax 5 '' Classification Output crossentropyex
Обучите сеть LSTM глубокого обучения для классификации «последовательность-метка».
Загрузите набор данных японских гласных, как описано в [1] и [2]. XTrain
- массив ячеек, содержащий 270 последовательностей различной длины с 12 функциями, соответствующими коэффициентам cepstrum LPC. Y
является категориальным вектором меток 1,2,..., 9. Записи в XTrain
являются матрицами с 12 строками (по одной строке для каждой функции) и меняющимся количеством столбцов (по одному столбцу для каждого временного шага).
[XTrain,YTrain] = japaneseVowelsTrainData;
Визуализируйте первые временные ряды на графике. Каждая линия соответствует функции.
figure plot(XTrain{1}') title("Training Observation 1") numFeatures = size(XTrain{1},1); legend("Feature " + string(1:numFeatures),'Location','northeastoutside')
Определите сетевую архитектуру LSTM. Задайте размер входа как 12 (количество функций входных данных). Задайте слой LSTM, который будет иметь 100 скрытые модули измерения и выводить последний элемент последовательности. Наконец, задайте девять классов, включив полностью соединенный слой размера 9, затем слой softmax и слой классификации.
inputSize = 12; numHiddenUnits = 100; numClasses = 9; layers = [ ... sequenceInputLayer(inputSize) lstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numClasses) softmaxLayer classificationLayer]
layers = 5×1 Layer array with layers: 1 '' Sequence Input Sequence input with 12 dimensions 2 '' LSTM LSTM with 100 hidden units 3 '' Fully Connected 9 fully connected layer 4 '' Softmax softmax 5 '' Classification Output crossentropyex
Задайте опции обучения. Задайте решатель следующим 'adam'
и 'GradientThreshold'
как 1. Установите размер мини-пакета равным 27 и установите максимальное количество эпох равным 70.
Поскольку мини-пакеты являются маленькими с короткими последовательностями, центральный процессор лучше подходит для обучения. Задайте 'ExecutionEnvironment'
на 'cpu'
. Для обучения на графическом процессоре, при наличии, установите 'ExecutionEnvironment'
на 'auto'
(значение по умолчанию).
maxEpochs = 70; miniBatchSize = 27; options = trainingOptions('adam', ... 'ExecutionEnvironment','cpu', ... 'MaxEpochs',maxEpochs, ... 'MiniBatchSize',miniBatchSize, ... 'GradientThreshold',1, ... 'Verbose',false, ... 'Plots','training-progress');
Обучите сеть LSTM с заданными опциями обучения.
net = trainNetwork(XTrain,YTrain,layers,options);
Загрузите тестовый набор и классифицируйте последовательности в динамики.
[XTest,YTest] = japaneseVowelsTestData;
Классификация тестовых данных. Укажите тот же размер мини-пакета, что и для обучения.
YPred = classify(net,XTest,'MiniBatchSize',miniBatchSize);
Вычислите классификационную точность предсказаний.
acc = sum(YPred == YTest)./numel(YTest)
acc = 0.9514
Чтобы создать сеть 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, полносвязный слой и выходной слой регрессии.
Установите размер входного слоя последовательности равным количеству функций входных данных. Установите размер полностью подключенного слоя равным количеству откликов. Вам не нужно указывать длину последовательности.
Для слоя LSTM задайте количество скрытых модулей измерения и режим выхода 'last'
.
numFeatures = 12; numHiddenUnits = 125; numResponses = 1; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numResponses) regressionLayer];
Чтобы создать сеть LSTM для регрессии между последовательностями, используйте ту же архитектуру, что и для регрессии между последовательностями, но установите выход режим слоя LSTM на 'sequence'
.
numFeatures = 12; numHiddenUnits = 125; numResponses = 1; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','sequence') fullyConnectedLayer(numResponses) regressionLayer];
Для примера, показывающего, как обучить сеть LSTM для регрессии между последовательностями и предсказать на новых данных, смотрите Регрессию между последовательностями с использованием глубокого обучения.
Можно сделать сети LSTM глубже, вставив дополнительные слои LSTM с выходом режимом 'sequence'
перед слоем LSTM. Чтобы предотвратить сверхподбор кривой, можно вставить слои выпадающего списка после слоев LSTM.
Для сетей классификации «последовательность-метка» должен быть 'last'
режим выхода последнего слоя LSTM.
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];
Для сетей классификации «последовательность-последовательность» должен быть 'sequence'
выход последнего слоя LSTM.
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];
LSTM слоя изучает долгосрочные зависимости между временными шагами во временных рядах и данными последовательности.
Состояние слоя состоит из скрытого состояния (также известного как выход состояние) и камера состояния. Скрытое состояние на временном шаге t содержит выход слоя LSTM для этого временного шага. Состояние камеры содержит информацию, полученную из предыдущих временных шагов. На каждом временном шаге слой добавляет информацию в или удаляет информацию из состояния камеры. Слой управляет этими обновлениями с помощью ворот.
Следующие компоненты управляют состоянием камер и скрытым состоянием слоя.
Компонент | Цель |
---|---|
Входной затвор (i) | Управляйте уровнем обновления состояния камеры |
Забудьте ворота (f) | Управляйте уровнем сброса состояния камеры (забудьте) |
Кандидат в камеру (g) | Добавьте информацию в состояние камеры |
Выходной затвор (o) | Управляйте уровнем состояния камеры, добавленной к скрытому состоянию |
Эта схема иллюстрирует поток данных во временной шаг t. Схема подсвечивает, как ворота забывают, обновляют, и выводят камеру и скрытые состояния.
Обучаемые веса слоя LSTM являются входными весами W (InputWeights
), периодические веса R (RecurrentWeights
), и смещение b (Bias
). Матрицы W, R и b являются конкатенациями входных весов, рекуррентных весов и смещения каждого компонента, соответственно. Эти матрицы объединяются следующим образом:
где i, f, g и o обозначают входной затвор, забыть затвор, кандидата камеры и выходной затвор, соответственно.
Состояние камеры на временном шаге t задается как
где обозначает продукт Адамара (поэлементное умножение векторов).
Скрытое состояние во временной шаг t задается как
где обозначает функцию активации состояния. The lstmLayer
функция по умолчанию использует гиперболическую тангенциальную функцию (tanh), чтобы вычислить функцию активации состояния.
Следующие формулы описывают компоненты на временном шаге t.
Компонент | Формула |
---|---|
Входной затвор | |
Забудьте ворота | |
Кандидат в камеры | |
Выходной затвор |
В этих вычислениях, обозначает функцию активации затвора. The lstmLayer
функция по умолчанию использует сигмоидную функцию, заданную как для вычисления функции активации затвора.
Поведение изменено в R2019a
Начиная с R2019a, программное обеспечение по умолчанию инициализирует входные веса слоев этого слоя с помощью инициализатора Glorot. Такое поведение помогает стабилизировать обучение и обычно сокращает время обучения глубоких сетей.
В предыдущих релизах программное обеспечение по умолчанию инициализирует входные веса слоя, используя выборку из нормального распределения с нулем среднего и отклонением 0,01. Чтобы воспроизвести это поведение, установите 'InputWeightsInitializer'
опция слоя для 'narrow-normal'
.
Поведение изменено в R2019a
Начиная с R2019a, программное обеспечение по умолчанию инициализирует рекуррентные веса слоя этого слоя с Q, ортогональной матрицей, заданной QR-разложением Z = Q R для случайной матричной Z, выбранной из модуля нормального распределения. Такое поведение помогает стабилизировать обучение и обычно сокращает время обучения глубоких сетей.
В предыдущих релизах программное обеспечение по умолчанию инициализирует периодические веса слоя, используя выборку из нормального распределения с нулем среднего и отклонением 0,01. Чтобы воспроизвести это поведение, установите 'RecurrentWeightsInitializer'
опция слоя для 'narrow-normal'
.
[1] М. Кудо, Дж. Тояма и М. Симбо. «Многомерная классификация кривых с использованием областей». Распознавание Букв. Том 20, № 11-13, стр. 1103-1111.
[2] UCI Machine Learning Repository: Японский набор данных гласных. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels
[3] Hochreiter, S, and J. Schmidhuber, 1997. Долгая краткосрочная память. Нейронные расчеты, 9 (8), стр. 1735-1780.
[4] Глорот, Ксавьер и Йошуа Бенгио. «Понимание сложности обучения нейронных сетей с глубоким Feedforward». В работе тринадцатой Международной конференции по искусственному интеллекту и статистике, 249-356. Сардиния, Италия: AISTATS, 2010.
[5] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. «Delving Deep Into Rectifiers: Overpassing Human-Level Performance on ImageNet Classification». В работе Международной конференции IEEE по компьютерному зрению 2015 года, 1026-1034. Вашингтон, округ Колумбия: IEEE Компьютерное Зрение Society, 2015.
[6] Saxe, Andrew M., James L. McClelland, and Surya Ganguli. «Точные решения нелинейной динамики обучения в глубоких линейных нейронных сетях» .arXiv preprint arXiv:1312.6120 (2013).
Указания и ограничения по применению:
При генерации кода с Intel® MKL-DNN:
The StateActivationFunction
свойство должно быть установлено в 'tanh'
.
The GateActivationFunction
свойство должно быть установлено в 'sigmoid'
.
Указания и ограничения по применению:
Для генерации кода GPU, StateActivationFunction
свойство должно быть установлено в 'tanh'
.
Для генерации кода GPU, GateActivationFunction
свойство должно быть установлено в 'sigmoid'
.
bilstmLayer
| classifyAndUpdateState
| Deep Network Designer | flattenLayer
| gruLayer
| predictAndUpdateState
| resetState
| sequenceFoldingLayer
| sequenceInputLayer
| sequenceUnfoldingLayer
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.