본문 바로가기
학습/AI

RNN 핵심 정리

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

1. return_sequences의 의미

RNN 층에서 return_sequences출력의 형태를 결정하는 옵션입니다. 즉, “모든 시점의 출력을 반환할지, 마지막 시점만 반환할지” 를 설정합니다.


🔹 구조 비교

설정값 출력 형태 출력 크기 사용 예시
return_sequences=False 마지막 시점의 출력만 반환 (batch_size, units) 문장 전체의 감정 분류 등 (한 개의 출력)
return_sequences=True 모든 시점의 출력 반환 (batch_size, timesteps, units) 다음 RNN 층 연결, 시계열 예측 등

🧩 예시 코드

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

# 1. 마지막 시점 출력만 반환 (기본값)
model_1 = Sequential([
    Input(shape=(4, 9)),  # (timesteps=4, input_dim=9)
    SimpleRNN(8, return_sequences=False),
    Dense(9, activation='softmax')
])
model_1.summary()
출력: (batch_size, 8) → Dense(9)

# 2. 모든 시점의 출력 반환
model_2 = Sequential([
    Input(shape=(4, 9)),
    SimpleRNN(8, return_sequences=True),
    Dense(9, activation='softmax')
])
model_2.summary()
출력: (batch_size, 4, 8) → 각 시점마다 예측 (시계열 전체 예측)

💬 비유로 이해하기

상황 비유
return_sequences=False 영화 전체를 보고 마지막에 평가 한 번 하는 경우
return_sequences=True 영화의 매 장면마다 평가를 기록하는 경우

2.  RNN 구조 설계 연습

(입력 차원, 출력층 설정 이해)


🧩 입력 구조

RNN의 입력은 항상 3차원 텐서입니다.

(batch_size, timesteps, input_dim)
요소 의미 예시
batch_size 학습 시 한 번에 처리할 샘플 수 32
timesteps 시계열의 길이 (몇 개의 데이터가 순서대로 들어오는가) 4 (예: hell → o)
input_dim 각 시점의 입력 벡터 길이 9 (예: one-hot 인코딩된 문자)

🧠 출력층 구조

  • 이진 분류Dense(1, activation='sigmoid')
  • 다중 분류Dense(클래스 수, activation='softmax')
  • 회귀 예측Dense(1, activation='linear')

✅ 예시 코드

model = Sequential([
    Input(shape=(4, 9)),  # 4개의 timestep, 각 timestep은 9차원 벡터
    SimpleRNN(16, activation='tanh'),
    Dense(9, activation='softmax')  # 9개의 알파벳 중 하나 예측
])

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

3.  평균, 오차, 정확도의 문제점

모델 평가에서 자주 사용하는 평균(loss)정확도(accuracy) 는 단순하지만, 데이터 불균형이나 손실 종류에 따라 한계가 있습니다.


⚙️ 주요 지표 요약

지표 의미 문제점
Loss (손실) 모델이 정답에서 얼마나 벗어났는지 (예: crossentropy) 값의 절대적 의미는 어려움 (낮을수록 좋음)
Accuracy (정확도) 전체 중 예측이 맞은 비율 데이터 불균형 시 신뢰도 낮음
Average (평균) 전체 손실의 평균값 이상치(outlier)에 민감함

💡 보완 방법

  • 정확도만 보지 말고 손실곡선(loss curve) 함께 보기
  • F1-score, Precision, Recall 등 다른 지표도 확인
  • Epoch마다 시각화로 학습 상태 모니터링

4. 시각화 코드 (학습 결과 확인)

학습 후 손실(loss)과 정확도(acc)를 시각화하면 학습 흐름을 쉽게 볼 수 있습니다.


import matplotlib.pyplot as plt

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

plt.figure(figsize=(10,4))
plt.plot(h1.history['accuracy'], label='Accuracy')
plt.plot(h1.history['loss'], label='Loss')
plt.xlabel('Epochs')
plt.ylabel('Value')
plt.title('RNN 학습 정확도 및 손실 변화')
plt.legend()
plt.show()

의미

  • accuracy 상승 → 모델이 점점 더 정확하게 예측
  • loss 감소 → 예측이 실제값에 가까워짐
  • accuracy가 멈추고 loss만 진동 → 과적합 신호

5️⃣ 예측 결과를 판다스로 변환하고 정렬하기

예측 결과를 DataFrame으로 바꿔서, 가장 확률이 높은 클래스를 직관적으로 볼 수 있습니다 👇


import pandas as pd

class_names = ['h','e','l','o','a','p','b','y','w']

# 예측
pred = model.predict(X_test)

# DataFrame으로 변환
pred_df = pd.DataFrame(pred, columns=class_names)

# 확률 높은 순으로 정렬
sorted_pred = pred_df.T.sort_values(by=0, ascending=False)

display(sorted_pred)
출력 예시
(예시 형태)

결과 해석

  • 각 문자가 예측될 확률이 표시됨
  • 예: 'o'의 확률이 0.98 → “hell → o” 예측 성공

📘 전체 요약

항목 핵심 내용
return_sequences False → 마지막 출력만 / True → 모든 시점 출력
입력 구조 (batch_size, timesteps, input_dim)
출력층 구조 분류 목적에 따라 Dense 설정
평균·오차·정확도 단일 지표 의존은 위험, 시각화 병행
시각화 코드 학습곡선으로 과적합 판단 가능
pandas 변환 예측 확률을 정렬해 직관적으로 확인 가능

✨ 한 줄 요약

return_sequences출력의 개수, 입력/출력 차원은 데이터 구조의 핵심, 정확도보다 손실곡선과 시각화를 함께 보며 모델을 이해하는 것이 진짜 실력입니다.

728x90
반응형