728x90
반응형
LSTM 수행하는 계산
- 아핀 변환(affine transformation) - 행렬 변환과 평행 이동(편향)을 결합한 형태 xWx + hWh + b
각 식 가중치들을 모아 4개의 식을 단 한 번의 아핀 변환으로 계산
- 4개의 가중치(또는 편향)를 하나로 모을 수 있고, 원래 개별적으로 총 4번을 수행하던 아핀 변환을 1회의 계산으로 끝낼수 있다.
- 일반적으로 행렬 라이브러리는 '큰 행렬'을 한꺼번에 계산할 때가 각각을 계산할 때보다 빠르기 때문이다.
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
아핀 변환 시의 형상 추이(편향은 생략)
- 미니배치 수 N
- 입력 데이터의 차원 수 D
- 기억 셀과 은닉 상태의 차원 수 H
- 계산 결과 A에는 네 개분의 아핀 변환 결과 저장
slice 노드의 순전파(위)와 역전파(아래)
dA = np.hstack((df, dg, di, do)) # 역전파 4개의 기울기
Time LSTM 구현
- T개분의 시계열 데이터를 한꺼번에 처리하는 계층
Time LSTM의 입출력
Time LSTM 역전파의 입출력
728x90
반응형
최근댓글