RNN, LSTM, GRU에 대해서 자세히 짚고 넘어가면 좋을 것 같아 정리를 시작했다.
초기 딥러닝은 주로 이미지와 같이 크기가 정해져있는 입력에 강했고 텍스트, 오디오 등등의 길이가 가변적이고 시간적 의존성이 있는 시퀀스 데이터에는 한계가 존재했다. MLP, CNN 같은 경우 입력을 한 번에 처리하는 게 최적화되어있어 과거부터 현재의 맥락을 보존하기가 어려웠기 때문이다.
이를 해결하기 위해 시간축으로 상태를 전달하는 구조인 RNN, LSTM, GRU 가 등장했다.
RNN (Recurrent Neural Network)
RNN은 입력과 출력을 시퀀스 단위로 처리하는 Sequence 모델이다. 전통적인 신경망은 입력이 모두 출력층 방향으로만 향했지만 RNN은 이전 입력과 컨텍스트를 기반으로 출력을 제공한다. 즉, 순서가 있는 데이터를 한 스텝 씩 보면서 이전 정보 (hidden state)와 함께 다음으로 전달하는 방식인 것이다.


위 그림에서 x는 입력 벡터, y는 출력층의 출력 벡터이다. 일단 편향을 제외하고 보면 RNN에서 hidden layer에서 활성화 함수를 통해 결과를 내보내는 노드를 RNN 셀 (= 메모리 셀)이라고 한다.
RNN 셀을 좀 더 자세히 살펴보자.


- 파라미터 수 (출력층 제외): h * d + h * h + h (입력 차원 d, 은닉 차원 h)
RNN은 현재 입력으로 들어온 x_t와 과거 hidden state h_{t-1} 을 선형 결합한 후 tanh 활성화 함수를 사용해 새로운 hidden state h_t를 만들어낸다. h_t는 결국 현재 시점의 특징을 반영하면서 과거의 정보도 이어 받게 된다. 이후 h_t는 다음 시점 t-1 로 전달되어 연속적인 문맥을 유지하고 동시에 출력층으로도 보내져서 예측값 y_t를 계산하게 된다.

이러한 RNN을 여러 개 쌓아서 Multi-Layer RNN을 만든다. 위 사진과 같은 다양한 종류의 RNN이 존재한다.
RNN의 단점은 무엇일까?
바로 기울기 소실 문제이다. 이는 역전파를 통해 가중치를 학습할 때, 입력층에 가까운 층으로 갈수록 기울기가 점점 더 작아져 0에 가까워지는 현상을 의미한다. 결국 앞쪽(과거)의 정보가 뒤쪽(현재)까지 제대로 전달되지 못해, 긴 시퀀스에서 장기적인 의존 관계를 학습하기 어려워지는 것이다.
RNN을 학습할 때는 역전파를 수행하는데 이 과정에서 각 time step에서 기울ㅇ기가 계산되고 이 기울기를 이용해 네트워크의 가중치를 업데이트한다. 하지만 시퀀스가 길어질 수록 과거 시점에서 계산된 기울기는 연쇄적으로 곱해지면서 점점 더 작아진다. 때문에 입력층에 가까운 시점의 기울기는 0에 가까워져 상대적으로 무시된다.
이 현상이 바로 기울기 소실 문제이며 그 결과 RNN은 주로 단기적인 의존성(short-term dependency)만 학습할 수 있고 긴 시퀀스의 패턴이나 장기 기억(long-term dependency)은 잘 다루지 못하게 된다.
LSTM (Long Short Term Memory)

때문에 이후 long-term dependency를 학습할 수 있는 LSTM이 등장했다.
LSTM은 현재 입력 상태, 이전 셀의 단기 기억, 장기기억과 같은 세 가지 다른 상태를 입력을 받을 때마다 볼 수 있다. LSTM은 Input Gate, Forget Gate, Output Gate의 총 3가지 gate를 사용한다.
[Input Gate]
- 하는 일: 현재 시점에서 들어온 새로운 정보 c~_t 중 얼마나 장기 기억 c_t에 반영할지 결정
- 입력: 현재 입력 x_t, 이전 단계의 단기 기억 정보 h_{t-1}

[Forget Gate]
- 하는 일: 이전 장기 기억 c_{t-1}에서 어떤 정보를 유지하거나 폐기할지 결정
- 입력: 장기 기억, 현재 입력 x_t, 이전 단기 기억 h_{t-1}

[Output Gate]
- 하는 일: 다음 time step에서 셀로 전달될 새로운 단기 메모리 생성
- 입력: 현재 입력 x_t, 이전 단계의 단기 기억 정보 h_{t-1}, 새로 계산된 장기 메모리

전체 식을 모아보면 다음과 같다.



LSTM은 cell state를 도입해 기울기 소실 문제를 완화하고 덕분에 긴 시퀀스에서도 과거 정보를 유지할 수 있게 되었다.

cell state에서 역전파를 생각해보면…

다음과 같은데, 기울기가 전달될 때 단순히 forget gate만 곱해지면서 흘러가게 된다. 때문에 forget gate가 1에 가깝다면 기울기가 거의 손실되지 않고 과거까지 전달되는 것이다. 이렇게 LSTM은 곱셈 누적 구조 대신 가산 경로를 두고, 게이트로 곱하는 값도 학습적으로 1에 가깝게 유지할 수 있어 과거의 정보를 많이 기억할 수 있게 된다.
또한 게이트 구조로 정밀한 정보를 제어해 필요 없는 정보는 버리고 중요한 정보만 선택적으로 보존할 수 있게 되었다.
하지만 LSTM에도 단점이 존재한다.
먼저 연산량과 파라미터가 많다는 것이다. 게이트가 3개가 되고 cell state가 추가된만큼 총 4개의 연산을 매 time step마다 수행해야 한다. 또한 시퀀스를 한 스텝씩 처리해야 해 병렬이 어려워서 학습 속도가 느리며 RNN보다는 개선되었지만 완전히 long-term dependency 문제가 해결이 된 건 아니었다.
정리하자면 LSTM은 RNN의 한계를 보완했지만, 그 대가로 연산량·속도·복잡성이 늘었고 long-term dependency 문제를 완전히 해결하지는 못했다는 것이다.
GRU (Gated Recurrent Unit)
이러한 LSTM의 장점은 유지하면서 단점을 줄이기 위해서 GRU가 등장했다.
GRU의 등장 목적을 간단하게 정리하면 다음과 같다.
- 셀 상태(c_t)와 은닉 상태(h_t)를 분리하지 않고 하나로 통합 → 구조 단순화
- 게이트 수도 2개(Update, Reset)만 사용 → 연산량 및 파라미터 감소
- 계산량이 줄고 속도가 빨라짐 → 실제 응용(음성, 기계번역 등)에서 효율적
또한 GRU는 LSTM과 달리 Update Gate와 Reset Gate를 가지고 있다.
[Update Gate]
- 하는 일: 이전 단기 기억 h_{t-1}를 얼마나 유지할지, 새로운 후보 h~_t를 얼마나 반영할지 결정
- 입력: 현재 입력 x_t, 이전 단기 기억 h_{t-1}

[Reset Gate]
- 하는 일: 이전 단기 기억 h_{t-1}을 얼마나 무시할지 결정
- 입력: 현재 입력 x_t, 이전 단기 기억 h_{t-1}

전체 식을 모아보면 다음과 같다.


LSTM과 GRU는 어떤 차이가 있을까? GRU는 어떻게 파라미터 수를 줄이면서 LSTM과 똑같은 효과를 낸걸까? 둘 중엔 뭐가 더 좋을까?

GRU는 LSTM의 cell state를 없애고 게이트 수를 줄여 단순화한 구조이다. GRU는 파라미터 수의 차이에서도 GRU가 더 적은 파라미터를 가진다. LSTM은 3개의 게이트(입력, 망각, 출력)와 cell state를 가지며 각 연산마다 가중치 행렬 2개(입력, 은닉), 편향 1개가 필요하다. 반면 GRU는 2개의 게이트 (업데이트, 리셋) 와 hidden state를 가지며 각 연산마다 필요한 파라미터 수는 동일하다. 때문에 LSTM은 4세트의 파라미터, GRU는 3세트의 파라미터를 가지게 되어 GRU가 LSTM보다 약 25% 정도 파라미터가 적다.
GRU는 LSTM의 cell state를 제거하고 h_{t-1} 을 가지고 내부에서 3갈래 연산을 하는 구조이다. 또한 Input·Forget gate를 Update gate로 통합하여 구조를 단순화하여 더 빠르고 효율적인 학습을 가능하게 했다.
둘 중에 뭐가 더 낫다에 대한 성능 차이는 크지 않다고 한다.
- 자원이 넉넉하고 긴 시퀀스를 다루며 안정성이 중요하다면 → LSTM
- 자원이 제한적이고 빠른 학습·적은 파라미터가 필요하다면 → GRU

참고 사이트
'헷개정 - 헷갈리는 개념 정리' 카테고리의 다른 글
| Resize(size)? CenterCrop(size)? (0) | 2025.09.26 |
|---|---|
| ViT는 왜 큰 데이터셋에서만 잘 작동할까? (feat. inductive bias) (0) | 2025.09.26 |
| 왜 데이터를 zero-centering하고 normalization 해야 할까? (0) | 2025.09.26 |
| 두 Vector 사이의 각도, 내적, 유사도? (0) | 2025.09.16 |
| dtype? type? (0) | 2025.09.16 |