728x90
 0. [python] 딥러닝  - sin 곡선 예측

 

 1. 풀이

1) LSTM(Long Short-Term Memory)의 구조(1)

내부 구조는 위와 같다.

내부에는 3개의 기억셀(c_(t-1))과  3개의 게이트(시그모이드 함수)가 존재한다. 위의 그림을 바탕으로 시그모이드 함수는 각각 망각 게이트(Forget Gate), 입력 게이트(Input Gate), 출력 게이트(Output Gate)이다.

 

(1) 망각 게이트

수식 1개

 

(2) 입력 게이트

수식 2개

1개는 시그모이드

1개는 활성화 함수(하이퍼볼릭탄젠트)

 

(3) 출력 게이트

1개

 

2) LSTM층의 순전파

# w:가중치   v:가중치   b:편향   n_upper:앞 층의 뉴런 수
# n:해당 층의 뉴런 수

w = np.random.randn(4, n_upper, n) / np.sqrt(n_upper)
v = np.random.randn(4, n, n) / np.sqrt(n)
b = np.zeros((4,n))

u = np.matmul(x, w) + np.matmul(y_prev, v) + b.reshape(4,1,-1)
        
a0 = sigmoid(u[0])        # 망각 게이트
a1 = sigmoid(u[1])        # 입력 게이트
a2 = np.tanh(u[2])        # 새로운 기억
a3 = sigmoid(u[3])        # 출력 게이트
        
c = a0*c_prev + a1*a2     # 기억 셀
y = a3*np.tanh(self.c)    # 출력

3) LSTM층의 역전파

# a0: 망각 게이트, a1:입력 게이트, a2:새로운 기억, a3:출력 게이트
# x:입력, y_prev:이전 시점의 출력, c:기억 셀
# grad_y:출력 기울기, grad_c: 기억 셀 기울기
# w,v: 가중치(4개의 행렬을 포함하는 배열)

tanh_c = np.tanh(c)
r = grad_c + (grad_y*a3) * (1-tanh_c**2)
        
# 각 delta
delta_a0 = r * c_prev * a0 * (1-a0)
delta_a1 = r * a2 * a1 * (1-a1)
delta_a2 = r * a1 * (1 - a2**2)
delta_a3 = grad_y * tanh_c * a3 * (1-a3)
        
deltas = np.stack((delta_a0, delta_a1, delta_a2, delta_a3))
        
# 각 파라미터의 기울기
grad_w += np.matmul(x.T, deltas)
grad_v += np.matmul(y_prev.T, deltas)
grad_b += np.sum(deltas, axis=1)
        
# x 기울기
grad_x = np.matmul(deltas, w.transpose(0,2,1))
grad_x = np.sum(grad_x, axis=0)
        
# y_prev 기울기
grad_y_prev = np.matmul(deltas, v.transpose(0,2,1))
grad_y_prev = np.sum(grad_y_prev, axis=0)
        
# c_prev 기울기
grad_c_prev = r * a0



 

+) 구현하는 과정 중 반전파의

r = grad_c + (grad_y*a3) * (1-tanh_c**2)

코드를 (1-tanh_c**2)와 기울기의 곱을 덧셈으로 구현한 실수를 범하게 되었다.

 

이렇게 구현한 코드를 테스트 한 결과 에러가 출력에 업데이트 되는 속도가 상당히 지연되는 것을 확인할 수 있었다.

sin함수를 활용한 경우 출력이 대략 100 epochs에서 1000 epochs으로 학습을 증가시켜야 학습이 이루어지는 것을 볼 수 있었다.

이러한 과정이 의미있는 것인지 추가적으로 다른 문제를 풀어보며 확인해보자.

이후 학습 모델이 달라지는 경우에는 학습량이 어떻게 차이나는지도 비교해보자.

2. 소스코드

https://github.com/kyun1016/deep_learning_python/blob/master/2021_05_22_LSTM/%EB%85%B8%EC%9D%B4%EC%A6%88%EA%B0%80%20%EC%B6%94%EA%B0%80%EB%90%9C%20sin%20%EA%B3%A1%EC%84%A0%EC%9D%84%20LSTM%20%EC%B8%B5%EC%9D%84%20%ED%99%9C%EC%9A%A9%ED%95%B4%20%EC%98%88%EC%B8%A1.ipynb

 

kyun1016/deep_learning_python

Contribute to kyun1016/deep_learning_python development by creating an account on GitHub.

github.com

 3. 참고

 

아즈마 유키나가, 최재원·장건희 옮김, 「핵심 딥러닝 입문 RNN, LSTM, GRU, VAE, GAN 구현」, 책만, 2020, p.166~194.

 

질문이나 지적 있으시면 댓글로 남겨주세요~

도움 되셨으면 하트 꾹!

+ Recent posts