본문 바로가기

파이썬 & 머신러닝과 딥러닝

시계열, RNN, Seq2Seq, 어텐션, ARIMA, CNN

RNN 

: 만약 1일차, 2일차, 3일차 주가를 넣으면 2일차, 3일차 종가를 출력한다고 가정, 

그러면 2일차 종가 정답값, 3일차 종가 정답값과의 각각 Loss 값을 계산할 수 있있지 않는가? 

그러면 2일차 loss, 3일차 loss를 합쳐서 loss를 구해내어서 W값을 없데이트 한다.

 

Seq2Seq

: seq2seq는 인코더와 디코더 두가지 모듈로 구성

컨텍스트 벡터 : 인코더는 입력 문장의 모든 단어들을 순차적으로 입력받은 뒤에

마지막에 이 모든 단어 정보들을 압축해서 하나의 벡터로 만듦

디코더는 컨텍스트 벡터(인코더에서 생성된 상태)를 받아서 번역된 단어를 하나씩 순차적으로 출력

 

1. Seq2Seq 모델 개념

Seq2Seq는 두 개의 RNN으로 구성된다:

  • 인코더(Encoder): 입력 시퀀스를 읽어 정보를 압축한 벡터로 변환.
  • 디코더(Decoder): 인코더에서 얻은 정보를 바탕으로 출력 시퀀스를 생성.

Seq2Seq 동작 과정

  1. 인코더는 주어진 입력을 하나씩 처리하여 context vector라는 요약 벡터를 만든다.
  2. 디코더는 이 요약 벡터를 입력받아 원하는 출력 시퀀스를 생성.

2. 인코더-디코더 구조

  • 인코더: 입력 시퀀스의 각 단어를 RNN에 넣어 마지막 hidden state를 출력. 이 hidden state가 인코더에서 디코더로 넘어가서 전체 입력에 대한 정보를 담고 있는 요약 벡터가 된다.
  • 디코더: 인코더의 마지막 hidden state를 받아 첫 번째 단어를 예측하고, 그 예측 결과를 다시 RNN에 넣어 두 번째 단어를 예측하는 방식으로 시퀀스를 생성한다.

3. 어텐션(Attention) 추가

기본 Seq2Seq는 입력 시퀀스를 요약 벡터로 압축해서 전달하는데,

길이가 긴 입력일수록 요약 벡터 하나로는 모든 정보를 담기 어렵다.

어텐션(Attention)은 이 문제를 해결하기 위해 특정 시점에서

입력의 각 부분에 얼마나 집중할지 가중치를 부여해, 더 많은 정보를 고려.

어텐션이 추가되면 디코더는 인코더의 모든 hidden state를 참조하여

각 타임스텝마다 중요한 정보를 동적으로 가져올 수 있다.

 

어텐션의 필요성

기본적인 Seq2Seq 모델에서는 인코더가 입력 시퀀스 전체를

하나의 고정된 크기의 벡터(context vector)로 압축하여 디코더에 전달

이 벡터가 입력의 모든 정보를 담고 있으면 좋지만,

입력 시퀀스가 길어지면 정보 손실이 발생하기 쉽다.

특히 번역이나 요약과 같은 작업에서 긴 문장은 문맥을 제대로 반영하지 못할 수 있다.

어텐션은 이러한 문제를 해결하기 위해,

디코더가 인코더의 모든 hidden state를 참조할 수 있게 하여,

각 타임스텝마다 다른 부분에 집중할 수 있게 만들어졌다.

 

어텐션의 원리

어텐션 메커니즘은 크게 세 가지로 이루어진다:

  1. 어텐션 가중치 계산 (Attention Weights): 인코더의 각 타임스텝에서 생성된 hidden state가 디코더의 현재 상태와 얼마나 관련이 있는지 계산. 각 입력 시점에 대해 가중치를 부여해 중요도를 결정한다.
  2. 가중치 적용 (Weighted Sum): 어텐션 가중치에 따라 인코더의 각 hidden state를 가중 합한 값을 컨텍스트 벡터(context vector)로 만든다.
  3. 출력 생성 (Generate Output): 이 컨텍스트 벡터를 디코더에 제공하여 현재 타임스텝의 출력을 만든다.

 

어텐션 메커니즘의 구체적인 단계

  1. 쿼리, 키, 밸류 생성:
    • 쿼리(Query): 디코더의 현재 hidden state. 이 쿼리가 입력 시퀀스의 각 타임스텝에 얼마나 관련이 있는지 확인
    • 키(Key): 인코더의 각 타임스텝에서의 hidden state.
    • 밸류(Value): 키와 동일하게 인코더의 각 타임스텝에서의 hidden state.

 

어텐션의 직관적 이해

  • 디코더가 출력 시퀀스를 생성할 때, 인코더에서 생성된 모든 hidden state를 보면서, 어느 입력이 출력과 더 관련이 있는지에 대해 가중치를 부여한다.
  • 어텐션 가중치가 큰 입력은 출력에 큰 영향을 미치고, 작은 가중치를 가진 입력은 영향을 덜 받음.
  • 이는 사람이 긴 문장을 이해할 때, 문맥에 따라 중요한 부분에 집중하는 것과 유사하다.

어텐션 예시

예를 들어, 기계 번역에서 영어 문장을 프랑스어로 번역한다고 가정할 때, 디코더가 프랑스어의 "chien" (개)를 출력할 때는 영어 입력의 "dog" 부분에 집중하게 된다. 어텐션 가중치가 "dog"에 크게 부여되고, 다른 단어들에는 작게 부여.

 

시계열 앞 : 용어의 특성

시계열 : 모델의 특성

 

→ Encoder의 모든 hidden state 중 어디에 더 집중할 것인가를 계산

  • 어텐션 함수는 주어진 '쿼리'에 대해서 모든 '키'와의 유사도를 각각 구함
  • 해당 유사도를 키와 매핑 되어있는 각각의 '값'에 반영함
  • 유사도가 반영된 '값'을 모두 더해서 리턴

 

 

 트랜스포머 (Transformer)

1. Seq2Seq 에서 LSTM 구조를 삭제

(순차적으로 계산하면 너무 오래 걸려 한방에 행렬곱으로 계산)

2. 멀티헤드 어텐션 -> 어텐션 값을 디코딩할 때 여러개 뽑음

3. maked attention -> 현재값 이후의 값을 참고하지 않는 방법

4. 포지셔널 인코딩 -> 문맥에 순서 정보를 주기 위한 절차

 

 

  • Seq2Seq에서 LSTM 구조를 삭제:
    • 트랜스포머는 전통적인 Seq2Seq 모델에서 LSTM, GRU와 같은 순환 신경망(RNN) 구조를 제거하고, 모든 계산을 병렬 처리할 수 있도록 행렬 곱셈으로 처리. 이 덕분에 순차적인 계산 과정 없이 더 빠른 학습이 가능.
  • 멀티헤드 어텐션:
    • 어텐션 메커니즘을 한 번 적용하는 것이 아니라 여러 개의 어텐션 헤드를 사용하여 입력 시퀀스 내에서 다양한 관점에서 어텐션을 수행. 이렇게 얻은 여러 어텐션 값을 조합하여 더 풍부한 정보를 학습할 수 있다.
  • Masked Attention:
    • 디코더에서 사용되는 기술로, 현재 시점에서 미래의 정보를 참조하지 않도록 하는 메커니즘. 예를 들어, 번역 작업에서 아직 생성되지 않은 미래의 단어를 참조하지 않도록 마스킹을 한다.
  • 포지셔널 인코딩:
    • 트랜스포머는 RNN처럼 시퀀스의 순서를 자연스럽게 학습하지 않기 때문에, 단어의 순서 정보를 추가적으로 입력에 포함시켜 준다. 이를 포지셔널 인코딩이라고 하며, 사인(sin)과 코사인(cos) 함수로 순서를 인코딩하여, 모델이 문맥에서 단어의 위치를 파악할 수 있도록 도와줌.

 


 

ARIMA

ARIMA(Autoregressive Integrated Moving Average, 자기회귀 누적 이동평균) 모델은

시계열 데이터에서 과거의 값과 오차를 기반으로 미래 값을 예측하는 통계적 모델

ARIMA는 시계열 데이터의 패턴을 자기회귀(AR), 이동평균(MA), 그리고 차분(I)을 통해 모델링

ARIMA는 비정상 시계열 데이터를 정상 시계열로 변환하여 안정적으로 예측을 수행하는 모델

 

아리마는 시계열 데이터가 '정상성'을 띄어야 미래 예측을 잘한다.

ACF와 PACF의 그래프가 초반에 y값이 뚝 떨어지지 않는다는건,

과거 정보가 미래 정보에 계속 영향을 주고 있다는 것.

이는, 미래 데이터의 분산값이 불안정(비정상성)하다고 판단 <- 아리마 모델이 정확한 학습을 못함.

 

 


 

CNN

CNN 모델을 쓰는 이유는 이미지에서 이웃픽셀 정보를 고려해서 계산하기 위함.

 

Convolution은 필터(1개이상)을 이미지 픽셀과 연산하여 아웃풋 피처맵을 만듦

 

padding(패딩)은 이미지의 모서리 부분의 정보도 아웃풋 피처맵에 잘 포함시키기 위해 사용

or 아웃풋 피처맵의 shape를 원본이미지 사이즈와 동일하게 만들기 위해 사용

 

스트라이드 : 컴볼루젼 연산을 얼마나 띄어서 할거냐

 

풀링 연산 : FC layer 들어가기 전에 아웃풋 피처맵에서 정말 필요한 정보들을 추출하거나,

아웃풉 피처맵의 크기를 줄이기 위해

 

 

Residual connection(잔차연결) : 입력값을 아웃풋에 더하거나 concat하는 것

Dense Block : 모든 residual을 연결한 형태