[딥러닝] LSTM과 GRU 셀

nbac406·2023년 5월 23일
0

RNN

RNN 개요

  • 시퀀스 데이터 처리에 강점을 가진 모델로써 시계열, 자연어 등의 분야에서 많이 사용
  • RNN은 이전 타임 스텝에서의 어떠한 정보(hidden state)를 다음 타입스텝으로 계속 전달하여 연산하는 방식
  • 순환 신경망은 은닉층을 거친 결과값을 재사용하는 특징으로 인해 그래디언트 소실 & 폭주 문제가 발생 가능

RNN의 기본구조

출처:https://wikidocs.net/60762

  • 전 시점의 정보 hidden state를 넘겨주기 위해 특정시점의 입력값에 대한 가중치의 곱과 전 시점의 hidden state와 그 가중치 곱의 합 구하기

LSTM

LSTM 개요

  • 단기 기억을 오래 기억하기 위해 고안된 모델
  • 순환신경망은 은닉층을 거친 결과값을 재사용하는 특징으로 인하여 그래디언트 소실&폭주 문제가 발생하는데 이를 해결하기 위해 LSTM방법 사용

LSTM 구조

  • 입력과 가중치를 곱하고 절편을 더해 함수를 통과시키는 구조를 여러개 보유
  • 해당 계산의 결과를 다음 타임스텝에 재사용 시킴
  • 기본 순환층과는 달리 시그모이드 활성화 함수를 사용하고 tanh활성화 함수를 통과한 어떤 값과 곱해져서 은닉 상태로 만듬
  • forget gate, input gate, output gate (총 3개)

LSTM신경망 훈련하기

# 라이브러리 임포트 및 train, test 데이터 분류

from tensorflow.keras.datasets import imdb
from sklearn.model_selection import train_test_split
from tensorflow.keras.preprocessing.sequence import pad_sequences

(train_input, train_target), (test_input, test_target) = imdb.load_data(
    num_words=500)

train_input, val_input, train_target, val_target = train_test_split(
    train_input, train_target, test_size=0.2, random_state=42)

train_seq = pad_sequences(train_input, maxlen=100)
val_seq = pad_sequences(val_input, maxlen=100)
# sequential 모델 객체 생성
from tensorflow import keras

model = keras.Sequential()

model.add(keras.layers.Embedding(500, 16, input_length=100))
model.add(keras.layers.LSTM(8))
model.add(keras.layers.Dense(1, activation='sigmoid'))

model.summary()
  • 입력 단어 500개, 입력 시퀀스 길이 100, 임베딩 차원 16으로 입력 시퀀스를 밀집 벡터로 변환
  • LSTM레이어 모델을 추가하고, Dense(완전 연결)레이어를 모델에 추가
    -> 이진 분류 문제를 해결하기 위해 시그모이드 활성화 함수 사용

rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model.compile(optimizer=rmsprop, loss='binary_crossentropy', 
              metrics=['accuracy'])

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-lstm-model.h5')
early_stopping_cb = keras.callbacks.EarlyStopping(patience=5,
                                                  restore_best_weights=True)

history = model.fit(train_seq, train_target, epochs=200, batch_size=128,
                    validation_data=(val_seq, val_target),
                    callbacks=[checkpoint_cb, early_stopping_cb])
  • RMSproop 옵티마이저 생성하고 학습률을 0.0001로 설정
  • 손실함수는 이진 분류를 위한 binary_crossentropy로 설정
  • EarlyStopping콜백을 생성하여 조기 종료 후 가장 성능이 좋았던 시점의 모델 가중치로 복원
import matplotlib.pyplot as plt

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()

LSTM 사용이유 요약

  • RNN은 시간이 길어지면 은닉층에서 데이터를 까먹기 때문에 LSTM을 사용
  • 하지만 계산식이 복잡하다는 단점 보유

GRU

GRU 개요

  • 기존 LSTM의 구조를 조금 더 간단하게 개선한 모델
  • LSTM을 구성하는 Time-step의 cell을 조금 더 간소화한 버전

GRU 구조

  • GRU 셀에는 은닉상태와 가중치를 곱하고 절편을 더하는 작은 셀이 3개가 있음
  • reset gate, update gate (총 2개)
  • GRU셀은 LSTM보다 가중치가 적기 때문에 계산량이 적지만 LSTM못지않은 좋은 성능을 내는 것으로 알려져 있음

GRU 훈련

model4 = keras.Sequential()

model4.add(keras.layers.Embedding(500, 16, input_length=100))
model4.add(keras.layers.GRU(8))
model4.add(keras.layers.Dense(1, activation='sigmoid'))

model4.summary()
  • 500개의 단어를 100개의 입력 시퀀스를 처리하기 위해 8개의 GRU유닛을 사용하는 모델을 정의
  • 이진 분류를 수행하고 시그모이드 함수를 통해 0~1 사이의 확률값으로 변환
rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model4.compile(optimizer=rmsprop, loss='binary_crossentropy', 
               metrics=['accuracy'])

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-gru-model.h5')
early_stopping_cb = keras.callbacks.EarlyStopping(patience=5,
                                                  restore_best_weights=True)

history = model4.fit(train_seq, train_target, epochs=200, batch_size=512,
                     validation_data=(val_seq, val_target),
                     callbacks=[checkpoint_cb, early_stopping_cb])
  • GRU모델을 훈련한 model4를 활용하여 컴파일, 훈련, 콜백 설정

LSTM & GRU 차이점

구조

  • LSTM : 입력게이트, 망각게이트, 출력게이트 등의 메커니즘을 사용하여 순차적 입력, 이전 상태 정보 조회 -> 장기 기억 상태로 저장
  • GRU : 입력게이트와 망각게이트를 업데이트 게이트로 통합, 훈련속도가 빠르고 더 간단한 구조

게이트 수

  • LSTM : 총 3개 (입력, 망각, 출력)
  • GRU : 총 2개 (업데이트, 출력)

정보의 흐름

  • LSTM : 입력 게이트를 통해 어떤 정보를 기억할지 결정 후 망각 게이트를 통해 이전 상태의 어떤 정보를 잊을지 결정, 출력 게이트는 현재 상태의 어떤 정보를 다음 상태의 전달할 지 결정
  • GRU : 업데이트 게이트를 통해 현재 입력과 이전 상태의 정보를 조합하여 현재 상태를 업데이트

참고자료

https://blog.naver.com/winddori2002/221992543837
https://wooono.tistory.com/242

0개의 댓글