Long Short-Term Memory (LSTM)

5단 분석법

순서
분석
단어
내용
1
일반 명사
Long
Short
짧은
Term
기간
Memory
기억
LSTM
길고 짧은 기간의 기억?
2
고유 명사
LSTM
기존의 RNN에서 출력과 멀리 있는 정보를 기억할 수 없다는 단점을 보완해 장/단기 기억을 가능하게 설계한 신경망 구조
3
사용 이유
LSTM
RNN에서 발생하는 기울기 소실 문제를 해결하여, 장기 의존성을 갖고 학습하고 기억할 수 있기 때문에
4
사용 방법
LSTM
순차적인 데이터를 입력받아 시간적 패턴을 학습하고, 다음 값을 예측하거나 시퀀스를 생성
5
다른 기술과의 비교
LSTM
-

정의

일반 명사

Long
Short
짧은
Term
기간
Memory
기억
LSTM
길고 짧은 기간의 기억?
Long은 긴, Short은 짧은 이라는 의미를 가지고 있습니다.
Term은 기간, Memory는 기억이라는 뜻을 가지고 있습니다.
위 4개의 단어를 조합해보면,
Long Short-Term Memory는 길고 짧은 기간의 기억이라고 유추해 볼 수 있는데 정말 그런 의미인지 고유 명사를 한 번 알아볼까요?

고유 명사

LSTM
기존의 RNN에서 출력과 멀리 있는 정보를 기억할 수 없다는 단점을 보완해 장/단기 기억을 가능하게 설계한 신경망 구조
LSTM은 기존의 RNN에서 출력과 멀리 있는 정보를 기억할 수 없다는 단점을 보완해 장/단기 기억을 가능하게 설계한 신경망 구조입니다.
graph LR
    A[입력] -->|1| B[입력 게이트]
    E[이전 상태] -->|2| B
    A -->|3| C[망각 게이트]
    E -->|4| C
    C -->|5| F[망각된 상태]
    F -->|6| H[셀 상태]
    B -->|7| G[갱신된 입력]
    G -->|8| H
    H -->|9| I[새로운 상태]
    A -->|10| D[출력 게이트]
    E -->|11| D
    I -->|12| D
    D -->|13| J[출력]
    style A fill:#f9f,stroke:#333,stroke-width:2px
    style E fill:#ff9,stroke:#333,stroke-width:2px
    style F fill:#9ff,stroke:#333,stroke-width:2px
    style G fill:#9ff,stroke:#333,stroke-width:2px
    style H fill:#9ff,stroke:#333,stroke-width:2px
    style I fill:#9ff,stroke:#333,stroke-width:2px
    style J fill:#f99,stroke:#333,stroke-width:2px
Mermaid
복사
순서
동작
1
입력이 입력 게이트로 전달됩니다.
2
이전 상태가 입력 게이트로 전달됩니다.
3
입력이 망각 게이트로 전달됩니다.
4
이전 상태가 망각 게이트로 전달됩니다.
5
망각 게이트가 이전 셀 상태에서 어떤 정보를 유지하거나 제거할지 결정합니다. 이 결정을 통해 망각된 상태가 형성됩니다.
6
망각된 상태가 셀 상태로 전달됩니다.
7
입력 게이트가 현재 입력 정보를 처리하여 갱신된 입력을 생성합니다.
8
갱신된 입력이 셀 상태와 결합됩니다.
9
결합된 새로운 정보로부터 새로운 셀 상태가 생성되며, 이것이 새로운 상태로 전환됩니다.
10
입력이 출력 게이트로 전달됩니다. 출력 게이트는 현재 입력과 이전 상태 정보를 활용하여 어떤 정보가 최종 출력으로 나갈지 계산합니다.
11
이전 상태가 출력 게이트로 전달됩니다. 이 정보는 출력 게이트가 현재 출력을 어떻게 형성할지 결정하는 데 사용됩니다.
12
새로운 셀 상태가 출력 게이트로 전달됩니다. 출력 게이트는 이 정보를 기반으로 최종 출력을 형성합니다.
13
출력 게이트가 최종 출력을 결정하고, 이 출력이 최종적으로 외부로 전달됩니다.
보라색 (Inputs): 입력과 관련된 부분을 강조합니다.
노란색 (Previous State): 이전 상태와 관련된 부분을 강조합니다.
파란색 (Cell State & New State): 셀 상태, 망각된 상태, 그리고 새로운 상태를 나타내는 부분입니다.
붉은색 (Output): 최종 출력을 나타내는 부분입니다
LSTM(Long Short-Term Memory)은 RNN(Recurrent Neural Network)의 한 종류로, 긴 시간 동안 의존 관계가 있는 데이터를 학습하는 데 뛰어난 성능을 보입니다.
LSTM의 핵심은 모델이 긴 시간 동안의 정보를 자연스럽게 기억할 수 있도록 하는 것입니다.
게이트가 뭐에요?
LSTM 모델에서 "게이트"는 특정한 목적을 가진 신경망 레이어를 나타냅니다.
게이트들은 가중치와 활성화 함수를 통해 입력된 데이터를 처리하고, 이를 통해 정보의 흐름을 제어합니다.
1.
입력 게이트 (Input Gate): 새로운 정보를 셀 상태에 얼마나 추가할지 결정합니다.
2.
망각 게이트 (Forget Gate): 이전 셀 상태에서 어떤 정보를 유지하거나 잊을지 결정합니다.
3.
출력 게이트 (Output Gate): 현재 셀 상태를 바탕으로 최종 출력을 어떻게 만들지 결정합니다.
이 게이트들 각각은 특정한 연산을 수행하는 작은 신경망 레이어라고 볼 수 있습니다.
LSTM의 주요 특징은 '셀 상태(cell state)'입니다.
셀 상태는 중요한 정보를 지속적으로 전달하는 방식으로 작동합니다.
정보가 시간에 따라 계속해서 흘러가면서 중요한 정보는 유지하고 불필요한 정보는 버려지는 것을 나타내죠.
이렇게 하나의 시점에서 다음 시점으로 정보가 순차적으로 이어지게 됩니다.
I am Wayne. I work at startupcode. I am SW Engineer. 라는 문장 예시를 통해 LSTM을 알아보도록 하겠습니다.
I am Wayne 이라는 문장을 학습하면서, I는 Wayne이라는 관계 정보를 예측할 수 있게 되었습니다.
그 정보를, Memory cell 에 저장시켜 앞으로 학습과 예측을 할 때에도 정보를 기억할 수 있도록 하였습니다.
다음 문장인 I work at startupcode. 를 학습하면서 I 를 학습할 때, memory cell에 이미 I에 대한 정보가 있기 때문에 이것을 망각 시킵니다.
그리고 나머지 단어인 work, at, startupcode는 그대로 학습을 진행 합니다.
다음 문장인 I am SW Engineer. 도 똑같이 진행 합니다.

사용 이유

LSTM
RNN에서 발생하는 기울기 소실 문제를 해결하여, 장기 의존성을 갖고 학습하고 기억할 수 있기 때문에
RNN의 단점을 보완하기 위해 나온 것이 LSTM이라고 했습니다.
RNN의 단점은 데이터 간 길이가 멀면 기울기 소실(vanishing gradient)이 발생한다는 것이었습니다.
기울기가 소실된다는 것은 이전의 기억을 하지 못한다와 같은 의미입니다.
기울기 소실이 발생하면, 신경망이 깊어질수록 이전 단계에서의 정보가 점점 희미해지고, 따라서 모델이 학습 초기의 중요 정보를 장기 기억하지 못하게 되기 때문입니다.
이것을 해결하기 위해 핵심 단어를 기억시키고, 필요없는 단어를 망각시키는 것이 LSTM 입니다.
예시에서도 I 라는 핵심 단어를 기억하고, 이후에 계속 등장하는 I는 따로 학습할 필요가 없으니 망각 시키는 것을 확인할 수 있습니다.
이유
설명
기울기 소실 문제 해결
RNN은 시퀀스 데이터의 길이가 길어질수록 기울기 소실(vanishing gradient) 문제가 발생하여 학습이 어려워지는 단점이 있습니다. LSTM은 이를 해결하기 위해 설계되었습니다.
장기 의존성 학습
LSTM은 셀 상태(cell state)와 게이트(gate) 구조를 통해 장기적인 의존성을 효과적으로 학습할 수 있습니다. 이는 긴 시퀀스 데이터에서 중요한 정보가 소실되지 않고 유지되도록 합니다.
망각과 기억 조절
LSTM은 입력 게이트(input gate), 출력 게이트(output gate), 망각 게이트(forget gate)라는 세 가지 게이트를 사용하여 중요하지 않은 정보를 망각하고 중요한 정보를 기억할 수 있습니다.

사용 방법

LSTM
순차적인 데이터를 입력받아 시간적 패턴을 학습하고, 다음 값을 예측하거나 시퀀스를 생성

TensorFlow (Keras)

PyTorch

알아 두면 좋은 정보

참고 하기 좋은 사이트

미니퀘스트

1번 미니퀘스트 - 주식 가격 예측

LSTM 모델을 사용하여 과거 주식 가격 데이터를 바탕으로 다음 날의 주식 가격을 예측하는 모델을 만들어보세요.
주어진 데이터셋은 일일 주식 가격을 포함하고 있으며, 이를 시퀀스 형태로 변환하여 모델을 학습시켜야 합니다.

문제 설명

1.
데이터 다운로드 및 전처리
import yfinance as yf # 데이터 다운로드 ticker = 'AAPL' data = yf.download(ticker, start='2020-01-01', end='2023-01-01') prices = data['Close'].values prices = prices.reshape(-1, 1)
Python
복사
2.
LSTM 모델 정의 및 훈련
3.
예측 및 평가

답안 코드

import numpy as np import pandas as pd import tensorflow as tf from tensorflow.keras import layers, models, optimizers, losses from sklearn.preprocessing import MinMaxScaler import yfinance as yf # 데이터 다운로드 ticker = 'AAPL' data = yf.download(ticker, start='2020-01-01', end='2023-01-01') prices = data['Close'].values prices = prices.reshape(-1, 1) # 데이터 전처리 scaler = MinMaxScaler() scaled_prices = scaler.fit_transform(prices) sequence_length = 10 x = [] y = [] for i in range(len(scaled_prices) - sequence_length): x.append(scaled_prices[i:i+sequence_length]) y.append(scaled_prices[i+sequence_length]) x = np.array(x) y = np.array(y) # 데이터셋 생성 dataset = tf.data.Dataset.from_tensor_slices((x, y)).shuffle(buffer_size=1024).batch(32) # LSTM 모델 정의 model = models.Sequential([ layers.LSTM(50, return_sequences=True, input_shape=(sequence_length, 1)), layers.LSTM(50), layers.Dense(1) ]) # 컴파일 및 훈련 model.compile(optimizer='adam', loss='mean_squared_error') model.fit(dataset, epochs=50) # 예측 predicted_prices = model.predict(x) predicted_prices = scaler.inverse_transform(predicted_prices) actual_prices = scaler.inverse_transform(y) # 평가 import matplotlib.pyplot as plt plt.plot(actual_prices, label='Actual Prices') plt.plot(predicted_prices, label='Predicted Prices') plt.legend() plt.show()
Python
복사

코드 설명

2번 미니퀘스트 - 영화 리뷰 감정 분석

LSTM 모델을 사용하여 영화 리뷰 텍스트 데이터를 바탕으로 긍정적 또는 부정적 감정을 예측하는 모델을 만들어보세요.
주어진 데이터셋은 영화 리뷰와 해당 리뷰의 감정을 포함하고 있으며, 이를 시퀀스 형태로 변환하여 모델을 학습시켜야 합니다.

문제 설명

1.
라이브러리 임포트 및 데이터 다운로드
import tensorflow_datasets as tfds # 데이터 다운로드 dataset, info = tfds.load('imdb_reviews', with_info=True, as_supervised=True) train_data, test_data = dataset['train'], dataset['test']
Python
복사
2.
데이터 전처리
3.
LSTM 모델 정의
4.
모델 컴파일 및 훈련
5.
모델 평가

답안 코드

import numpy as np import tensorflow as tf from tensorflow.keras import layers, models, optimizers, losses import tensorflow_datasets as tfds # 데이터 다운로드 dataset, info = tfds.load('imdb_reviews', with_info=True, as_supervised=True) train_data, test_data = dataset['train'], dataset['test'] # 데이터 전처리 BUFFER_SIZE = 10000 BATCH_SIZE = 64 VOCAB_SIZE = 10000 tokenizer = tfds.deprecated.text.SubwordTextEncoder.build_from_corpus( (review.numpy() for review, label in train_data), target_vocab_size=VOCAB_SIZE) def encode_review(review, label): encoded_review = [tokenizer.vocab_size] + tokenizer.encode(review.numpy()) + [tokenizer.vocab_size + 1] return encoded_review, label def tf_encode_review(review, label): encoded_review, label = tf.py_function(encode_review, inp=[review, label], Tout=[tf.int64, tf.int64]) encoded_review.set_shape([None]) label.set_shape([]) return encoded_review, label train_data = train_data.map(tf_encode_review) train_data = train_data.padded_batch(BATCH_SIZE, padded_shapes=([None], [])) train_data = train_data.shuffle(BUFFER_SIZE).prefetch(tf.data.experimental.AUTOTUNE) test_data = test_data.map(tf_encode_review) test_data = test_data.padded_batch(BATCH_SIZE, padded_shapes=([None], [])) # LSTM 모델 정의 model = models.Sequential([ layers.Embedding(VOCAB_SIZE + 2, 64), layers.Bidirectional(layers.LSTM(64)), layers.Dense(64, activation='relu'), layers.Dense(1, activation='sigmoid') ]) # 컴파일 및 훈련 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) history = model.fit(train_data, epochs=5, validation_data=test_data) # 평가 test_loss, test_acc = model.evaluate(test_data) print(f'Test Accuracy: {test_acc:.4f}')
Python
복사

코드 설명

미니퀘스트 답안지

ⓒ 2024 startupcode. 모든 권리 보유. 무단 복제 금지.