CS/기계학습

[기계학습] RNN

dbwls-log 2025. 6. 14. 00:01

Time-series Data 

시계열 데이터의 활용 분야 

1. 예측/예보 

- 주가 예측 

- 날씨 예측 

- 기계 고장 예측 

- 풍속/풍향 예측 

- 농산물 가격/수요 예측 

 

2. 언어 번역 

- 언어는 시간적 순서를 가짐 → 문장 단위로 순차적인 처리 

 

3. 음성 인식 

- 시간에 따라 입력이 달라짐 → 순서대로 처리해야 정확하게 인식 

 

4. 신경 공학 

- 생체 신호도 시계열 형태 데이터 

 

5. 생성 모델 

- 이미지를 보고 설명 문장을 생성하는 등 이미지에 대한 설명도 시간의 흐름이 필요할 수 있다. 

 

 

시계열 데이터 예시 

숫자 2를 온라인으로 쓰는 경우 시간에 따라 펜이 움직인 경로가 기록된다. 

심전도 신호도 3채널 데이터로 구성되는데, 이 둘의 핵심은 시간 축을 따라 연속된 신호라는 점이다. 

 

시계열 데이터의 특징 

1. 순서가 중요하다. 

단어 순서가 바뀌면 의미가 달라지는 것처럼, 시계열 데이터는 순서를 꼭 지켜야한다. 

 

2. 샘플 길이가 다르다. 

발음이나 센서 측정 길이는 사람/환경마다 다를 수 있다. 

 

3. 문맥 의존성 

앞에서 말한 정보에 따라 뒤의 의미가 달라진다. 

 

4. 계절성 

반복되는 주기가 있다. 

예를 들면, 여름엔 에어컨의 매출이 증가한다던가, 미세먼지의 수치에 변화가 생기는 등이 있다. 

 

 

시계열 데이터의 표현 방식 

데이터는 벡터의 시퀀스(vector of vectors) 형태로 표현된다. 

 

예를 들어, 뇌파 신호를 초당 100번, 2분 동안 기록을 하면 T=12,000개의 벡터가 생긴다. 

그 때의 학습 데이터는 아래와 같이 구성된다. 

 

 

RNN : Recurrent Neural Network 

RNN의 개념 

RNN은 순환 신경망으로 기억을 가지고 있는 신경망이다. 

1982년 John Hopfield가 제안했다. 

 

입력값들이 상호 연결되어 있고, 이전 결과를 다시 피드백하는 구조를 갖는다는 특징을 가지고 있다. 

 

 

RNN의 핵심 특징 

시간성 

입력 데이터를 한꺼번에 처리하는 것이 아니라 순서대로 하나씩 입력해야 한다. 

 

가변 길이 처리 

데이터의 길이가 T면 은닉층도 T번 반복되어야 한다. 

즉, 입력 길이에 따라 구조가 유동적으로 바뀐다. 

 

문맥 의존성 

이전 시점의 정보를 가지고 있다가, 적절하게 사용해야 한다. 

나는 학교에 가는 중에서 "가는"이라는 글자가 "학교에" 뒤에 와야 자연스러운 것처럼 말이다. 

 

RNN의 구조 

MLP와 비슷하게 입력층 - 은닉층 - 출력층 구조를 가지지만, 은닉층에 순환 연결이 있어, 이전의 은닉 상태를 다음 시점으로 넘겨준다. 

 

이를 통해 시간 흐름에 따라 데이터를 처리하고, 가변 길이에 대응하며, 문맥 유지가 가능해지는 것이다. 

 

현재 은닉 상태는 이전 은닉 상태와 현재 입력값의 조합으로 계산된다. 

일반 MLP와 RNN의 구조 차이

 

수식 정리 

RNN은 반복적으로 계산 되는데, 예를 들어 t=1에서 계산된 값을 바탕으로 t=2를 계산하고, 그 결과를 바탕으로 t=3을 계산하는 방식을 가진다. 

 

수식으로 변환을 해보면 아래와 같다.

h⁽ᵗ⁾ = f(h⁽ᵗ⁻¹⁾ ,  x⁽ᵗ⁾ ;  Θ)

 

Θ는 RNN의 학습 파라미터들이고, 이전의 은닉 상태와 현재의 입력이 들어가서 현재 은닉 상태를 계산한다. 

학습은 BPTT (BackPropagation Through Time)이라는 기법으로 진행되며, 이는 일반적인 역전파에 시간 축을 더한 개념이다. 

 

 

RNN의 전체 흐름

V, U, W 라는 파라미터 3개가 필요하다. 

U : 입력 x⁽ᵗ⁾를 은닉상태 h⁽ᵗ⁾로 보내는 가중치 

W : 이전 은닉상태 h⁽ᵗ⁻¹⁾를 현재 은닉상태 h⁽ᵗ⁾로 전달하는 가중치 (시간 순환) 

V : 현재 은닉 상태 h⁽ᵗ⁾로 부터 출력 y⁽ᵗ⁾를 계산하는 가중치 

 

이 전체 네트워크는 시간에 따라 펼쳐진 구조이고, 각 시점에서 입력받고, 은닉 상태를 계산해서 출력까지 내보내는 구조이다. 

우리가 학습해야 할 것은 바로 {U, V, W}를 잘 찾아내는 것이다. 

 

아래 수식을 제일 아래에서 부터 보자. 

1. 처음 상태 h⁽⁰⁾과 첫 입력 x⁽¹⁾를 이용하여 h⁽¹⁾을 계산한다. 

2. 그 결과와 x⁽²⁾로 h⁽²⁾를 계산한다. 

3. 이를 끝까지 반복하여 최종 h⁽ᵗ⁾를 구한다. 

 

 

이전 은닉 상태들이 계속 누적되기 때문에, RNN이 기억을 가진다고 하는 것이다. 

하지만 동시에 이전 값이 뒤로 갈수록 영향력이 줄어드는 기울기 소실문제가 발생한다. 

 

 

출력 표현 방식 

RNN은 조건부 확률을 출력으로 표현한다. 

p(y1x1),p(y2x1,x2),…,p(ytx1,...,xt)

입력이 누적될수록 은닉 상태가 정보를 저장해서 다음 출력의 기반이 된다. 

 

가중치 공유 효과 

모든 시점에 같은 파라미터를 공유한다. (W_hh, W_xh, W_hy)

 

시퀀스 구조를 잘 파악할 수 있고, 가변 길이의 처리가 가능하며, 파라미터 수가 감소하여 일반화에 유리하다는 장점이 있다.

 

 

다양한 RNN 아키텍처 

Many-to-one 

여러 입력을 받아서 마지막 출력만 생성한다. 

 

Many-to-Many

여러 입력을 받아서, 각 입력마다 출력을 생성한다. 

예를 들어 영상 프레임을 입력받아 각 프레임마다 자막을 생성하는 것이다. 

 

Bidirectional RNN 

양방향 RNN이라고 불리며 과거 정보뿐만 아니라 미래 정보도 함께 고려한다. 

이를 통해 문맥 이해력이 좋아질 수 있다. 

예를 들어 문장 전체를 이해할 때 앞 뒤 문맥을 모두 반영하는 것과 같다. 

 

 

역전파의 한계 

역전파는 손실함수에서 시작해서 각 시점으로 거꾸로 전파되어야 한다. 

즉, 마지막 시간 스텝까지 모두 계산을 마쳐야 역전파가 가능하다는 것이다. 

이걸 BPTT라고 부른다. 

 

하지만 시퀀스가 너무 길면 역전파를 너무 오래해야한다. 그럼 계산 비용이 커지고, 기술이 소실 문제가 생긴다. 

즉, 긴 시퀀스를 처리하기가 어려운 것이다. 

 

 

역전파의 한계에 대한 해결법 

길이가 너무 긴 시퀀스를 한번에 학습하지 않고, 여러 구간으로 나누어 처리하면 된다. 

예를 들어 100단계를 한번에 처리하지 않고, 10단위로 나누어 학습하는 것이다. 

이를 Truncated BPTT (잘라서 역전파)라고 한다. 

 

여러 블록으로 나눠서 각 블록마다 순전파와 역전파를 수행한다. 

빨간 화살표는 역전파, 파란 화살표는 순전파를 의미한다. 

이렇게 나누어서 학습을 하면 메모리도 아끼고, 기울기 소실 문제도 해결할 수 있다. 

 

 

 

LSTM : Long Short-Term Memory 

Long Term Dependency : 장기 의존성 문제 

장기 의존성이란 멀리 떨어진 입력이 중요한 정보를 담고 있지만, 시간이 지나며 그 정보의 영향력이 점점 사라지는 현상을 의미한다. 

 

예를 들어 아래와 같은 문장이 있다고 해보자. 

t=1인 길동은과 t=32인 쉬기로는 서로 밀접한 관련이 있다. 

 

"쉬기로"에서 누가 쉬는지를 알려면 처음에 나온 "길동은"을 기억하고 있어야 한다.

하지만 RNN은 시간 순서대로 정보를 전달하면서 앞의 정보가 점점 희미해지는 특성이 있다. 

그래서 t=32에서는 "길동은"에 대한 정보가 약해져있기 때문에 해당 문장의 의미 파악이 어려워진다. 

 

 

LSTM이란? 

Long Short-Term Memor란 이름 그대로 단기 기억과 장기 기억을 동시에 모델링하는 구조이다. 

 

📍 왜 LSTM이 필요할까?

RNN은 과거 정보를 계속 전달하면서도 입력이 많아지면 예전 정보가 점점 사라지는 장기 의존성 문제를 겪는다. 

이러한 문제를 해결하기 위해 LSTM이 등장한 것이다. 

 

과거의 문제를 잘 기억하면서, 중요한 정보선택적으로 기억하고, 덜 중요한 정보잊을 수 있도록 설계되어 있다. 

 

 

🔎 입력으로 사건(정보)을 받고, 단기/장기 기억을 갱신한 뒤 다음 예측에 사용한다.  

 

 

LSTM의 구조 

1. Gate Structure for selecting memory 

LTSM에는 4가지의 게이트가 존재한다. 

 

 

1️⃣ 망각 게이트 : Forget gate 

쓸모 없는 기억은 버린다. 

 

2️⃣ 입력 게이트 : input gate

어떤 새로운 정보를 기억할지 말지 결정한다. 

 

3️⃣ 기억 게이트 : memory gate 

장기 기억을 어떻게 업데이트할지 조절한다. 

 

4️⃣ 출력 게이트 : output gate 

어떤 기억을 출력으로 보낼지 결정한다. 

 

즉, 이 4가지의 게이트를 통해 기억할지 잊을지를 결정하는 것이다. 

 

기존 RNN은 중요한 단어의 영향을 잊지만, LSTM은 중요한 정보를 끝까지 잘 유지하는 모습을 볼 수 있다. 

 

 

2. Flow of memory and gates 

LSTM은 시간에 따라 장기기억을 전달한다. 

각 시간 단계마다 입력 게이트, 망각 게이트, 출력 게이트가 작동하여 메모리를 유지하거나 비워준다. 

 

아래 그림을 보면 o로 되어 있는 경우엔 게이트가 열린 것이고, -로 되어 있는 경우엔 게이트가 닫힌 것이다. 

t=5일 때를 보면 망각 게이트는 열려 있고, 나머지 출력, 입력 게이트는 닫혀있다. 

따라서 t=4에서 넘어온 기억 중 쓸모 없는 기억은 잊고, 새로운 데이터의 입력(중요한 데이터 저장)과 출력은 일어나지 않는다. 

이런 과정을 통해 LSTM은 필요한 정보만 잘 기억하는 구조를 유지한다. 

 

3. input gate and output gate 

➡️ 입력 게이트 

현재 시점의 입력 데이터를 기억 셀에 반영할지 말지 결정한다.

 

⬅️ 출력 게이트 

현재 시점의 출력값을 밖으로 꺼내서 전달할지 말지 결정한다. 

 

각각 열린 상태에서는 신호가 흘러 정보 전달이 가능하고, 닫힌 상태에서는 신호가 차단되어 정보 전달이 불가능하다. 

 

 

여기서는

t=1에서 새로운 인물 정보를 기억한다

t=2~5에서는 중요하지 않은 내용이라 기억도 안하고 출력도 안한다. 

t=32~33에서는 중요한 정보를 기억에 저장하고 출력도 한다. 

 

즉, LSTM은 중요한 정보만 기억하고 필요한 순간에 꺼내서 쓰는 구조를 가지고있다. 

 

Training of LSTM 

LSTM Cell 의 구조 

아래의 왼쪽 그림은 기본적인 LSTM 셀의 구조이고, 오른쪽은 각 게이트가 LSTM 셀 내부에서 어떤 역할을 하는지 설명한 그림이다. 

 

💡 핵심 요소 

f𝑡 : 망각 게이트 

이전 기억 C𝑡-𝟣 중 어떤 정보를 잊고, 어떤 정보를 잊지 않을지 결정한다. 

 

i𝑡 : 입력 게이트 

새로운 정보를 기억할지 하지 않을지(받아들일지) 결정한다. 

 

g𝑡 

새로운 기억의 후보로, tanh를 통해 생성된다. 

 

o𝑡 : 출력 게이트 

최종 출력으로 보낼 정보를 선택한다. 

 

각 게이트 값 계산 

각 게이트는 x𝑡(현재 입력), h𝑡-𝟣 (이전 출력)로 계산된다. 

i_t = σ(W_xi * x_t + W_hi * h_{t-1} + b_i) ← 입력 게이트
f_t = σ(W_xf * x_t + W_hf * h_{t-1} + b_f) ← 망각 게이트
o_t = σ(W_xo * x_t + W_ho * h_{t-1} + b_o) ← 출력 게이트
g_t = tanh(W_xg * x_t + W_hg * h_{t-1} + b_g) ← 새 기억 후보

 

이걸 이용해서 장기 기억 상태인 C𝑡를 업데이트한다. 

망각 게이트 f𝑡가 이전 기억을 얼마나 유지할지 조절, i𝑡⊙g𝑡는 새롭게 받아들일 정보를 의미한다. 

 

 

최종 출력 계산 

현재 시점의 단기 기억인 h𝑡는 아래와 같이 계산된다.

C𝑡는 전체 기억이고, 그 중 얼마나 출력할지를 o𝑡가 정한다. 

 

 

 

LSTM Model 

다양한 구조의 LSTM 

📍 적층 LSTM (Stacked LSTM) 

여러 층의 LSTM을 쌓은 구조로, 아래층(LSTM1) 출력이 위층(LSTM2)의 입력으로 들어간다. 

더 복잡하고 깊은 특성을 학습할 수 있다는 특징을 가지고 있으며, 문장 분류, 감정 분석 등에 사용된다. 

 

 

📍 양방향 LSTM (Bi-directional LSTM) 

입력 시퀀스를 앞 → 뒤 방향뿐만 아니라 뒤 → 앞 방향으로도 처리하는 구조로, 하나의 시점에서 과거 정보뿐만 아니라 미래 정보도 고려할 수 있다. 

문장의 앞뒤 단어를 모두 참고하는 등의 문맥 파악이 더 정밀해진다는 특징이 있으며, 개체명 인식(NER)이나 문맥 기반 번역 등에 사용된다. 

 

 

문제 유형에 따른 구조 다양화 

📍 분류 또는 예측 문제 

시퀀스 데이터를 받아 마지막 출력 하나만 사용하는 구조이다. (Many-to-one)

영화 리뷰 시퀀스를 입력 받아 감정(P/N)을 예측하는 등에 사용된다. 

 

📍 비디오 프레임 분류 

시퀀스의 각 시점마다 출력을 만들어 내는 구조이다. (Many-to-Many)

비디오 프레임마다 동작 라벨링을 하는 등에 사용된다. 

 

📍 언어 번역  

입력 시퀀스를 모두 처리한 후, 다른 시퀀스를 생성하는 구조이다. 

Encoder-Decoder 구조라고도 불리며 입력 시퀀스를 압축해서 상태로 전달한 후, 출력 시퀀스를 디코딩한다. 

"나는 학생입니다"라는 한글 문장을 "I am a student"라는 영어 문장으로 바꾸는 등에 사용된다. 

 

 

 

GRU : Gated Recurrent Unit 

GRU의 등장 배경 

GRU는 2014년 발표된 논문에서 처음 제안되었다. 

번역 작업처럼 시퀀스를 다루는 문제에서 기존 RNN보다 더 효율적인 구조가 필요했고, 그 결과로 GRU가 등장한 것이다. 

 

 

GRU 구조 

GRU란 LSTM의 장점은 유지하면서도 구조는 단순화 시킨 RNN이다. 

 

C𝑡 (셀 상태, 장기 기억)이 없고, 대신 h𝑡(은닉 상태)가 장기/단기 기억을 모두 담당한다. 

게이트 수가 LSTM보다 적고 계산도 간단하다. 

 

게이트 구성 요소는 리셋 게이트, 업데이트 게이트, g𝑡이다. 

 

리셋 게이트 : Reset Gate, r𝑡 

과거 정보를 얼마나 반영할지 조절하는데, 낮게 설정되면 과거는 무시된다. 

 

업데이트 게이트 : Update Gate, z𝑡 

과거 상태와 현재 새로운 기억 중 어떤 것을 반영할지 결정한다. 

 

g𝑡 

현재 입력으로부터 생성된 새로운 기억이다. 

 

 

 

GRU 수식 정리 

1. 게이트 계산 

리셋 게이트 r𝑡 와 업데이트 게이트 z𝑡를 계산한다. 

 

여기서 σ는 시그모이드 함수이고, W는 가중치 행렬이다. 

 

 

2. 새로운 기억 계산 

과거 기억 h𝑡-𝟣과 입력 x𝑡, 그리고 리셋 게이트를 이용하여 새로운 기억 h𝑡를 만든다.  

 

 

3. 최종 기억 (업데이트 된 은닉 상태) 

과거 기억과 새로운 기억을 업데이트 게이트로 가중합 계산한다. 

z𝑡가 크면 과거 기억을 유지하고, 작으면 새로운 기억을 많이 반영한다. 

 

 

 

Application 

1. 음악 작곡 

 

2. 비디오의 소리를 저장 

 

3. 손글씨 생성 

 

4. 주식 예측 

 

5. 텍스트 생성 (seq2seq model) 

 

6. 주식 예측 

 

7. 신경 생물학적 신호 해독