개요
RNN(Recurrent Neural Network, 순환 신경망)은 순서가 있는 데이터를 이해하기 위해 만들어진 인공지능 모델이다.
왜 필요할까?
우리가 문장을 읽을 때를 생각해보자. “나는 학교에 갔다”라는 문장을 이해하려면:
- “나는”을 읽고
- “학교에”를 읽으면서 “나는”을 기억하고
- “갔다”를 읽으면서 앞의 단어들을 종합해서 이해한다
즉, 이전 정보를 기억하면서 새로운 정보를 처리해야 한다. 일반적인 신경망은 각 입력을 독립적으로 처리하기 때문에 이런 “순서”와 “기억”을 다루지 못한다. RNN은 바로 이 문제를 해결하기 위해 만들어졌다.
RNN의 핵심 아이디어
RNN은 마치 메모장을 들고 있는 사람처럼 작동한다:
- 첫 번째 단어를 읽고 메모장에 중요한 내용을 적는다
- 두 번째 단어를 읽으면서 메모장을 참고하고, 새로운 내용을 추가한다
- 세 번째 단어를 읽으면서 또 메모장을 참고한다
- 이렇게 계속해서 이전 정보를 기억하면서 새로운 정보를 처리한다
이 “메모장”이 바로 RNN의 핵심인 은닉 상태(hidden state)이다.
어디에 사용될까?
- 번역: “I love you” → “나는 너를 사랑해” (문장 전체의 맥락을 이해해야 함)
- 음성 인식: 음성 신호를 시간 순서대로 듣고 텍스트로 변환
- 주가 예측: 과거 주가 흐름을 보고 미래 예측
- 대화형 AI: 이전 대화 내용을 기억하면서 답변
현재는 많은 작업에서 Transformer가 주류를 이루고 있지만, RNN은 실시간 처리나 계산 자원이 제한된 환경에서 여전히 유용하다.
구조와 작동 원리
은닉 상태 - RNN의 “메모장”
은닉 상태(hidden state)는 RNN이 정보를 기억하는 핵심 장치이다.
왜 "은닉(hidden)"일까?
“은닉”이라는 이름은 이 상태가 사용자에게 직접 보이지 않기 때문이다:
- 입력(input): 우리가 직접 넣어주는 데이터 (예: “나는”, “학교에”, “갔다”)
- 출력(output): 우리가 받는 결과 (예: 번역된 문장, 예측 결과)
- 은닉 상태(hidden state): 모델이 내부적으로만 사용하는 메모리
마치 사람의 단기 기억이나 작업 메모리와 같다. 우리가 문장을 읽을 때:
- 눈으로 보는 글자 = 입력
- 이해한 의미 = 출력
- 머릿속에서 앞 내용을 기억하는 것 = 은닉 상태 (다른 사람이 볼 수 없음)
은닉 상태는 무엇을 저장할까?
문장 “나는 어제 학교에 갔다”를 처리한다면:
- “나는” 읽은 후 → 은닉 상태: “주어는 ‘나’”
- “어제” 읽은 후 → 은닉 상태: “주어는 ‘나’, 시간은 ‘과거’”
- “학교에” 읽은 후 → 은닉 상태: “주어는 ‘나’, 시간은 ‘과거’, 장소는 ‘학교’”
- “갔다” 읽은 후 → 은닉 상태: “주어는 ‘나’, 시간은 ‘과거’, 장소는 ‘학교’, 동작은 ‘가다’”
각 단계마다 은닉 상태가 이전 정보를 유지하면서 새 정보를 추가한다.
기본 작동 원리
각 시점 에서 RNN은 두 가지를 입력받는다:
- 현재 입력 : 지금 처리할 데이터 (예: 현재 단어)
- 이전 은닉 상태 : 이전까지의 기억
이 둘을 합쳐서:
- 새로운 은닉 상태 생성: 업데이트된 기억
- 출력 생성: 현재 시점의 예측 결과
비유로 이해하기
책을 읽을 때를 생각해보자:
- 현재 문장(입력) + 지금까지 읽은 내용에 대한 기억(이전 은닉 상태)
- → 업데이트된 이해(새 은닉 상태) + 현재 문장에 대한 판단(출력)
수학적 표현
수학적으로 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 비교
특징 LSTM GRU 게이트 개수 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
특징 | RNN | Transformer |
---|---|---|
처리 방식 | 순차적 (한 번에 하나씩) | 병렬적 (모두 동시에) |
학습 속도 | 느림 | 빠름 |
장기 의존성 | 어려움 (LSTM으로 완화) | 쉬움 |
메모리 사용 | 적음 | 많음 |
실시간 처리 | 가능 | 어려움 |
Transformer가 더 나은 이유:
- 모든 단어를 동시에 처리 → 훨씬 빠름
- Attention 메커니즘으로 장거리 의존성을 효과적으로 학습
- 긴 문맥도 문제없이 처리
RNN이 여전히 유용한 경우:
- 실시간 스트리밍 데이터: 음성 인식, 주가 예측 등
- 메모리 제한: 모바일 기기, 임베디드 시스템
- 짧은 시퀀스: 간단한 작업에서는 RNN이 더 효율적
참고 자료
- Recurrent neural network - Wikipedia
- CS 230 - Recurrent Neural Networks Cheatsheet - Stanford
- What is RNN? - AWS
- What is a Recurrent Neural Network (RNN)? - IBM
- Understanding LSTM Networks - colah’s blog
- The Unreasonable Effectiveness of Recurrent Neural Networks - Andrej Karpathy