이전 글에서 RNN의 한계를 해결하기 위해 도입된 게이트(Gate) 개념과, 이를 활용한 LSTM의 구조를 살펴보았습니다. LSTM은 forget gate(망각 게이트), input gate(입력 게이트), output gate(출력 게이트)를 활용해 장기 기억과 단기 기억에서 어떤 정보를 유지하고, 삭제하며, 새로운 정보를 추가할지를 조절함으로써 RNN이 가진 기울기 소실 문제를 완화할 수 있었습니다. 하지만 LSTM의 구조는 비교적 복잡하고 연산량이 많아 학습 속도가 느려지는 단점이 있습니다.

여기서 GRU(Gated Recurrent Unit)가 등장합니다. GRU는 LSTM과 유사한 성능을 유지하면서도, 불필요한 연산을 줄이고 더 단순한 구조로 효율성을 높인 모델입니다. 이번 글에서는 GRU의 구조가 LSTM과 어떻게 다른지, 그리고 왜 LSTM보다 연산량이 적은지를 살펴보고 어떤 상황에 어떤 모델이 더 적합한지 알아보겠습니다.

LSTM의 한계와 개선점

복잡한 게이트 구조로 인한 연산량 증가

RNN에서는 전달받은 직전 노드의 은닉 상태를 갱신하는 과정이 상대적으로 단순합니다. $$ h_t = \tanh(W_h h_{t-1} + W_x x_t + b) $$ 각 시점($t$)마다 위 하나의 수식만 연산하면 됩니다. 반면 LSTM에서는 3 개의 게이트와 새로운 정보 후보군을 계산하는 추가적인 연산이 필요하고, 이로 인해 RNN보다 계산량이 크게 증가하게 됩니다.

RNN보다 더 많은 연산을 수행해야하는 LSTM은 모델을 학습 시키는 데에 소요하는 시간이 너무 길어질 가능성이 있습니다.

어려워진 모델의 최적화

LSTM은 여러 게이트를 사용해서 정보의 흐름을 조절할 수 있기 때문에 RNN보다 장기 의존성을 학습하는 데 더욱 유리한 모델입니다. 하지만 지나치게 정교한 모델은 최적화가 어려워집니다.

RNN과 LSTM의 매개변수 비교

RNN과 LSTM의 매개변수 비교

LSTM은 RNN과 비교해 훨씬 많은 매개변수를 사용하며 여러 개의 게이트를 통해 정보를 조절합니다. 하지만 학습 과정에서 여러 게이트 중 하나라도 적절한 게이트 값으로 조정되지 않으면, 학습이 비효율적인 방향으로 진행될 수도 있습니다. 예를 들어, 망각 게이트가 지나치게 강하면 중요한 정보까지 사라질 위험이 있고, 너무 약하면 불필요한 정보가 계속 남아 학습이 방해될 수 있습니다.

또한, LSTM을 학습 시키는 데에 사용하는 데이터셋이 비교적 작다면, LSTM 모델이 과적합될 수 있습니다. 과적합(overfitting)이란 모델이 훈련 데이터에 지나치게 잘 맞지만, 새로운 테스트 데이터에서는 좋은 성능을 보이지 못하는 현상을 의미합니다. 다시 말해, 훈련 데이터의 패턴을 너무 세밀하게 학습한 나머지 새로운 데이터에서는 예측 성능이 떨어지는 문제입니다. 과적합을 방지하기 위해서는 모델에 추가적인 기법을 적용해야하는 경우가 많습니다.

LSTM을 개선한 GRU(Gated Recurrent Unit)

이렇듯 LSTM은 복잡한 구조와 높은 연산량으로 인해 실용적인 측면에서 아쉬운 점이 있었습니다. 메모리 사용량이 많아 모바일 기기나 실시간 애플리케이션에서 활용하기 어려웠죠. 이를 보완하기 위해 2014년, 뉴욕대학교의 조경현 교수가 발표한 GRU(Gated Recurrent Unit)이 등장했습니다. GRU는 LSTM과 유사한 매커니즘을 사용하면서도, 연산량을 줄이고 구조를 단순화하여 학습 속도를 개선한 모델입니다. GRU의 주요 특징을 살펴보겠습니다.

GRU 구조의 개요

GRU 구조의 개요

1. GRU는 셀 상태 없이 은닉 상태 하나만 사용한다.

LSTM은 셀 상태($c_t$)와 은닉 상태($h_t$)를 분리해서 정보를 유지했던 반면, GRU는 은닉 상태 하나만 사용합니다. 셀 상태를 없애는 대신, 은닉 상태($h_t$) 자체를 장기 기억 보존에 적합한 방식으로 조절합니다.

2. GRU는 3개의 게이트 대신 2개의 게이트만 사용한다.

LSTM에는 Forget Gate, Input Gate, Output Gate가 있지만, GRU는 Reset Gate(리셋 게이트)와 Update Gate(업데이트 게이트) 2개만 사용합니다.

GRU는 LSTM과 마찬가지로 게이트라는 매커니즘을 이용해 장기 의존성 문제를 완화하면서도, 효율적인 게이트 구조를 사용해 연산량이 적고 학습 속도가 빠른 편입니다.

GRU의 구조

GRU가 셀 상태 없이도 장기 기억을 관리할 수 있는 것은 GRU의 핵심 요소인 Reset Gate(리셋 게이트)와 Update Gate(업데이트 게이트) 때문입니다.

GRU 구조의 개요(좌)와 상세 계산 과정(우)

GRU 구조의 개요(좌)와 상세 계산 과정(우)

$h_t$ (Hidden State, 은닉 상태)

  • GRU는 은닉 상태만으로 기억을 관리합니다.
  • 이전 은닉 상태($h_{t-1}$)는 Reset Gate와 Update Gate를 거쳐 새로운 은닉 상태($h_t$)로 갱신됩니다.

Reset Gate, 리셋 게이트 → $r_t$

  • 이전 은닉 상태($h_{t-1}$)를 얼마나 잊을지 결정하는 역할을 합니다.
  • 현재 입력($x_t$)과 이전 은닉 상태($h_{t-1}$)를 결합해 계산되며, sigmoid 함수를 적용해 0과 1 사이의 값을 가집니다.

$\tilde{h}_t$ (새로운 상태 후보)

  • 현재 입력($x_t$)과 리셋된 이전 은닉 상태($r_t \times h_{t-1}$)를 기반으로 생성되는 새로운 상태입니다.
  • tanh 함수를 적용하여 -1 ~ 1 범위의 값을 가지며, 새로운 은닉 상태를 결정하는 핵심 요소가 됩니다.

Update Gate, 업데이트 게이트 → $u_t$

  • 이전 은닉 상태($h_{t-1}$)를 얼마나 유지할지 결정하는 역할을 합니다.
  • 업데이트 게이트 값이 1에 가까울수록 이전 은닉 상태를 유지하고, 0에 가까울수록 새로운 상태를 반영하여 업데이트됩니다.

Reset Gate, 리셋 게이트

GRU의 Reset Gate 개요

GRU의 Reset Gate 개요

Reset Gate는 이전 은닉 상태($h_{t-1}$)에서 현재 입력과 관련성이 낮은 정보를 얼마나 줄일지를 결정하는 역할을 합니다. Reset Gate가 활성화되면 이전 은닉 상태의 일부 정보가 사라지고, 새로운 정보가 상대적으로 더 강하게 반영될 수 있도록 조정됩니다.

GRU의 Reset Gate 계산 과정

GRU의 Reset Gate 계산 과정

STEP (1): $Z_r = W_h^{(r)}h_{t-1} + W_x^{(r)}x_t + b^{(r)}$

먼저, 리셋 게이트 값을 계산하기 위해 선형 변환을 수행합니다. 이전 은닉 상태($h_{t-1}$)와 현재 입력($x_t$)을 활용하여, ‘이전 정보 중 얼마나 유지할 것인가’를 결정하는 가중합을 구합니다.

이때 사용되는 가중치와 편향 역시 LSTM과 마찬가지로 리셋 게이트에만 영향을 주는 고유한 매개변수이므로, 이를 구분하기 위해 $W_h^{(r)}$, $W_x^{(r)}$, $b^{(r)}$ 와 같이 첨자 $r$을 붙여 표현합니다. 그리고 이렇게 계산된 선형 변환 결과를 $Z_r$라고 하겠습니다.

STEP (2): $r_t = \sigma(Z_r)$

이번에는 적절한 활성화 함수를 적용해 $Z_r$를 비선형 변환해야 합니다. 비선형 변환 후 계산된 값 $r_t$는 이전 정보에서 유지할 정보의 비율을 나타낸 값이 됩니다. 따라서 계산 결과를 (0, 1)의 범위로 제한할 수 있는 sigmoid 함수를 적용합니다.

그 결과 리셋 게이트 값($r_t$)이 0에 가까우면 이전 정보를 거의 잊고, 1에 가까우면 이전 정보를 유지하게 됩니다.

STEP (3): $r_t \times h_{t-1}$

STEP (2)에서 계산된 $r_t$는 이전 기억을 담고 있는 이전 은닉 상태($h_{t-1}$)에 곱해져, 불필요한 정보를 걸러낸 기억, 즉, 리셋된 이전 은닉 상태($r_t \times h_{t-1}$)를 계산해냅니다. 이 값은 추후에 새로운 상태 후보($\tilde{h}_t$)를 생성하는 과정에서 사용됩니다.

새로운 상태 후보: $\tilde{h}_t$

GRU의 새로운 상태 후보 계산 개요

GRU의 새로운 상태 후보 계산 개요

리셋 게이트를 통해 이전 은닉 상태의 정보를 조절하여, 일부는 감소시키고 일부는 그대로 유지했습니다. 이제 현재 입력($x_t$)을 바탕으로 새로운 은닉 상태 후보를 생성하는 과정이 필요합니다. 여기서 GRU의 새로운 상태 후보($\tilde{h}_t$)는 단순히 입력을 기반으로 생성되는 것이 아니라, 리셋 게이트를 통해 선택적으로 과거 정보를 반영하는 방식으로 만들어집니다.

GRU의 새로운 상태 후보 계산 과정

GRU의 새로운 상태 후보 계산 과정

STEP (1): $ W_h (r_t \times h_{t-1}) + W_xx_t + b $

RNN, LSTM, GRU의 새로운 정보(상태) 선형 변환 식 비교

RNN, LSTM, GRU의 새로운 정보(상태) 선형 변환 식 비교

이 단계에서 수행되는 선형 변환 식은 RNN과 LSTM에서 새로운 정보를 반영하는 수식의 선형 변환 식과 조금 다릅니다. 새로운 정보를 계산할 때, GRU에서는 이전 은닉 상태를 그대로($h_{t-1}$) 사용하지 않고, 리셋 게이트를 적용($r_t \times h_{t-1}$)하여 일부 정보를 초기화한 후 사용합니다. 이로써 새로운 정보를 처리할 때에도, 과거 정보 중 일부만 반영해 새로운 상태 후보($\tilde{h}_t$)를 계산합니다.

STEP (2): $ \tilde{h}_t = \tanh (\mathrm{STEP (1)})$

STEP (1)에서 선형 변환된 결과를 tanh 함수로 비선형 변환합니다. 여기서 활성화 함수로 sigmoid 함수가 아닌 tanh 함수를 쓰는 것은, 이전 글에서 설명했듯이 음수 표현을 유지하기 위해서 입니다. 새로운 상태 후보인 $\tilde{h}_t$는 다른 어떤 값의 비율을 표현한 것이 아니니 범위를 (0, 1)로 제한하는 sigmoid 함수를 쓸 필요가 없습니다. 오히려 모든 출력이 (-1, 1) 범위로 반환되는 tanh 함수를 써서, 음수로 표현된 정보도 유지하는 것이죠.

이렇게 새로운 상태 후보($\tilde{h}_t$)가 계산되었습니다. 이 값은 앞으로 업데이트 게이트를 거쳐 최종 은닉 상태($h_t$)를 결정하는 데에 사용됩니다. 따라서 새로운 상태 후보인 $\tilde{h}_t$는 ‘새로운 입력을 반영할 준비가 된 상태’라고 이해할 수 있습니다.

Update Gate, 업데이트 게이트

GRU의 Update Gate 개요

GRU의 Update Gate 개요

GRU에서 각 노드마다 출력하는 최종 은닉 상태($h_t$)는 앞서 계산한 새로운 상태 후보($\tilde{h}\substack{t}$)와 이전 은닉 상태($h_{t-1}$)를 합쳐서 결정됩니다. 이 때, 업데이트 게이트는 두 값($\tilde{h}\substack{t}$, $h_{t-1}$)의 비중을 조절하는 역할을 합니다.

GRU의 Update Gate 계산 과정

GRU의 Update Gate 계산 과정

STEP (1): $Z_u = W_h^{(u)}h_{t-1} + W_x^{(u)}x_t + b^{(u)} $

업데이트 게이트 값을 계산하기 위해 먼저 선형 변환을 진행합니다. 다른 게이트들과 마찬가지로, 이전 은닉 상태($h_{t-1}$)와 현재의 입력($x_t$)을 반영해 가중합을 계산합니다. 이렇게 계산된 선형 변환 결과를 $Z_u$라고 하겠습니다.

STEP (2): $u_t = \sigma(Z_u) $

이번 단계에서는 STEP (1)에서 계산된 $Z_u$를 비선형 변환시켜 업데이트 게이트의 값 $u_t$를 만듭니다. 이 $u_t$는 다음 단계에서 과거의 기억($h_{t-1}$)과 새로운 상태 후보($\tilde{h}_t$)가 혼합되는 비율을 조절하게 됩니다. 따라서 활성화 함수로는 (0, 1) 범위로 출력값을 한정시켜 비율을 표현할 수 있는 sigmoid 함수가 사용됩니다.

STEP (3): $h_t = (1 - u_t) \times h_{t-1} + u_t \times \tilde{h}_t$

업데이트 게이트의 마지막 단계에서 드디어 최종 은닉 상태($h_t$)가 계산됩니다. 이 때, 과거의 기억인 $h_{t-1}$에는 1에서 $u_t$를 뺀 값이 곱해지고, 새로운 상태 후보인 $\tilde{h}_t$에는 $u_t$가 그대로 곱해지게 됩니다.

다시 말하면, 업데이트 게이트 값 $u_t$는 최종 은닉 상태에서 새로운 상태가 차지할 비중을 뜻하고, 최종 은닉 상태의 나머지 비중이 과거의 기억에게 배정됩니다.

Update Gate에 따른 최종 은닉 상태

Update Gate에 따른 최종 은닉 상태

  • $u_t$값이 0에 가까우면 → 기존 은닉 상태 $h_{t-1}$를 거의 그대로 유지
  • $u_t$값이 1에 가까우면 → 새로운 상태 후보 $\tilde{h}_t$를 많이 반영하여 업데이트

이렇게 GRU에서는 리셋 게이트, 업데이트 게이트, 그리고 새로운 상태 후보가 상호작용하며 보관할 기억인 은닉 상태를 처리합니다. 리셋 게이트($r_t$)는 이전 은닉 상태($h_{t-1}$)에 곱해져 과거의 기억에서 중요한 정보만 남도록 조절하고, 이를 토대로 새로운 상태 후보($\tilde{h}\substack{t}$)를 계산해 냅니다. 업데이트 게이트는 이 새로운 상태 후보($\tilde{h}\substack{t}$)와 과거의 기억인 이전 은닉 상태($h_{t-1}$)의 비율을 조절해 최종 은닉 상태($h_t$)를 결정합니다.

LSTM vs GRU

LSTM과 GRU는 모두 RNN의 한계, 특히 장기 의존성 문제를 해결하기 위해 등장했습니다. 두 모델 모두 게이트를 활용해 불필요한 정보를 제거하고, 중요한 정보는 유지하며 ‘기억’을 관리하는 매커니즘을 가집니다. 하지만 지금까지 살펴봐왔듯, 두 모델에는 구조와 연산량 등에서 차이가 있습니다.

두 모델의 차이 LSTM GRU
기억의 관리 셀 상태($c_t$)와 은닉 상태($h_t$) 은닉 상태($h_t$)
게이트 개수 3개 (Forget Gate, Input Gate, Output Gate) 2개 (Reset Gate, Update Gate)
연산량 상대적으로 많음 상대적으로 적음
구조의 복잡성 복잡함 (3개의 게이트와 셀 상태) 간결함 (2개의 게이트)
장기 의존성 처리 더욱 정교한 정보 조절 가능 상대적으로 단순하지만 효과적

복잡한 장기 의존성 문제 OR 대규모 학습 데이터를 보유한 경우 → LSTM이 유리

LSTM의 구조는 복잡하기 때문에 그만큼 장기 의존성을 더욱 정밀하게 조절할 수 있습니다. 따라서 소설, 뉴스 기사 등의 복잡한 문맥을 학습해야 할 때는 LSTM이 더 유리합니다. 또한 만약 모델을 학습 시킬 데이터가 충분히 큰 규모의 데이터일 경우, LSTM은 GRU보다 더 많은 학습 매개변수를 가지므로 더 강력한 성능을 낼 수 있습니다.

빠른 연산이 필요한 문제 OR 학습 데이터가 적은 경우 → GRU가 유리

GRU의 장점은 연산량이 적다는 점입니다. 따라서 실시간 번역이나 모바일 환경과 같이 계산 속도가 중요한 환경에서는 GRU가 더 적합할 수 있습니다. 또한 만약 보유한 학습 데이터의 크기가 충분히 크지 않다면, LSTM은 과적합 가능성이 높습니다. 따라서 매개변수가 적은 GRU가 더 좋은 성능을 낼 수 있습니다.

두 모델이 유리한 환경을 표로 비교해보면 아래와 같습니다.

사용 환경 LSTM GRU
실시간/빠른 연산이 필요 ❌ 연산량이 많아 속도가 느림 ✅ 연산량이 적고 빠르게 동작
메모리가 제한된 환경 ❌ 메모리 사용량이 많음 ✅ 메모리 사용량이 적음
데이터가 적은 경우 ❌ 과적합 위험이 있음 ✅ 상대적으로 적은 데이터에서도 학습 가능
정기적인 기억 조절이 강한 데이터 ✅ 더 세밀한 조정이 가능 ❌ 정기적인 기억 조절이 상대적으로 덜 정밀함
대규모 데이터 학습 ✅ 데이터가 많으면 더 강력한 성능을 보임 ❌ 데이터가 많아도 LSTM보다 더 나은 성능을 보여주진 않음

마무리하며…

LSTM과 GRU는 모두 순환 신경망(RNN)의 한계를 극복하기 위해 등장한 모델로, 게이트를 활용해 정보를 효과적으로 조절합니다. LSTM은 더 정밀한 정보 관리를 통해 장기 의존성을 학습하는 데 유리하지만, 연산량이 많고 구조가 복잡합니다. 반면, GRU는 단순한 구조로 빠르게 학습할 수 있어 실시간 응용이나 적은 데이터 환경에서 효과적입니다. 따라서 사용하는 데이터와 응용 환경에 따라 두 모델 중 적절한 것을 선택하는 것이 중요합니다. 하지만 LSTM과 GRU만으로는 문장 번역, 챗봇, 문장 생성과 같은 복잡한 시퀀스 변환 문제를 해결하기 어렵습니다. 이를 위해 등장한 것이 Sequence-to-Sequence(Seq2Seq) 모델로, 인코더-디코더 구조를 활용해 입력 시퀀스를 변환하는 방식으로 동작합니다. 다음 글에서는 Seq2Seq 모델의 개념과, RNN을 활용한 인코더-디코더 구조가 어떻게 작동하는지 살펴보겠습니다.