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

장단기 기억 네트워크

이 항목에서는 장단기 기억(LSTM) 네트워크를 사용하여 분류 및 회귀 작업에 대해 시퀀스 및 시계열 데이터로 작업하는 방법을 설명합니다. LSTM 네트워크를 사용하여 시퀀스 데이터를 분류하는 방법을 보여주는 예제는 심층 학습을 사용한 시퀀스 분류 항목을 참조하십시오.

LSTM 신경망은 시퀀스 데이터의 시간 스텝 간의 장기적인 종속성을 학습할 수 있는 순환 신경망(RNN)의 일종입니다.

LSTM 네트워크 아키텍처

LSTM 네트워크의 핵심 구성요소는 시퀀스 입력 계층과 LSTM 계층입니다. 시퀀스 입력 계층은 네트워크에 시퀀스 또는 시계열 데이터를 입력합니다. LSTM 계층은 시퀀스 데이터의 시간 스텝 간의 장기 종속성을 학습합니다.

다음 도식은 분류를 위한 간단한 LSTM 네트워크의 아키텍처를 보여줍니다. 이 네트워크는 시퀀스 입력 계층으로 시작하고, 그 뒤에 LSTM 계층이 옵니다. 클래스 레이블을 예측하기 위해, 네트워크의 끝부분에는 완전 연결 계층, 소프트맥스 계층, 분류 출력 계층이 옵니다.

다음 도식은 회귀를 위한 간단한 LSTM 네트워크의 아키텍처를 보여줍니다. 이 네트워크는 시퀀스 입력 계층으로 시작하고, 그 뒤에 LSTM 계층이 옵니다. 네트워크의 끝부분에는 완전 연결 계층과 회귀 출력 계층이 옵니다.

다음 도식은 비디오 분류를 위한 네트워크의 아키텍처를 보여줍니다. 네트워크에 이미지 시퀀스를 입력하려면 시퀀스 입력 계층을 사용하십시오. 특징 추출을 위해 컨벌루션 계층을 사용하려면, 즉 비디오의 각 프레임에 독립적으로 컨벌루션 연산을 적용하려면, 시퀀스 접기 계층 뒤에 컨벌루션 계층을 사용하고, 그 뒤에 시퀀스 펼치기 계층을 사용하십시오. 벡터로 구성된 시퀀스에서 학습하도록 LSTM 계층을 사용하려면 평탄화 계층 뒤에 LSTM 계층과 출력 계층을 사용하십시오.

분류 LSTM 네트워크

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

회귀 LSTM 네트워크

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 계층을 사용하려면 평탄화 계층 뒤에 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');

심층 학습 네트워크를 비디오 분류를 위해 훈련시키는 방법을 보여주는 예제는 Classify Videos Using Deep Learning 항목을 참조하십시오.

심층 LSTM 네트워크

LSTM 계층 앞에 출력 모드가 'sequence'인 LSTM 계층을 추가로 삽입하여 LSTM 네트워크의 심도를 높일 수 있습니다. 과적합을 방지하기 위해 LSTM 계층 뒤에 드롭아웃 계층을 삽입할 수 있습니다.

sequence-to-label 분류 네트워크의 경우, 마지막 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];

sequence-to-sequence 분류 네트워크의 경우, 마지막 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

BiLSTM(양방향 장단기 기억) 계층은 시계열 또는 시퀀스 데이터의 시간 스텝 간의 양방향 장기 종속성을 학습합니다. 이러한 종속성은 네트워크가 각 시간 스텝에서 전체 시계열로부터 학습하도록 하려는 경우에 유용할 수 있습니다.

sequenceFoldingLayer

시퀀스 접기 계층은 이미지 시퀀스 배치를 이미지 배치로 변환합니다. 이미지 시퀀스의 시간 스텝에 대해 독립적으로 컨벌루션 연산을 수행하려는 경우 시퀀스 접기 계층을 사용하십시오.

sequenceUnfoldingLayer

시퀀스 펼치기 계층은 시퀀스 접기 후에 입력 데이터의 시퀀스 구조를 복원합니다.

flattenLayer

평탄화 계층은 입력값의 공간 차원을 채널 차원으로 축소합니다.

wordEmbeddingLayer(Text Analytics Toolbox™)

단어 임베딩 계층은 단어 인덱스를 벡터로 매핑합니다.

분류 및 예측

새로운 데이터를 분류하거나 데이터에 대해 예측을 수행하려면 classifypredict를 사용하십시오.

LSTM 네트워크는 각 예측 사이의 네트워크 상태를 기억할 수 있습니다. 네트워크 상태는 전체 시계열을 미리 갖고 있지 않거나 긴 시계열에 대해 여러 예측을 수행하려는 경우에 유용합니다.

시계열의 각 부분을 예측 및 분류하고 네트워크 상태를 업데이트하려면 predictAndUpdateStateclassifyAndUpdateState를 사용하십시오. 각 예측 사이의 네트워크 상태를 재설정하려면 resetState를 사용하십시오.

시퀀스의 미래의 시간 스텝을 예측하는 방법을 보여주는 예제는 심층 학습을 사용한 시계열 예측 항목을 참조하십시오.

시퀀스 채우기, 자르기 및 분할

LSTM 네트워크는 다양한 시퀀스 길이를 갖는 입력 데이터를 지원합니다. 네트워크에 데이터를 통과시키면 각 미니 배치의 모든 시퀀스가 지정된 길이를 갖도록 시퀀스가 채워지거나, 잘리거나, 분할됩니다. trainingOptionsSequenceLengthSequencePaddingValue 이름-값 쌍 인수를 사용하여 시퀀스 길이와 시퀀스를 채우는 데 사용되는 값을 지정할 수 있습니다.

시퀀스를 길이로 정렬하기

시퀀스를 채우거나 자를 때 사용되는 채우기 양이나 버려지는 데이터를 줄이려면 시퀀스 길이를 기준으로 데이터를 정렬해 보십시오. 시퀀스 길이를 기준으로 데이터를 정렬하려면 먼저 cellfun을 사용하여 각 시퀀스에 size(X,2)를 적용하여 각 시퀀스의 열 개수를 가져옵니다. 그런 다음 sort를 사용하여 시퀀스 길이를 정렬하고, 두 번째 출력값을 사용하여 원래 시퀀스를 재정렬합니다.

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

다음 그림은 정렬된 데이터와 정렬되지 않은 데이터의 시퀀스 길이를 막대 차트로 보여줍니다.

시퀀스 채우기

시퀀스 길이를 'longest'로 지정하면 미니 배치의 모든 시퀀스가 미니 배치에 있는 가장 긴 시퀀스와 동일한 길이를 갖도록 소프트웨어가 시퀀스를 채웁니다. 이는 디폴트 옵션입니다.

다음 그림은 'SequenceLength''longest'로 설정하는 효과를 보여줍니다.

시퀀스 자르기

시퀀스 길이를 'shortest'로 지정하면 미니 배치의 모든 시퀀스가 미니 배치에 있는 가장 짧은 시퀀스와 동일한 길이를 갖도록 소프트웨어가 시퀀스를 자릅니다. 시퀀스의 나머지 데이터는 버려집니다.

다음 그림은 'SequenceLength''shortest'로 설정하는 효과를 보여줍니다.

시퀀스 분할하기

시퀀스 길이를 정수 값으로 설정하면 소프트웨어가 미니 배치의 모든 시퀀스를 미니 배치에 있는 가장 긴 시퀀스 길이보다 큰, 지정된 길이의 가장 가까운 배수로 채웁니다. 그런 다음 소프트웨어가 각 시퀀스를 지정된 길이의 더 작은 시퀀스로 분할합니다. 분할이 이루어지면 소프트웨어가 미니 배치를 추가로 만듭니다.

전체 시퀀스가 메모리에 맞지 않으면 이 옵션을 사용하십시오. 또는 trainingOptions'MiniBatchSize' 옵션을 더 낮은 값으로 설정하여 미니 배치당 시퀀스 개수를 줄여 보십시오.

시퀀스 길이를 양의 정수로 지정하면 소프트웨어가 이 작은 크기의 시퀀스를 연속적인 반복을 통해 처리합니다. 네트워크는 분할된 시퀀스 사이에서 네트워크 상태를 업데이트합니다.

다음 그림은 'SequenceLength'를 5로 설정하는 효과를 보여줍니다.

시퀀스 데이터 정규화하기

0이 중심이 되는 정규화를 사용하여 훈련 시점에 자동으로 훈련 데이터의 중심을 조정하려면 sequenceInputLayerNormalization 속성을 'zerocenter'로 설정하십시오. 또는 먼저 모든 시퀀스의 특징별 평균값과 표준편차를 계산하여 시퀀스 데이터를 정규화할 수도 있습니다. 그런 다음 각 훈련 관측값에서 평균값을 빼고 표준편차로 나눕니다.

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

메모리에 담을 수 없는 큰 데이터

데이터가 너무 커서 메모리에 담을 수 없거나 데이터 배치를 읽을 때 특정 연산을 수행하려면 시퀀스, 시계열 및 신호 데이터를 위한 데이터저장소를 사용합니다.

자세한 내용은 Train Network Using Out-of-Memory Sequence DataClassify Out-of-Memory Text Data Using Deep Learning 항목을 참조하십시오.

LSTM 계층 아키텍처

다음 도식은 길이가 S인 특징(채널) C개를 갖는 시계열 X가 LSTM 계층을 통과하는 흐름을 보여줍니다. 이 도식에서 htct는 각각 시간 스텝 t에서의 출력값(은닉 상태라고도 함)과 셀 상태를 나타냅니다.

첫 번째 LSTM 블록은 네트워크의 초기 상태와 시퀀스의 첫 번째 시간 스텝을 사용하여 첫 번째 출력값과 업데이트된 셀 상태를 계산합니다. 시간 스텝 t에서, 이 블록은 네트워크 (ct1,ht1)의 현재 상태와 시퀀스의 다음 시간 스텝을 사용하여 출력값과 업데이트된 셀 상태 ct를 계산합니다.

계층의 상태는 은닉 상태(출력 상태)와 셀 상태로 구성됩니다. 시간 스텝 t에서의 은닉 상태는 이 시간 스텝에 대한 LSTM 계층의 출력값을 포함합니다. 셀 상태는 이전 시간 스텝에서 학습한 정보를 포함합니다. 이 계층은 각 시간 스텝에서 셀 상태에 정보를 추가하거나 셀 상태로부터 정보를 제거합니다. 계층은 게이트를 사용하여 이러한 업데이트를 제어합니다.

다음 구성요소는 계층의 셀 상태와 은닉 상태를 제어합니다.

구성요소목적
입력 게이트(i)셀 상태 업데이트의 수준 제어
망각 게이트(f)셀 상태 재설정(망각)의 수준 제어
셀 후보(g)셀 상태에 정보 추가
출력 게이트(o)은닉 상태에 추가되는 셀 상태의 수준 제어

다음 도식은 시간 스텝 t에서의 데이터 흐름을 보여줍니다. 이 도식은 게이트가 셀 상태와 은닉 상태를 망각, 업데이트, 출력하는 방식을 보여줍니다.

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., and J. Schmidhuber. "Long short-term memory." Neural computation. Vol. 9, Number 8, 1997, pp.1735–1780.

참고 항목

| | | | | | | | |

관련 항목