순서를 다루는 모델: RNN과 LSTM
딥러닝이 이미지에서 큰 성공을 거둔 뒤, 사람들은 곧 다른 질문을 던지기 시작했다. 사진만 잘 본다고 해서 세상을 잘 이해하는 것은 아니기 때문이다. 우리의 현실에는 순서가 중요한 데이터가 아주 많다. 문장은 앞뒤가 바뀌면 뜻이 달라지고, 음성은 시간의 흐름 속에서 의미가 생기며, 주가나 센서 로그는 이전 상태를 모르면 현재를 해석하기 어렵다. 이 장에서는 딥러닝이 이런 순차 데이터를 어떻게 다루기 시작했는지, 그리고 왜 결국 더 강력한 구조가 필요해졌는지를 살펴본다.

순차 데이터란 무엇인가
순차 데이터는 말 그대로 순서 자체가 정보인 데이터다. 같은 재료를 써도 배열이 달라지면 의미가 달라진다. 예를 들어 "강아지가 사람을 쫓았다"와 "사람이 강아지를 쫓았다"는 등장하는 단어는 비슷하지만, 순서가 바뀌는 순간 전혀 다른 장면이 된다. 숫자 데이터도 마찬가지다. 오늘 기온이 20도이고 내일이 10도인 것과, 오늘이 10도이고 내일이 20도인 것은 같은 숫자 두 개를 가지고도 다른 흐름을 만든다.
이런 데이터는 여러 곳에서 등장한다. 문장과 대화 같은 자연어, 시간에 따라 변하는 음성 신호, 서버의 이벤트 로그, 주가나 판매량 같은 시계열, 사용자의 클릭 흐름이 모두 순차 데이터다. 여기서는 개별 항목 하나하나보다도 앞에서 무엇이 왔는지, 그리고 그것이 지금 무엇을 의미하게 만드는지가 중요하다.
이 점이 순차 데이터를 어렵게 만든다. 보통의 피드포워드 신경망은 입력을 한 번에 받아 정해진 계산을 수행한다. 하지만 문장은 길이가 제각각이고, 중요한 정보가 맨 앞에 있을 수도 맨 뒤에 있을 수도 있다. 모델은 현재 단어만 보는 것이 아니라, 지금까지 지나온 흐름을 기억해야 한다.
문장, 음성, 시계열은 왜 특별한가
순차 데이터의 핵심은 "현재"가 혼자 존재하지 않는다는 데 있다. 현재는 과거와 연결되어 있다. "은행"이라는 단어를 보았다고 하자. 이 단어가 금융 기관인지, 강가의 둑인지 알려면 앞 문맥을 봐야 한다. "대출 상담을 받으러 은행에 갔다"와 "강가의 은행이 무너졌다"는 같은 단어를 완전히 다르게 해석한다.
음성도 비슷하다. 사람의 발음은 짧은 조각으로 나뉘지만, 실제 의미는 연속된 흐름 속에서 나타난다. 한 음절은 앞뒤 소리와 연결되어야 제대로 인식된다. 시계열 데이터에서는 더 직접적이다. 갑작스러운 상승이 이상 현상인지 정상 변동인지 판단하려면 이전 구간을 알아야 한다.
즉 순차 데이터는 하나의 점이 아니라 흐름으로 읽어야 한다. 딥러닝은 이 흐름을 표현할 새로운 장치가 필요했고, 그 요구에 대한 대표적 답이 바로 RNN이었다.
RNN의 아이디어: 한 칸씩 읽는 신경망
RNN은 Recurrent Neural Network, 즉 순환 신경망이다. 이름이 조금 어렵지만 핵심 생각은 의외로 단순하다. 입력 전체를 한 번에 보지 않고, 하나씩 순서대로 읽으면서 이전의 상태를 다음 계산에 넘긴다는 것이다.
예를 들어 문장을 왼쪽에서 오른쪽으로 읽는다고 해보자. 첫 번째 단어를 읽고 어떤 내부 상태를 만든다. 두 번째 단어를 읽을 때는 그 단어만 보는 것이 아니라, 첫 번째 단어를 읽고 난 뒤의 내부 상태도 함께 사용한다. 세 번째 단어를 읽을 때는 다시 두 번째 단계까지의 상태를 이어받는다. 이렇게 모델은 입력을 따라가며 조금씩 문맥을 쌓아 간다.
이 내부 상태를 보통 은닉 상태(hidden state)라고 부른다. 은닉 상태는 일종의 작업 메모리다. 지금까지 본 정보를 압축해서 들고 다니는 작은 노트라고 생각하면 된다. 새 입력이 들어올 때마다 모델은 이 노트를 갱신한다. 중요한 내용을 적고, 덜 중요한 내용은 흐리게 만들며, 현재 판단에 필요한 형태로 정보를 바꿔 저장한다.
그래서 RNN은 순차 데이터를 다룰 수 있었다. 문장을 읽을 때 앞 단어의 영향을 뒤 단어 해석에 반영할 수 있었고, 시계열 데이터를 볼 때 이전 시점의 상태를 현재 예측에 사용할 수 있었다. 피드포워드 신경망에 비해 한 단계 더 "문맥적인" 모델이 된 것이다.
은닉 상태는 어떻게 문맥을 유지할까
RNN의 계산을 아주 직관적으로 적으면 이렇다. 현재 시점의 은닉 상태는 현재 입력과 이전 은닉 상태를 합쳐 만들어진다. 기호로는 보통 다음처럼 쓴다.
h_t = f(x_t, h_{t-1})
여기서 x_t는 현재 입력, h_{t-1}은 바로 이전까지의 기억, h_t는 새로 갱신된 기억이다. 함수 f는 가중치와 활성화 함수를 포함한 신경망의 계산이라고 보면 된다.
이 구조의 중요한 점은, 모델이 매 시점마다 같은 규칙을 반복해서 쓴다는 것이다. 첫 번째 단어든 열 번째 단어든, 같은 신경망이 입력을 읽고 상태를 갱신한다. 그래서 길이가 다른 문장도 처리할 수 있다. 문장이 짧으면 몇 번만 반복하고, 길면 더 많이 반복하면 된다.
예를 들어 "나는 어제 극장에서 아주 재미있는 영화를 봤다"라는 문장을 생각해 보자. RNN은 "나는"을 읽고 주어에 대한 정보를 만들고, "어제"를 읽으며 시간 정보를 추가하고, "극장에서"를 읽으며 장소 정보를 쌓는다. 뒤에 "봤다"가 나왔을 때는 앞에서 모아 둔 정보를 토대로 문장의 사건을 해석한다. 지금 읽는 단어 하나만 보지 않고, 앞에서 형성된 문맥 전체를 참고하는 셈이다.
이 아이디어는 당시로서는 대단히 강력했다. 자연어 처리, 음성 인식, 번역, 자막 생성, 시계열 예측 같은 문제에서 RNN은 "순서를 가진 입력을 처리하는 대표 모델"로 자리 잡았다.
하지만 기억은 생각보다 쉽게 사라진다
문제는 이 아름다운 아이디어가 긴 문맥 앞에서는 쉽게 흔들린다는 점이다. 이론상으로는 RNN이 앞에서 본 정보를 계속 전달할 수 있어야 한다. 그러나 실제 학습에서는 오래된 정보가 점점 희미해진다. 문장 맨 앞의 단어가 맨 뒤 예측에 영향을 줘야 할 때, 그 신호가 중간 단계를 거치며 점점 약해지는 것이다.
이 현상을 이해하려면 딥러닝의 학습 과정을 떠올리면 된다. 모델은 손실을 줄이기 위해 역전파를 수행한다. 즉, 뒤에서 나온 오차 신호가 앞쪽 가중치들까지 전달되어야 한다. 그런데 RNN은 시간축으로 길게 펼쳐진 구조이기 때문에, 오차 신호도 많은 단계를 거슬러 올라가야 한다. 이 과정에서 기울기가 반복적으로 작아지면 앞부분까지 학습 신호가 거의 도달하지 못한다. 이것이 기울기 소실(vanishing gradient) 문제다.
반대로 어떤 경우에는 기울기가 너무 커져 학습이 불안정해지기도 한다. 이를 기울기 폭주(exploding gradient)라고 부른다. 폭주는 기법으로 어느 정도 제어할 수 있었지만, 더 근본적인 어려움은 역시 소실이었다. 모델이 오래된 정보를 붙잡아야 하는데, 학습 신호가 그만큼 멀리 가지 못하는 것이다.
장기 의존성 문제는 왜 어려운가
기울기 소실이 실제로 만드는 대표적인 문제가 장기 의존성(long-term dependency) 문제다. 말은 조금 딱딱하지만 뜻은 간단하다. 현재 판단에 필요한 단서가 한참 이전에 있을 때, RNN이 그것을 안정적으로 기억하고 활용하기 어렵다는 뜻이다.
예를 들어 영어 문장에서 주어와 동사가 멀리 떨어져 있을 때를 생각해 보자. 모델은 문장 앞쪽의 주어가 단수인지 복수인지 기억해야 뒤쪽 동사 형태를 맞출 수 있다. 또는 긴 문단에서 처음 제시된 인물이나 주제를 몇 문장 뒤까지 유지해야 할 수도 있다. 인간에게는 자연스러운 일이지만, 기본 RNN에게는 꽤 버거운 과제였다.
왜 그럴까. RNN의 은닉 상태는 한 번 갱신될 때마다 새 입력의 영향을 받는다. 즉, 새로운 정보가 들어올수록 기존 기억은 덮이거나 흐려질 수 있다. 중요한 정보를 오래 보존해야 할 때와, 불필요한 정보를 빨리 지워야 할 때를 구분하는 능력이 충분히 정교하지 않았던 것이다. 쉽게 말해, 기본 RNN은 기억장치가 있긴 한데 무엇을 오래 기억하고 무엇을 잊을지 잘 조절하지 못했다.
그래서 짧은 문맥에서는 괜찮지만, 입력이 길어질수록 성능이 떨어지는 일이 많았다. 이는 RNN의 실패라기보다, 순차 데이터가 그만큼 어렵다는 뜻이기도 했다.
LSTM: 기억하고, 잊고, 꺼내 쓰는 법
이 문제를 해결하기 위해 등장한 대표 구조가 LSTM(Long Short-Term Memory)이다. 이름 그대로 짧은 정보와 긴 정보를 함께 다루려는 설계다. LSTM의 핵심은 단순히 상태를 계속 넘기는 것이 아니라, 어떤 정보는 저장하고, 어떤 정보는 버리고, 어떤 정보는 지금 꺼내 쓸지 조절하는 장치를 넣었다는 데 있다.
이 장치를 보통 게이트(gate)라고 부른다. 게이트는 정보의 문 같은 역할을 한다. 문을 활짝 열면 정보가 많이 지나가고, 거의 닫으면 정보가 막힌다. LSTM은 이 문들을 학습을 통해 스스로 조절한다.
LSTM에는 보통 세 가지 중요한 게이트가 있다고 설명한다.
망각 게이트는 기존 기억 중에서 무엇을 잊을지 정한다.
입력 게이트는 새로 들어온 정보 중 무엇을 저장할지 정한다.
출력 게이트는 현재 기억 중 무엇을 밖으로 드러낼지 정한다.
이 구조 덕분에 LSTM은 기본 RNN보다 훨씬 안정적으로 긴 문맥을 다룰 수 있었다. 중요한 정보는 셀 상태(cell state)라는 별도의 경로를 따라 비교적 손실 없이 전달하고, 덜 중요한 정보는 잊어버릴 수 있게 되었기 때문이다. 한마디로 말하면, 기본 RNN이 "계속 갱신되는 메모장"이었다면, LSTM은 "삭제와 보관 규칙이 생긴 메모장"에 가까웠다.
이 차이는 성능에서 크게 드러났다. 번역, 음성 인식, 언어 모델링 같은 문제에서 LSTM은 기본 RNN보다 더 긴 문맥을 기억했고, 학습도 더 잘 되었다. 딥러닝 역사에서 LSTM은 한동안 순차 데이터 처리의 표준 도구였다.
GRU: 더 단순하게, 하지만 꽤 강하게
LSTM이 강력하긴 했지만 구조가 다소 복잡하다는 점은 부담이었다. 게이트가 많고 계산량도 적지 않았다. 그래서 등장한 또 다른 변형이 GRU(Gated Recurrent Unit)다.
GRU 역시 기본 아이디어는 같다. 정보 흐름을 게이트로 조절해 장기 의존성 문제를 완화한다. 다만 LSTM보다 구조를 단순화했다. 셀 상태와 은닉 상태를 따로 두지 않고, 업데이트 게이트와 리셋 게이트를 중심으로 기억을 관리한다. 덕분에 구현이 비교적 간단하고, 데이터와 과제에 따라서는 LSTM과 비슷하거나 더 나은 성능을 보이기도 했다.
중요한 것은 LSTM과 GRU를 외워 구분하는 데 있지 않다. 두 모델이 공통으로 보여준 통찰이 핵심이다. 순차 데이터를 잘 다루려면 단순히 이전 상태를 넘기는 것만으로는 부족하고, 정보의 흐름을 선택적으로 제어하는 메커니즘이 필요하다는 사실이다.
RNN 계열이 실제로 잘했던 것
오늘날 트랜스포머가 워낙 강력해서, RNN을 오래된 기술처럼 느끼기 쉽다. 하지만 RNN 계열은 딥러닝 역사에서 매우 중요한 역할을 했다. 이 모델들은 처음으로 딥러닝이 시간의 흐름과 문맥을 본격적으로 다루게 만들었다.
무엇보다 RNN은 "입력을 순서대로 읽으며 상태를 갱신한다"는 사고방식을 정착시켰다. 이는 자연어 처리와 음성 처리의 문제를 신경망으로 풀 수 있게 만든 큰 전환이었다. 문장이 단순한 단어 집합이 아니라 흐름이라는 점, 의미가 현재 토큰 하나가 아니라 이전 문맥과 연결되어 있다는 점을 모델 구조로 구현한 것이다.
또한 RNN 계열은 인코더-디코더 구조, 시퀀스 투 시퀀스 학습, 문맥 기반 예측 같은 아이디어의 토대를 만들었다. 뒤이어 등장한 어텐션과 트랜스포머도 사실은 이 흐름 위에서 자라났다. 다시 말해, 트랜스포머는 RNN을 무시하고 나타난 것이 아니라, RNN이 부딪힌 한계를 정면으로 해결하려는 시도였다.
왜 RNN은 결국 자리를 내주었나
그렇다면 RNN과 LSTM이 그렇게 유용했는데도 왜 주역의 자리를 오래 지키지 못했을까. 가장 큰 이유는 두 가지다. 하나는 긴 문맥 처리의 근본적 어려움, 다른 하나는 병렬화의 한계다.
RNN은 순서를 따라 한 칸씩 계산해야 한다. 첫 번째 상태가 있어야 두 번째를 계산할 수 있고, 두 번째가 있어야 세 번째를 계산할 수 있다. 즉, 시점들 사이에 강한 순차 의존성이 있다. 이 구조는 문맥을 다루는 데는 자연스럽지만, 현대 하드웨어에서 학습을 크게 가속하기는 어렵다. 긴 문장을 한 번에 병렬 처리하기 힘들기 때문이다.
여기에 장기 의존성 문제가 겹친다. LSTM과 GRU가 이를 크게 개선했지만, 아주 긴 문맥을 다루는 데는 여전히 한계가 있었다. 정보가 멀리 떨어져 있을수록 모델은 힘들어졌고, 학습 속도와 성능 면에서도 더 나은 해법이 필요해졌다.
이 지점에서 등장한 것이 어텐션(attention)이다. 어텐션은 "이전 정보를 작은 상태 하나에 억지로 압축해 넣지 말고, 필요할 때 전체 입력 중 중요한 부분을 직접 참고하자"는 방향으로 문제를 다시 정의했다. 순차 데이터를 다루는 관점이 근본적으로 바뀐 것이다.
이 장에서 꼭 붙잡아야 할 감각
RNN을 이해하는 핵심은 공식을 외우는 데 있지 않다. 다음 감각을 붙잡으면 된다.
첫째, 순차 데이터는 순서가 바뀌면 의미가 달라진다. 그래서 모델은 현재 입력만이 아니라 이전 흐름을 함께 봐야 한다.
둘째, RNN은 은닉 상태를 통해 이전 정보를 다음 단계로 넘기며 문맥을 유지하려 했다. 이것은 딥러닝이 시간과 문장을 읽기 시작한 결정적 아이디어였다.
셋째, 기본 RNN은 긴 문맥에서 기억이 쉽게 흐려졌다. 기울기 소실과 장기 의존성 문제 때문에 오래된 정보를 안정적으로 배우기 어려웠다.
넷째, LSTM과 GRU는 게이트를 도입해 무엇을 저장하고 잊을지를 조절함으로써 이 문제를 상당히 개선했다. 하지만 순차 계산 구조 자체의 한계는 남아 있었다.
이제 다음 장으로 넘어가면, 딥러닝은 여기서 한 번 더 도약한다. 모델이 정보를 한 줄로 전달받기만 하는 대신, 입력 전체를 서로 연결해 바라보기 시작한다. 바로 어텐션의 탄생이다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
