이번에는 RNN(Recurrent Neural Network, 순환 신경망)에 대해 정리해보겠습니다.(본 내용은 고려대학교 김성범 교수님의 유튜브 강의와 연세대학교 이기복 교수님 피피티를 참고하여 정리한 것입니다.)
RNN은 시계열 데이터, 자연어 처리, 음성 신호 등과 같이 순서(Sequence)가 중요한 데이터를 다루는 데 효과적으로 활용됩니다.
Sequence Data
Sequence Data란? 시간에 따라 관측되어 시간의 영향을 받게 되는 데이터
시계열 데이터
아래 데이터는 센서가 5개(설명 변수가 5개)인 시계열 데이터

시간의 흐름이 중요하기 때문에 순서가 바뀌면 안됨!
한 시점에서 상태를 알 때는 그 시점에서의 변수도 중요하지만, 이전 시점의 정보도 영향이 있음!
e.g.) 17:00 상태를 예측할 때 센서 1 ~ 5의 변수를 활용하는 것도 중요하지만, 이전 시점(16:00의 상태와 센서 값들의 정보도 영향을 줄 수 있다는 뜻!
즉, RNN은 이전 시점의 정보까지 활용해서 예측을 하는 모델이라고 생각하시면 됩니다!
그럼 이 모델이 왜 만들어진거지? 기존의 뉴럴 네트워크와는 어떤 차이점이 있지? 를 생각해보면 RNN이 왜 만들어졌는지 쉽게 이해할 수 있습니다.
DNN(뉴럴 네트워크)
기존의 뉴럴네트워크는 한개의 입력값이 주어지고, 한개로 출력을 하는 모델입니다. 그것을 One to One모델이라고 합니다.

위 사진 처럼 이미지를 분류한다고 했을 때, 이미지 사진(Input)이 주어지면, Label을 예측(Output) 하게되는 모델이죠
e.g.) 푸들 사진이 주어졌을 때, 이 사진이 고양이 인지, 사람인지, 강아지인지 예측하는 모델

위 예시는 하나의 입력 데이터가 주어졌을 때, 뉴럴 네트워크를 활용하여 정상인지 불량인지 예측하는 과정을 시각화한 그림입니다.
각 단계에서의 역할을 보겠습니다.
- 설명변수 (Input, $x_1 \sim x_5$)
- 설명변수는 모델이 예측을 위해 입력으로 사용하는 값입니다. 여기서는 특정 시점(T=1, 12:00)에 측정된 센서1~센서5 값이 하나의 입력 벡터를 이룬다고 볼 수 있죠
- 은닉층 $h_1$
- 은닉층은 여러 설명변수를 조합해 예측에 유용한 특징을 추출하는 단계입니다.
- 여기서는 가중치와 비선형 함수(tanh)를 통해 센서 값들의 관계를 학습하며, 이 과정을 통해 원래 입력보다 더 잘 구분되는 표현 $h_1$이 만들어집니다. $h_1$의 식은 아래와 같습니다.
- $\mathbf{h}_1 = f(W_{xh}\mathbf{x}_1), \quad f(\cdot)=\tanh$
- 반응 변수 $\mathbf{y}_1$
- 반응변수는 모델이 최종적으로 예측하고자 하는 값이죠. 은닉층에서 추출된 특징을 기반으로 softmax 함수를 적용해 정상/불량에 대한 확률을 출력하게 됩니다.
- 최종적으로 정상일 확률과 불량일 확률을 예측하는 단계죠! $\mathbf{y}_1$의 식은 아래와 같습니다.
- $\mathbf{y}_1 = g(W_{hy}\mathbf{h}_1), \quad g(\cdot)=\mathrm{softmax}$
- 혹시 비선형 함수(tanh, softmax, sigmoid)에 대해서 모르신다면 아래 블로그에서 참고하셔도 좋을 것 같습니다.
이제 2번째, 3번째에도 입력 데이터가 주어졌을 때 상태를 예측하는 방식도 위와 같습니다.


DNN의 한계
여기서 일반적인 뉴럴 네트워크(DNN)의 한계가 드러나죠! 기본적인 DNN은 각 시점의 입력 데이터를 독립적으로 처리하며, 이전 시점의 정보가 현재 예측에 영향을 미친다는 가정을 포함하지 않고 있습니다.
즉, 각 시점에서의 설명변수와 가중치, 비선형 함수를 이용해 예측을 수행할 뿐, 과거 시점의 데이터는 현재 예측에 반영되지 않고있죠
하지만 시계열 데이터의 경우, 이전 시점의 상태가 현재 상태에 영향을 주는 경우가 많죠? 이러한 시간적 의존성을 고려하지 못한다는 점이 DNN의 한계입니다. 이 문제를 해결하기 위해 이전 시점의 정보를 기억하고 다음 예측에 활용할 수 있는 구조인 RNN(Recurrent Neural Network)이 제안된거죠! RNN이 왜 만들어졌는지 이제 알게되었습니다!
그러면 어떻게 이전 정보를 기억하고 다음 예측에 활용할까요? → 이제 RNN의 구조에 대해서 자세하게 살펴보도록 하죠!
RNN
RNN은 이전 시점의 정보를 현재 시점에 반영하는 신경망이죠
아래 그림은 t 시점의 상태를 예측할 때, 직전 시점(t−1)의 정보만을 활용하는 기본적인 RNN 구조를 나타냅니다.

그림을 보시면, 이전 시점의 정보를 반영하기 위해 현재 시점의 은닉 상태 $h_t$는 $h_{t-1}$의 정보를 함께 입력받습니다. 이렇게 해야 이전 시점에서 학습된 정보가 현재 시점의 상태에 반영될 수 있습니다.
그렇다면 이전 시점의 정보는 어떻게 제공될까요? 이를 위해 RNN에서는 새로운 은닉 상태에 대한 식이 추가됩니다. $\mathbf{h}_t = f(W_{xh}\mathbf{x}_t+W _ {hh}h_{t-1})$

위 식에서 볼 수 있듯이, 현재 시점의 은닉 상태 $\mathbf{h}t$는 입력 $\mathbf{x}t$뿐만 아니라 이전 시점의 은닉 상태 $h{t-1}$도 함께 사용해 계산됩니다. 즉, $h{t-1}$의 정보를 전달하기 위한 항 $W_{hh}h_{t-1}$이 새롭게 추가된거죠!
기존 DNN에서는 은닉층이 $\mathbf{h}_t = f(W_{xh}\mathbf{x}_t)$와 같이 입력만을 기반으로 계산되었지만, RNN에서는 이전 시점의 정보를 반영하기 위해 이전 시점의 은닉층이 포함됩니다.
이렇게 함으로써 이전 시점에서 어떤 특징에 가중치가 집중되었는지가 현재 시점의 은닉 상태에 자연스럽게 반영되며, 시간에 따른 정보의 흐름을 학습할 수 있게 됩니다.
그렇다면 전 시점(t−1)의 정보만 반영하는 것보다, 그 이전 시점의 정보까지 함께 활용한다면 더 많은 정보를 담을 수 있겠죠? 이에 따라 이번에는 아래 그림을 통해 t−2 시점의 정보까지 반영하는 경우를 살펴보겠습니다.

현재 시점의 은닉 상태는 $\mathbf{h}_t = f(W_{xh}\mathbf{x}_t+W_{hh}h_{t-1})$로 주어집니다. 그런데 여기서 중요한 점은, $h_{t-1}$자체도 이미 더 이전 시점의 정보를 반영한 결과라는 것입니다.
실제로 t-1시점의 은닉 상태는 다음과 같이 계산됩니다. $\mathbf{h}_{t-1} = f(W_{xh}\mathbf{x}_{t-1}+W_{hh}h_{t-2})$
즉, $\mathbf{h}_{t-1}$에는 t-2시점의 정보가 이미 포함되어 있습니다. 따라서 현재 시점의 $\mathbf{h}_{t}$는 간접적으로 t-2시점의 정보까지 함게 반영하게 됩니다.
같은 논리를 적용하면, $\mathbf{h}_{t-2}$역시 더 이전 시점의 영향을 받습니다. $\mathbf{h}_{t-2} = f(W_{xh}\mathbf{x}_{t-2}+W_{hh}h_{t-3})$
이처럼 RNN의 은닉 상태는 이전 시점의 정보가 반복적으로 전달되면서 더 과거의 정보까지 누적해 반영하게 됩니다.
RNN은 현재 시점 t를 예측할 때, 단순히 현재 입력만 사용하는 것이 아니라 이전 시점들의 정보를 함께 활용합니다. 이를 통해 더 중요한 정보를 반영할 수 있고, 결과적으로 예측 성능도 향상됩니다. 이것이 바로 RNN의 핵심 아이디어입니다!
RNN의 궁극적인 목적은 t시점의 출력 $y_t$를 정확히 예측하는 것입니다. 이때 현재 시점의 관측치와 은닉 상태만 사용하는 것이 아니라, 과거의 정보까지 함께 이용하자는 것이 RNN의 출발점입니다. 과거의 정보는 각 시점의 은닉층에 요약되어 있으며, 이 은닉 상태들이 반복적으로 결합되면서 현재 시점의 은닉층에는 이전 시점들의 정보가 자연스럽게 축적됩니다. 이를 통해 RNN은 시간에 따른 패턴을 학습할 수 있게 되는 것이죠!
RNN 구조 다양성
기존의 뉴럴네트워크는 One to One모델이었죠? 이제 그러면 RNN 구조의 종류를 한번 살펴보겠습니다.

RNN은 순차적으로 입력하고, 순차적으로 예측하는 것이 가능합니다.
그 중에서도 입력의 길이, 순차적인 예측의 길이에 따라서도 위에 4가지처럼 분류가 됩니다.
- Many to One
- 여러 시점의 X로 하나의 Y를 예측하는 문제입니다.
- 여러 시점에 따른 데이터가 주어졌을 때 t시점의 상태를 예측하는게 바로 Many to One의 구조입니다.
- 여러 시점의 X로 하나의 Y를 예측하는 문제입니다.

- One to Many
- 단일 시점 X로 순차적인 Y를 예측하는 문제입니다.
- 이미지 데이터가 주어졌을 때, 이미지에 대한 정보를 글로 생성하는 것이 One to Many입니다.

- Many to many
- 순차적인 X로 순차적인 Y를 예측하는 문제입니다.


- 문장이 주어졌을 때, 각 단어의 품사를 예측하는 POS Tagging
- 또 다른 예로, 비디오(영상)의 각 프레임을 분류하는 경우를 생각해볼 수 있습니다. 이때는 시간 순서대로 입력되는 이미지들을 각각의 레이블로 변환하게 되며, 이는 Many-to-Many 구조에 해당합니다.
- Many to many(many to one + one to many)
- 위에서 설명한 Many to many와는 다른 개념!(왼쪽 그림이 위에서 설명한 Many to many, 오른쪽 그림이 지금 설명하는 Many to many)

- 지금 설명하는 Many to many는 입력을 다 받고 나서, 다음 y를 예측하는 문제입니다.

- 영어 문장이 주어졌을 때, 한글 문장으로 번역하는 문제가 이 구조에 해당하게 됩니다.
순환신경망 파라미터 학습
RNN의 기본 구조를 전체적으로 이해했다면, 이제는 모델이 데이터를 통해 학습해야 할 파라미터들을 살펴볼 차례입니다. RNN에서는 총 3가지 종류의 파라미터를 추정하게 됩니다. 각각의 파라미터의 역할은 다음과 같습니다.
- t 시점 데이터 반영하는 파라미터 → $W_{xh}$
- t 시점 이전 정보 반영하는 파라미터 → $W_{hh}$
- t 시점의 y를 예측하는 파라미터 → $W_{hy}$
여기서 중요한 점은, 이 3개의 파라미터가 모든 시점에서 동일한 값을 공유한다는 것입니다. 즉, RNN은 parameter sharing 구조를 가정하고 있습니다.

예를 들어 t-2 시점에서 t-1 시점으로 정보를 전달할 때 사용되는 $W_{hh}$와, t-1 시점에서 t시점으로 전달될 때 사용되는 $W_{hh}$는 동일한 파라미터 입니다.
이와 마찬가지로 입력을 처리하는 가중치 $W_{xh}$역시 시점에 관계없이 같은 값을 사용합니다. 이렇게 시간 축 전체에서 동일한 파라미터를 공유하는 것이 RNN의 기본 가정이며, 이를 통해 시간에 따른 패턴을 일관되게 학습할 수 있습니다.
시점이 많아질수록 모델 구조는 시간 축 방향으로 길어지며 동일한 연산이 반복되게 됩니다. 이러한 반복 구조를 모두 그리기에는 복잡하기 때문에, 보통은 아래 그림과 같이 간략화된 형태로 표현합니다.

이처럼 시점에 따라 같은 구조가 반복되기 때문에 이를 Recurrent라고 부르며, 한글로는 순환 신경망(RNN)이라고 불리게 되었습니다.
그럼 이제 파라미터를 학습하는 방법을 설명하겠습니다. 각각의 파라미터는 Loss가 최소가 되도록 파라미터를 학습하게 됩니다! 여기서 Loss는 실제값 $\mathbf{y}_t$ 예측값 $\hat{\mathbf{y}}_t$의 차이입니다. 즉, 예측한 값과 실제 값의 차이가 줄어들도록 반복적으로 학습하면서 파라미터들을 Update하는 것입니다!

학습대상의 순서는 다음과 같습니다.

- Loss 계산하기
- 입력값이 주어지면 현재 파라미터를 이용해 예측값 $\hat{\mathbf{y}}_t$을 계산하고, 실제값 $\mathbf{y}_t$와의 차이를 통해 Loss를 계산합니다.
- 초기에는 가중치에 대한 정보가 없기 때문에 보통 작은 값이나 균등한 값으로 초기화하여 학습을 시작합니다.
- Gradient 계산하기
- 계산된 Loss를 기준으로, 각 파라미터가 Loss에 얼마나 영향을 미쳤는지를 역방향으로 미분하여 Gradient를 구합니다.
- RNN에서는 이 과정이 시간 축을 따라 진행되며, 이를 BPTT(Backpropagation Through Time)라고 합니다.
- Parameter Update
- 구해진 Gradient를 이용해 Loss를 줄이는 방향으로 파라미터를 업데이트합니다.
- 이때 보통 Gradient Descent 방법을 사용하며, 이 과정을 반복하면서 모델의 예측 성능을 점점 개선해 나갑니다.
- 여기서 사진을 보면 지금은 Many to one의 구조입니다. 여기서 의문이 들 수 있는 것은 Many to Many일때는 Loss가 어떻게 계산되는거지? 라고 생각할 수 있습니다. 그때는 보통 각 시점의 Loss값의 평균을 전체 Loss로 사용한다고 합니다.(아래 그림 참고)


아래 그림은 RNN에서 Gradient를 어떻게 계산하는지, 그중에서도 출력 가중치 $W_{hy}$에 대한 역전파 과정을 보여주는 그림입니다. 즉, 오차 역전파(Backpropagation)를 통해 $W_{hy}$의 Gradient를 계산하는 과정을 시각화한 것입니다.

- 은닉 상태 $h_t$가 출력층으로 전달되어 예측값 $\hat{\mathbf{y}}_t$을 생성
- 예측값 $\hat{\mathbf{y}}_t$와 실제값 $\mathbf{y}_t$ 차이로 Loss 계산
- 이 Loss가 출력 가중치 $W_{hy}$에 얼마나 영향을 미쳤는지 Chain Rule로 미분하게 됩니다.
이와 같은 방식으로 $W_{hh}$와 $W_{xh}$도 구하는 방식은 비슷합니다.


최종적으로 각각의 파라미터 업데이트는 아래의 그림과 같이 학습됩니다.

RNN의 한계
위 예제에서는 이해를 돕기 위해 시점이 3개인 간단한 RNN 구조를 사용했습니다. 하지만 실제 시계열 데이터에서는 시점이 100개 이상으로 길어지는 경우도 흔합니다. 그렇다면 시점이 이렇게 길어지면 어떤 문제가 발생할까요? 시퀀스 길이가 길어질수록 RNN은 각 시점의 은닉 상태를 모두 거쳐 역전파를 수행해야 하므로 계산량이 급격히 증가합니다. 더 중요한 문제는, 이 과정에서 수행되는 미분 값들이 연속적으로 곱해진다는 점입니다.
RNN의 은닉 상태는 $\mathbf{h}_t = tanh(W_{xh}\mathbf{x}_t+W_{hh}h_{t-1})$이었죠? 역전파 과정에서 기울기는 체인 룰에 의해 이전 시점으로 전달되는데, 이때 tanh 함수의 미분값은 항상 0과 1 사이의 값을 가집니다.(아래 그림 참고) 즉, 시점이 하나 늘어날 때마다 0~1 사이의 값이 계속 곱해지게 됩니다. 그렇다면 이런 값들이 100번 이상 곱해지면 어떻게 될까요? 결과적으로 기울기는 점점 0에 수렴하게 되고, 이는 오래된 과거 시점의 정보가 현재 시점의 학습에 거의 영향을 주지 못한다는 의미입니다.

이처럼 시퀀스가 길어질수록 과거 정보의 영향이 사라지는 현상을 기울기 소실(vanishing gradient) 이라고 하며, 이는 RNN이 장기 의존성(long-term dependency)을 효과적으로 학습하지 못하는 구조적 한계로 이어집니다.

이러한 한계를 해결하기 위해, 이후에 LSTM이나 GRU와 같은 구조가 등장하게 됐다고 합니다! 그래서 다음 글에서는 이런 장기 의존성 문제를 해결하기 위해서 어떻게 모델을 또 만들었는지 작성해보도록 하겠습니다.
마지막으로 RNN과 DNN의 차이점을 간략하게 확인하고 마치겠습니다.
RNN과 DNN의 차이점
| 항목 | DNN | RNN |
| 과거 정보 반영 | X | O |
| 시점 간 의존성 | 없음 | 있음 |
| 핵심 아이디어 | 현재 입력만으로 예측 | 과거 정보를 누적해 예측 |
핵심은 과거 정보를 반영하냐 안하냐!
이상으로 RNN 정리 마치도록 하겠습니다. 감사합니다.
'딥러닝' 카테고리의 다른 글
| [딥러닝] Long Short-Term Memory(LSTM) (0) | 2026.01.23 |
|---|