본문 바로가기
학습/AI

RNN( Recurrent Neural Network )의 개념

by 황성안 2025. 11. 12.
728x90
반응형

https://pandas.pydata.org/docs/reference/api/pandas.Series.str.contains.html

pandas 설명

https://wikidocs.net/21703

딥러닝 정규 표현식 도큐먼트

 

🎯 학습 목표

  • RNN의 개요를 이해한다.
  • Simple RNN을 이용해 순차적 데이터(Sequential data)를 학습한다.
  • RNN의 구조, 특징, 한계점을 학습한다.
  • 간단한 알파벳 예측 모델을 구현한다.

🧩 RNN의 개요

🔹 RNN이란?

  • Recurrent Neural Network (순환 신경망)시간적 순서가 있는 데이터(Sequential Data)를 다루는 신경망.
  • 문장, 음성, 영상, 시계열 데이터처럼 이전 정보가 다음 결과에 영향을 주는 데이터를 학습할 수 있다.

DNN, CNN은 공간적(지역적) 특성은 잘 추출하지만 시간적인 순서(Temporal Relation) 분석은 어렵기 때문에 RNN이 고안됨.


🧠 RNN의 작동 원리

  • 여러 개의 데이터를 순서대로 입력하면서, 이전 입력의 출력을 다음 단계의 입력으로 순환 연결함.
  • 이전 시점의 상태(hidden state)가 다음 시점의 계산에 영향을 줌.
  • 과거 정보를 기억하고, 현재 입력과 결합하여 출력을 생성.

ht=tanh⁡(Wxhxt+Whhht−1+b)h_t = \tanh(W{xh}x_t + W{hh}h_{t-1} + b)ht=tanh(Wxhxt+Whhht−1+b)

기호 의미
xtx_txt 현재 입력 데이터
hth_tht 현재 은닉 상태
WxhW_{xh}Wxh 입력 가중치
WhhW_{hh}Whh 순환(은닉→은닉) 가중치
bbb 편향 (bias)

🧠 RNN의 특징

특징 설명
시간 순서 정보 기억 과거 입력을 기억하여 현재에 반영
순환 구조 이전 출력이 다음 입력으로 연결됨
시간적 패턴 학습 시계열 변화 패턴을 분석 가능

⚠️ RNN의 한계점

문제 설명 해결 방안
Gradient Vanishing 시간이 지남에 따라 기울기가 0에 가까워져 장기 의존 관계 학습 어려움 LSTM, GRU 사용
Gradient Exploding 기울기가 지수적으로 증가 → 가중치 발산 Gradient Clipping
장기기억 취약 오래된 정보는 점차 영향력이 사라짐 LSTM 구조로 해결 가능

💡 Gradient Clipping

  • 너무 큰 기울기(Gradient)가 발생할 경우, 임계값을 설정하여 잘라내거나 비율로 감소시킴.

🔹 활성화 함수로 tanh를 사용하는 이유

함수 특징
Sigmoid 0~1 사이의 값, 기울기 소실이 빨리 발생
tanh -1~1 사이 값, 기울기 유지력이 높아 더 많은 시간 기억 가능
ReLU 반복 구조에서는 값이 커져 발산 가능 (적합하지 않음)

RNN은 순환 구조상 동일 레이어 반복 → tanh가 가장 안정적


🧮 RNN의 입력-출력 구조 유형

유형 설명 예시
다수 입력 → 단일 출력 여러 단어를 읽고 의미를 도출 문장 분류
단일 입력 → 다수 출력 하나의 이미지를 보고 설명을 생성 이미지 캡션
다수 입력 → 다수 출력 문장을 다른 언어로 번역 번역기
다수 입력 → 다수 출력 연속 프레임 분석 비디오 처리

🧰 Simple RNN 구조

📏 입력 텐서 형태

(batch_size, timesteps, input_dim)
항목 의미
batch_size 입력 데이터 샘플 개수
timesteps 시퀀스의 길이 (시간 축 길이)
input_dim 각 시점의 입력 벡터 차원

⚙️ 주요 파라미터

파라미터 설명
units 출력 노드 수 (RNN 셀 크기)
input_shape 입력 텐서의 크기
activation 활성화 함수 (tanh 권장)
return_sequences True → 전체 시퀀스 출력 / False → 마지막 출력만 반환

파라미터 수 계산: (입력 차원 + units) × units + bias


🧠 Simple RNN 실습

🎯 목표

“과거 4개의 알파벳을 기억하여 다음 알파벳을 예측하자.”

예시 데이터:

hello → h,e,l,l > o  
apple → a,p,p,l > e  
hobby → h,o,b,b > y  
below → b,e,l,o > w  
wheel → w,h,e,e > l

🧾 데이터 정의

1️⃣ 문자 원핫 인코딩 (총 9개)

h = [1,0,0,0,0,0,0,0,0]
e = [0,1,0,0,0,0,0,0,0]
l = [0,0,1,0,0,0,0,0,0]
o = [0,0,0,1,0,0,0,0,0]
a = [0,0,0,0,1,0,0,0,0]
p = [0,0,0,0,0,1,0,0,0]
b = [0,0,0,0,0,0,1,0,0]
y = [0,0,0,0,0,0,0,1,0]
w = [0,0,0,0,0,0,0,0,1]

2️⃣ 입력(X)과 출력(y)

X_data = np.array([
 [h,e,l,l],
 [a,p,p,l],
 [h,o,b,b],
 [b,e,l,o],
 [w,h,e,e]
])

y_data = np.array([o, e, y, w, l])
  • X_data.shape → (5, 4, 9)
  • y_data.shape → (5, 9)

🧱 모델 설계

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Dense, SimpleRNN

model = Sequential()
model.add(Input(shape=(4,9)))
model.add(SimpleRNN(units=2, activation="tanh", return_sequences=False))
model.add(Dense(9, activation='softmax'))

model.compile(loss="categorical_crossentropy",
              optimizer="adam",
              metrics=['accuracy'])

🧮 학습 및 시각화

h1 = model.fit(X_data, y_data, epochs=1000)

plt.plot(h1.history['accuracy'])
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.legend(['accuracy'])
plt.show()

결과:

  • Epoch 1000에서 accuracy: 1.0000
  • 모든 학습 데이터 완벽 예측

🔍 예측

X_test = np.array([[h,e,l,l]])
pred = model.predict(X_test)
예시 입력 예측 결과
hell o
appl e
hobb y

모델이 문자열 패턴의 순차 관계를 학습하여 다음 문자 예측에 성공.


📘 정리

항목 핵심 내용
RNN 순차적 데이터(시간 정보 포함) 학습용 신경망
작동 방식 이전 출력이 다음 입력으로 연결
한계 Gradient Vanishing / Exploding
개선 기법 Gradient Clipping, LSTM, GRU
활성화 함수 tanh (장기 기억 유지에 유리)
SimpleRNN 기본 순환 신경망 구조, 문자 예측 실습 가능

✨ 한 줄 요약

RNN은 과거 정보를 기억해 현재 예측에 반영하는 순환 신경망으로, 시계열·텍스트·음성 등 “시간의 흐름이 있는 데이터” 학습에 특화된 모델이다.


 

 

728x90
반응형