728x90
반응형
https://pandas.pydata.org/docs/reference/api/pandas.Series.str.contains.html
pandas 설명
딥러닝 정규 표현식 도큐먼트
🎯 학습 목표
- 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
반응형
'학습 > AI' 카테고리의 다른 글
| RNN 핵심 정리 (0) | 2025.11.14 |
|---|---|
| 임베딩(Embedding) 이란? (0) | 2025.11.13 |
| 합성곱 신경망(CNN), 신경망 성능 개선, 전이학습 (0) | 2025.11.11 |
| [ 딥러닝 ] Batch의 개념을 비유하여 설명하기 (0) | 2025.11.10 |
| 활성화 함수, 오차 역전파, 경사하강법 (1) | 2025.11.08 |