[시계열] 01. RNN의 등장과 발전

‍강민석·2023년 8월 10일
1

시계열

목록 보기
1/2

😍 먼저, 시계열에 대한 블로그 내용은 밑바닥부터 시작하는 딥러닝 2 도서를 기반으로 작성되었음을 밝힙니다.


확률과 언어 모델

RNN 이전에 1) Word2Vec의 CBOW 모델과 2) 언어 모델을 알아야 한다.

CBOW : 맥락 단어로부터 타깃 단어를 추측하는 모델

위 문장에서 맥락 단어를 통해 타깃 단어를 추측하고자 할 때,
맥락 단어를 타깃 단어의 왼쪽 2개의 단어로 한정한다면, 교차 엔트로피 오차에 의한 손실함수 L은 다음과 같이 계산할 수 있다.

L=logP(wtwt2,wt1)L = -logP(w_t | w_{t-2}, w_{t-1})

이 손실함수를 최소화하는 가중치 매개변수를 탐색하는 것이 목표가 될 것이다.

언어 모델 : 특정한 단어 나열에 대해서 얼마나 자연스러운 단어 순서인지 확률을 부여하는 모델

m개 단어로 이루어진 문장에서 단어가 w1,...,wmw_1, ..., w_m의 순서로 출현할 확률 : 동시 확률

P(w1,...,wm)P(w_1, ..., w_m)

단어 시퀀스를 계속 줄여가면서 매번 사후 확률로 분해할 수 있다.

P(w1,...,wm1,wm)=P(A,wm)=P(wmA)P(A)=Πt=1mP(wtw1,...,wt1)P(w_1, ..., w_{m-1}, w_m) = P(A,w_m) = P(w_m|A)P(A) = \Pi_{t=1}^m P(w_t|w_1,...,w_{t-1})

사후 확률 P(wtw1,...,wt1)P(w_t|w_1,...,w_{t-1})은 타깃 단어보다 왼쪽에 있는 모든 단어를 맥락으로 했을 때의 확률이며, 동시 확률은 사후 확률의 총곱으로 대표될 수 있다.

그러나, CBOW 모델을 언어 모델에 적용하는 과정에서 문제가 발생한다.

맥락의 크기는 임의로 설정할 수 있지만, 결국 특정 길이로 고정되므로 그 맥락보다 더 왼쪽에 있는 단어의 정보는 무시된다.

그렇다면, 맥락 크기를 최대한 키우는 방법을 생각할 수 있지만, CBOW 모델에서는 맥락 안의 단어 순서가 무시되는 한계점이 존재한다.

예를 들어, 맥락으로 2개의 단어를 다루는 경우, CBOW 모델에서는 단어 벡터의 '합'이 은닉층에 오게 된다.

따라서, 이상적으로 맥락의 단어 순서를 고려한 모델이 바람직할 것이다.


RNN

RNN의 등장

앞서, CBOW 모델과 같은 피드포워드(Feed Forward) 신경망은 시계열 데이터의 성질을 학습할 수 없다는 한계점이 존재했다.

RNN : 양방향의 순환 신경망

순환하는 경로, 즉 닫힌 경로가 있어 데이터가 과거의 정보를 순서를 고려하여 기억할 수 있다.

  • RNN 계층의 매커니즘

시계열 데이터 x0,x1,...,xtx_0, x_1, ..., x_t가 RNN 계층에 입력되면 h0,h1,...,hth_0, h_1, ..., h_t가 출력되는 방식이다.

특정 시각 t에서의 RNN 계층은 그 계층으로의 입력 xtx_t와 1개 전의 RNN 계층으로부터의 출력 ht1h_{t-1}을 받고, 그 두 정보를 바탕으로 t에서의 RNN 계층의 출력 hth_t를 다음과 같이 계산한다.

ht=tanh(ht1Wh+xtWx+b)h_t = \tanh(h_{t-1}W_h + x_tW_x+b)
  • WxW_x : x를 h로 변환하기 위한 가중치
  • WhW_h : 한 개의 RNN 출력을 다음 시각의 출력으로 변환하기 위한 가중치
  • bb : 편향

출력 hh라는 상태를 가진 RNN으로 해석 가능하며 출력 hh를 은닉 상태라고 부른다.

BPTT

BPTT : 시간 방향으로 펼친 신경망의 오차역전파법

BPTT, 즉 RNN의 역전파를 활용하여 RNN을 학습할 수 있다.

그러나, 긴 시계열 데이터를 학습할 때 시간 크기가 커짐에 따라 BPTT가 소비하는 컴퓨팅 자원이 증가하고 역전파 기울기가 불안정해지는 문제점이 발생한다.

따라서, 너무 큰 시계열 데이터를 취급할 때는 신경망 연결을 적당한 길이로 끊어야 한다.

Truncated BPTT

Truncated BPTT : BPTT를 적당한 길이로 잘라낸 것

역전파를 적당한 길이로 끊지 않는다면, 신경망을 하나 통과할 때마다 기울기 값이 계속 감소해 0이 되어 소멸할 가능성이 존재한다.
: 기울기 소실

단, 순전파는 끊어지지 않아야 한다. = 데이터를 순서대로 입력해야 한다.

한 단위(x0,...,x9x_0, ..., x_9)에서 순전파를 수행하고, 그다음 역전파 수행, 이어서 다음 단위를 입력하는 방식으로 수행된다.

RNN의 구현

  • RNN 클래스 구현 (1개 계층)
class RNN:
    # 초기화 메서드
    def __init__(self, Wx, Wh, b):
        # 가중치 2개, 편향 1개
        self.params = [Wx, Wh, b]
        # 기울기 초기화
        self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)]
        # 중간 데이터
        self.cache = None
  
    # 순전파 메서드
    def forward(self, x, h_prev):
  		Wx, Wh, b = self.params
        # 한 RNN 계층의 출력 h_next 계산
        t = np.matmul(h_prev, Wh) + np.matmul(x, Wx) + b
        h_next = np.tanh(t)
    
    # 역전파 메서드
    def backward(self, dh_next):
    	Wx, Wh, b = self.params
        x, h_prev, h_next = self.cache
        
        dt = dh_next * (1 - h_next ** 2)
        db = np.sum(dt, axis=0)
        dWh = np.matmul(h_prev.T, dt)
        dh_prev = np.matmul(x.T, dt)
        dWx = np.matmul(dt, Wx.T)
        dx = np.matmul(dt, Wx.T)
        
        self.grads[0][...] = dWx
        self.grads[1][...] = dWh
        self.grads[2][...] = db
        
        return dx, dh_prev
  • RNN의 순전파 및 역전파

  • Time RNN의 구현 (T개의 계층)
class TimeRNN:
    # 초기화 메서드 : stateful이 True일 경우, Time RNN 계층이 은닉 상태를 유지함
    def __init__(self, Wx, Wh, b, stateful=False):
        # 가중치 2개, 편향 1개
        self.params = [Wx, Wh, b]
        # 기울기 초기화
        self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)]
        # 다수의 RNN 계층 리스트에 저장
        self.layers = None
        
        # h : forward()의 마지막 RNN 계층 은닉 상태 저장
        # dh : backward()의 하나 앞 블록의 은닉 상태 기울기 저장
        self.h, self.dh = None, None
        self.stateful = stateful
        
    def set_state(self, h):
    	self.h = h
        
    def reset_state(self):
    	self.h = None
    
    # 순전파 메서드
    def forward(self, x, h_prev):
  		# 생략
    
    # 역전파 메서드
    def backward(self, dh_next):
    	# 생략
  • Time RNN의 순전파 및 역전파


RNN을 사용한 언어 모델 : RNNLM

  • "you say goodbye and I say hello"를 처리하는 RNNLM의 프로세스

  • Embedding 계층 : 단어 ID를 단어 벡터로 변환
  • RNN 계층 : 은닉 상태를 다음 층으로 출력하고, 다음 시각의 RNN 층으로 출력
  • Affine 계층 : 순전파 시에 행렬곱 수행
  • Softmax 계층 : 손실 오차 계산

첫 RNNLM 계층에서의 Softmax 계층은 "say"에서 가장 높은 확률을 출력한다.
즉, "you" 다음으로 출현하는 단어를 "say"로 예측한다.

더 정확한 예측을 위해서는 좋은 가중치를 사용해야 한다.

두 번째 RNNLM 계층에서의 RNN 계층은 "you say"라는 맥락을 기억하고 있다.
즉, RNN 계층은 "you say"라는 과거의 정보를 은닉 상태 벡터로 저장한다.

RNNLM은 지금까지 입력된 단어를 기억하고, 그 정보를 바탕으로 다음에 출현할 단어를 예측한다.


⏩ 다음으로는 RNN이 가진 한계점과 RNN을 대체하는 새로운 계층 LSTM, GRU를 살펴보겠습니다. 시계열 데이터 처리에 있어서 가장 중요한 계층에 해당합니다.

profile
데이터분석가

2개의 댓글

comment-user-thumbnail
2023년 8월 10일

많은 도움이 되었습니다, 감사합니다.

1개의 답글