Theory/LLM & NLP

RNN, LSTM, GRU

YeonJuJeon 2024. 12. 28. 14:33

 

1. RNN (Recurrent Neural Network)

1. 기본 구조

  • 순차 데이터(문장, 음성, 시계열 등) 처리를 위해 설계
  • 은닉층에 loop(순환 구조)를 둬서 이전 시점의 hidden state와 현재 입력을 종합해 현재 hidden state를 계산
  • 모든 시점에서 같은 가중치(Weight)와 바이어스 사용 $h_t = \tanh(W \cdot [h_{t-1},\, x_t] + b)$
  • Output($y_t$)을 내고 싶다면 별도 가중치를 통해 출력 레이어로 연결
  • 구조에 따라 One-to-One, One-to-Many, Many-to-One, Many-to-Many 형태 등 다양

2. 문제점: Gradient Exploding / Vanishing

  • RNN은 시퀀스 길이가 길어질수록 Gradient가 Backpropagation 시 반복 곱셈으로 인해 폭발(Exploding) 혹은 소실(Vanishing) 문제 발생
  • 가중치 W의 고유값이 1보다 크면 Exploding, 작으면 Vanishing 경향 → 장기 의존(Long-term Dependency) 학습이 어려움

2. LSTM (Long Short-Term Memory)

1. 배경

  • H.ochreiter & Schmidhuber (1997)가 제안
  • RNN의 Gradient Vanishing / Exploding 문제를 해결하기 위해 Cell state를 추가

2. LSTM 셀 구조

(하나의 LSTM 셀 내부에는 다음과 같은 요소들이 존재)

  1. Cell state:
    • RNN에서의 장기 기억(Long-term memory) 역할
  2. Hidden state:
    • LSTM에서의 단기 기억(Short-term memory) 역할
  3. Gate (총 4개):
    • Forget gate (f): 이전 셀 상태 $(c_{t-1})$를 얼마나 반영할지 결정
    • Input gate (i): 새로운 정보(g)를 얼마나 현재 셀 상태에 반영할지
    • Output gate (): 최종적으로 $c_t$에서 얼마나 추출해서 $h_t$로 내보낼지
    • Candidate gate (): 새로 들어올 후보 정보(주로 $\tanh$활성화)
  4. Gate 계산:
    • 현재 입력 $(x_t)$와 이전 hidden $(h_{t-1})$를 합쳐서, 각각의 게이트($i,f,o,g$)를 구함
    • $f, i, o$sigmoid(0~1), $g$는 tanh(-1~1)
  5. Cell state 업데이트: $c_t = f \odot c_{t-1} + i \odot g$
    • : 요소별 곱(Element-wise multiplication)
  6. Hidden state 업데이트: $h_t = o \odot \tanh(c_t)$

3. Gradient 문제 해결

  • Cell state $(c_t)$를 도입해, 과거 정보를 직접 경로로 전달
  • Forget gate 등으로 $(c_t)$의 경사(gradient) 흐름이 시점마다 달라지는 가중치(f)를 거치게 하여 장기간 Gradient 소실/폭발 문제 완화
  • ResNet의 Identity 연결과 유사한 효과로 해석 가능

3. GRU (Gated Recurrent Unit)

1. 배경

  • Cho, Chung (2014) 등이 제안
  • LSTM의 구조를 더 간단하게 만든 RNN 변형
  • Gate 수매개변수 수가 줄어, 학습 효율이 좋아짐

2. GRU 셀 구조

  1. Update gate $(z_t)$:
    • LSTM의 input gate + forget gate 역할을 합친 것
    • 과거($h_{t-1}$)와 현재($x_t$) 중 어느 비율로 정보를 가져갈지 결정
  2. Reset gate $(r_t)$:
    • 이전 시점 $(h_{t-1})$ 정보를 얼마나 무시할지 결정
  3. Candidate hidden $(\tilde{h}_t)$:
    • reset gate 적용된 $(r_t \odot h_{t-1})$$x_t$ 결합 → 새로운 후보 상태
  4. 최종 hidden state $(h_t)$ 계산: $h_t = z_t \odot h_{t-1} + (1 - z_t) \odot \tilde{h}_t$
    • $(1-z_t)$가 새 정보 반영 비중, $z_t$가 과거 정보 유지 비중
  5. Cell state 없음:
    • LSTM의 $(c_t)$$(h_t)$통합해 단일 $(h_t)$로 사용

3. 장단점

  • 장점: 구조 단순 → 연산량↓, 파라미터 수↓
  • 성능 비교: LSTM vs GRU는 과제별 성능 편차가 있으나, 일반적으로 GRU가 더 빠르고, 메모리 사용량 적음
  • 활성화 함수: 최종 출력에서 별도 활성화가 없고, 내부에서 sigmoid/tanh만 사용

정리

  • RNN: 순환 구조로 시퀀스 처리 but Gradient Vanishing / Exploding 문제
  • LSTM: 셀 상태($c_t$)와 게이트(4개)로 장기 의존성 문제 해결
  • GRU: LSTM 간소화 버전(게이트 2개), 파라미터 수 적고 학습 빠름