이번 문서의 목표: RNN의 은닉 상태 갱신식과 시간 펼치기(unfolding) 구조를 이해하고, 왜 긴 시퀀스에서 기울기 소실·폭발이 특히 심해지는지 설명하며, LSTM의 게이트 3종과 GRU의 간소화 지점을 구분해 설명할 수 있다.
왜 RNN이 필요한가
11–12편에서 다룬 합성곱 신경망(CNN, Convolutional Neural Network)은 이미지처럼 고정된 크기의 입력을 다루는 데 강하다. 하지만 문장, 음성, 주가 시계열처럼 순서(order)가 의미를 만들고 길이가 가변적인 데이터에는 CNN이나 05편의 다층 퍼셉트론(MLP, Multi-Layer Perceptron) 구조를 그대로 쓰기 어렵다. “나는 학교에 간다”와 “학교에 나는 간다”는 같은 단어 집합이지만 순서가 다르면 뉘앙스가 달라지고, 극단적으로 순서를 무시하면 아예 다른 문장(“간다 학교에 나는”)도 구분하지 못한다.
순환신경망(RNN, Recurrent Neural Network)은 이 문제를 “같은 가중치를 시간 축을 따라 반복 적용하면서, 이전 시점의 정보를 다음 시점으로 전달하는 상태(state)를 둔다”는 아이디어로 해결한다. 입력이 몇 개가 들어오든 같은 함수(같은 가중치 행렬)를 재사용하므로 가변 길이 시퀀스를 처리할 수 있다.
쉽게 말하면: RNN은 문장을 한 단어씩 읽어 나가면서, 지금까지 읽은 내용을 “기억 메모”(은닉 상태)에 계속 업데이트해 가는 신경망이다.
RNN의 은닉 상태 갱신식
시점(time step) 에서 RNN은 두 가지 입력을 받는다. 하나는 그 시점의 입력 벡터 (예: 번째 단어의 임베딩 벡터), 다른 하나는 이전 시점에서 넘어온 은닉 상태(hidden state) 이다. 이 둘을 합쳐 새로운 은닉 상태 를 계산한다.
각 기호의 뜻은 다음과 같다.
- : 시점 의 입력 벡터. 예를 들어 단어 임베딩이면 차원이 인 실수 벡터다.
- : 바로 이전 시점 까지의 정보를 압축해 담고 있는 은닉 상태 벡터. 일 때는 보통 영벡터(모든 원소가 0)로 초기화한다.
- : 입력 를 은닉 공간으로 변환하는 가중치 행렬(input-to-hidden weight).
- : 이전 은닉 상태 을 다음 은닉 상태로 전달할 때 곱하는 가중치 행렬(hidden-to-hidden weight). 이 행렬이 모든 시점에서 동일하게 재사용된다는 점이 RNN의 핵심이다.
- : 편향(bias) 벡터.
- : 하이퍼볼릭 탄젠트 활성화 함수. 06편에서 다룬 것처럼 출력을 에서 사이로 눌러준다.
출력이 필요한 문제(예: 각 시점마다 클래스를 예측)라면 은닉 상태에서 출력을 한 번 더 뽑아낸다.
여기서 는 은닉 상태를 출력 공간으로 보내는 가중치, 는 출력층 편향이다. 분류 문제라면 이 에 소프트맥스를 적용해 확률로 바꾼다.
시간 펼치기(unfolding)
RNN은 “루프가 있는 하나의 셀”로 그릴 수도 있고, 그 루프를 시간 축으로 풀어서 “같은 가중치를 공유하는 여러 층이 늘어선 신경망”으로 그릴 수도 있다. 후자를 시간 펼치기(unfolding in time)라 부르며, 역전파를 이해하려면 반드시 이 펼친 그림으로 생각해야 한다.
그림에서 RNN 셀 (t=1), (t=2), (t=3)은 서로 다른 박스처럼 보이지만, 내부의 , , 는 전부 동일한 값을 공유한다(점선으로 표시). 이 “가중치 공유(weight sharing)“가 RNN을 CNN의 필터 공유와 유사하게 만들어 주는 지점이며, 동시에 뒤에서 다룰 기울기 문제의 원인이기도 하다.
장기 의존성 문제와 기울기 소실·폭발
문장이 길어질수록 RNN은 “오래전에 읽은 정보”를 뒤쪽 시점까지 전달해야 하는 경우가 많다. 예를 들어 “그 나라는… (중략, 40단어)… 그래서 그곳 사람들은 그 언어를 쓴다”라는 문장에서 “그 언어”가 무엇인지 맞히려면 40단어 전에 나온 “나라” 정보를 은닉 상태가 계속 들고 있어야 한다. 이렇게 멀리 떨어진 시점 사이의 의존 관계를 장기 의존성(long-term dependency)이라 부른다.
쉽게 말하면: RNN은 짧은 문장은 잘 기억하지만, 문장이 길어질수록 앞부분 정보를 까먹거나 반대로 신호가 폭발적으로 커져 학습이 불안정해진다.
07편에서 역전파는 체인 룰(연쇄 법칙)로 국소 기울기(gradient)를 곱해 나가는 과정이라고 배웠다. RNN을 시간에 대해 펼친 뒤 역전파를 적용하는 것을 시간 역전파(BPTT, Backpropagation Through Time)라 하는데, 여기서 시점 의 손실이 훨씬 이전 시점 의 은닉 상태에 미치는 영향은 그 사이에 있는 모든 시점의 국소 기울기를 곱한 값으로 근사된다.
- : 시점 의 은닉 상태가 훨씬 이전인 시점 의 은닉 상태에 얼마나 민감한지를 나타내는 기울기.
- : 파이(pi), “모두 곱하라”는 기호(시그마 가 “모두 더하라”라면 파이는 “모두 곱하라”다).
- : 인접한 두 시점 사이의 국소 기울기. 여기에는 매번 같은 가 곱해진다.
이 곱셈이 문제다. 만약 의 고유값(eigenvalue, 행렬이 벡터를 얼마나 늘리거나 줄이는지를 나타내는 값) 크기가 1보다 계속 작으면, 여러 번 곱할수록 값이 지수적으로 0에 가까워진다 — 이것이 기울기 소실(vanishing gradient)이다. 반대로 고유값 크기가 1보다 크면 곱할수록 값이 지수적으로 커져 발산한다 — 기울기 폭발(exploding gradient)이다.
CNN이나 얕은 MLP도 층이 깊어지면 비슷한 문제를 겪지만, RNN에서 유독 심한 이유는 같은 가중치 행렬 를 시퀀스 길이만큼 반복해서 곱하기 때문이다. 층마다 서로 다른 가중치를 쓰는 일반 심층망과 달리, RNN은 문장이 100단어면 “동일한 행렬을 100번 곱한 것”과 사실상 같은 구조가 되어 소실·폭발이 훨씬 빠르고 극단적으로 나타난다.
- 기울기 폭발은 비교적 다루기 쉽다. 기울기의 크기(norm)가 특정 임계값을 넘으면 잘라내는 기울기 클리핑(gradient clipping)으로 완화한다.
- 기울기 소실은 훨씬 다루기 어렵다. 클리핑으로는 “이미 0에 가까워진” 신호를 되살릴 수 없기 때문이다. 이 문제를 구조적으로 해결하려는 시도가 바로 다음 절의 LSTM이다.
LSTM: 게이트로 정보 흐름을 제어한다
장단기 기억망(LSTM, Long Short-Term Memory)은 은닉 상태 외에 셀 상태(cell state) 라는 별도의 “장기 기억 컨베이어 벨트”를 추가하고, 이 벨트에 무엇을 지우고 무엇을 더할지를 세 개의 게이트(gate)로 조절한다. 게이트는 0에서 1 사이 값을 내는 시그모이드 함수로 만들어지며, 0에 가까우면 “그 정보를 막는다”, 1에 가까우면 “그대로 통과시킨다”는 뜻이다.
| 게이트 | 수식 | 역할 | 직관 |
|---|---|---|---|
| 망각 게이트(forget gate) | 이전 셀 상태 중 얼마를 버릴지 결정 | ”지금까지 기억 중 필요 없어진 부분을 지운다” | |
| 입력 게이트(input gate) | 새 후보 정보 중 얼마를 셀 상태에 더할지 결정 | ”새로 들어온 정보 중 기억할 가치가 있는 부분을 고른다” | |
| 출력 게이트(output gate) | 셀 상태 중 얼마를 이번 시점의 은닉 상태로 내보낼지 결정 | ”장기 기억 중 지금 당장 답에 쓸 부분만 꺼낸다” |
표의 는 시그마가 아니라 소문자 시그모이드 함수(sigma, )를 가리키며, 는 두 벡터를 이어 붙인(concatenate) 벡터를 뜻한다.
셀 상태를 실제로 갱신하는 식은 다음과 같다. 먼저 “새로 들어올 후보 정보” (틸드 C, C candidate)를 tanh로 계산한다.
그다음 망각 게이트와 입력 게이트를 이용해 셀 상태를 갱신한다.
- : 아다마르 곱(Hadamard product), 두 벡터의 같은 위치 원소끼리 곱하는 원소별 곱셈. 행렬 곱과 달리 벡터의 차원이 그대로 유지된다.
- : 이전 기억 중 “망각 게이트가 열어둔 만큼만” 남긴다.
- : 새 후보 정보 중 “입력 게이트가 허락한 만큼만” 더한다.
마지막으로 은닉 상태는 셀 상태를 tanh로 한 번 눌러준 뒤 출력 게이트로 걸러서 만든다.
셀 상태 흐름 그림
이 그림에서 핵심은 셀 상태 에서 로 가는 경로가 덧셈 위주라는 점이다. RNN의 은닉 상태 갱신식은 매 시점 를 곱하고 tanh를 씌우는 “곱셈·비선형 변환” 경로였지만, LSTM의 셀 상태 경로는 게이트 값을 곱하는 것을 빼면 거의 덧셈으로 흘러간다. 덧셈은 역전파 시 기울기를 그대로 전달하는 성질이 있어서(합의 미분은 그대로 분배되므로), 망각 게이트가 1에 가깝게 열려 있는 한 셀 상태를 통한 기울기가 지수적으로 줄어들지 않는다. 이것이 LSTM이 기울기 소실 문제를 크게 완화하는 구조적인 이유다.
GRU: 게이트를 줄인 간소화 버전
게이트 순환 유닛(GRU, Gated Recurrent Unit)은 LSTM의 아이디어(게이트로 정보 흐름을 조절한다)를 유지하면서 구조를 더 가볍게 만든 변형이다. 가장 큰 차이는 다음과 같다.
- 셀 상태와 은닉 상태를 하나로 합친다. LSTM은 와 를 따로 두지만, GRU는 은닉 상태 하나만 사용한다.
- 게이트를 3개에서 2개로 줄인다. 망각 게이트와 입력 게이트를 리셋 게이트(reset gate) 와 업데이트 게이트(update gate) 로 재구성하며, 별도의 출력 게이트가 없다.
업데이트 게이트 는 “이전 은닉 상태를 얼마나 유지하고, 새 후보를 얼마나 받아들일지”를 한 번에 결정한다(LSTM의 망각 게이트와 입력 게이트 역할을 하나로 합친 셈이다). 리셋 게이트 는 새 후보를 계산할 때 이전 은닉 상태를 얼마나 참고할지를 정한다.
마지막 식에서 와 가 합이 1이 되도록 맞물려 있어, “옛 정보를 얼마나 남길지”와 “새 정보를 얼마나 받아들일지”가 하나의 게이트로 동시에 조절된다는 점이 LSTM의 망각·입력 게이트 두 개를 따로 학습하는 것과 대비된다.
| 비교 항목 | LSTM | GRU |
|---|---|---|
| 상태 개수 | 셀 상태 + 은닉 상태 (2개) | 은닉 상태 만 (1개) |
| 게이트 개수 | 망각·입력·출력 (3개) | 리셋·업데이트 (2개) |
| 파라미터 수 | 상대적으로 많음 | 상대적으로 적음(계산·학습이 가볍다) |
| 표현력 | 게이트가 세분화되어 더 정교한 제어 가능 | 구조가 단순해 적은 데이터·자원에서 유리한 경우가 많음 |
| 성능 경향 | 과제에 따라 다름(둘 다 우열이 고정적이지 않음) | 과제에 따라 다름(둘 다 우열이 고정적이지 않음) |
시험에서는 “LSTM과 GRU 중 무엇이 항상 더 우수하다”는 식의 보기가 나오면 틀린 진술일 가능성이 높다는 점을 기억해 두자. 두 구조의 성능 우열은 데이터와 과제에 따라 달라진다는 것이 일반적인 결론이다.
자주 틀리는 점
- RNN의 가중치 가 “시점마다 다른 값”이라고 착각하는 경우가 많다. 실제로는 모든 시점에서 동일한 행렬을 공유하며, 이 공유 때문에 긴 시퀀스에서 곱셈이 누적되어 기울기 문제가 심해진다.
- LSTM이 “기울기 소실을 완전히 없앤다”고 오해하기 쉽다. 정확히는 셀 상태의 덧셈 경로 덕분에 크게 완화하는 것이지, 여전히 매우 긴 시퀀스에서는 소실이 발생할 수 있다.
- GRU가 “LSTM보다 항상 성능이 좋다” 또는 “항상 더 나쁘다”는 진술은 옳지 않다. GRU는 구조가 간단해 계산이 가볍다는 장점이 있을 뿐, 성능은 과제·데이터에 따라 달라진다.
- 망각 게이트 값이 1이라는 것은 “이전 기억을 모두 버린다”가 아니라 이전 기억을 모두 통과시켜 그대로 남긴다는 뜻이다. 0과 1의 의미를 반대로 외우는 실수가 흔하다.
핵심 정리
- RNN은 은닉 상태 를 시점마다 갱신하며, 시간 축으로 펼치면 가중치를 공유하는 여러 층으로 볼 수 있다.
- 시간 역전파(BPTT)는 같은 가중치 를 시퀀스 길이만큼 반복 곱하므로, 일반 심층망보다 기울기 소실·폭발이 훨씬 빠르고 극단적으로 나타난다.
- LSTM은 셀 상태 와 망각·입력·출력 3개 게이트를 도입해, 덧셈 위주의 경로로 장기 의존성 문제를 완화한다.
- GRU는 셀 상태를 은닉 상태에 통합하고 게이트를 리셋·업데이트 2개로 줄여 구조를 가볍게 만든 변형이다.
마무리 복습
참고 자료
- Ian Goodfellow 외, Deep Learning — https://www.deeplearningbook.org
- Stanford CS224n: Natural Language Processing with Deep Learning — https://cs224n.stanford.edu