1. FNN
FNN(Feedforward Neural Network)란, 입력값이 출력까지 한 방향으로 전달되는 구조를 가진 인공 신경망이다. 이 구조 때문에 'feedforward'라는 이름이 붙었으며, 데이터가 신경망의 입력층에서 출력층까지 단방향으로 이동하므로 순환 또는 피드백이 없다. 이러한 특징으로 인해 FNN은 시계열 데이터와 같은 연속적인 정보를 처리하는 데 한계가 있다.
위와 같이 RNN과 달리 단방향성을 가진다. FNN은 인공 신경망의 기본적인 형태로, 다수의 입력 노드와 가중치, 활성화 함수를 통해 출력 노드로 정보를 전달한다. 이때 가중치는 학습 과정에서 업데이트되며, 초기 가중치는 보통 무작위로 결정된다. FNN은 다층 퍼셉트론이라고도 불리며, 은닉층이 하나 이상인 인공 신경망을 말한다.
2. RNN
RNN(Recurrent Neural Network)은 입력과 출력을 시퀀스 단위로 처리하는 시퀀스(Sequence) 모델이다. 번역기를 생각해보면 입력은 번역하고자 하는 단어의 시퀀스인 문장이다. 출력에 해당되는 번역된 문장 또한 단어의 시퀀스이다. 이와 같이 시퀀스들을 처리하기 위해 고안된 모델들을 시퀀스 모델이라고 한다. 그 중 RNN은 가장 기본적인 인공 신경망 시퀀스 모델이다.
RNN의 한계점이 존재한다. 바로 '그래디언트 소실 문제'이다. 그래디언트 소실 문제는 지속적으로 활성화함수의 미분값이 곱해지게 되어 기울기 값(Gradient)가 0으로 수렴하는 문제를 말한다. 그렇게 되면 이전 계산 값을 기억하지 못하기 때문에 해당 문제를 개선하기 위해 고안된 방법이 LSTM이다.
3. LSTM
LSTM 모델은 기존의 RNN의 문제점인 기울기 소실 문제를 보완한 모델이다. 기울기 소실 문제를 보완하기 위해 정보를 오랫동안 유지할 수 있는 기억 셀(cell)을 도입하여, 장기 의존성 문제를 해결한다. 이때 셀은 메모리의 단위를 말한다. LSTM모델의 대표적인 사용처는 시계열 데이터(시간), 음성인식, 자연어 처리, 등에 사용된다. 아래의 코드는 LSTM을 이용하여 삼성전자의 주가를 예측하는 코드이다.
import FinanceDataReader as fdr # 주가에 관한 데이터를 읽어오기 위해 finance-datareader모듈 호출
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler # 데이터 정규화를 위해 호출
import keras
# samsung = fdr.DataReader(symbol='005930', start='01/01/2016', end='12/23/2020')
samsung = fdr.DataReader(symbol='005930', start='01/01/2016', end=None)
# 삼성전자에 대한 데이터 호출 (코드: 005930)
open_values = samsung[['Open']]
#여러개의 Column 중 Open에 해당하는 Column 값 선택
# 데이터의 값이 10_000을 넘어가기 때문에 정규화를 진행
scaler = MinMaxScaler(feature_range=(0, 1)) # MinMaxScaler 생성자를 이용하여 객체 생성
# 범위를 0 ~ 1 사이의 값으로 설정
scaled_open_values = scaler.fit_transform(X=open_values) # 데이터의 정규화 진행
TEST_SIZE = 200
# 테스트 데이터 : 200개
train_data = scaled_open_values[:-TEST_SIZE] # 마지막 200개의 값을 제외한 나머지 값들을 학습 데이터로 지정
test_data = scaled_open_values[-TEST_SIZE:] # 마지막 200개의 값은 테스트 값으로 지정
# print(train_data.shape) # (1914, 1)
# print(test_data.shape) # ( 200, 1)
def make_feature(data, windowing) -> tuple:
train, test = list(), list()
for i in range(len(data) - windowing):
train.append(data[i: i + windowing])
test.append(data[i + windowing])
return (np.array(train), np.array(test))
# 학습을 위한 데이터셋 생성 함수 선언, 튜플 값 반환
(x_train, y_train) = make_feature(data = train_data, windowing = 30)
# LSTM으로 구현하기
model = keras.models.Sequential(name = 'LSTM_MODEL')
model.add(keras.Input(shape = (x_train.shape[1], 1), name = 'INPUT'))
# LSTM units를 32로 설정 -> 메모리 개수 32개와 동일
model.add(keras.layers.LSTM(units=32, return_sequences=True, activation = 'tanh', name = 'LAYER1'))
model.add(keras.layers.LSTM(units=16, return_sequences=False, activation = 'tanh', name = 'LAYER2'))
model.add(keras.layers.Dense(units=1, activation = 'sigmoid', name = 'OUTPUT'))
model.summary()
# model.compile(loss = 'mse', optimizer='adam') # 모델의 손실함수, 옵티마이저 설정
# model.fit(x= x_train, y = y_train, epochs=100, batch_size=16) # 모델 학습
# model.save('LSTM_MODEL.keras') # 학습된 모델 저장
model2 = keras.models.load_model('LSTM_MODEL.keras') # 학습된 모델 로딩
# Test 진행
(x_test, y_test) = make_feature(data = test_data, windowing=30) # 테스트 데이터셋 생성
prediction = model2.predict(x = x_test) # 모델을 이용한 예측
print(prediction) # 예측 값 출력
print(prediction.shape)
# 결과 시각화를 위해 원래 값과 예측 값 비교 그래프 생성
plt.figure(figsize = (10, 8))
plt.plot(y_test, label = 'STOCK PRICE', color = 'blue')
plt.plot(prediction, label = 'PREDICTION', color = 'red')
plt.legend()
plt.show()
'ABC부트캠프 데이터 탐험가 과정' 카테고리의 다른 글
[26일차] ABC 부트캠프 미니 프로젝트 발표회 (0) | 2024.08.11 |
---|---|
[25일차] ABC 부트캠프 미니 프로젝트 (0) | 2024.08.07 |
[23일차] ABC 부트캠프 딥러닝과 CNN (0) | 2024.08.05 |
[22일차] ABC 부트캠프 인공신경망, MLP (0) | 2024.08.02 |
[21일차] ABC 부트캠프 ESG포럼 & 세미나 (0) | 2024.08.01 |