본문 바로가기
AI/DeepLearning

[DL] RNN(순환신경망) 맛보기

by TSpoons 2025. 2. 18.

RNN(Recurrent Neural Network)

  • 시계열 데이터 처리에 특화된 아키텍처
  • 이전 단계의 정보를 기억하고 활용할 수 있는 능

Sequence(시퀀스 데이터)

  • 문장을 구성하는 단어들의 순서
  • 시간에 따른 주식 가격의 변화
  • 음성 신호의 연속된 파형

순환신경망 구조

입력층반복(hidden) 층출력층

  1. 입력층 (Input Layer)
    • 시퀀스 데이터 (예: 문장, 주식 가격, 음성 신호)
    • 시점(t)에 따라 나눠진 입력 벡터 ( x_t )
    • 예: 자연어 처리라면 단어 임베딩 벡터, 시계열 데이터라면 숫자 값
  2. 반복(hidden)층 (Recurrent Hidden Layer)
    • 현재 시점(t)의 입력 ( x_t )과 이전 시점(t-1)의 hidden state ( h_{t-1} )를 사용하여 새로운 hidden state ( h_t )를 계산
  3. 출력층 (Output Layer)
    • 최종 출력 ( y_t )을 생성
    • 예측 결과를 Softmax, Sigmoid 등을 사용해 출력

반복층(hidden layer)

  • 현재 입력 을 받음
  • 이전 히든 상태와 결합
  • 가중치 연산 후 새로운 히든 상태 생성
  • 출력층에 전달하거나 다음 시점으로 전달

예제 코드

import torch
import math
import matplotlib.pyplot as plt
from torch.utils.data import TensorDataset, DataLoader
import torch.nn as nn

class DataCollector:
    def __init__(self):
        self.sin_x = torch.linspace(-2*math.pi, 2*math.pi, 100)
        self.sin_y = torch.sin(self.sin_x) + 0.1*torch.randn(len(self.sin_x))

    def show_data(self):
        plt.plot(self.sin_x, self.sin_y)
        plt.show()

class myDataLoader:
    def __init__(self, data_collector, n_time=10):
        self.n_time = n_time
        self.sin_x = data_collector.sin_x
        self.sin_y = data_collector.sin_y
        self.n_sample = len(self.sin_x) - n_time    

    def get_dataloader(self):
        self.input_data = torch.zeros((self.n_sample, self.n_time, 1))
        self.correct_data = torch.zeros((self.n_sample, 1))

        for i in range(self.n_sample):
            self.input_data[i] = self.sin_y[i:i+self.n_time].view(-1,1) # (시각 수 , 입력 수)
            self.correct_data[i] = self.sin_y[i+self.n_time:i+self.n_time+1]

        dataset = TensorDataset(self.input_data, self.correct_data)
        train_loader = DataLoader(dataset, batch_size= 8, shuffle = True)

        return train_loader

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.rnn = nn.RNN(input_size = 1, hidden_size = 64, num_layers= 2, batch_first=True)
        self.fc = nn.Linear(64,1)

    def forward(self, x):
        y_rnn, h = self.rnn(x, None)
        y = self.fc(y_rnn[:,-1,:])
        return y

RNN 이용 분야(with GPT)

1. 자연어 처리 (NLP, Natural Language Processing)

  • 텍스트 생성: 챗봇, 자동 번역, 감성 분석
  • 음성 인식: 음성-텍스트 변환(STT), 가상 비서(AI Assistant)
  • 문장 요약: 긴 문장을 요약하는 기술

2. 시계열 데이터 분석

  • 주식 예측: 과거 가격 데이터를 바탕으로 미래 가격 예측
  • 날씨 예측: 기상 데이터 분석 및 예측 모델
  • 센서 데이터 처리: IoT 기기에서 수집된 데이터를 활용한 이상 탐지

3. 음성 및 영상 처리

  • 음성 합성 (TTS): 텍스트를 음성으로 변환
  • 영상 캡션 생성: 영상 내용을 분석하여 자막 자동 생성
  • 행동 예측: 스포츠 분석, 보안 시스템에서 행동 패턴 분석

RNN 한계

  1. 기울기 소실(Vanishing Gradient) 문제
  • 시간이 길어질수록, 과거의 정보가 현재에 영향을 미치기 어려움
  • 원인은 backpropagation 과정에서 기울기(gradient)가 0에 가까워지면서 학습이 잘 안 되기 때문
  1. 장기 의존성(Long-term dependency) 문제
  • 문장이 길어지면 문맥을 유지하기 어려움
  • 오래된 정보가 사라지고 최근 정보만 반영되는 경향이 있음

이런 문제를 해결하기 위해 LSTM, GRU 같은 개선된 구조가 등장함.

참고

https://stanford.edu/~shervine/teaching/cs-230/cheatsheet-recurrent-neural-networks

https://www.geeksforgeeks.org/introduction-to-recurrent-neural-network/

https://medium.com/@rameesanadeem9/a-comprehensive-guide-to-recurrent-neural-networks-rnns-3091b834d509

https://www.researchgate.net/figure/A-simple-RNN-with-a-single-hidden-layer-At-each-time-step-output-is-produced-through_fig2_346853926

https://www.pycodemates.com/2023/08/recurrent-neural-networks-explained.html

'AI > DeepLearning' 카테고리의 다른 글

[DL] CNN(합성곱신경망) 맛보기  (0) 2025.02.12
[DL] 딥러닝 훓어보기  (0) 2025.02.10