관리 메뉴

Bull

[DL] RNN (Recurrent Neural Network) | study books 본문

Artificial Intelligence/Deep Learning

[DL] RNN (Recurrent Neural Network) | study books

Bull_ 2024. 9. 28. 14:57

RNN (Recurrent Neural Network)

RNN 특징


  • 연속적인 데이터를 처리하는데 적합한 구조
  • 각 시점의 데이터가 이전 데이터와 독립적이지 않다
  • 1~1000까지 (1,2,3) , ... , (998,999,1000)을 학습 시켜 11,12를 입력하면 13.0023 등이 나오도록 예측하는 것이다.
  • 긴 문장일수록 강한 상관관계가 존재
  • 시계열, 자연어, 음성 인식, 기타 시퀀스 데이터

RNN 구조


  • 연속형 데이터를 순서대로 입력 받아 처리하며 각 시점마다 은닉 상태 형태로 저장

https://www.google.com/url?sa=i&url=https%3A%2F%2Fheytech.tistory.com%2F440&psig=AOvVaw2-5BZtdqjwMVC1Z4tgXknz&ust=1727580932229000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCOCx4NDa5IgDFQAAAAAdAAAAABAa]

수식


은닉 상태


$$ h_t = \sigma (h_{t-1},x_t) $$
$$ h_t = \sigma (W_{hh}h_{t-1} + W_{xh}x_t+b_h) $$

  • $\sigma_h$ : 은닉 상태를 계산하기 위한 활성화 함수
    이전 시점 $t-1$ 의 은닉상태 $h_{t-1}$ 과 현재 입력값 $x_t$를 받아 현재 은닉상태를 계산
  • $h_{t-1}$ : 이전 은닉 상태
  • $W_{hh}$ : $h_{t-1}$ 에 대한 가중치
  • $W_{xh}$ : 입력값 $x_t$에 대한 가중치
  • $b_h$ : 은닉상태 편향
  • 초기 은닉 상태 $h_0$이전의 타임 스텝은 보통 0을 사용한다.

출력 값


$$ y_t = \sigma_y(h_t)$$
$$ y_t = \sigma_y (W_{hy}h_t+b_y)$$

  • $\sigma_y$ : 출력 상태를 계산하기 위한 활성화 함수
  • $W_{hy}$ : 현재 시점 은닉상태 $h_t$에 대한 가중치
  • $b_y$ : 출력 값 $y_t$의 편향값

일대다 구조


  • 하나의 입력 시퀀스에 대해 여러 개 출력값을 생성하는 순환 신경망 구조
  • 예를 들어
    • 문장을 입력 받고 각 단어의 품사를 예측하는 작업, 입력 시퀀스는 문장, 출력 시퀀스는 단어의 품사
    • 이미지 캡셔닝 모델, 입력 시퀀스는 이미지, 출력 시퀀스는 이미지 관련 설명 문장들

파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습

다대일 구조


  • 여러 개의 입력 시퀀스에 대해 하나의 출력 값을 생성하는 순환 신경망
  • 예를들어
    • 문장의 감정을 예측하는 작업, 입력 시퀀스는 문장, 출력 시퀀스는 문장의 감정(긍정,부정 등)

다대다 구조


  • 입력 시퀀스와 출력 시퀀스의 길이가 여러 개인 경우 사용되는 순환 신경망
  • 예를 들어
    • 입력 문장에 대해 번역된 출력 문장을 생성하는 번역기
    • 음성 인식 시스템에서 음성 신호를 입력으로 받아 문장을 출력하는 음성 인식기
  • Seq2Seq 구조, 입력 시퀀스인 인코더와 출력 시퀀스인 디코더로 구성된다

BiRNN (Bidirectional RNN)


  • 양방향 순환신경망
  • RNN은 이전 시점의 은닉 상태를 이용하는데 BiRNN은 이전 시점 은닉 상태 뿐만 아니라 이후 시점의 은닉 상태도 함께 이용
  • t-1, t+1을 동시에 참고하는 것이 아닌 t-1을 참고하여 만든 것과 t+1을 참고하여 만든 것 2개를 만든다. 순서는 순방향을 모두 다하고 역방향을 진행함.
  • 예를들어
    • "인생은 B와_ 사이의 C다." 라는 문장에서 "_"를 예측,
      "인생의 B"라는 문장만 봐서는 어려우므로 양측 모두를 고려.

Stacked RNN

https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.gabormelli.com%2FRKB%2FStacked_Recurrent_Neural_Network&psig=AOvVaw3O4kiSrGiP0tt92cmMbbwJ&ust=1727582362278000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCNDr2Prf5IgDFQAAAAAdAAAAABAE

 

  • 다중 순환 신경망
  • 여러 개의 RNN을 연결하여 구성한 모델, 퍼셉트론도 은닉층이 1개이지만 다층 퍼셉트론은 퍼셉트론을 여러 개 쌓아 올린 개념과 동일.

CODE : RNN


RNN class


rnn = torch.nn.RNN(
   input_size,
   hidden_size,
   num_layers=1,
   nonliearity="tanh",
   bias=False,
   batch_first=True,
   dropout=0,
   bidirectional=False
)
  • input_size : 입력 피쳐 크기
  • hidden_size : 은닉 상태 크기
  • num_layers : RNN 층 수, 2이상 이면 Stacked RNN
  • batch_first : 입력 배치 크기를 첫 번째 차원으로 사용할 지 유무
    True - [배치 크기, 시퀀스 길이, 입력 특성 길이]
    False - [시퀀스 길이, 배치 크기, 입력 특성 길이]

RNN 피쳐별 크기


import torch
from torch import nn


input_size = 128
ouput_size = 256
num_layers = 3
bidirectional = True

model = nn.RNN(
    input_size=input_size,
    hidden_size=ouput_size,
    num_layers=num_layers,
    nonlinearity="tanh",
    batch_first=True,
    bidirectional=bidirectional,
)

# 4문장씩 학습시킨다고 생각
batch_size = 4
# RNN 연결 고리라고 생각
sequence_len = 6

inputs = torch.randn(batch_size, sequence_len, input_size)
h_0 = torch.rand(num_layers * (int(bidirectional) + 1), batch_size, ouput_size)

outputs, hidden = model(inputs, h_0)
# [배치 크기, 시퀀스 길이, (양방향여부+1) X 출력 크기]
print(outputs.shape) # torch.Size([4, 6, 512])
# [계층 수 x (양방향 여부+1), 배치 크기, 출력 크기]
print(hidden.shape) # torch.Size([6, 4, 256])

 

참고 자료

https://product.kyobobook.co.kr/detail/S000209621433

 

파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습 | 윤대희 - 교보문고

파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습 | 트랜스포머는 딥러닝 분야에서 성능이 우수한 모델로 현대 인공지능 분야의 핵심 기술입니다. 트랜스포머와 비전 트랜스

product.kyobobook.co.kr