implement_ml_models/RNN

implement_rnn(result_w)

명징직조지훈 2022. 12. 5. 12:15

2022.12.05 - [implement_ml_models] - implement_rnn(delta2)

 

implement_rnn(delta2)

2022.12.04 - [implement_ml_models] - implement_rnn(delta) implement_rnn(delta) 2022.12.03 - [implement_ml_models] - implement_RNN(hidden_activation) implement_RNN(hidden_activation) 2022.12.03 - [implement_ml_models] - implement_RNN(first_step) implement_R

teach-meaning.tistory.com

이러한 delta 값을 구한 이유는 delta가 노드의 입력값의 변화에 따른 오차 함수의 변화를 뜻하고, 이를 통해 가중치 변화량을 계산할 수 있기 때문이다.

rnn 에는 가중치의 종류가 3개가 존재,

  • result_w : 은닉층의 출력에서 예측값과 연결되는 가중치
  • input_w : 입력값에서 은닉층의 입력으로 연결되는 가중치
  • before_w : 이전 은닉층의 출력에서 현재 은닉층의 입력으로 연결되는 가중치

t 층의 순환 신경망의 경우 result_w, input_w 는 t 번의 반복, before_w 는 t-1 번의 반복이 있지만, 첫 번째 층의 before_w 를 0이라고 임의로 지정하여 모두 t번의 반복을 수행할 수 있도록 할 수 있다.

result_w

오차 제곱합의 사용

"""
예측 노드의 델타,

오차 함수의 미분값과 동일하다.(활성화 함수로 항등 함수를 사용했기 때문)
"""

err = Error()

result_delta = err.d_RMSE(target, rnn_result)
result_delta
>>>
array([[-6.34645513718887],
       [-11.4274288618395],
       [-12.7238757992856],
       [-13.7852011357702]], dtype=object)
       
#예측 노드의 델타를 사용한 result_w 값 업데이트

rnn_hidden_output
>>>
array([[0.999999999999453],
       [0.999999997388096],
       [0.999999990932234],
       [0.999999999999768]], dtype=object)
       
d_result_w = result_delta * rnn_hidden_output
d_result_w
>>>
array([[-6.34645513718540],
       [-11.4274288319922],
       [-12.7238756839085],
       [-13.7852011357670]], dtype=object)