이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

lstmLayer

장단기 기억(LSTM) 계층

설명

LSTM 계층은 시계열 및 시퀀스 데이터에서 시간 스텝 간의 장기 종속성을 학습합니다.

이 계층은 부가 상호 작용을 수행하는데, 이는 훈련 중에 긴 시퀀스에 대한 기울기 흐름을 개선하는 데 도움이 될 수 있습니다.

생성

구문

layer = lstmLayer(numHiddenUnits)
layer = lstmLayer(numHiddenUnits,Name,Value)

설명

예제

layer = lstmLayer(numHiddenUnits)는 LSTM 계층을 만들고 NumHiddenUnits 속성을 설정합니다.

예제

layer = lstmLayer(numHiddenUnits,Name,Value)는 하나 이상의 이름-값 쌍의 인수를 사용하여 추가로 Name, OutputMode, 활성화, 학습률과 L2 인자 속성을 설정합니다. 여러 개의 이름-값 쌍 인수를 지정할 수 있습니다. 각 속성 이름을 따옴표로 묶습니다.

속성

모두 확장

LSTM 파라미터

계층 이름으로, 문자형 벡터로 지정됩니다. Name''로 설정하면, 훈련 시점에 자동으로 이름이 할당됩니다.

데이터형: char

입력 크기로, 양의 정수 또는 'auto'로 지정됩니다. InputSize'auto'이면, 훈련 시점에 자동으로 입력 크기가 할당됩니다.

예: 100

은닉 유닛의 개수(은닉 크기라고도 함)로, 양의 정수로 지정됩니다.

예: 200

출력값 형식으로, 다음 중 하나로 지정됩니다.

  • 'sequence' – 전체 시퀀스를 출력합니다.

  • 'last' – 시퀀스의 마지막 시간 스텝을 출력합니다.

활성화

셀과 은닉 상태를 업데이트하는 활성화 함수로, 다음 중 하나로 지정됩니다.

  • 'tanh' – 쌍곡탄젠트 함수(tanh)를 사용합니다.

  • 'softsign' – 소프트사인 함수 softsign(x)=x1+|x|를 사용합니다.

이 계층은 셀과 은닉 상태를 업데이트하는 계산에서 이 옵션을 함수 σc로 사용합니다. LSTM 계층에서 활성화 함수가 사용되는 방식에 대한 자세한 내용은 장단기 기억 계층 항목을 참조하십시오.

게이트에 적용할 활성화 함수로, 다음 중 하나로 지정됩니다.

  • 'sigmoid' – 시그모이드 함수 σ(x)=(1+ex)1을 사용합니다.

  • 'hard-sigmoid' – 다음과 같은 하드 시그모이드 함수를 사용합니다.

    σ(x)={00.2x+0.51if x<2.5if2.5x2.5if x>2.5.

이 계층은 입력값, 출력값, 망각 게이트 계산에서 이 옵션을 함수 σg로 사용합니다. LSTM 계층에서 활성화 함수가 사용되는 방식에 대한 자세한 내용은 장단기 기억 계층 항목을 참조하십시오.

학습률과 L2 인자

편향에 대한 학습률 인자로, 음이 아닌 스칼라 또는 1x4 숫자형 벡터로 지정됩니다.

이 인자에 전역 학습률을 곱하여 이 계층의 편향에 대한 학습률이 결정됩니다. 예를 들어, BiasLearnRateFactor가 2인 경우, 이 계층의 편향에 대한 학습률은 현재 전역 학습률의 2배입니다. 소프트웨어는 trainingOptions 함수로 지정된 설정을 기준으로 전역 학습률을 결정합니다.

Bias에 있는 4개의 개별 행렬에 대한 학습률 인자 값을 제어하려면 1x4 벡터를 지정하십시오. BiasLearnRateFactor의 요소는 다음과 같은 게이트의 학습률 인자에 해당합니다.

  1. 입력 게이트

  2. 망각 게이트

  3. 셀 후보

  4. 출력 게이트

모든 행렬에 동일한 값을 지정하려면 음이 아닌 스칼라를 지정하십시오.

예: 2

예: [1 2 1 1]

편향에 대한 L2 정규화 인자로, 음이 아닌 스칼라 또는 1x4 숫자형 벡터로 지정됩니다.

이 인자에 전역 L2 정규화 인자를 곱하여 이 계층의 편향에 대한 학습률이 결정됩니다. 예를 들어, BiasL2Factor가 2인 경우, 이 계층의 편향에 대한 L2 정규화는 전역 L2 정규화의 2배입니다. 전역 L2 정규화 인자는 trainingOptions 함수를 사용하여 지정할 수 있습니다.

Bias에 있는 4개의 개별 행렬에 대한 L2 정규화 인자 값을 제어하려면 1x4 벡터를 지정하십시오. BiasL2Factor의 요소는 다음과 같은 게이트의 L2 정규화 인자에 해당합니다.

  1. 입력 게이트

  2. 망각 게이트

  3. 셀 후보

  4. 출력 게이트

모든 행렬에 동일한 값을 지정하려면 음이 아닌 스칼라를 지정하십시오.

예: 2

예: [1 2 1 1]

입력 가중치에 대한 학습률 인자로, 숫자형 스칼라 또는 1x4 숫자형 벡터로 지정됩니다.

이 인자에 전역 학습률을 곱하여 계층의 입력 가중치에 대한 학습률 인자가 결정됩니다. 예를 들어, InputWeightsLearnRateFactor가 2인 경우, 계층의 입력 가중치에 대한 학습률 인자는 현재 전역 학습률의 2배입니다. 소프트웨어는 trainingOptions 함수로 지정된 설정을 기준으로 전역 학습률을 결정합니다.

InputWeights에 있는 4개의 개별 행렬에 대한 학습률 인자 값을 제어하려면 1x4 벡터를 지정하십시오. InputWeightsLearnRateFactor의 요소는 다음과 같은 게이트의 학습률 인자에 해당합니다.

  1. 입력 게이트

  2. 망각 게이트

  3. 셀 후보

  4. 출력 게이트

모든 행렬에 동일한 값을 지정하려면 음이 아닌 스칼라를 지정하십시오.

예: 2

예: [1 2 1 1]

입력 가중치에 대한 L2 정규화 인자로, 숫자형 스칼라 또는 1x4 숫자형 벡터로 지정됩니다.

이 인자에 전역 L2 정규화 인자를 곱하여 계층의 입력 가중치에 대한 L2 정규화 인자가 결정됩니다. 예를 들어, InputWeightsL2Factor가 2인 경우, 계층의 입력 가중치에 대한 L2 정규화 인자는 현재 전역 L2 정규화 인자의 2배입니다. trainingOptions 함수로 지정된 설정을 기준으로 L2 정규화 인자가 결정됩니다.

InputWeights에 있는 4개의 개별 행렬에 대한 L2 정규화 인자 값을 제어하려면 1x4 벡터를 지정하십시오. InputWeightsL2Factor의 요소는 다음과 같은 게이트의 L2 정규화 인자에 해당합니다.

  1. 입력 게이트

  2. 망각 게이트

  3. 셀 후보

  4. 출력 게이트

모든 행렬에 동일한 값을 지정하려면 음이 아닌 스칼라를 지정하십시오.

예: 2

예: [1 2 1 1]

순환 가중치에 대한 학습률 인자로, 숫자형 스칼라 또는 1x4 숫자형 벡터로 지정됩니다.

이 인자에 전역 학습률을 곱하여 계층의 순환 가중치에 대한 학습률이 결정됩니다. 예를 들어, RecurrentWeightsLearnRateFactor가 2인 경우, 계층의 순환 가중치에 대한 학습률은 현재 전역 학습률의 2배입니다. 소프트웨어는 trainingOptions 함수로 지정된 설정을 기준으로 전역 학습률을 결정합니다.

RecurrentWeights에 있는 4개의 개별 행렬에 대한 학습률 인자 값을 제어하려면 1x4 벡터를 지정하십시오. RecurrentWeightsLearnRateFactor의 요소는 다음과 같은 게이트의 학습률 인자에 해당합니다.

  1. 입력 게이트

  2. 망각 게이트

  3. 셀 후보

  4. 출력 게이트

모든 행렬에 동일한 값을 지정하려면 음이 아닌 스칼라를 지정하십시오.

예: 2

예: [1 2 1 1]

순환 가중치에 대한 L2 정규화 인자로, 숫자형 스칼라 또는 1x4 숫자형 벡터로 지정됩니다.

이 인자에 전역 L2 정규화 인자를 곱하여 계층의 순환 가중치에 대한 L2 정규화 인자가 결정됩니다. 예를 들어, RecurrentWeightsL2Factor가 2인 경우, 계층의 순환 가중치에 대한 L2 정규화 인자는 현재 전역 L2 정규화 인자의 2배입니다. trainingOptions 함수로 지정된 설정을 기준으로 L2 정규화 인자가 결정됩니다.

RecurrentWeights에 있는 4개의 개별 행렬에 대한 L2 정규화 인자 값을 제어하려면 1x4 벡터를 지정하십시오. RecurrentWeightsL2Factor의 요소는 다음과 같은 게이트의 L2 정규화 인자에 해당합니다.

  1. 입력 게이트

  2. 망각 게이트

  3. 셀 후보

  4. 출력 게이트

모든 행렬에 동일한 값을 지정하려면 음이 아닌 스칼라를 지정하십시오.

예: 2

예: [1 2 1 1]

상태 파라미터

셀 상태의 초기값으로, NumHiddenUnitsx1 숫자형 벡터로 지정됩니다. 이 값은 시간 스텝 0에서의 셀 상태입니다. predictAndUpdateStateclassifyAndUpdateState를 사용하는 경우에는 이 속성의 값이 변경될 수 있습니다.

이 속성을 설정한 후에 resetState 함수를 호출하면 셀 상태가 이 초기값으로 다시 설정됩니다.

은닉 상태의 초기값으로, NumHiddenUnitsx1 숫자형 벡터로 지정됩니다. 이 값은 시간 스텝 0에서의 은닉 상태입니다. predictAndUpdateStateclassifyAndUpdateState를 사용하는 경우에는 이 속성의 값이 변경될 수 있습니다.

이 속성을 설정한 후에 resetState 함수를 호출하면 은닉 상태가 이 초기값으로 다시 설정됩니다.

가중치

LSTM 계층의 계층 편향으로, 4*NumHiddenUnitsx1 숫자형 벡터로 지정됩니다.

편향 벡터는 LSTM 계층의 구성요소(게이트)에 대한 4개의 편향 벡터를 결합한 것입니다. 4개의 벡터는 다음과 같은 순서로 세로로 결합됩니다.

  1. 입력 게이트

  2. 망각 게이트

  3. 셀 후보

  4. 출력 게이트

입력 가중치로, 4*NumHiddenUnitsxInputSize 행렬로 지정됩니다.

입력 가중치 행렬은 LSTM 계층의 구성요소(게이트)에 대한 4개의 입력 가중치 행렬을 결합한 것입니다. 4개의 행렬은 다음과 같은 순서로 세로로 결합됩니다.

  1. 입력 게이트

  2. 망각 게이트

  3. 셀 후보

  4. 출력 게이트

순환 가중치로, 4*NumHiddenUnitsxNumHiddenUnits 행렬로 지정됩니다.

순환 가중치 행렬은 LSTM 계층의 구성요소(게이트)에 대한 4개의 순환 가중치 행렬을 결합한 것입니다. 4개의 행렬은 다음과 같은 순서로 세로로 결합됩니다.

  1. 입력 게이트

  2. 망각 게이트

  3. 셀 후보

  4. 출력 게이트

예제

모두 축소

이름이 'lstm1'이고 100개의 은닉 유닛을 갖는 LSTM 계층을 만듭니다.

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

Layer 배열에 LSTM 계층을 포함시킵니다.

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

Sequence-to-label 분류를 위해 심층 학습 LSTM 네트워크를 훈련시킵니다.

[1]과 [2]에서 설명한 Japanese Vowels 데이터 세트를 불러옵니다. XTrain은 특징 차원이 12이고 다양한 길이의 시퀀스 270개로 구성된 셀형 배열입니다. Y는 레이블 1,2,...,9로 구성된 categorical형 벡터입니다. 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(입력 데이터의 특징 개수)로 지정합니다. 은닉 유닛 100개를 포함하고 시퀀스의 마지막 요소를 출력하는 LSTM 계층을 지정합니다. 마지막으로, 크기가 9인 완전 연결 계층을 포함하여 9개의 클래스를 지정하고, 이어서 소프트맥스 계층과 분류 계층을 지정합니다.

inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;

layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    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

훈련 옵션을 지정합니다. 솔버를 'adam'으로 지정하고 'GradientThreshold'를 1로 지정합니다. 미니 배치의 크기를 27로 설정하고 최대 Epoch 횟수를 100으로 설정합니다.

미니 배치는 짧은 시퀀스로 구성된 크기가 작은 배치이므로 훈련에는 CPU가 더 적절합니다. 'ExecutionEnvironment''cpu'로 설정합니다. GPU를 사용할 수 있는 경우 GPU에서 훈련시키려면 'ExecutionEnvironment''auto'(디폴트 값)로 설정하십시오.

maxEpochs = 100;
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.9270

sequence-to-label 분류를 위한 LSTM 네트워크를 만들려면 시퀀스 입력 계층, LSTM 계층, 완전 연결 계층, 소프트맥스 계층, 분류 출력 계층을 포함하는 계층 배열을 만듭니다.

시퀀스 입력 계층의 크기가 입력 데이터의 특징 개수가 되도록 지정합니다. 완전 연결 계층의 크기가 클래스 개수가 되도록 지정합니다. 시퀀스 길이는 지정할 필요가 없습니다.

LSTM 계층의 경우, 은닉 유닛의 개수와 출력 모드 'last'를 지정합니다.

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

sequence-to-label 분류를 위한 LSTM 네트워크를 훈련시키고 새 데이터를 분류하는 방법을 보여주는 예제는 심층 학습을 사용한 시퀀스 분류 항목을 참조하십시오.

sequence-to-sequence 분류를 위한 LSTM 네트워크를 만들려면 sequence-to-label 분류와 동일한 아키텍처를 사용하되 LSTM 계층의 출력 모드를 'sequence'로 설정합니다.

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

sequence-to-one 회귀를 위한 LSTM 네트워크를 만들려면 시퀀스 입력 계층, LSTM 계층, 완전 연결 계층, 회귀 출력 계층을 포함하는 계층 배열을 만듭니다.

시퀀스 입력 계층의 크기가 입력 데이터의 특징 개수가 되도록 지정합니다. 완전 연결 계층의 크기가 응답 변수의 개수가 되도록 지정합니다. 시퀀스 길이는 지정할 필요가 없습니다.

LSTM 계층의 경우, 은닉 유닛의 개수와 출력 모드 'last'를 지정합니다.

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

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

sequence-to-sequence 회귀를 위한 LSTM 네트워크를 만들려면 sequence-to-one 회귀와 동일한 아키텍처를 사용하되 LSTM 계층의 출력 모드를 'sequence'로 설정합니다.

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

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

sequence-to-sequence 회귀를 위한 LSTM 네트워크를 훈련시키고 새 데이터에 대해 예측하는 방법을 보여주는 예제는 심층 학습을 사용한 sequence-to-sequence 회귀 항목을 참조하십시오.

LSTM 계층 앞에 출력 모드가 'sequence'인 LSTM 계층을 추가로 삽입하여 LSTM 네트워크의 심도를 높일 수 있습니다.

sequence-to-label 분류 네트워크의 경우, 마지막 LSTM 계층의 출력 모드가 'last'가 되어야 합니다.

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

sequence-to-sequence 분류 네트워크의 경우, 마지막 LSTM 계층의 출력 모드가 'sequence'가 되어야 합니다.

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

세부 정보

모두 확장

참고 문헌

[1] M. Kudo, J. Toyama, and M. Shimbo. "Multidimensional Curve Classification Using Passing-Through Regions." Pattern Recognition Letters. Vol. 20, No. 11–13, pages 1103–1111.

[2] UCI Machine Learning Repository: Japanese Vowels Dataset. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels

[3] Hochreiter, S, and J. Schmidhuber, 1997. Long short-term memory. Neural computation, 9(8), pp.1735–1780.

R2017b에 개발됨