개요

RNN(Recurrent Neural Network, 순환 신경망)은 순서가 있는 데이터를 이해하기 위해 만들어진 인공지능 모델이다.

왜 필요할까?

우리가 문장을 읽을 때를 생각해보자. “나는 학교에 갔다”라는 문장을 이해하려면:

  • “나는”을 읽고
  • “학교에”를 읽으면서 “나는”을 기억하고
  • “갔다”를 읽으면서 앞의 단어들을 종합해서 이해한다

즉, 이전 정보를 기억하면서 새로운 정보를 처리해야 한다. 일반적인 신경망은 각 입력을 독립적으로 처리하기 때문에 이런 “순서”와 “기억”을 다루지 못한다. RNN은 바로 이 문제를 해결하기 위해 만들어졌다.

RNN의 핵심 아이디어

RNN은 마치 메모장을 들고 있는 사람처럼 작동한다:

  1. 첫 번째 단어를 읽고 메모장에 중요한 내용을 적는다
  2. 두 번째 단어를 읽으면서 메모장을 참고하고, 새로운 내용을 추가한다
  3. 세 번째 단어를 읽으면서 또 메모장을 참고한다
  4. 이렇게 계속해서 이전 정보를 기억하면서 새로운 정보를 처리한다

이 “메모장”이 바로 RNN의 핵심인 은닉 상태(hidden state)이다.

어디에 사용될까?

  • 번역: “I love you” → “나는 너를 사랑해” (문장 전체의 맥락을 이해해야 함)
  • 음성 인식: 음성 신호를 시간 순서대로 듣고 텍스트로 변환
  • 주가 예측: 과거 주가 흐름을 보고 미래 예측
  • 대화형 AI: 이전 대화 내용을 기억하면서 답변

현재는 많은 작업에서 Transformer가 주류를 이루고 있지만, RNN은 실시간 처리나 계산 자원이 제한된 환경에서 여전히 유용하다.

구조와 작동 원리

은닉 상태 - RNN의 “메모장”

은닉 상태(hidden state)는 RNN이 정보를 기억하는 핵심 장치이다.

왜 "은닉(hidden)"일까?

“은닉”이라는 이름은 이 상태가 사용자에게 직접 보이지 않기 때문이다:

  • 입력(input): 우리가 직접 넣어주는 데이터 (예: “나는”, “학교에”, “갔다”)
  • 출력(output): 우리가 받는 결과 (예: 번역된 문장, 예측 결과)
  • 은닉 상태(hidden state): 모델이 내부적으로만 사용하는 메모리

마치 사람의 단기 기억이나 작업 메모리와 같다. 우리가 문장을 읽을 때:

  • 눈으로 보는 글자 = 입력
  • 이해한 의미 = 출력
  • 머릿속에서 앞 내용을 기억하는 것 = 은닉 상태 (다른 사람이 볼 수 없음)

은닉 상태는 무엇을 저장할까?

문장 “나는 어제 학교에 갔다”를 처리한다면:

  • “나는” 읽은 후 → 은닉 상태: “주어는 ‘나’”
  • “어제” 읽은 후 → 은닉 상태: “주어는 ‘나’, 시간은 ‘과거’”
  • “학교에” 읽은 후 → 은닉 상태: “주어는 ‘나’, 시간은 ‘과거’, 장소는 ‘학교’”
  • “갔다” 읽은 후 → 은닉 상태: “주어는 ‘나’, 시간은 ‘과거’, 장소는 ‘학교’, 동작은 ‘가다’”

각 단계마다 은닉 상태가 이전 정보를 유지하면서 새 정보를 추가한다.

기본 작동 원리

각 시점 에서 RNN은 두 가지를 입력받는다:

  1. 현재 입력 : 지금 처리할 데이터 (예: 현재 단어)
  2. 이전 은닉 상태 : 이전까지의 기억

이 둘을 합쳐서:

  1. 새로운 은닉 상태 생성: 업데이트된 기억
  2. 출력 생성: 현재 시점의 예측 결과

비유로 이해하기

책을 읽을 때를 생각해보자:

  • 현재 문장(입력) + 지금까지 읽은 내용에 대한 기억(이전 은닉 상태)
  • 업데이트된 이해(새 은닉 상태) + 현재 문장에 대한 판단(출력)

수학적 표현

수학적으로 RNN의 작동은 다음과 같이 표현된다:

여기서:

  • : 시점 의 은닉 상태 (현재까지의 기억)
  • : 시점 의 입력 (현재 처리할 데이터)
  • : 시점 의 출력 (예측 결과)
  • , , : 가중치 행렬 (학습되는 파라미터)
  • , : 편향 벡터
  • , : 활성화 함수 (보통 tanh, ReLU 등)

핵심 특징: 가중치 공유

중요한 점은 모든 시점에서 동일한 가중치(, , )를 사용한다는 것이다.

비유: 같은 안경으로 모든 단어를 본다

  • 첫 번째 단어를 볼 때: 이 안경 사용
  • 두 번째 단어를 볼 때: 똑같은 안경 사용
  • 세 번째 단어를 볼 때: 똑같은 안경 사용

이를 통해:

  • 문장이 3단어든 100단어든 같은 규칙으로 처리
  • 학습해야 할 파라미터가 줄어들어 효율적
  • “주어 다음에 동사가 온다” 같은 일관된 패턴을 학습

RNN의 학습: BPTT

RNN은 BPTT(Backpropagation Through Time, 시간을 통한 역전파)로 학습한다.

왜 "시간을 통한(Through Time)" 역전파일까?

일반 신경망은 공간적으로만 역전파를 한다:

입력 → 레이어1 → 레이어2 → 출력
       ←      ←      ←
     (역전파)

하지만 RNN은 시간 축도 있다:

시점1 → 시점2 → 시점3
  ↓       ↓       ↓
출력1    출력2    출력3

역전파할 때 시간을 거슬러 올라가면서 오차를 전파한다:

시점1 ← 시점2 ← 시점3
       (시간을 통한 역전파)

마치 영화를 거꾸로 돌려보면서 “어디서 실수했는지” 찾아가는 것과 같다.

수학적으로는:

모든 시점의 오차를 합쳐서 가중치를 업데이트한다.

아키텍처 유형

RNN은 입력과 출력의 구조에 따라 다양한 형태로 구성될 수 있다:

1. One-to-One: 단일 입력 → 단일 출력

  • 일반 신경망과 유사
  • 예: 이미지 분류 (이미지 하나 → 라벨 하나)

2. One-to-Many: 단일 입력 → 시퀀스 출력

  • 예시: 이미지 캡셔닝
    • 입력: 고양이 사진 하나
    • 출력: “A cat is sitting on a sofa” (단어 여러 개)

3. Many-to-One: 시퀀스 입력 → 단일 출력

  • 예시: 감정 분석
    • 입력: “이 영화 정말 재미있어요!” (단어 여러 개)
    • 출력: 긍정 (하나의 결과)

4. Many-to-Many: 시퀀스 입력 → 시퀀스 출력

  • 예시: 기계 번역
    • 입력: “I love you” (3개 단어)
    • 출력: “나는 너를 사랑해” (4개 단어)
  • 예시: 음성 인식
    • 입력: 음성 신호 (시간 순서대로)
    • 출력: 텍스트 (시간 순서대로)

RNN의 주요 변형

LSTM (Long Short-Term Memory) - “장기 기억 장치”

1997년에 등장한 LSTM은1 전통적인 RNN의 가장 큰 문제였던 기울기 소실 문제(vanishing gradient problem)를 해결하기 위해 개발되었다.

문제: 기본 RNN의 건망증

기본 RNN은 정보를 오래 기억하지 못한다. 마치 단기 기억만 있는 사람처럼:

  • “이 문장의 첫 단어가 뭐였지?” → 잊어버림
  • 긴 문장이나 긴 시퀀스를 처리하면 앞부분의 정보 손실

해결책: 게이트로 정보 흐름 제어

LSTM은 세 가지 “문(gate)“을 사용해서 무엇을 기억하고 무엇을 잊을지 똑똑하게 결정한다:

1. Forget Gate (망각 게이트): “이전 기억 중 뭘 잊을까?”

  • 비유: 메모장에서 필요 없는 내용을 지우개로 지우기
  • 예: “나는 학교에 갔다. 나는 집에 왔다.” → “학교”는 이제 필요 없으니 지우기

2. Input Gate (입력 게이트): “새 정보 중 뭘 기억할까?”

  • 비유: 새로운 내용을 메모장에 적을지 말지 결정
  • 예: “그곳은 아름다웠다” → “아름답다”는 중요하니까 기억!

3. Output Gate (출력 게이트): “지금 뭘 출력할까?”

  • 비유: 메모장 내용 중 지금 필요한 부분만 꺼내기
  • 예: 번역할 때 지금 시점에 필요한 정보만 사용

이 세 게이트 덕분에 LSTM은 장기 의존성(long-term dependency), 즉 오래 전 정보도 잘 기억할 수 있다.

GRU (Gated Recurrent Unit) - “단순화된 LSTM”

GRU는 LSTM을 단순화한 버전으로2, 두 개의 게이트만 사용한다:

1. Reset Gate (리셋 게이트): “이전 정보를 얼마나 무시할까?”

  • LSTM의 Forget Gate와 비슷하지만 더 단순

2. Update Gate (업데이트 게이트): “새 정보와 이전 정보를 어떻게 섞을까?”

  • LSTM의 Input Gate + Output Gate를 합친 것

LSTM vs GRU 비교

특징LSTMGRU
게이트 개수3개2개
복잡도높음낮음
학습 속도느림빠름
파라미터 수많음적음
성능복잡한 문제에 강함단순한 문제에 충분

언제 어떤 걸 쓸까?

  • 단순한 작업, 계산 자원 부족, 빠른 학습 필요 → GRU
  • 복잡한 작업, 장기 의존성 중요 → LSTM

양방향 RNN (Bidirectional RNN) - “앞뒤로 읽기”

양방향 RNN은 시퀀스를 순방향과 역방향 모두에서 처리한다.

왜 필요할까?

문장 “나는 사과를 먹었다”를 보자:

  • 순방향만 읽으면: “나는” → “사과를” → “먹었다”
    • “사과를” 읽을 때 “먹었다”를 아직 모름
    • “사과”가 과일인지, 사과(apology)인지 헷갈릴 수 있음
  • 양방향으로 읽으면:
    • 앞에서 뒤로: “나는” → “사과를” → “먹었다”
    • 뒤에서 앞으로: “먹었다” → “사과를” → “나는”
    • “사과를” 처리할 때 “먹었다”도 알고 있음 → 과일임을 확실히 알 수 있음!

비유: 책을 읽을 때

  • 일반 RNN: 처음부터 끝까지 한 방향으로만
  • 양방향 RNN: 앞에서 뒤로 읽고, 동시에 뒤에서 앞으로도 읽어서 문맥 파악

언제 유용할까?

  • 문장 전체의 의미 파악이 필요한 작업
  • 예: 품사 태깅, 개체명 인식, 감정 분석

기울기 소실/폭발 문제

전통적인 RNN의 가장 큰 문제는 기울기 소실(vanishing gradient)과 기울기 폭발(exploding gradient) 문제이다.

문제가 뭘까?

RNN이 학습할 때 시간을 거슬러 올라가면서 오차를 전파한다고 했다. 이 과정에서:

기울기 소실 (Vanishing Gradient)

  • 비유: 긴 복도에서 속삭임을 전달하는 것
    • 첫 사람: “안녕” (명확)
    • 10명 전달 후: “안…?” (거의 안 들림)
    • 100명 전달 후: ”…” (완전히 소실)
  • 시퀀스가 길어질수록 초반 정보의 영향력이 사라짐
  • 결과: 앞부분을 학습하지 못함

기울기 폭발 (Exploding Gradient)

  • 비유: 눈덩이 굴리기
    • 처음: 작은 눈덩이
    • 조금 굴린 후: 사람 크기
    • 더 굴린 후: 집 크기 (통제 불가!)
  • 시퀀스가 길어질수록 신호가 지나치게 증폭
  • 결과: 학습이 불안정해짐 (값이 무한대로)

왜 이런 일이 일어날까?

역전파할 때 같은 가중치를 계속 곱하기 때문:

  • 가중치가 1보다 작으면 (예: 0.5) → 0.5 × 0.5 × 0.5 × … → 0에 가까워짐 (소실)
  • 가중치가 1보다 크면 (예: 2) → 2 × 2 × 2 × … → 무한대에 가까워짐 (폭발)

해결 방법

1. LSTM/GRU 사용 (가장 효과적)

  • 게이트 메커니즘으로 정보 흐름 제어
  • “고속도로”를 만들어서 정보가 소실 없이 전달되도록 함

2. Gradient Clipping (기울기 폭발 방지)

  • 비유: 속도 제한
    • 기울기가 너무 크면 → 특정 값으로 제한
    • 예: 기울기가 1000이면 → 10으로 제한

3. 적절한 활성화 함수 선택

  • tanh, ReLU 같은 함수 사용
  • 기울기가 너무 작아지지 않도록 조절

장단점

장점

  • 시퀀스 데이터의 시간적 의존성을 자연스럽게 모델링
  • 가변 길이 입력 처리 가능
  • 모든 시점에서 파라미터 공유로 효율적

단점

  • 기울기 소실/폭발 문제로 장기 의존성 학습 어려움 (LSTM/GRU로 완화)
  • 순차적 처리로 인한 병렬화 어려움
  • 긴 시퀀스에서 계산 비용 증가

응용 분야

  • 자연어 처리: 기계 번역, 텍스트 생성, 언어 모델링
  • 음성 인식: 음성을 텍스트로 변환
  • 필기 인식: 손글씨를 디지털 텍스트로 변환
  • 시계열 예측: 주가, 날씨 등의 시계열 데이터 예측
  • 비디오 분석: 동작 인식, 비디오 캡셔닝

현대적 발전

최근에는 Attention is All You Need 논문에서 제안된 Transformer 아키텍처가 많은 시퀀스 처리 작업에서 RNN을 대체했다.

RNN vs Transformer

특징RNNTransformer
처리 방식순차적 (한 번에 하나씩)병렬적 (모두 동시에)
학습 속도느림빠름
장기 의존성어려움 (LSTM으로 완화)쉬움
메모리 사용적음많음
실시간 처리가능어려움

Transformer가 더 나은 이유:

  • 모든 단어를 동시에 처리 → 훨씬 빠름
  • Attention 메커니즘으로 장거리 의존성을 효과적으로 학습
  • 긴 문맥도 문제없이 처리

RNN이 여전히 유용한 경우:

  • 실시간 스트리밍 데이터: 음성 인식, 주가 예측 등
  • 메모리 제한: 모바일 기기, 임베디드 시스템
  • 짧은 시퀀스: 간단한 작업에서는 RNN이 더 효율적

참고 자료

Footnotes

  1. Hochreiter, S., & Schmidhuber, J. (1997). “Long Short-Term Memory”. Neural Computation, 9(8), 1735-1780.

  2. Cho, K., et al. (2014). “Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation”. arXiv:1406.1078