728x90
반응형

LSTM 수행하는 계산

[그림1] LSTM 수행하는 계산

  • 아핀 변환(affine transformation) - 행렬 변환과 평행 이동(편향)을 결합한 형태 xWx + hWh + b

 

각 식 가중치들을 모아 4개의 식을 단 한 번의 아핀 변환으로 계산

[그람2] 각 식의 가중치들을 모아 4개의 식을 단 한 번의 아핀 변환으로 계산

  • 4개의 가중치(또는 편향)를 하나로 모을 수 있고, 원래 개별적으로 총 4번을 수행하던 아핀 변환을 1회의 계산으로 끝낼수 있다.
  • 일반적으로 행렬 라이브러리는 '큰 행렬'을 한꺼번에 계산할 때가 각각을 계산할 때보다 빠르기 때문이다.

 

4개분의 가중치를 모아 아핀 변환을 수행하는 LSTM 계산 그래프

[그림3] 4개분의 가중치를 모아 아핀 변환을 수행하는 LSTM의 계산 그래프

 

  • 4개분의 아핀 변환 한꺼번에 수행
  • slice 노드를 통해 4개의 결과를 꺼낸다.
  • slice는 아핀 변환의 결과(행렬)를 균등하게 네조각으로 나눠서 꺼내주는 단순한 노드다.

 

LSTM 초기화 코드

# LSTM 클래스

class LSTM:
    def __init__(self, Wx, Wh, b):
        self.params = [Wx,Wh, b]
        self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)]
        self.cache = None

 

LSTM 순전파

def forward(self, x, h_prev, c_prev): # 순전파
        Wx, Wh, b = self.params
        N, H = h_prev.shape
        
        A = np.matmul(x, Wx) + np.matmul(h_prev, Wh) + b
        
        # slice
        
        f = A[:, : H]
        g = A[:, H:2*H]
        i = A[:, 2*H:3*H]
        o = A[:, 3*H:]
        
        f = sigmoid(f)
        g = np.tanh(g)
        i = sigmoid(i)
        o = sigmoid(o)
        
        c_next = f*c_prev + g * i
        h_next = o*np.tanh(c_next)
        
        self.cache = (x, h+prev, c_prev, i, f, g, o ,c_next)
        
        return h_next, c_next

 

아핀 변환 시의 형상 추이(편향은 생략)

[그림4] 아핀 변환 시의 형상 추이(편향은 생략)

  • 미니배치 수 N
  • 입력 데이터의 차원 수 D
  • 기억 셀과 은닉 상태의 차원 수 H
  • 계산 결과 A에는 네 개분의 아핀 변환 결과 저장

 

slice 노드의 순전파(위)와 역전파(아래)

[그림5] slice 노드의 순전파(위)와 역전파(아래)

dA = np.hstack((df, dg, di, do)) # 역전파 4개의 기울기

 

 

Time LSTM 구현

  • T개분의 시계열 데이터를 한꺼번에 처리하는 계층

 

Time LSTM의 입출력

[그림6] Time LSTM의 입출력

 

 

Time LSTM 역전파의 입출력

[그림7] Time LSTM 역전파의 입출력

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기