41일차 딥러닝4 순환신경망 RNN

차지예·2025년 7월 10일

생성AI

목록 보기
37/56
post-thumbnail

순환 신경망 (Recurrent Neural Network)

  • RNN은 시퀀스(Sequence) 데이터를 처리하기 위한 인공 신경망이다.
  • 입력과 출력 모두 시퀀스 구조인 자연어 처리, 번역, 챗봇 등에 적합하다.
  • 일반적인 신경망과 달리, 이전 시점의 출력을 현재 시점의 입력으로 사용한다.
  • 대표적인 시퀀스 모델에는 RNN 외에도 LSTM, GRU 등이 있다.

RNN 계열 모델 정리 (Vanilla RNN / LSTM / BiLSTM / RNN Language Model)

📌 Vanilla RNN (Simple RNN)

✅ 개요

  • 시퀀스 데이터를 시간 흐름에 따라 처리하는 가장 기본적인 순환 신경망.
  • 과거 정보를 은닉 상태로 저장하여 다음 시점에 전달.

✅ 수식

  • 은닉 상태 계산
    ht=tanh(Wxxt+Whht1+b)h_t = \tanh(W_x x_t + W_h h_{t-1} + b)
  • 출력 계산
    yt=f(Wyht+b)y_t = f(W_y h_t + b)

✅ 특징

  • 모든 시점에서 같은 가중치 사용
  • 단순하고 빠르지만 기울기 소실 문제 발생 → 긴 문장 기억 어려움

✅ code

rnn = SimpleRNN(3, return_sequences=True)  # 은닉 상태 크기가 3인 RNN을 정의함
hidden_states = rnn(train_X)               # 입력 데이터를 모델에 통과시켜 시점별 은닉 상태 출력

print('hidden states : {}, shape: {}'.format(hidden_states, hidden_states.shape))
  • SimpleRNN(3) → 은닉 상태 차원이 3
  • return_sequences=True → 시점마다 은닉 상태 전부 출력
  • hidden_states.shape → (배치 크기, 시점 수, 은닉 상태 크기)
  • 예: (1, 4, 3) → 1개의 시퀀스, 4개의 시점, 각 시점마다 3차원 은닉 상태

📌 LSTM (Long Short-Term Memory)

✅ 개요

  • Vanilla RNN의 단점을 해결하기 위한 구조
  • 셀 상태와 3가지 게이트 (입력, 삭제, 출력)를 이용하여 중요한 정보만 기억하거나 잊음

✅ 구성 요소와 수식

  • 입력 게이트
    it=σ(Wxixt+Whiht1+bi)i_t = \sigma(W_{xi} x_t + W_{hi} h_{t-1} + b_i)
    gt=tanh(Wxgxt+Whght1+bg)g_t = \tanh(W_{xg} x_t + W_{hg} h_{t-1} + b_g)
  • 삭제 게이트
    ft=σ(Wxfxt+Whfht1+bf)f_t = \sigma(W_{xf} x_t + W_{hf} h_{t-1} + b_f)
  • 셀 상태 업데이트
    Ct=ftCt1+itgtC_t = f_t \circ C_{t-1} + i_t \circ g_t
  • 출력 게이트 및 은닉 상태
    ot=σ(Wxoxt+Whoht1+bo)o_t = \sigma(W_{xo} x_t + W_{ho} h_{t-1} + b_o)
    ht=ottanh(Ct)h_t = o_t \circ \tanh(C_t)

✅ 특징

  • 긴 시퀀스에서의 기억 유지 능력 우수
  • 계산 복잡도는 증가하지만 성능 향상

✅ code

lstm = LSTM(3, return_sequences=True, return_state=True)
hidden_states, last_hidden_state, last_cell_state = lstm(train_X)

print('hidden states : {}, shape: {}'.format(hidden_states, hidden_states.shape))
print('last hidden state : {}, shape: {}'.format(last_hidden_state, last_hidden_state.shape))
print('last cell state : {}, shape: {}'.format(last_cell_state, last_cell_state.shape))
  • LSTM(3) → 은닉 상태(hidden state)와 셀 상태(cell state) 차원 = 3
  • return_state=True → 마지막 은닉 상태와 셀 상태도 함께 출력
  • hidden_states.shape → (배치, 시점, 은닉 상태 크기) → 예: (1, 4, 3)
  • last_hidden_state.shape → 마지막 시점의 은닉 상태 → 예: (1, 3)
  • last_cell_state.shape → 마지막 시점의 셀 상태 → 예: (1, 3)

📌 BiLSTM (Bidirectional LSTM)

✅ 개요

  • 양방향 RNN 구조로, 입력 시퀀스를 정방향과 역방향 모두 학습
  • 현재 시점의 출력을 예측할 때 과거와 미래 정보 모두 사용

✅ 구조 설명

  • 정방향 LSTM: 앞에서 뒤로
  • 역방향 LSTM: 뒤에서 앞으로
  • 두 출력 벡터를 concat 또는 sum하여 최종 출력 생성

✅ 특징

  • 자연어의 문맥 정보 이해에 탁월
  • 예: 품사 태깅, 개체명 인식 등에서 효과적

📌 RNN Language Model (RNNLM)

✅ 개요

  • RNN을 기반으로 한 언어 모델
  • 단어 시퀀스를 입력으로 받고 다음 단어를 예측

✅ 특징

  • 입력 길이 제한 없음 → n-gram 모델의 단점 보완
  • 문장의 의미 흐름을 시점 기반으로 처리 가능

✅ 예시

  • 입력: "The fat cat"
  • 출력: "sat"

📊 요약 비교

모델기억 능력게이트 구조방향성특징
Vanilla RNN짧은 기억없음단방향단순, 빠름, 기울기 소실
LSTM장기 기억입력/삭제/출력단방향긴 문맥 처리 우수
BiLSTM장기 기억동일 (LSTM)양방향문맥 이해 극대화
RNNLM-RNN 기반단방향언어 모델에 사용


점검 퀴즈

RNN을 제대로 이해했는지 퀴즈를 통해서 확인해보세요! 모델에 대한 설명이 다음과 같을 때, 총 파라미터 개수를 구해보세요.

  1. Embedding을 사용하며, 단어 집합(Vocabulary)의 크기가 5,000이고 임베딩 벡터의 차원은 100입니다.
  2. 은닉층에서는 Simple RNN을 사용하며, 은닉 상태의 크기는 128입니다.
  3. 훈련에 사용하는 모든 샘플의 길이는 30으로 가정합니다.
  4. 이진 분류를 수행하는 모델로, 출력층의 뉴런은 1개로 시그모이드 함수를 사용합니다.
  5. 은닉층은 1개입니다.


자세한 코드는 깃허브

0개의 댓글