Colab으로 하루에 하나씩 딥러닝

시계열 분석_3.LSTM 본문

딥러닝_개념

시계열 분석_3.LSTM

Elleik 2023. 1. 17. 23:03
728x90

LSTM(Long short-term memory)

  • RNN의 최적화하기 어렵도 성능적인 한계를 해결하기 위하여 사용
    • 기울기 소실문제: RNN는 가중치가 업데이트되는 과정에서 1보다 작은 값이 계속 곱해지기 때문에 기울기 소실문제가 발생함
    • 장기의존성: 순차열 길어질수록 오래전에 입력된 데이터의 정보가 사라지기 때문에 예측이 어려움
  • 셀 상태와 은닉 상태로 장기 기억과 단기 기억을 모델링

LSTM 구조

1. 순전파

 

  • 셀: 각 단계에 대한 은닉노드, 총합을 사용하여 기울기 소멸 문제를 해결
  • 망각 게이트: 과거 정보를 어느 정도 기억할지 결정, 과거 정보를 시그모이드로 취하고 0이면 버리고, 1이면 온전하게 보전
  • 입력 게이트: 현재 정보를 기억하기 위해 만듦, 시그모이드와 하이퍼볼릭 탄젠트 함수를 기반으로 현재 정보에 대한 보존량 결정
  • 기억 게이트: 장기 기억을 새롭게 갱신하기 위해 망각 게이트를 통과한 장기 기억에 입력 게이트를 통과한 새로운 기억을 더함
  • 출력 게이트: 과거 정보와 현재 데이터를 사용하여 뉴런의 출력을 결정

2. 역전파

 

  • 최종 오차는 모든 노드에 전파됨, 셀을 통해서 중단 없이 전파됨
  • 셀 단위로 오차가 전파된다고 해서 입력 방향으로 오차가 전파되지 않음

 

LSTM 실습

2023.01.16 - [딥러닝_개념] - 시계열 분석_2.순환 신경망(RNN)_2)RNN 셀 구현

 

시계열 분석_2.순환 신경망(RNN)_2)RNN 셀 구현

### 라이브러리 호출 import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = "2" import tensorflow as tf import numpy as np from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras.models import Sequential from tensorflow.keras.l

elleik.tistory.com

 

이전 게시물의 기반으로 실습 진행하기 때문에 이전글 확인 후 아래의 실습을 보시는 걸 추천드립니다.
이전 게시물과 동일하게 라이브러리 호출, 값 초기화, 데이터셋 준비를 실행합니다. 
### 네트워크 생성 

class LSTM_Build(tf.keras.Model):
  def __init__(self, units):
    super(LSTM_Build, self).__init__()

    self.state0 = [tf.zeros([batch_size, units]), tf.zeros([batch_size, units])]
    self.state1 = [tf.zeros([batch_size, units]), tf.zeros([batch_size, units])]

    self.embedding = tf.keras.layers.Embedding(total_words, embedding_len, input_length=max_review_len)
    self.RNNCell0 = tf.keras.layers.LSTMCell(units, dropout=0.5) 
    self.RNNCell1 = tf.keras.layers.LSTMCell(units, dropout=0.5)
    self.outlayer = tf.keras.layers.Dense(1)

  def call(self, inputs, training=None):
    x = inputs
    x = self.embedding(x)
    state0 = self.state0  # 초기 상태 0으로 설정
    state1 = self.state1
    for word in tf.unstack(x, axis=1):
      out0, state0 = self.RNNCell0(word, state0, training)  # train 매개변수 추가
      out1, state1 = self.RNNCell1(out0, state1, training)

    x = self.outlayer(out1)
    prob = tf.sigmoid(x)

    return prob

### 모델 훈련

import time
units = 64
epochs = 4
t0 = time.time()

model = LSTM_Build(units)

model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
              loss=tf.losses.BinaryCrossentropy(),
              metrics=['accuracy'],
              experimental_run_tf_function=False)

model.fit(train_data, epochs=epochs, validation_data=test_data, validation_freq=2)

모델 훈련 출력 결과


### 모델 평가

print("훈련 데이터셋 평가 >>> ")
(loss, accuracy) = model.evaluate(train_data, verbose=0)
print("loss={:.4f}, accuracy={:.4f}%".format(loss,accuracy * 100))
print("테스트 데이터셋 평가 >>> ")
(loss, accuracy) = model.evaluate(test_data, verbose=0)
print("loss={:.4f}, accuracy={:.4f}%".format(loss,accuracy * 100))
t1 = time.time()
print('시간: ', t1-t0)

모델 평가를 실행한 결과

상세 설명

  • RNN을 사용하는 것보다 테스트 데이터셋 평가가 81%에서 83%로 정확도가 높아짐

 

참고: 서지영, 『딥러닝 텐서플로 교과서』, 길벗(2022)