콘텐츠로 이동

순환 신경망 (RNN / LSTM / GRU)

핵심 요약: RNN(Recurrent Neural Network)은 순서가 있는 데이터(문장, 시계열 등)를 처리하기 위한 신경망이다. 이전 시간 단계의 은닉 상태(Hidden State)를 다음 단계로 전달하여 “기억”을 유지한다. 기본 RNN은 긴 시퀀스에서 기억이 사라지는 문제가 있어, LSTM과 GRU가 이를 해결하였다.

순환 신경망(Recurrent Neural Network, RNN)은 시퀀스 데이터를 처리하기 위해 설계된 신경망이다. 이전 시간 단계의 정보를 은닉 상태(hidden state)를 통해 현재로 전달하며, 모든 시간 단계에서 동일한 가중치를 공유한다. 그러나 기본 RNN은 장기 의존성(long-term dependency)을 학습하기 어려워, 이를 해결한 LSTM과 GRU가 등장하였다. 현재는 Transformer가 대부분의 시퀀스 과제에서 RNN을 대체했지만, RNN의 개념적 이해는 여전히 중요하다.


1990년대 초, 시퀀스 데이터를 다루는 기본 RNN은 치명적인 약점을 안고 있었다. 시퀀스가 길어지면 기울기가 기하급수적으로 소실(Vanishing Gradient)되어, 앞부분의 정보를 뒷부분까지 전달하는 것이 사실상 불가능했다. 1997년, Sepp HochreiterJurgen Schmidhuber가 이 문제에 대한 혁명적인 해답을 내놓았다 — 바로 LSTM (Long Short-Term Memory)이다. 핵심 아이디어는 놀라울 정도로 직관적이었다: 기울기가 곱셈 연쇄를 거치며 소실되는 것이 문제라면, 덧셈 경로를 만들어 기울기가 변하지 않고 흘러가게 하자는 것이었다. 이를 위해 “셀 상태(Cell State)“라는 별도의 정보 전달 경로를 도입하고, 3개의 게이트(Gate)로 정보의 흐름을 제어하는 구조를 설계하였다. LSTM은 발표 당시에는 계산 자원의 한계로 주목받지 못했지만, 2010년대 GPU 시대가 열리면서 음성인식, 기계번역 등에서 압도적인 성능을 보이며 딥러닝의 핵심 아키텍처로 부상하였다.

비유: LSTM의 셀 상태는 공장의 컨베이어 벨트와 같다. 정보가 필요한 만큼 벨트 위를 흘러가고, 3개의 게이트가 각각 “무엇을 버릴지(Forget Gate)”, “무엇을 새로 태울지(Input Gate)”, “무엇을 꺼내 쓸지(Output Gate)“를 결정한다. 기본 RNN이 사람에서 사람으로 전언을 전달하는 전화 게임이라면, LSTM은 메모장에 적어서 전달하는 것과 같다 — 정보가 왜곡 없이 먼 거리까지 도달할 수 있다.


은닉 상태 업데이트: ht=tanh(Whhht1+Wxhxt+bh)h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t + b_h)

출력: yt=Whyht+byy_t = W_{hy} h_t + b_y

  • 파라미터 공유(Parameter Sharing): 모든 시간 단계에서 WhhW_{hh}, WxhW_{xh}, WhyW_{hy}를 공유
  • Unfolding: 시간축으로 펼치면 매우 깊은 네트워크로 볼 수 있음

3단어 문장 “나는 고양이를 좋아한다”를 hidden size 2인 RNN으로 처리해 보자.

  • 초기 은닉 상태: h0=[0,0]h_0 = [0, 0]

  • 각 단어가 임베딩(Embedding)을 거쳐 벡터로 변환된다고 가정

  • 시점 1 (“나는”): 입력 x1x_1h0h_0를 결합

    • h1=tanh(Wxhx1+Whhh0+b)=[0.6,0.3]h_1 = \tanh(W_{xh} \cdot x_1 + W_{hh} \cdot h_0 + b) = [0.6, -0.3]
    • “나는”이라는 정보가 h1h_1에 저장됨
  • 시점 2 (“고양이를”): 입력 x2x_2h1h_1을 결합

    • h2=tanh(Wxhx2+Whhh1+b)=[0.2,0.8]h_2 = \tanh(W_{xh} \cdot x_2 + W_{hh} \cdot h_1 + b) = [0.2, 0.8]
    • “나는 + 고양이를”의 정보가 h2h_2에 압축됨
  • 시점 3 (“좋아한다”): 입력 x3x_3h2h_2를 결합

    • h3=tanh(Wxhx3+Whhh2+b)=[0.5,0.4]h_3 = \tanh(W_{xh} \cdot x_3 + W_{hh} \cdot h_2 + b) = [0.5, 0.4]
    • 문장 전체의 정보가 h3h_3에 담김 → 이 벡터로 감성 분류 등 수행

핵심은 같은 가중치 WhhW_{hh}, WxhW_{xh}를 매 시점에서 재사용한다는 점이다. 문장이 3단어든 100단어든 동일한 파라미터를 사용한다.

1. 기본 RNN 다이어그램 BPTT (Backpropagation Through Time): 시간 방향으로 역전파를 수행한다.

한계 — 장기 의존성 학습 어려움: hth1=i=2thihi1\frac{\partial h_t}{\partial h_1} = \prod_{i=2}^{t} \frac{\partial h_i}{\partial h_{i-1}}

이 연쇄 곱이 tt가 커지면 기하급수적으로 소실(vanishing)하거나 폭발(exploding)한다.

Hochreiter & Schmidhuber (1997)가 제안. 셀 상태(Cell State)라는 “정보 고속도로”를 통해 장기 의존성(Long-term Dependency) — 멀리 떨어진 과거 정보를 현재까지 전달하는 능력 — 을 학습한다.

3개의 게이트:

게이트수식역할
Forget Gateft=σ(Wf[ht1,xt]+bf)f_t = \sigma(W_f [h_{t-1}, x_t] + b_f)무엇을 잊을지
Input Gateit=σ(Wi[ht1,xt]+bi)i_t = \sigma(W_i [h_{t-1}, x_t] + b_i)무엇을 기억할지
Output Gateot=σ(Wo[ht1,xt]+bo)o_t = \sigma(W_o [h_{t-1}, x_t] + b_o)무엇을 출력할지

셀 상태 업데이트: c~t=tanh(Wc[ht1,xt]+bc)(후보 셀)\tilde{c}_t = \tanh(W_c [h_{t-1}, x_t] + b_c) \quad \text{(후보 셀)} ct=ftct1+itc~tc_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t

은닉 상태: ht=ottanh(ct)h_t = o_t \odot \tanh(c_t)

2. LSTM (Long Short-Term Memory) 다이어그램 왜 vanishing gradient를 완화하는가: 셀 상태 ctc_t의 업데이트가 덧셈 형태이다. 곱셈과 달리 덧셈은 기울기를 직접 전달하므로, 기울기가 “고속도로”처럼 먼 시간 단계까지 도달할 수 있다.

Cho et al. (2014)이 제안한 LSTM의 간소화 버전이다.

2개의 게이트:

게이트수식역할
Update Gatezt=σ(Wz[ht1,xt])z_t = \sigma(W_z [h_{t-1}, x_t])forget + input gate 통합
Reset Gatert=σ(Wr[ht1,xt])r_t = \sigma(W_r [h_{t-1}, x_t])과거 정보 리셋 정도

은닉 상태 업데이트: h~t=tanh(W[rtht1,xt])\tilde{h}_t = \tanh(W [r_t \odot h_{t-1}, x_t]) ht=(1zt)ht1+zth~th_t = (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t

LSTM vs GRU 비교:

특성LSTMGRU
게이트 수3개 (forget, input, output)2개 (update, reset)
별도 셀 상태있음 (ctc_t)없음
파라미터 수더 많음더 적음 (~25% 감소)
성능장기 의존성에 약간 유리짧은 시퀀스에서 유사
학습 속도느림빠름

경험적 가이드: 데이터가 많으면 LSTM, 적으면 GRU가 유리한 경향이 있다.

입력 시퀀스를 양방향으로 처리하여, 과거와 미래 문맥을 모두 활용한다.

ht=f(W[ht1,xt])\overrightarrow{h_t} = f(\overrightarrow{W} [h_{t-1}, x_t]) ht=f(W[ht+1,xt])\overleftarrow{h_t} = f(\overleftarrow{W} [h_{t+1}, x_t]) ht=[ht;ht]h_t = [\overrightarrow{h_t}; \overleftarrow{h_t}]

사용처: NLP (품사 태깅, NER 등 시퀀스 레이블링) 제한: 실시간 예측에는 부적합 (미래 정보가 필요하므로)

Encoder-Decoder 구조: 입력 시퀀스 → 고정 길이 벡터(Context Vector, 문맥 벡터) → 출력 시퀀스

Teacher Forcing: 학습 시 디코더에 이전 시간 단계의 정답을 입력으로 제공. 학습 속도를 높이지만, 추론 시와의 괴리(exposure bias)가 발생한다.

한계: 전체 입력 시퀀스를 고정 길이 벡터로 압축해야 하는 정보 병목어텐션 메커니즘의 등장 동기


Forget gate의 편향을 1로 초기화하면 (bf=1b_f = 1), 학습 초기에 forget gate가 열려 있어 장기 기억이 보존된다. Jozefowicz et al. (2015)이 제안하였으며, 실무에서 널리 사용되는 트릭이다.

매우 긴 시퀀스에서 전체 시간 단계에 대한 역전파는 메모리와 계산 비용이 과도하다. 일정 시간 단계(예: 35)까지만 역전파를 수행하는 Truncated BPTT를 사용한다.

여러 RNN 층을 쌓아 더 깊은 표현을 학습한다. 보통 2~4층이 적절하며, Dropout을 층 사이에 적용한다.


과제RNN 적합도대안
시계열 예측적합Transformer, CNN
음성 인식적합 (과거)Transformer (현재 주류)
기계 번역부적합 (구식)Transformer
시퀀스 레이블링적합Transformer + CRF
실시간 스트리밍적합 (순차 처리)상태 유지 가능
긴 문서 처리부적합Transformer

현재 트렌드: 대부분의 NLP 과제에서 Transformer가 RNN을 대체하였다. 그러나 메모리 효율성이 중요한 실시간 스트리밍이나, 매우 긴 시퀀스의 온라인 처리에서는 RNN이 여전히 유용하다.


2014년, Google은 Seq2Seq + LSTM 기반의 기계번역 시스템을 발표하며 통계 기반 번역(Statistical Machine Translation)을 뛰어넘는 성능을 보여주었다. 같은 시기, 음성인식 분야에서도 LSTM은 혁신적이었다. Google의 음성인식 시스템은 LSTM을 도입한 후 단어 오류율(Word Error Rate)을 49% 감소시켰으며, Apple의 Siri, Amazon의 Alexa 등 주요 음성 비서 서비스의 핵심 엔진으로 자리 잡았다.

이 시기에 Bidirectional LSTM은 NER(개체명 인식), 품사 태깅 등 시퀀스 레이블링 과제의 사실상 표준이었고, Stacked LSTM은 더 깊은 표현 학습을 가능하게 했다. GRU는 LSTM보다 파라미터가 적으면서도 유사한 성능을 보여, 자원이 제한된 환경에서 실용적 대안으로 널리 채택되었다.

2017년 “Attention Is All You Need” 논문의 등장 이후, 상황은 급변했다. Transformer는 RNN의 순차 처리 한계를 완전히 극복하고 완전한 병렬화를 가능하게 하여, 학습 속도와 성능 모두에서 LSTM을 압도했다. 2018년 BERT의 등장은 사실상 NLP에서 LSTM 시대의 종말을 선언했다. 그러나 LSTM이 완전히 사라진 것은 아니다 — 실시간 스트리밍 음성 처리, 엣지 디바이스에서의 온라인 시계열 예측 등 메모리 효율성과 순차 처리가 중요한 영역에서는 여전히 LSTM/GRU가 실용적 선택이다.


  1. “LSTM이 vanishing gradient를 완전히 해결한다”: LSTM은 완화하지만, 매우 긴 시퀀스(수천 스텝)에서는 여전히 어려움이 있다.

  2. Gradient clipping을 하지 않음: RNN 학습에서 gradient clipping은 사실상 필수이다. 폭발하는 기울기는 학습을 즉시 불안정하게 만든다.

  3. 양방향 RNN을 자기회귀 생성에 사용: 양방향 RNN은 미래 정보를 사용하므로, 텍스트 생성 같은 자기회귀 과제에는 사용할 수 없다.

  4. 패딩 처리 무시: 가변 길이 시퀀스를 배치로 묶을 때, 패딩된 위치의 은닉 상태를 사용하면 오류가 발생한다. pack_padded_sequence를 활용해야 한다.

  5. RNN의 순차 처리 한계 무시: RNN은 본질적으로 병렬화가 불가능하다. GPU의 활용도가 떨어져 학습 속도가 느리다.