본문 바로가기

SK네트웍스 Family AI캠프 10기/Daily 회고

42일차. 자연어 딥러닝 - RNN

더보기

 

42일 차 회고.

 

 RNN에 대해서 배웠는데 이해가 잘 가지 않았다. 잘 모르겠는 부분은 최대한 강사님께 물어봤는데도 아직도 전부 해결이 안 된 느낌이다. 추가학습을 하거나 내일 코드를 짜면서 이해하도록 노력해봐야 할 것 같다.

 

 

 

 

0. RunPod

 

 

0-1. RunPod 설정

 

Cloud

  • Secure Cloud
    • 보안이 중요한 클라우드 환경
  • Community Cloud
    • 여러 조직이 자원을 공유하는 클라우드 환경

 

다운로드 속도

  • Low
  • Med
  • High
  • Extreme
    • 사용할 때마다 매번 관련 라이브러리를 다운받아야 한다.

Instance Pricing

  • On-Demand
    • 필요할 때마다 클라우드 인스턴스를 구매하여 사용한다.
  • Spot
    • 여유 인스턴스를 경매 방식으로 구매하여 사용한다.

 

 

 

1. RNN

 

 

1-1. First Order System

 

현재 시간의 상태가 이전 시간의 상태와 관련이 있다고 가정한다.

 

Autonomous System

  • 이전 시간의 상태를 입력으로 받는다. 따라서 외부의 입력 없이 스스로 돌아갈 수 있다.
  • $x_t = f(x_{t-1})$
    • $x$: 상태
    • $t$: 시간

 

Non-Autonomous System

  • 이전 시간의 상태와 현재 값을 입력으로 받는다.
  • $x_t = f(x_{t-1}, u_t)$
    • $x$: 상태
    • $t$: 시간
    • $u_t$: $t$ 시간일 때의 현재(입력) 값

 

State Space Model

  • 1차원 시스템 모형(First Order System)
    • $x_t = f(x_{t-1}, u_t)$
      • $x$: 상태
  • 각 시간에서 관측 가능한 상태
    • $y_t = h(x_t)$
      • $y$: 관측값

 

 

1-2. RNN(Recurrent Neural Networks, 순환 신경망)

 

RNN

  • 입력받는 신호의 길이가 정해지지 않은 동적 데이터를 처리한다.
  • CNN(위치)은 구역별로 같은 weight를 공유하지만, RNN(순서)은 시간별로 같은 weight를 공유한다.

 

  • 초기 상태값은 방향(단방향 / 양방향), Layer, Model 개수에 따라 크기가 정해진다.
    • 입력값(문장의 길이)과는 관련이 없다.

 

RNN 구조

  • one to many
    • 사진 설명 붙이기
  • many to one
    • 감성분석
  • many to many
    • 번역

 

 

1-3. RNN Model

 

import torch
from torch import nn

class RNN_Layer(nn.Module):
    def __init__(self, emb_size, n_layer, n_hidden, is_bidirection=True) -> None:
        super().__init__()
        
        self.emb_size = emb_size
        self.n_layer = n_layer
        self.n_hidden = n_hidden
        self.is_bidirection = is_bidirection
        
        self.rnn = nn.RNN(
            input_size=self.emb_size,
            hidden_size=self.n_hidden,
            num_layers=self.n_layer,
            bidirectional=self.is_bidirection
        )
    
    def forward(self, x):
        x_trans = x.transpose(0, 1)
        
        n_direction = 2 if self.is_bidirection == True else 1
        init_state = torch.zeros(n_direction * self.n_layer, x.shape[0], self.n_hidden)
        
        out, hidden_state = self.rnn(x_trans, init_state)
        
        return hidden_state[-1]