RNN(recurrent neural network, 순환 신경망)은 텍스트, 음성, 시계열처럼 순서가 있는 데이터를 다루기 위해 만든 신경망입니다. 각 단계에서 현재 입력과 이전 단계의 은닉 상태를 함께 사용하므로, 출력은 앞에서 무엇이 나왔는지에 영향을 받을 수 있습니다.

이것이 핵심 아이디어입니다. RNN에는 계속 이어지는 메모리가 있습니다. LSTM은 중요한 정보가 여러 단계를 지나도 유지되어야 할 때, 그 메모리를 더 신중하게 관리하도록 만든 게이트 기반 RNN입니다.

RNN이 각 시간 단계에서 하는 일

시간 단계 tt에서, 단순한 RNN은 보통 다음과 같은 규칙으로 은닉 상태를 업데이트합니다.

ht=tanh(Wxxt+Whht1+b).h_t = \tanh(W_x x_t + W_h h_{t-1} + b).

여기서 xtx_t는 현재 입력, ht1h_{t-1}는 이전 은닉 상태, hth_t는 새로운 은닉 상태입니다. 행렬 WxW_x, WhW_h, 그리고 편향 bb는 학습 과정에서 조정됩니다.

모델이 각 단계마다 출력도 만든다면, 자주 쓰이는 형태는 다음과 같습니다.

yt=Wyht+c.y_t = W_y h_t + c.

정확한 출력 규칙은 과제에 따라 달라집니다. 어떤 문제는 단계마다 출력이 필요하고, 어떤 문제는 마지막 은닉 상태만 사용합니다.

은닉 상태가 중요한 이유

피드포워드 신경망은 하나의 입력을 보고 다음으로 넘어갑니다. 반면 RNN은 이전 계산의 일부를 다시 사용합니다. 바로 이 재사용 덕분에 텍스트, 음성, 시계열, 그 밖의 순서 있는 데이터에 유용합니다.

은닉 상태는 모델이 각 단계가 끝날 때 자기 자신에게 남기는 짧은 메모라고 생각할 수 있습니다. 다음 단계는 그 메모를 읽고, 업데이트한 뒤, 수정된 버전을 다시 앞으로 전달합니다.

같은 입력들이라도 순서를 바꾸면 은닉 상태도 보통 달라집니다. 즉, 시퀀스의 순서는 중요합니다.

RNN 예제로 보기

실제 RNN은 보통 벡터와 비선형 활성화 함수를 사용합니다. 계산을 쉽게 보기 위해, 여기서는 숫자 하나만 있는 간단한 상태를 사용해 보겠습니다.

ht=0.5ht1+xt,h0=0.h_t = 0.5 h_{t-1} + x_t, \quad h_0 = 0.

이제 시퀀스 x1=2x_1 = 2, x2=1x_2 = -1, x3=3x_3 = 3을 처리해 봅시다.

첫 번째 단계:

h1=0.5(0)+2=2.h_1 = 0.5(0) + 2 = 2.

두 번째 단계:

h2=0.5(2)+(1)=0.h_2 = 0.5(2) + (-1) = 0.

세 번째 단계:

h3=0.5(0)+3=3.h_3 = 0.5(0) + 3 = 3.

여기서 중요한 것은 정확한 공식 자체가 아닙니다. 핵심은 이전 상태에 의존한다는 점입니다. 2단계의 업데이트는 x2x_2만 사용하는 것이 아니라, 1단계에서 전달된 정보도 함께 사용합니다. 이것이 RNN의 핵심 아이디어입니다.

순서를 바꿔서 x1=1x_1 = -1, x2=2x_2 = 2, x3=3x_3 = 3을 사용하면 다음과 같습니다.

h1=1,h2=0.5(1)+2=1.5,h3=0.5(1.5)+3=3.75.h_1 = -1, \quad h_2 = 0.5(-1) + 2 = 1.5, \quad h_3 = 0.5(1.5) + 3 = 3.75.

같은 숫자들이 등장했는데도 최종 상태는 달라집니다. 바로 이 점 때문에 RNN은 입력 집합만 보는 모델이 아니라, 순서를 다루는 시퀀스 모델입니다.

기본 RNN이 긴 시퀀스에서 어려움을 겪는 이유

기본 RNN에서는 오래된 정보가 반복되는 많은 업데이트를 거치며 살아남아야 합니다. 시퀀스가 길어지면 이것이 어려워질 수 있습니다. 중요한 신호가 점점 약해질 수 있고, 학습 중에는 그래디언트가 여러 단계를 거치며 너무 작아지거나 너무 커질 수도 있습니다.

그래서 일반적인 RNN은 시퀀스의 훨씬 앞부분 정보에 의존하는 과제에서 자주 어려움을 겪습니다. 순환 구조 자체가 잘못된 것은 아닙니다. 문제는 단순한 은닉 상태 업데이트만으로는 장기 의존성을 유지하기가 어렵다는 데 있습니다.

LSTM이 RNN의 메모리를 어떻게 개선하는가

LSTM은 long short-term memory의 약자로, 게이트를 가진 RNN입니다. 더 구조화된 메모리 경로를 도입하는데, 보통 이를 셀 상태(cell state)라고 부릅니다. 그리고 어떤 정보를 잊을지, 어떤 새 정보를 기록할지, 어떤 부분을 출력으로 드러낼지를 조절하는 게이트가 함께 있습니다.

핵심을 이해하는 데 모든 게이트 방정식이 꼭 필요한 것은 아닙니다. 중요한 점은 이 구조가 모델에게 메모리를 더 세밀하게 제어할 수 있게 해준다는 것입니다. 어떤 정보가 여러 단계 동안 유지되어야 한다면, LSTM은 일반 RNN보다 그것을 보존할 준비가 더 잘 되어 있습니다.

그렇다고 LSTM이 모든 것을 영원히 기억한다는 뜻은 아닙니다. 다만 어떤 정보를 유지하고 어떤 정보를 버릴지 더 잘 학습할 수 있는 구조라는 뜻입니다.

쉬운 말로 보는 RNN과 LSTM의 차이

기본 RNN은 하나의 누적 상태를 계속 업데이트합니다. LSTM은 그 아이디어 위에 더 강한 메모리 메커니즘을 추가한 구조입니다.

시퀀스가 짧고 의존성이 가까운 범위에 있다면 일반 RNN만으로도 충분할 수 있습니다. 하지만 훨씬 이전 정보가 중요한 과제라면, LSTM이 더 안전한 선택인 경우가 많습니다.

RNN과 LSTM에서 자주 하는 오해

RNN은 전체 시퀀스를 한 번에 본다고 생각하기

보통은 그렇지 않습니다. 표준적인 그림은 한 단계씩 처리하면서 상태를 앞으로 전달하는 방식입니다.

LSTM이 메모리 문제를 완벽히 해결한다고 가정하기

LSTM은 장기 의존성 문제를 완화하는 데 도움이 되지만, 여전히 유한한 용량과 현실적인 한계를 가진 학습 모델입니다.

시퀀스의 순서를 무시하기

RNN은 순서가 있는 데이터를 위해 만들어졌습니다. 시퀀스 원소의 순서를 섞으면 계산 결과도 달라집니다.

은닉 상태를 사람이 읽을 수 있는 메모리라고 생각하기

은닉 상태는 학습된 수치 표현이지, 문장처럼 깔끔하게 읽히는 요약문이 아닙니다.

RNN과 LSTM은 언제 사용될까

이들은 언어 모델링, 음성, 손글씨, 센서 스트림, 시계열 예측 같은 시퀀스 문제에 사용됩니다. 오늘날 많은 언어 과제에서는 대신 트랜스포머를 사용하지만, RNN과 LSTM은 시퀀스 메모리의 개념을 분명하게 보여주고 더 작거나 특수한 환경에서는 여전히 유용할 수 있기 때문에 중요합니다.

직접 해보기

직접 4단계 시퀀스를 하나 만들고, 규칙 ht=0.5ht1+xth_t = 0.5 h_{t-1} + x_t를 적용해 보세요. 그런 다음 두 입력의 순서를 바꾸고 최종 상태를 비교해 보세요. 이 작은 실험은 RNN이라는 약어만 보는 것보다 순환 구조의 역할을 훨씬 더 분명하게 보여줍니다.

다른 경우도 살펴보고 싶다면, 이 페이지를 transformer나 Markov chain 설명과 비교해 보세요. 각 모델이 과거 정보를 어떻게 다루는지 눈여겨보면 좋습니다.

문제 풀이가 필요하신가요?

문제를 올리면 검증된 단계별 풀이를 몇 초 만에 받을 수 있습니다.

GPAI Solver 열기 →