이번 글에서는 LG Aimers의 AI 전문가 과정에서 시계열 데이터의 순차적 특성을 고려한 모형과 그 학습 원리를 배웁니다. 모형의 어떠한 특성이 시계열 데이터의 특성을 학습에 반영하게 되는지 그리고 어떻게 모델의 성능을 향상시킬 수 있는지를 배울 수 있습니다.
1. 순환신경망 기반의 시계열 데이터 회귀
Non-Sequential vs Sequential (Time-Series) Data
- Non-Sequential Data: 시간 정보를 포함하지 않고 생성되는 데이터
- 순차 데이터가 아닌 경우, 데이터는 N by D 행렬로 표현 (N: 관측치 수, D: 변수 수)
- (예) 특정 고객의 금융 상품 이용 현황으로 대출 상품 추천 (X: 고객별 금융 상품 이용 현황, Y: 대출사용 유무)
- 순서가 없는 인공신경망 구조: x -> h -> y
- Sequential Data: 시간 정보를 포함하여 순차적으로 생성되는 데이터
- 순차 데이터의 경우, 데이터는 (N) by T by D Tensor 로 표현 (T는 측정 시점 수)
- (예) 반도체 공정에서 주기적으로 측정되는 여러 센서 값을 이용한 Critical Dimension 예측
- 순서가 있는 인공신경망 구조: x -> h (과거 정보를 누적시켜서 다시 재학습, Recurrent 형태) -> y
RNN Basics: Forward Path
- 기본 RNN (Vanilla RNN) 구조에서 정보의 흐름
- t 시점에서의 은닉 노드의 값은 두 부분에서 영향을 받게 됨
- 첫번째는, t-1 시점까지 은닉 노드에 저장된 정보
- 두번째는, t 시점에서 새롭게 제공되는 입력 정보
RNN Basics: Gradient Vanishing, Exploding Problem
- RNN에서의 Backpropagation에서 활성화 함수는 Tanh로 가정
- 순전파를 통해서 모델이 얼마나 틀렸는지를 확인한 후, Cost 함수를 사용하여 역전파를 수행
- 그래서 가장 현재 입력과 출력 간의 쌍들을 잘 맞출 수 있는 가중치 행렬을 구하게 됨 (역전파 목적)
- 이를 일반화시켜서 표현하면,
(1 - tanh^2(z_t)) * x_t
- 그런데,
1 - tanh^2(x)
의 값은 값이 양 또는 음의 값으로 발산할 때, 값이 0으로 수렴 - 즉, 특정한 값을 벗어나게 되면, Gradient 값이 소실되는 문제가 발생한다는 것
- 이를 해결하기 위해, LSTM과 GRU 방식이 등장
- 그런데,
RNN Hidden Unit: LSTM (Long Short-Term Memory)
- Gradient exploding, vanishing 문제를 해결하여 Long-term dependency 학습 가능
- Vanilla RNN은 Input이 주어지고, 이전 시점에서의 은닉층 (Hidden State)의 정보가 주어지면 이 두 개를 한 번 연산하고, 다음 State로 내보내게 되고 (Concatenate), 이것이 다음 시점의 Output으로 만들어짐
- LSTM은 Cell state라고 하여 각 시점마다 Cell state가 존재하고, 모델 상부를 관통하는 선의 모양
- Vanilla RNN은 주기억장치 하나만 있는데, LSTM은 주기억장치와 보조기억장치가 함께 있어서 보조기억장치의 역할을 잘 개선시켜서 과거에 멀리 떨어져 있던 정보들을 잘 기억하고, 선택적으로 반영할 수 있게 해주는 것
LSTM Process
- Step 1. 지금까지 Cell state에 저장된 정보 중 얼마만큼 망각 (Forget) 할 것인지 결정
- Forget gate: 이전 단계의 Hidden state h_t-1과 현 단계의 입력 x_t로부터 0과 1 사이값 출력 (시그모이드)
- 1: 지금까지 Cell state에 저장된 모든 정보 보존
- 0: 지금까지 Cell state에 저장된 모든 정보 무시
- 이전 단계의 결과와 현 단계의 입력을 Concatenate 하고, 모델의 파라미터 (W_f)를 통해 지금까지 저장된 정보가 얼마나 유용한지 현재 시점에서 유용한지 판단 (1 또는 0으로 결과값을 반환)
- Forget gate: 이전 단계의 Hidden state h_t-1과 현 단계의 입력 x_t로부터 0과 1 사이값 출력 (시그모이드)
- Step 2. 새로운 정보를 얼마만큼 Cell state에 저장할 것인지를 결정
- Input gate: 어떤 값을 업데이트 할 것인지를 결정
- 고정적으로 결정하는 것이 아닌, 그때 그때 시점 별로 Data에 따라 Adaptive 하게 결정되는 것
- Tanh layer를 사용하여 새로운 Cell state의 후보를 생성
- 후보를 생성하는데 있어서 필요한 데이터는 이전 시점의 Hidden state와 현 시점의 입력 정보
- Input gate: 어떤 값을 업데이트 할 것인지를 결정
- Step 3. 예전 Cell state를 새로운 Cell state로 업데이트
- 예전 Cell state를 얼마만큼 망각할 것인가를 계산한 Forget gate 결과값과 곱합
- 새로운 Cell state 후보와 얼마만큼 보존할 것인가를 계산한 Input gate 결과값을 곱합
- 두 값을 더하여 새로운 Cell state 값으로 결정
- 즉, 과거부터 지금까지 이만큼의 정보를 저장했고, 현재는 이 정도의 정보를 새로 받았는데, 그 과거 정보를 얼마만큼 보존하고, 현재 정보를 얼마만큼 반영해야 하는지를 데이터를 기반으로 학습으로 결정하는 것
- Step 4. 출력 값을 결정
- 이전 Hidden state 값과 현재의 입력 값을 이용하여 Output gate 값을 산출
- Output gate 값과 현재의 Cell state 값을 결합하여 현재의 Hidden state 값을 계산
- Vanilla RNN은 W_xh, W_hh, W_hy 라는 세 가지 가중치 행렬을 사용하여 학습
- LSTM은 W_f, W_i, W_c, W_o 라는 네 가지 가중치 행렬을 학습시켜야만 작동
- 또한 LSTM의 입력 값은 이전 Hidden state 값과 현재의 입력 값 (h_t-1, x_t)을 Concatenate 한 것
- Vanilla RNN이 먼 시점에서 정보를 기억하지 못해서 보완하게 된 LSTM 방법론
RNN Hidden Unit: GRU (Gated Recurrent Unit)
- LSTM을 단순화 한 구조. 실제 활용에서는 LSTM과 GRU의 성능 차이는 미비함
- GRU가 LSTM에 비해 상대적으로 단순하기 때문에 GRU -> LSTM 순서로 적용하는게 일반적 순서
- 별도의 Cell state가 존재하지는 않음
- LSTM의 Forget gate와 Input gate를 하나의 Update gate로 결합
- Update gate는 현재 정보를 얼마만큼 많이 반영해 줄것인가를 결정하는 부분
- Reset gate를 통해 망각과 새로운 정보 업데이트 정도를 결정
- Reset gate는 과거의 정보를 얼마만큼 덜 반영하거나, 더 반영하는지를 연산해주는 부분
RNN Variations: Bidirectional RNN
- Bidirectional RNN (양방향 순환신경망): 정보의 입력을 시간의 순방향과 역방향 관점에서 함께 처리 (번역기 예시)
- Deep-Bidirectional RNN: RNN의 Hidden layer가 한 층일 필요가 없이, 더 쌓아보는 접근법 (CNN처럼)
- 단, CNN과는 다르게, RNN은 층을 여러 개 깊게 쌓는다고 해서 성능의 향상을 보장하지는 않음
- 경험적으로도 쌓지 않거나, 아니면 최대 두 개에서 네 개 층 정도만 쌓는 것이 Maximum 층이 될 것
RNN: Attention
- 어느 시점 정보가 RNN의 최종 출력 값에 영향을 미치는지를 알려줄 수 있는 매커니즘
- Bahadanau attention (2015): Attention 매커니즘을 구현하기 위해 별도로 다시 모델을 학습함
- Luong attention (2015): 별도로 학습하지 않아도, Attention score를 산출할 수 있어서 이 방법론을 더 선호함
- 일반적인 Vanilla RNN에서는 각 시점 별로 Hidden state의 정보가 전달되고, 가장 마지막 층에서 최종적인 예측값을 도출하는데, Attention 방법에서는 가장 마지막의 Hidden state 정보와 첫번째 Hidden state와의 알파값이라는 유사도 (기여도)를 산출함. 그리고 각 Hidden state 마다 유사도 (기여도) 값을 산출한 후, 과거에 한 번 사용된 Hidden state 값을 버리는 것이 아닌 그 값과 알파값과의 선형 결합을 통해 C라고 하는 Context vector를 만듦. 최종적으로 이 값과 가장 마지막 시점에서의 Hidden state vector를 결합하여 h 틸다라는 새로운 Hidden state vector를 만들고, 이 값을 통해서 최종적인 예측을 수행
- 이를 통해, Attention 구조를 차용하지 않았을 때에 비해 성능이 훨씬 향상되는 것이 일반적. 또한 알파값이 결국 0부터 1 사이이면서 모든 알파들의 값을 더했을 때는 1이 나오기 때문에, 이 예측 과정에서 몇 번째 시점이 가장 중요한 역할을 수행했는지를 추론할 수 있음
- 알파_i 값은 i번째 Hidden state vector가 Context vector 생성에 기여하는 비중
- 두 Hidden state vector 사이의 Score 산출 방식 중 가장 간단한 방식은 두 벡터의 내적을 사용하는 것
- 알파값이라고 하는 유사도 (기여도)가 산출이 되면, Context vector는 단순히 지금까지 계산을 해왔던 각 시점들의 Hidden state vector와 알파와의 선형 결합
- Vanilla RNN, LSTM, GRU 모두는 중간 시점에 해당하는 Hidden state h들의 정보는 버려지고, 마지막만 사용
- Attention을 활용하게 되어 중간 시점에 해당하는 Hidden state vector도 다시 한번 의사결정에 활용
- 이렇게 Context vector를 만든 후, h 틸다라고 하는 새로운 Hidden state vector는 가장 마지막 시점의 Hidden state와 Context vector를 Concatenate 하고, 학습 대상이 되는 가중치를 곱한 후, 비선형 활성화를 통해 만들어지게 되고, 최종 예측을 수행
Summary
- 순환신경망은 순차 데이터를 처리하는데 특화된 인공신경망 구조
- 현 시점에서 Hidden state (H_t)는 이전 시점의 Hidden state (H_t-1)와 현 시점의 입력 (x_t)를 이용해 계산
- Vanilla RNN은 Long-term relationship을 파악하는데 어려움을 겪어서 LSTM, GRU가 등장
- LSTM은 Input, Forget, Output gate와 Cell state를 활용하여 정보를 선택적으로 활용
- GRU는 Reset, Update gate 만을 사용하여 LSTM 보다 단순화 된 구조
- Attention은 시계열 데이터의 어느 시점이 최종 예측에 영향을 미쳤는지 판별할 수 있는 기법. 일반적으로 Attention 구조가 그렇지 않은 구조보다 일반적으로 예측 성능이 우수한 경향이 있음
2. 합성곱 기반의 시계열 데이터 회귀
- 합성곱 즉, CNN 구조는 이미지 데이터를 처리하기 위해 고안된 구조
- 이 모델을 시계열 데이터에 적용했을 때도 효과적이었음
- 합성곱 신경망: 합성곱 연산을 통해 이미지로부터 필요한 특질 (Feature)을 스스로 학습할 수 있는 능력을 갖춘 신경망
- 이미지 인식 종류: Classification, Classification + Localization, Object Detection, Instance Segmentation
- Classification: 주어진 이미지에서 어떤 객체가 있는지 분류하는 것
- Classification + Localization: 어떤 객체가 어디에 있는지 Bounding box로 표현까지 해주는 것
- Object Detection: 여러 객체에 대하여 Classification + Localization을 수행
- Instance Segmentation: Object Detection을 pixel 단위로 수행하는 것 (Polygon 생성)
CNN Basics: Image Representation
- 이미지를 어떻게 컴퓨터에게 숫자로 인식시킬 것인가?
- 컬러 이미지는 3차원의 Tensor로 표현됨 (Width * Height * 3 (RGB))
- 문제점: 모든 픽셀 하나의 입력 노드로 간주하고, 서로 다른 가중치로 연결하면 Input layer와 First hidden layer에 너무 많은 학습을 시켜야 하는 weights (가중치)가 생김
- 이 단계에서 필요한 가중치 수: 1685 * 2247 * 3 * 첫번째 Hidden layer의 노드 수
CNN Basics: Convolution
- Image Convolution (Filter, Kernel): 특정 속성을 탐지하는데 사용하는 Matrix (예를 들면, Edge detection)
Convolutional Neural Network (CNN)
- 합성곱 신경망: 합성곱 연산을 통해 이미지로부터 필요한 특질을 스스로 학습할 수 있는 능력을 갖춘 심층 신경망
- 이미지 데이터가 갖는 특징: 인접 픽셀 간 높은 상관관계 (Spatially-local correlation), 이미지의 부분적 특성은 고정된 위치에 등장하지 않음 (Feature invariance)
- Spatially-local correlation을 고려하기 위해 Sparse connection 구성
- Sparse connection: 전체 픽셀이 아닌 일부 픽셀만 가중치로 연결하여 연산 수행
- 인접한 변수만을 이용하여 새로운 Feature 생성
- Invariant feature를 추출하기 위해 Shared weight 개념 이용
- Shared weight: 동일한 필터는 대상 영역에 상관없이 같은 가중치를 사용하여 연산을 수행
- 특정 특질을 추출하기 위한 도구로서 같은 대상 크기에는 위치가 다르더라도 동일한 Weight 적용
- Spatially-local correlation을 고려하기 위해 Sparse connection 구성
- CNN의 작동 과정
- 일반적인 CNN은 Convolution 연산, Activation 연산 (대부분 ReLU), Pooling 연산의 반복으로 구성
- 일정 횟수 이상의 Feature Learning 과정 이후에는, Flatten 과정을 통해 이미지가 1차원 벡터로 변환
- 이미지는 3차원 Tensor (RGB) 이므로, 필터 역시도 3차원
- Filter가 한번에 한 칸씩 이동하면, 시간이 오래 걸리지 않을까? Stride를 통해 한번에 여러 칸 이동하도록 함
- 가장자리에 있는 픽셀은 중앙의 픽셀보다 합성곱 연산이 적게 수행되지 않을까? Padding을 추가하여 이를 보완
- 최종적인 Output size는 Stride와 Padding 값에 따라 달라질 수 있음
- Output size = ((H + 2P - F / S) + 1) * ((W + 2P - F / S) + 1)
CNN Basics: Activation
- 합성곱을 통해 학습된 값들의 비선형 변환을 수행 (대부분 ReLU를 사용)
- 선형 변환만 하게 되면, 아무리 복잡한 구조로 조합해도 선형 조합의 결과는 선형 결과가 도출
- 대부분 Rectified Linear Unit (ReLU)을 사용
- 0보다 작은 값들은 0으로 변환하고, 0보다 큰 값들은 그 값을 반환
CNN Basics: Pooling
- 문제점: 고차원의 Tensor를 보다 Compact 하게 축약해야 하지 않을까?
- Pooling: 일정 영역의 정보를 축약하는 역할 (Max pooling, Average pooling)
- Strided convolution: Average pooling은 Strided convolution의 특수한 케이스 (모든 weight가 1/n)
CNN Basics: Flatten
- 평탄화 (Flatten): 2차원, 3차원의 Matrix, Tensor 구조를 1차원의 Vector로 변환하는 과정
CNN: 하이퍼파라미터
- Convolution filter의 크기: 이미지 데이터에는 주로 2-d Convolution을 사용 (가로와 세로의 크기가 같음)
- Convolution filter의 수: 이 수가 많을수록 동질 영역에서 다양한 형태의 특질을 추출할 수 있음
- Stride의 크기: Conv filter가 건너뛰는 픽셀의 수. Stride가 작을수록 촘촘하게 특질을 추출하지만 시간 오래 걸림
- Zero Padding 크기: Conv 연산의 편의성을 위해 사용. Conv 연산 전후의 크기를 일치시키기 위한 목적
- Filter와 Stride의 크기에 따라서 필요한 Padding의 크기가 결정
CNN Architecture 1: AlexNet
- 원본 이미지가 너무 크게 되면, 연산량이 부족했기 때문에 이미지를 Resize (224 * 224 차원 * 3 (RGB))
- Filter의 크기는 11 * 11 차원, Stride는 4, Filter의 개수는 96개 (Output 사이즈는 55 * 55)
- 초반에는 넓게 보되 듬성듬성 보고, 후반부에는 좁게 보되 세밀하게 보자
- 그 다음 Conv 연산에서는 Max pooling 후, Filter의 크기는 5 * 5 차원으로, 개수는 256개로 늘림
- 그리고 Max pooling 후, 3 * 3 Filter 384개로 적용
- 촘촘하게 보되, 특질을 찾아낼 수 있도록 Filter의 개수를 증가시킴
- 총 5번의 Conv 연산 후, 13 * 13 * 256 차원의 Tensor를 Flatten 하여 4096차원의 Dense layer로 변환
- 최종적으로 정리하면 다음과 같음
- 224 * 224 크기의 이미지를 Input으로 사용
- 초기 단계에서는 큰 필터 사이즈와 Stride를 사용
- 상위 Layer로 갈수록 작은 필터 사이즈와 Stride를 사용
- 2개의 Fully connected layer 존재
- 파라미터의 총 개수: 60 Million
CNN Architecture 2: VGGNet
- 원본 이미지는 24 * 24 * 3 차원의 Tensor인데, 64 차원의 Filter로 Conv 연산 두 번 수행
- 그리고 Max pooling 후, 128 차원의 Filter로 Conv 연산 두 번 수행
- 그 후, Max pooling 후, 사이즈를 줄여서 256 차원의 Filter로 Conv 연산 세 번 수행
- 최종적으로 정리하면 다음과 같음
- AlexNet에 비해서 단순하지만 깊은 구조
- 3 by 3 Convolution with stride 1을 기본 연산으로 하며, 중간 중간에 2 by 2 max pooling을 수행
- 파라미터의 총 개수: 138 Million
CNN for Time-Series Data
- Time-Series Data의 가정은 모든 변수는 동일한 주기 (초, 분, 시간 등)로 수집되고 있음
- Task 1 (분류): 특정 기간 (제품 가공 기간) 데이터를 입력으로 하고, 특정 범주를 출력으로 하는 모델 (양/불 판정 등)
- Task 2 (회귀): 특정 기간 데이터를 입력으로 하고, 특정 수치 (품질 지표)를 출력으로 하는 모델
- Task 1, 2는 Input인 X 데이터는 동일하지만, Output인 Y 데이터의 형태가 다름
- Task 3 (회귀): 일부 기간 데이터를 입력으로 하고, 이후 기간 데이터를 예측 (태양광 발전량 예측, 전력 소모 예측 등)
Task 4 (이상탐지): 일부 기간 데이터를 입력으로 하고, 해당 상황의 정상 및 비정상 여부를 탐지
- 1-D Convolution vs 2-D Convolution
- 시계열 데이터는 이미지 데이터와 달리, 변수들 사이에 Spatial Correlation이 존재하지 않음
- 시간 축으로 움직이는 Convolution은 의미가 있지만, 변수 축으로 움직이는 Convolution은 의미가 없음
- 2-D Convolution은 시간과 변수 두 축을 모두 Convolution 연산을 통해서 탐색하는 방식
- 1-D Convolution은 모든 변수를 한번에 고려하여 시간 축에 대해서만 Convolution 연산을 수행
- 따라서 Filter의 크기가 정사각형이 아닌, 직사각형 형태의 Filter를 사용. 즉, 이것은 모든 변수를 한꺼번에 고려하여, 시점에 대해서만 이동을 시키는 것
- Filter의 세로 크기는 변수의 개수만큼 고정이 될 것 (이미지 CNN과의 차이)
- 1-D Convolution에서 1개의 Filter를 사용하면 1개의 Vector가 결과물로 산출
- 이와 같은 Conv 연산을 반복하면, 각 Vector 상의 같은 인덱스는 같은 Time-series에 대한 데이터
Dilated Convolution
- 의문: 보다 긴 길이의 시계열 데이터를 효율적으로 처리할 수는 없을까?
- Standard Convolution은 항상 인접한 연속된 시점의 데이터에 대한 합성곱 연산을 수행
- 합성곱 연산을 조금 더 띄엄띄엄 해본다면?
Summary
- 합성곱 연산은 Feature Invariance와 Spatial Correlation을 반영하기 위해 사용되는 연산
- 이미지를 처리할 때는 정방형의 필터를 사용하여 가로, 세로 두 방향으로 움직이는 2-D 합성곱 연산을 사용
- 반면, 시계열 데이터에서는 변수 축으로 필터가 이동하는 것은 의미가 없어 필터의 한쪽 크기는 변수의 개수와 같음
- 그리고 시간 축으로만 움직이는 1-D 합성곱 연산을 수행하도록 함
- 합성곱 연산은 한 레이어에서만 적용하는 것이 아닌, 반복적으로 쌓아 올려서 사용할 수도 있음
- 보다 긴 길이의 시계열 데이터를 한번에 처리하기 위해서는, Standard Convolution 보다는 중간 지점을 생략하는 Dilated Convolution을 사용하면 보다 효율적인 정보의 처리가 가능
3. 트랜스포머 기반의 시계열 데이터 회귀
- 앞서 배운 CNN은 원래 이미지 데이터를 처리하기 위해 제안되었으나, 시계열 데이터에 적용한 것
- RNN은 원래부터 시계열 데이터나, 순차 데이터를 처리하기 위해 만들어진 방법론
- Transformer는 원래 자연어 데이터를 처리하기 위해 만들어진 모델이지만, 이 모델이 이미지와 시계열으로도 확장
- Transformer는 언어 모델의 한 종류
- 언어 모델은 특정 문장 (단어의 나열)이 등장할 확률을 계산해주는 모델
- 즉, 특정한 언어에서 특정한 문장 즉, 단어의 나열이 얼마나 그럴듯하고 자연스러운지 확률을 계산해주는 모델
- Transformer는 Attention의 병렬적 사용을 통해 효율적인 학습이 가능한 구조의 언어 모델
- 개괄적 구조: 내부에 인코더 파트와 디코더 파트가 존재하며, 이 둘 사이를 이어주는 연결고리가 존재함
- Input 데이터를 처리하는 Encoder 모듈과 처리가 완료된 다음 단어를 하나씩 반환해주는 Decoder 모듈이 있음
- Encoder는 여섯 개의 블록으로 구성되어 있고, Decoder도 역시 여섯 개의 블록으로 구성됨
- 입력 데이터가 들어왔을 때, Encoder는 층층이 이전 단계에서 다음 단계로 정보가 전달
- Decoding 과정에서는 가장 마지막 단계에서의 Encoder가 모든 단계의 Decoder에 정보를 전달하고, 하위 Decoder의 정보가 상위 Decoder로 정보를 전달해주는 구조
Transformer의 작동 원리
- 개별 단어에 대한 임베딩 벡터 (Word2Vec, GloVe 등)를 최초 입력으로 사용함
- Word2Vec, GloVe 등의 방법론은 실제 단어에서 두 단어가 의미적으로 유사하면, 공간상에서도 유사하도록 학습
- 이 단어 임베딩은 가장 아래에 위치한 인코더에서만 입력으로 1회 사용
- 나머지 인코더들을 하위 인코더에서 출력된 결과물을 입력으로 사용
- 최초 논문에서는 512 차원의 임베딩을 사용
- 입력으로 사용되는 리스트는 사용자가 지정하는 하이퍼파라미터 - 컴퓨팅 자원이 충분하다면 큰 값 지정 가능
- Positional Encoding
- Transformer는 단어를 순차적이지 않고, 한번에 받아서 입력 시퀀스에서 단어들 간의 위치 관계를 표현해야 함
- RNN 구조에서는 단어를 순차적으로 받았던 것과 약간 차이가 있음
- 따라서 Transformer에서는 입력 시퀀스에서 어떤 단어가 먼저 들어왔고, 나중에 들어왔는지 확인 필요
- 이 역할을 수행하도록 Positional Encoding을 만들고, 모든 단어 임베딩에 이것을 더해 입력 벡터를 구성함
- Transformer는 단어를 순차적이지 않고, 한번에 받아서 입력 시퀀스에서 단어들 간의 위치 관계를 표현해야 함
- Multi-Head Attention
- 어떤 토큰들을 받았을 때, 그 문서 안에서 또는 문장 안에서 단어들이 서로 어떤 연관관계를 가지는지 해석하는 것
- Positional Encoding이 더해진 단어 임베딩은 첫 번째 인코더 블록에서 Self-Attention과 FFNN을 거침
- 특정 위치의 단어는 해당 위치를 유지하면서 연산이 수행
- Self-Attention 과정에서는 이 경로간 의존성이 존재
- FFNN (Feed Forward Neural Network) 과정에서는 의존성이 존재하지 않아서 병렬화가 가능
- Encoding Procedure
- 인코더는 일련의 벡터들을 입력으로 받음
- 입력된 벡터들은 Self-Attention과 FFNN을 거쳐서 상위 인코더의 입력으로 투입
- 즉, Encoder 1의 Output은 Encoder 2의 Input으로도 활용된다는 것
- Self-Attention에 대한 이해
- The animal did’t cross the street because it was too tired.
- 이와 같은 문장에서 it이 해당하는 의미를 사람은 알기 쉽지만, 알고리즘은 그렇지 못함
- 이는 입력 시퀀스의 다른 위치에 있는 단어를 둘러보면서, 특정 위치의 단어를 잘 설명 및 표현 할 수 있게 함
- Self-Attention의 절차
- Step 1. 입력 벡터에 대해서 세 가지의 벡터를 생성
- 실제로는 Query, Key, Value에 대응하는 행렬을 곱해서 생성
- Query: 다른 단어들을 고려하여 표현하고자 하는 대상이 되는 현재 단어에 대한 임베딩 벡터
- 어떤 단어가 다른 단어들과 무슨 관계가 있는지를 알고싶은 질의 대상이 되는 단어
- Key: Query가 들어왔을 때, 다른 단어들과 매칭을 하기 위해 사용되는 레이블로 사용되는 임베딩 벡터
- Value: Key와 연결된 실제 단어를 나타내는 임베딩 벡터
- Step 2. 지금 표현하고자 하는 단어 (Q)에 대하여 어떤 단어를 고려해야 하는지 (K)를 알려주는 스코어 산출
- Q와 K를 곱한 후, 소프트맥스 함수를 취하여 이 스코어를 계산해줌
- Step 3. Step 2에서 계산한 스코어를 차원의 루트 수로 나눠줌
- 이 과정을 통해 Gradient 전파가 보다 안정적으로 수행됨
- Step 4. Step 3의 결과를 이용하여 소프트맥스 함수를 적용해 해당 단어에 대한 집중도를 산출
- Step 5. Step 4에서 산출된 확률값과 해당 단언의 Key 값을 곱함
- Step 6. Step 5에서 산출된 모든 값들을 더해서 출력으로 반환
- Step 1. 입력 벡터에 대해서 세 가지의 벡터를 생성
- Masked Multi-head Attention
- 디코딩 단계에서 셀프 어텐션은 Query 토큰보다 뒤에 위치한 토큰들에 대한 정보는 가용하지 않다고 가정하고, 해당 부분을 전부 Masking 처리
- 순차적으로 수행할 필요 없이 한번에 수행 가능
- The Final Linear and Softmax Layer
- Linear layer: 단순 FFNN 형태로서 마지막 디코더의 출력 결과물을 이용해 모든 단어의 출력 확률을 산출하기 위해서 차원을 늘려주는 역할을 수행
- Softmax layer: 개별 단어들의 출력 확률값을 반환
Transformer의 시계열 데이터 적용
- Transformer를 다변량 시계열 데이터에 최초로 적용한 논문
- Transformer의 Encoder 구조만을 사용
- Pre-training 과업을 위하여 연속적 길이의 Input masking 사용
- Layer Normalization 대신 Batch Normalization 사용
- Fine-tuning 단계에서 구조를 어떻게 설계하느냐에 따라 분류, 회귀, 예측 등 다양한 테스크에 적용 가능
- Time-Series Transformer (TST) 작동 원리
- TST는 크게 Pre-training과 Fine-tuning의 두 부분으로 구분
- Pre-training은 데이터를 통해 이 Transformer의 구조를 미리 학습하는 것
- Fine-tuning은 원하는 문제를 잘 풀 수 있도록 고도화하는 단계
- 입력 데이터 변환
- 원본 입력 데이터 X는 m개의 변수와 w개의 Time window length를 가짐
- Pre-training 과정에서는 이 중 일부를 Masking 한 뒤, Transformer의 Input이 되는 d차원으로 변환
- Fine-tuning 과정에서는 Masking 없이 d차원으로 변환
- 입력 데이터 Masking
- Transformer의 사전 학습 목적은 Masking 된 부분을 정확하게 예측하는 것으로 설계
- 각 Cell에 대한 Masking 여부를 독립적으로 결정하게 되면, Trivial Solution으로도 문제를 잘 맞춤
- Trivial Solution은 Masking 된 Cell 이전 시점 혹은 이후 시점 값을 그대로 사용하거나, 평균값 사용
- Masking 길이가 평균만큼이 되는 기하 분포를 따르도록 Markov Chain을 적용하여 Masking 여부 결정
- 모든 변수에 대해 동일한 시점을 Masking 하는 것보다 변수 별로 독립적으로 Masking segment를 결정하는 것이 실험적으로 더 우수한 성능을 보였음
- Transformer의 사전 학습 목적은 Masking 된 부분을 정확하게 예측하는 것으로 설계
- Positional Encoding
- NLP의 Transformer처럼 TST에서도 입력 데이터에 이것을 더해 Transformer 인코더의 입력값으로 사용
- 고정된 Positional Encoding을 사용할 수도 있고, 학습 가능한 Positional Encoding을 사용할 수도 있음
- Self-Attention in Transformer Encoder Block
- 총 3개의 Encoder 블록을 사용 (자연어에서는 6개를 사용했음)
- NLP에서의 Transformer와 다르게 Layer Normalization 대신 Batch Normalization 사용
- 시계열 데이터는 NLP Word Embedding에는 없는 이상치가 존재
- 시계열 데이터는 각 관측치의 길이 변화가 NLP의 문장 길이의 변화보다 작음
- 이러한 상황 하에서는 실험적으로 Batch Normalization이 우수한 성능을 보이는 것으로 입증
- Pre-training
- 각 관측치 및 Epoch 마다 독립적으로 생성한 Mask를 Input과 Element-wisse Multiplication 하여 Masked Input을 도출
- 이것을 Input Encoding과 Transformer Encoder에 순차적으로 넣어서 Latent Representation을 도출하고, 이를 Linear Output Layer에 넣어서 모든 값이 채워져 있는 각 시점의 데이터를 예측
- Masking 된 부분의 실제값과 예측값의 Mean Squared Error를 기반으로 모델을 학습
- Fine-tuning
- 1단계: Masking을 적용하지 않은 Input time window를 Input encoding과 Transformer Encoder에 순차적으로 넣어서 Representation을 도출
- 2단계: 도출된 모든 시점의 Representation을 Concatenate 한 것을 Output Linear Layer에 Input으로 넣어서 회귀 또는 분류의 정답을 예측
- 3단계: Task의 실제 정답과 TST가 예측한 값의 차이를 통해 Output Linear Layer를 Fine-tuning
- TST는 크게 Pre-training과 Fine-tuning의 두 부분으로 구분
TST의 성능
- Supervised Learning에 사용되는 Label의 비율 증가에 따른 TST (Pretrained)와 TST (Sup only)의 성능 변화로 다음 결과 도출
- 두 모델 모두 사용 가능한 Label의 비율이 증가할수록 성능이 향상
- Pretrained TST가 Sup only TST 보다 모든 비율에서 높은 성능을 도출한 것을 통해 동일한 Training set을 중복 사용하여 모델을 학습한 것이 효과가 있다는 것을 알 수 있음
- Fine-tuning 데이터의 개수가 고정되었을 때, Pre-training에 사용되는 데이터의 비율 증가에 따른 Pretrained TST의 성능 변화를 통해 다음 결과 도출
- Pre-training에서 많은 데이터를 학습할수록 Pretrained TST의 성능이 향상
- Pretrained TST의 Fine-tuning 데이터의 개수가 적을수록 Pre-training에 사용되는 데이터의 비율 증가에 따른 성능 향상 폭이 큼
Summary
- TST는 Transformer의 Encoder 구조만을 사용
- Pre-training 과업을 위하여 연속적 길이의 Input masking을 사용
- Layer Normalization 대신 Batch Normalization 사용
- Fine-tuning 단계에서 구조를 어떻게 설계하느냐에 따라 회귀, 분류, 예측 등 다양한 테스크로 적용 가능
- Pre-training을 통해 기존의 Supervised Learning만 수행했을 경우보다, 우수한 예측 성능을 보임