본문 바로가기
실습 & 활동/LG Aimers

Module 7. 시계열 데이터 및 AI 모델 성능 최적화 - 순환 신경망 기반의 시계열 회귀(1)

by sim0609 2023. 1. 30.

Non-Sequential vs. Sequential (Time-Series) Data

데이터에 순서가 없음 → Non-Sequential Data

: 시간 정보를 포함하지 않고 생성되는 데이터

: 순차 데이터가 아닌 경우 데이터는 N by D 행렬(N: 관측하는 데이터 개수, D: 변수 개수)로 표현됨

 

ex) 특정 고객의 금융상품 이용 현황을 바탕으로 대출 상품 추천

X: 고객별 금융 상품 이용 현황 - 주어지는 부분

Y: 과거 대출 상품 이용 유무(1: 사용, 0: 미사용) - 기계학습이 맞춰야 하는 정답

 

아래 그림처럼 두 번째 관측치의 하나의 vector가 X이고, 거기에 대응하는 하나의 scalar 값이 Y가 됨

 

 

순서(sequence)가 없는 인공신경망 구조

: 그림에서 x가 설명 변수이고, h는 은닉 노드이며 마지막 y라는 것은 model이 출력해야 되는 output임

 

※ 순서가 없는 인공 신경망의 경우 x에서 h로, h에서 y로 가는 화살표만 존재

 

 

데이터에 순서가 있음 → Sequential (Time-Series) Data

: 시간 정보를 포함하여 순차적으로 생성되는 데이터

: 순차데이터의 경우 데이터는 (N) by T by D Tensor (T는 측정 시점 수)로 표현됨 → tensor나 array로 표현됨

: N by T by D → 관측하는 데이터 개수 by 측정 시점 수 by 변수 개수

 

ex) 반도체 공정에서 주기적으로 측정되는 여러 센서 값을 이용한 Critical Dimension 예측

X: 반도체 공정 설비에서 시간별 측정되는 다양한 센서(변수) 값

Y: 웨이퍼의 Critical Dimension (CD)

 

아래 그림처럼 첫 번째 웨이퍼 X가 통으로 설명 변수가 되고 거기에 대응하는 하나의 Critical Dimension 값 Y를 예측함

 

 

마찬가지로 아래 그림은 N개의 관측 데이터에 대해 T차원의 시간축, D차원의 변수축을 x와 y축으로 갖는 행렬을 이용해 두 번째 Critical dimension, y값 model의 출력을 예측하게 되는 것

 

 

순서(sequence)가 있는 인공신경망 구조

: 첫 번째 시점에서 설명 변수인 x값들이 들어왔을 때 첫 번째 히든 노드로 정보가 투입되는 것을 의미함

: 두 번째 시점에서도 마찬가지로 시점만 바뀌었을 뿐 동일한 센서 데이터가 들어온다라고 했을 때 해당하는 입력 변수들이 두 번째 시점에서 히든 노드 정보를 전달함 

 

※ 여기서 주의할 점은 이전 시점에서 히든 노드의 정보들이 다음 시점의 히든 노드들의 정보들로 연결됨 

 

 과거의 정보가 다음 단계로 계속적으로 누적해서 전달이 되는 구조라는 뜻이며, 이거를 반복적으로 수행한 다음에 제일 마지막에 여러 시점에 해당하는 값들을 입력 받아서 적절히 처리한 후 최종적인 y를 산출하는 3차원 구조를 지님

 

 

순서(sequence)가 있는 인공신경망 구조 (벡터 표현)

: 실제 데이터로 위의 과정을 표현해보자

 

행에 해당하는 부분들 = 시점 T

열에 해당하는 부분인 센서 data = D

Critical Dimension = Y

 

순서가 있는 인공 신경망에서 첫 번째 시점에서의 vector 값들인 센서 data들이 첫 번째 hidden state로 전달되고 두 번째 입력 시점에서의 변수들이 두 번째 hidden state로 전달이 됨과 동시에 이전 hidden state에 있었던 정보가 다음 hidden state로 전달

 

위의 과정을 반복적으로 T만큼 진행을 한 다음에 가장 마지막에 y라고 하는 최종적으로 우리가 찾아야 되는 출력 값을 예측하도록 하는 구조 → 이러한 구조가 순환 신경망의 기본 구조임

 

 

지금까지 다룬 순환 신경망을 Vanilla RNN이라고 부르고 기본적인 구조의 RNN임

 

RNN Basics: Forward Path

RNN이 어떻게 정보를 취급하고 정보가 어디서 어느 방향으로 흐르는지 살펴보도록 하자

 

RNN에서 h_t가 핵심

: 특정한 small t시점에서의 은닉 노드의 값은 두 방향에서 정보를 전달받음

: t시점에서의 은닉 노드의 값(h_t)은 t-1 시점까지 은닉 노드에 저장된 정보(W_hh * h_t-1)와 t 시점에서 새롭게 제공되는 입력 정보(W_xh * x_t)에 영향을 받음

 

아래 식에서 W_hy, W_hh, W_xh는 데이터를 통해 학습되는 대상 → model parameter(모델 학습을 통해 최적으로 찾아가야하는 값들) 

 

 

RNN Basics: Gradient Vanishing/Exploding Problem

: Neural Network를 학습하는 과정은 gradient descent를 이용해서 backpropagation을 진행하는 것임

 

아래 그림에서는 활성 함수 Tanh를 통해 실제로 얼마만큼 예측에 틀렸는지(Cost)를 안 다음, 역방향으로 어떻게 해야지만이 현재 입력과 출력간의 쌍들을 잘 맞출 수 있는지 가중치 행렬을 구하는 것이 backpropagation의 목적 

 

즉, backpropagation을 하기 위해 연산에 관여하는 부분들을 전부 편미분하여 해당하는 gradient가 무엇인지를 찾아줘야 함

 

아래 그림에서는 은닉층 사이에서의 정보인 W_xh를 최적화를 진행함

 

 

위의 그림처럼 복잡한 식을 일반화하면 아래 식이 도출

 

 

그리고 여기서는 활성 함수가 Tanh라고 표현 했기 때문에 이 활성 함수에 대해서 t 시점에서의 은닉 노드를 t-1 시점으로 미분했을 때는 아래와 같은 수식이 나올 수 있음 

 

 

t 시점에서의 은닉 노드 W_xh로 미분했을 때 나오는 식은 아래와 같이 나옴

 

 

여기서 (1 - tanh^2(z_t)) 부분이 문제가 됨

 

아래 그림에서 빨간색 그래프를 tanh(x)라고 생각을 해보면, 초록색 그래프는 1 - tanh^2(x)가 됨

 

여기서 초록색 그래프인 1 - tanh^2(x)가 특정한 값을 벗어나게 되면 우리가 gradient 값을 통해 정보를 흘려줘야 하는데 그 gradient 값이 0이 된다는 이야기임 

 

→ 그래서 그래프의 길이가 길어지면 길어질수록 gradient 값이 하나라도 0이 되는 순간 식이 모두 곱하기로 연결되어 있어 지금까지 우리가 누적해서 쌓아왔던 정보가 전부 0이 될 수 있음

(이러한 문제점을 순환 신경망에서 gradient vanishing, gradient exploding problem이라고 부름)

 

 

RNN Hidden Unit - LSTM

: gradient vanishing, gradient exploding problem을 해결하기 위한 첫 번째 기법이 LSTM(Long Short-Term Memory)임

: 장기간에 있어서의 어떤 의존성을 학습 가능함

: LSTM은 RNN에 비해 내부 구조가 매우 복잡함

 

 

LSTM은 구조가 복잡하며 다양한 diagram이 존재하는데 실질적 구조는 하나임

 

 

Vanilla RNN vs LSTM

Vanilla RNN

input이 주어지고 이전 시점에서의 은닉층에서의 정보가 주어지면 그 두 개를 한 번 연산한 다음에 다음 state로 내보냄

 

아래 그림처럼 초록색 세 개와 빨간색 두 개가 vector로 이어지는데 이것을 concatenation하다고 표현하는데 concatenation된 것이 한 번 Neural Network 연산을 한 다음에 다음 시점에 output으로 만들어짐

 

 

LSTM

LSTM은 Vanilla RNN에서 보지 못했던 변수가 등장하고 Vanilla RNN과 다르게 셀 내부에서의 다양한 연산이 진행됨

 

 

기본적인 Vanilla RNN과 다르게 LSTM에서는 Cell state라는 구성요소가 필요함

 

Cell state

: LSTM의 핵심 구성요소, 아래의 diagram에서는 상부를 관통하는 선이며 시점마다 존재함

 

 

LSTM은 Vanilla RNN(주기억 장치 하나만 존재)과 다르게 주기억 장치와 보조 기억 장치가 같이 있어서 어떻게든 보조기억장치의 역할을 잘 개선시켜줌으로서 과거에 굉장히 멀리 떨어져 있었던 정보들을 잘 기억할 수 있고 선택적으로 반영할 수 있게 해 줌

 

아래 진행 과정을 통해 LSTM이 어떻게 진행되는지 살펴보자 

 

Step 1: 지금까지의 cell state에 저장된 정보 중에서 얼마만큼을 망각(forget)할 것인지 결정

Forget gate: 이전 단계의 hidden state(h_t-1) 와 현 단계의 입력(x_t)으로부터 0과 1사이의 값을 출력 (Sigmoid 함수 사용) 과거의 정보가 얼마나 현재 시점에서 유용한지를 판단

 

1: 지금까지 cell state에 저장된 모든 정보를 보존 

0: 지금까지 cell state에 저장된 모든 정보를 무시

 

즉, 아래 식처럼 forget gate는 어떠한 복잡한 연산에서도 두 가지의 조합을 만들어냄

 

forget gate는 이전 시점에서의 Hidden state 정보 vector와 현 시점에서의 입력 vector 두 가지를 concatenation을 해서 사용하게 되고 여기서 W_f(최적화 대상이 되는 model의 parameter)를 곱하여 사용

 

이러한 위의 과정을 통해 지금까지 저장된 정보가 얼마나 유용한지를 다시 한 번 현재 시점에서 판단을 해볼 수 있음

 

→ 만약 지금까지 저장된 정보가 충분히 유용하다고 판단이 되면 1의 값을 내보내 지금까지 기억했던 정보를 최대한 계속 기억

 

만약 지금까지 저장된 정보가 쓸모 없다고 판단이 되0의 값을 내보내 지금까지 기억했던 정보를 잊어버림

 

 

Step 2: 새로운 정보를 얼마만큼 cell state에 저장할 것인지를 결정

Input gate: 현재 시점에서 어떤 값을 최종적으로 업데이트 할 것인지 결정

Tanh layer를 사용하여 새로운 cell state의 후보 ~C_t을 생성

 

아래 식처럼 i_t는 h_t-1과 x_t라는 과거 시점에서의 hidden state vector와 현재 시점에서의 input vector를 concatenation 해서 학습의 대상이 되는 W_i라는 가중치 행렬을 이용하게 되면 input gate의 값이 추가적으로 나타남 

 

→ i_t 값이 크면 클수록 우리는 현재 시점에서의 정보들을 최대한 많이 반영함

 

→ i_t 값이 작으면 현재 시점에서의 정보를 적게 반영함

 

이러한 i_t 값의 크기는 그때그때 시점별로 Data에 따라서 adaptive하게 결정함

 

위의 과정을 통해 새로운 cell state의 보조기억장치에 들어갈 정보의 후보(~C_t)를 생성하는게 step 2에서 진행됨

→ 이러한 결정하는데 있어 필요한 정보는 이전 시점에서의 hidden state 정보와 현 시점에서의 입력 정보임

 

 

Step 3: 예전 cell state를 새로운 cell state로 업데이트

예전 cell state(C_t-1)를 얼마만큼 망각할 것인가를 계산한 forget gate 결과값(f_t)과 곱함

새로운 cell state 후보(~C_t)와 얼마만큼 보존할 것인가를 계산한 input gate 결과값(i_t)을 곱함

두 값을 더하여 새로운 cell state 값으로 결정

 

이러한 step 3에서는 예전에 cell state 보조 기억장치를 새로운 cell state 보조 기억장치로 update 함

 

f_t * C_t-1: 바로 이전 시점의 정보를 앞서 forget gate에서 학습한 값을 통해서 얼마만큼 반영할 것인가를 의미

i_t * ~C_t: 새로운 cell state의 후보를 현재 시점 기준에서 얼마만큼 반영해 줄 것인가를 의미

 

최종 정리

→ 과거부터 지금까지 어느정도의 정보를 저장해왔고 현재 어느정도의 정보를 새로 받았을 때 과거 정보를 얼마만큼 보존해야 하고 현재 정보를 얼마만큼 반영해야 되는지를 데이터 기반으로한 학습을 통해 adaptive하게 결정함

 

 

Step 4: 출력 값을 결정

출력값을 결정하는데 있어서 이전 hidden state 값(h_t-1)과 현재 입력 값(x_t)을 이용하여 output gate 값을 산출

output gate 값(o_t)을 이용해 현재의 cell state(C_t)를 업데이트 한 후에 최종적으로 h_t를 산출

 

 

LSTM 요약

Vanilla RNN은 W_xh, W_hh, W_hy라는 세 개의 가중치를 학습시켰지만, LSTM에서는 W_f, W_i, W_c, W_o라는 네 가지의 가중치 행렬을 학습시켜야지만이 작동함 

 

모든 상황에서의 입력은 h_t-1과 x_t를 concatenation 해야 함

 

 

→ 즉, Vanilla RNN이 과거 먼 거리에서의 정보를 잘 기억하지 못하는 문제점을 해결하기 위해서 LSTM이 제안됨

 

RNN Hidden Unit: GRU

: gradient vanishing, gradient exploding problem을 해결하기 위한 두 번째 기법이 GRU(Gate Recurrent Units)임

: LSTM과 GRU의 성능 차이는 비슷함 → 하지만, GRU 구조가 좀 더 단순

: 별도의 cell state가 존재하지 않음 (보조 메모리가 존재하지 않음)

 

Update gate: LSTM에서의 forget gate와 input gate가 결합된 형태 

→ 현재 정보를 얼마만큼 많이 반영해 줄 것이냐를 결정하는 부분

 

Reset gate: 망각과 새로운 정보 update 정도를 결정

→ 과거의 정보를 얼마만큼 덜 반영하거나 더 반영할지 연산해주는 부분

 

 

Vanilla RNN vs. LSTM vs. GRU

최종적으로 세 가지 RNN 구조를 아래 그림을 통해 비교해볼 수 있음