개발 창고/AI

LSTM(Long Short-Term Memory) 네트워크 기초

Royzero 2025. 8. 21. 22:00
반응형

1. 들어가며

앞선 강의에서 순환 신경망(RNN)의 개념을 배웠습니다. 하지만 RNN에는 장기 의존성 문제(long-term dependency) 라는 한계가 있습니다.
즉, 문장이 길어지거나 시퀀스 데이터가 길어질수록 앞쪽 정보를 뒤쪽에서 잘 기억하지 못한다는 것이죠.

이를 해결하기 위해 고안된 것이 바로 LSTM(Long Short-Term Memory) 네트워크입니다. LSTM은 정보를 오랫동안 기억할 수 있도록 특별한 구조를 가지고 있어, 텍스트, 음성, 시계열 데이터 분석 등에서 널리 활용됩니다.


2. LSTM의 핵심 아이디어

LSTM은 RNN 구조에 **게이트(gate)**라는 장치를 추가한 모델입니다.
게이트는 마치 “필터”처럼 어떤 정보를 기억할지, 잊을지를 결정합니다.

  • Forget Gate (망각 게이트): 과거 정보 중 불필요한 것을 버림
  • Input Gate (입력 게이트): 새로운 정보 중 기억할 내용을 선택
  • Output Gate (출력 게이트): 다음 단계로 내보낼 정보를 결정

이 3가지 게이트가 조화를 이루어, LSTM은 RNN보다 훨씬 긴 문맥을 다룰 수 있습니다.

예를 들어,

“오늘은 날씨가 맑고 기분이 좋아서 친구와 함께 공원에 갔다. 그곳에서 우리는 …”
라는 긴 문장이 있을 때, 단순 RNN은 앞의 “날씨” 정보를 뒤쪽까지 유지하기 어렵지만, LSTM은 필요하다면 해당 맥락을 **기억 셀(cell state)**에 보관해 둡니다.


3. 간단한 수학적 표현

LSTM은 기본적으로 아래와 같은 연산으로 구성됩니다.

  • 망각 게이트:

    f_t = σ(W_f · [h_{t-1}, x_t] + b_f)
  • 입력 게이트:

    i_t = σ(W_i · [h_{t-1}, x_t] + b_i)
    C̃_t = tanh(W_c · [h_{t-1}, x_t] + b_c)
    C_t = f_t * C_{t-1} + i_t * C̃_t
  • 출력 게이트:

    o_t = σ(W_o · [h_{t-1}, x_t] + b_o)
    h_t = o_t * tanh(C_t)

여기서

  • σ는 시그모이드 함수,
  • tanh는 하이퍼볼릭 탄젠트 함수,
  • C_t는 셀 상태,
  • h_t는 은닉 상태를 의미합니다.

수학식은 복잡해 보이지만, 결국 “게이트로 정보 흐름을 조절한다”는 것이 핵심입니다.


4. 파이썬 실습: 텍스트 감정 분류 예제

이제 실습으로 LSTM을 체험해 보겠습니다.
영화 리뷰 데이터(IMDB Dataset)를 활용하여 리뷰가 긍정/부정인지 분류하는 모델을 만들어 봅시다.

import tensorflow as tf
from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense

# 1. 데이터 불러오기
max_features = 10000  # 상위 10,000 단어만 사용
maxlen = 200          # 각 리뷰를 200 단어로 잘라냄
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)

# 2. 데이터 전처리 (패딩)
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)

# 3. 모델 정의
model = Sequential()
model.add(Embedding(max_features, 128))
model.add(LSTM(128))
model.add(Dense(1, activation='sigmoid'))

# 4. 컴파일 및 학습
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
history = model.fit(x_train, y_train, epochs=3, batch_size=64, validation_split=0.2)

# 5. 평가
loss, acc = model.evaluate(x_test, y_test)
print("테스트 정확도:", acc)

실행 결과 예시

Epoch 1/3
313/313 [==============================] - 50s 150ms/step - loss: 0.45 - acc: 0.78 - val_acc: 0.84
Epoch 2/3
313/313 [==============================] - 45s 140ms/step - loss: 0.30 - acc: 0.87 - val_acc: 0.86
Epoch 3/3
313/313 [==============================] - 46s 145ms/step - loss: 0.22 - acc: 0.91 - val_acc: 0.87

테스트 정확도: 0.87

5. 핵심 정리

  • RNN은 장기 의존성 문제를 겪지만, LSTM은 게이트 구조로 이를 해결한다.
  • LSTM은 텍스트, 음성, 시계열 데이터 등에서 강력한 성능을 발휘한다.
  • 실습에서는 영화 리뷰 감정 분류에서 약 87% 정확도를 달성할 수 있었다.

🔗 추천 학습 링크

반응형