본문 바로가기

Data Science/ML & DL

RNN 개요 | RNN

 

 

 

Sequential 데이터란


- 데이터의 순서 정보가 중요한 데이터셋으로 순서가 달라질 경우 의미가 바뀌거나 손상되는 데이터를 말한다.
- 예
    - 자연어 텍스트
    - 일정한 주기로 샘플링된 영상, 음성
    - 시계열(time series) 데이터 :순서 + 데이터가 발생한 시점 정보가 중요한 데이터셋
 
 

RNN (Recurrent Neural Network) 구조

- RNN은 Feature 추출기로 Recurrent Layer을 사용하는 딥러닝 모델을 말한다..
- Recurrent Layer는 sequential 데이터 처리에 좋은 성능을 낸다.
 

 

 

Recurrent Layer 구조

 
- RNN은 순서대로 입력되는 데이터를 반복 처리하는 Recurrent Layer를 이용해 Feature vector를 추출하고+ 
그 Feature vector를 Estimator Layer에 전달해 추론한다.

 -  DNN, CNN은 순서를 고려하지 않고 특성 추출과 추론을 한다.

메모리 시스템(Memory system)

- Sequential 데이터는 단순히 순서대로 처리하는 것 뿐만 아니라 이전 단계의 처리결과를 기억 = Memory 하고 그것을 현재 단계 처리에 사용한다.

- time step : Sequential 데이터 처리에서 순서대로 처리할 때 각각의 단계
 

- 예를 들어 4일간의 주가 변화로 5일째 주가를 예측하려면 입력받은 4일간의 주가를 순서를 기억하고 있어야 한다.
- Fully Connected Layer나 Convolution Layer의 출력은 이전 Data에 대한 처리와 상관없이 현재 데이터를 기준으로만 특성을 추출한다.
 
 

Simple RNN구조

wx : "x의 가중치" , wh :"h의 가중치" , b = w1, w2,w3

def RNN(X: "현재데이터", h:"이전처리"):
    return tanh(X@wx + h@wh + b)

hidden = 0 #이전처리데이터가 누적
for i in range(10) # range가 제공하는 값이 현재순서의 값
    hidden = RNN (i, hidden)

 


문제 유형별 RNN 구조

seq2Seq  :

텍스트 분류 (Text classification)

  • 입력받은 문장을 분류하는 문제 - 대표적으로 감성분석(semetic analysis)
  • 감성분석  리뷰데이터 등에서 감성을 긍/부정을 분류하는 문제

Image captionning

 

객체명인식 (Named Entity Recognition)

  • 토큰화된 단어가 어떤 종류,의미 인지 찾는 문제
    예 : 미국에 사는 톰은 스무살 입니다 => 미국 : 위치, 톰 : 이름 , 스무살 : 나이

품사 태깅(Pos tagging) 

  • 각 토큰의 품사를 찾는 문제 
    예 : 미국에 사는 톰은 스무살 입니다 => 미국 : 대명사, 에 : 조사 , 은 :조사, 스무: 명사, 살: 명사 ,이다 :동사

Chatbot

    • 입력 받은 문장에 대한 답을 하는 시스템
      encoder는 질문을 받아 처리 , decoder는 답변을 생성

Machine translation

  • 번역 시스템
  • encoder는 번역 대상문장을 입력받아 처리하고 decoder는 번역문장을 생성

< Bidirectional RNN + Stacking(Multi Layer) RNN >

Bidirectional RNN 


Auto Regressive 모델
이전 time step에 대한 출력결과를 다음 time step의 입력으로 사용하는 구조.
예 : Text 생성 모델
이전 출력의 결과에 의존하기 때문에 bidirectional RNN을 사용할 수 없다.
=> 왜? Non Auto Regressive 모델은 현재의 상태가 앞/뒤 상태에 따라 정해지는 경우로 앞/뒤의 상태를 모두 참조할 경우 성능이 올라가는 경우

Stacking(Multi Layer) RNN


- Recurrent Layer를 쌓아 모델의 용량을 늘려 표현능력(Represenational capacity)를 증가시킨다.
- 여러층을 쌓은 경우 먼저 쌓은 layer의 모든 time step별 출력이 다음 Layer의 입력 데이터로 사용된다.
- Layer을 쌓으면 표현능력은 증가하는 대신 계산 비용이 많이들고 과대적합(Overfitting)이 발생할 수 있다.
    - 과대적합을 막기 위해 드롭아웃 레이어를 추가할 수있다.
    - Recurrent Layer에서 Dropout layer는 매 time step 마다 적용한다.
 

 

Pytorch RNN Layer ⭐

 

        input_size: 입력 데이터의 shape

        hidden_size: Layer의 Hidden size

        num_layers: 몇층으로 Layer을 쌓을지 개수

        nonlinearity: 활성함수로 'tanh' (Default), 'relu' 둘 중 하나 지정.

        batch_first: True - (batch, seqence len, ..) False - (sequence len, batch, ..). Default: False

        dropout: Dropout rate 비율

        bidirectional:  양방향 적용 여부. Default: False

CLASS torch.nn.RNN(self, input_size, hidden_size, num_layers=1, 
                  nonlinearity='tanh', bias=True, batch_first=False, 
                  dropout=0.0, bidirectional=False, device=None, dtype=None)

 hidden size를 2로 설정 -> 입력데이터가 dim이 4였어도 output은 2로 반환

RNN Layer의 input / output tensor 의 shape


1) 추론시 Input : Input_Data, Hidden_state

1) Input_data의 shape
    - (Sequence_legnth, batch_size, feature_shape)
        - pytorch 는 입력으로 batch 보다 sequence length가 먼저 온다.
        - batch_first=True 로 설정하면 (batch_size, seq_len, feature_shape) 순이 된다.
        - ex)  주가 데이터
            - feature: 시가, 종가, 최고가, 최저가
            - sequence: 100일치
            - batch size: 30
            - (100, 30, 4)
2) Hidden_state의 shape
    - 시작(초기) hidden state로 입력하지 않으면 0이 들어간다.
    - shape은 아래 hidden state 설명 참조
 

2) Output : (output_data, hidden_state)

- output_data과 hidden state를 tuple로 묶어서 반환한다.
 
 
1) Output shape
- (Sequence length, batch_size, hidden_size * D)
    - D: 2 if bidirectional else 1
    - batch_first=True 로 설정하면 (**batch_size**, seq_len, feature_shape) 순이 된다.
    - ex)
        - RNN Layer의 hidden size가 256 인 경우. (sequence length: 100, batch size: 30, bidirection=False)
        -  (100, 30, 256)
 
2) Hidden state
- 마지막 time step의 출력결과
    - (D * layer수, batch_size, hidden_size)
        -  D: 2 if bidirectional else 1
        -  layer수: multi layer일 경우 layer stack 수
 

RNN의 Back Propagation

 
- BPTT(Back Propagation Through Time) 이라고 한다.
- RNN이 sequential하기 때문에 발생하는 hidden state를 따라 역행하면서 전파되는 gradient의 계산 방법이다.

RNN 파라미터 학습과정

🔗참고영상 : RNN, LSTM, GRU