🤔 ARIMA 모델은 모델의 특정 파라미터(AR 차수, 차분의 차수, MA 차수)로 결정
- 자동회귀(AR: AutoRegressive)
- 누적이동평균(I: Integrated): 데이터의 차분값(differencing)
(현재값과 이전값간의 차이)- 이동평균(MA: Moving Average): 시간에 따른 평균값의 변화를 나타내는 모델입니다. 이동평균은 일정 기간 동안의 관측값들의 평균을 계산하여 경향을 파악합니다.
최근 자기회귀를 기반으로 한 모델들의 인기가 떨어진 것은 병렬 연산이 불가능하다는 점 때문이다.
GPU 등의 현대 연산 유닛은 병렬 연산에 최적화된 구조를 가지고 있는데 자기회귀 기반 모델들은 특정 시점의 데이터가 이전 시점의 데이터에 의존하기 때문에 직렬적인 연산을 수행하고, 이에 GPU나 TPU 등의 이점을 십분 활용하지 못한다.
최근, Transformer 등 Attention을 기반으로 한 병렬 연산 모델들이 주목을 받고 있음
import numpy as np
import matplotlib.pyplot as plt
import statsmodels #통계학 패키지
# 예제 데이터 생성
np.random.seed(0)
temperature = []
for i in range(30):
temperature.append(10 + i / 2 + np.random.randint(-3,1)) # 랜덤한 변동 포함
# 입력 특성과 타깃 변수 준비
X_train = []
y_train = []
for i in range(3, len(temperature)):
X_train.append(temperature[i-3:i])
y_train.append(temperature[i])
# 자기회귀 모델 구축 및 학습
model = statsmodels.tsa.ar_model.AutoReg(y_train, lags=3)
result = model.fit() # 최대 3개의 이전 시점 값을 사용
# 다음 날의 온도 예측
next_day = temperature[-3:]
next_temperature = result.predict(start=len(y_train), end=len(y_train) + 2)
# 온도 그래프 플로팅
plt.plot(range(len(temperature)), temperature, label='Actual Temperature')
plt.plot(range(len(temperature), len(temperature) + len(next_temperature)), next_temperature, 'ro', label='Predicted Temperature')
plt.xlabel('Day')
plt.ylabel('Temperature')
plt.title('Temperature Changes')
plt.legend()
plt.savefig('AR.png')
plt.show()
CNN
이 제안됨⚑ 구조 ⚑
⚑ Convolutional Layer(합성곱 계층) ⚑
쉽게 말해서, 필터를 이미지의 맨 왼쪽 위에 가져다 댄 후 내적하면 숫자 하나가 나오고 그 값이 Activation Map 의 맨 왼쪽 위의 값으로 들어가게 된다. 그래서 결과로 나오는 Activation Map 의 크기가 32 - 5 + 1 = 28 이 되는 것이다.
이러한 결과 값을 Feature Map 또는 Activation Map 이라고 부른다. 이 때, 특징을 여러 개 뽑기 위해서 여러 개의 필터를 사용하고, 여러개의 Activation Map 이 생성된다.
보통은 필터가 이미지 기준으로 한 칸씩 이동하며 계산을 하지만 여러 칸씩 이동이 가능하다.
그 이동의 보폭을 Stride라고 하며 위 그림에서는 두 칸씩 이동하면서 연산하도록 파라미터를 통해 조절했으므로 Stride는 2가 된다.
입력 이미지의 가장자리에 측정 값으로 설정된 픽셀들을 추가함으로써 입력 이미지와 출력 이미지의 크기를 같거나 비슷하게 만드는 역할을 수행한다. 0의 값을 갖는 픽셀을 추가하는 것을 Zero-Padding 이라고 하며, CNN 에서는 주로 Zero-Padding 이 사용된다.
Pooling Layer
Pooling 계층에서는 이전 합성곱 과정을 통해 생성한 결과(Feature Map)에서 비교적 상관관계가 낮은 부분은 삭제함으로써 차원을 줄이는 과정을 수행한다.
Pooling 에는 대표적으로 Max Pooling
과 Average Pooling
이 있다.
위 이미지와 같이 선택 영역의 크기가 2 ✕ 2인 경우,
- Max Pooling은 해당 크기의 행렬에서 가장 큰 값(Max)을,
선택 영역의 내부에서는 객체의 이동이나 회전에 의해 픽셀의 위치가 변경되더라도 출력값이 동일하기 때문에 객체가 이동이나 회전하더라도 같은 객체로 인식할 수 있다. 또한 모델이 처리해야 하는 이미지의 크기가 줄어들기 때문에 모델 파라미터 수가 줄어들어 학습시간을 크게 절약할 수 있다.
Fully Connected 계층에서는 앞에서 얻은 다차원 벡터의 행렬을 1차원 배열로 만들고 softmax 함수를 통해 이미지를 이미 정의된 분류 라벨 중에 하나로 분류한다.
💡 따라서 요약하자면, CNN은 합성곱과 Pooling 을 반복적으로 사용하면서 특징을 찾고, 그 특징을 입력데이터로 Fully Connected Layer 에 보내서 카테고리 중에 하나로 분류하는 작업을 한다.
💡 메모리셀(RNN 셀) : 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드, 이전의 값을 기억하려고 하는 일종의 메모리 역할을 수행한다.
은닉상태(hidden state) : 메모리 셀이 출력층 방향 또는 다음 시점의 메모리셀에 보내는 값을 의미한다.
RNN은 자연어 처리 분야에서 많이 쓰이는 딥러닝의 가장 기본적인 시퀀스 모델임
예를 들어 자연어 처리 모델을 통해 한국어-영어 번역을 한다고 하자. 입력으로 주어지는 한국어 문장도 단어의 시퀀스이고 출력으로 나와야 하는 번역된 영어 문장도 시퀀스라고 할 수 있다. 이러한 시퀀스들을 처리하기 위해 고안된 모델을 시퀀스 모델이라고 한다.
RNN 구조
RNN 수식
은닉층 :
출력층 :
현재 시점의 은닉상태 값은 라고 할때, 이 값은 이전 시점 에서의 은닉상태 값, 그리고 현재 시점의 입력층 에서 을 받아서 갱신된다.
이전 시점의 은닉상태와 현재 시점의 입력값은 각각 를 학습을 위한 가중치로 가진다. 각 가중치와 입력값을 곱하고 편향 를 더한 뒤 활성함수 Tanh 에 넣으면 현재 시점의 은닉상태 값 을 구할 수 있다.
RNN 활용
RNN은 입력과 출력의 길이가 고정되어 있지 않아서 설계에 따라 다앙한 용도로 사용할 수 있다.
일대다 모델 (one-to-many)
하나의 입력에 대해 여러개의 출력을 하는 모델로, 하나의 이미지 입력에 대해 사진의 제목을 출력하는 이미지 캡셔닝에 사용 가능하다. 사진의 제목은 단어들의 나열이므로 시퀀스라고 할 수 있다.
다대일 모델(many-to-one)
단어 시퀀스에 대해 하나의 출력을 하는 모델로, 입력 문서가 긍정적인지 부정적인지를 판별하는 감성분류 , 메일이 정상메일인지 스팸메일인지 분류하는 스팸 메일 분류 등에 사용할 수 있다.
다대다 모델(many-to-many)
사용자가 문장을 입력하면 대답문장을 출력하는 챗봇과 입력문장으로부터 번역된 문장을 출력하는 번역기, 또는 품사 태깅 같은 작업이 속한다.
[출처 | 딥다이브 Code.zip 매거진]