2023.02.24 - [분류 전체보기] - implement_RNN (delta-to-sequence 1)
implement_RNN (delta-to-sequence 1)
2023.02.21 - [분류 전체보기] - implement_RNN implement_RNN 가중치의 종류 W_xh : 입력 값에 대한 가중치, 가중치 연산 결과가 노드 입력이 된다. W_hy : 노드 출력에 대한 가중치, 예측값이 된다. W_hh : 노드 출
teach-meaning.tistory.com
이전 글에서 RNN 의 계산 과정을 구할 수 있었다.
RNN 역시 DNN 과 마찬가지로 역전파 계산을 통해 가중치의 크기를 업데이트 해야 한다.
각 노드들의 입력 계산에 동일한 가중치가 사용되므로 처음 노드까지의 각 다음 노드들의 변화량, delta 값을 계속 누적해가며 계산해야 한다.
먼저 비용 함수의 작성
# 비용 함수 클래스, 비용 함수의 종류에 따라 다른 클래스 내 함수를 사용한다.
class cost_function:
# 예측값
predict = []
# 타겟값
target = []
# 비용 함수값
error_cost = []
# 오차 제곱합
def errer_squared_sum(self, predict, target):
self.predict = predict
self.target = target
self.error_cost = np.sum(0.5*((predict - target)**2))
return self.error_cost
# 오차 제곱합 미분 함수
def diff_error_squared_sum(self):
return self.predict - self.target
RNN 클래스에서도 필요한 파라미터를 추가 작성해준다.(각 가중치 업데이트 크기, 노드의 출력 변화에 따른 비용 함수의 변화량, delta 값)
class RNN_vector_to_sequence:
#입력값
input_data = []
#가중치
weight = []
#편향값
bias = []
# 입력 가중치
input_w = []
# 이전 출력에 대한 가중치
before_w = []
# 출력 가중치
result_w = []
# 편향 값 bais
bias = []
# 노드 입력
node_input = []
# 노드 출력
node_output = []
# 타겟, 목푯값
target = []
# 활성화 함수
activation = activation_function()
# 비용 함수
cost = cost_function()
# 예측 결과
predict = []
# 각 층의 델타 값의 저장
delta = []
# 각 가중치 업데이트 크기
input_weight_update = []
before_weight_update = []
result_weight_update = []
해당 클래스 내 cal_delta 함수의 작성,
각 노드별 입력에 따른 비용 함수의 변화량을 계산해야 한다.
먼저 result_w 변화량에 대한 비용 함수의 변화량을 계산하기 위해 먼저 출력, 예측 노드의 변화량에 대한 비용 함수의 변화량을 계산해보면
출력 노드의 입력에 대한 변화량, delta = 활성화 함수 변화량 * 비용 함수 변화량 이다.
#출력 노드의 변화량에 대한 오차 함수의 변화량 계산
delta = (self.cost.diff_error_squared_sum() * self.activation.sigmoid_diff(self.predict))
self.delta.append(delta)
해당 delta 값과 result_w 가중치 변화량 ( 이전 노드의 출력 ) 의 계산으로 result_w 의 가중치 변화량을 구할 수 있고
이전노드 출력에 변화량(result_w 가중치 값) 과의 계산을 통해 앞 노드의 출력의 변화량에 대한 비용 함수의 변화량으로 delta 값을 사용하는 데 사용되는 값을 구할 수 있다.
출력 노드를 제외한 각 노드들의 구성으로는
activation_function((이전 노드 출력 * before_w) + (데이터 입력 * input_w))
으로 해당 노드의 이전 노드 출력의 변화에 대한 비용 함수의 변화량과, 데이터 입력값의 변화에 대한 비용 함수의 변화량을 계산할 수 있을 것이다.
하지만 RNN 을 구성하는 모든 노드들이 동일한 값의 가중치를 공유하기에 delta 값의 계산 후 가중치 업데이트 크기의 결정은 맨 마지막에 이뤄질 것
이를 구현하기 위해 먼저 각 층, 노드들의 delta 값을 우선 계산해본다.
그런데 고민해야 할 점으론, 가중치 변화량을 계산하는데에는 이전 노드의 출력이나 입력 데이터를 바탕으로 그 변화량을 계산하게 되는데 RNN 은 동일한 가중치를 공유하지만 동일한 가중치에 대해 노드에 입력되는 값은 제각각이므로 그 변화량을 어떻게 결정해야 하는지에 대한 점이 존재한다.
'implement_ml_models > RNN' 카테고리의 다른 글
implement_RNN (vector-to-sequence, delta2) (0) | 2023.03.02 |
---|---|
implement_RNN (delta-to-sequence, delta2) (0) | 2023.02.27 |
implement_RNN (delta-to-sequence 1) (0) | 2023.02.24 |
implement_RNN (0) | 2023.02.21 |
implement_GRU(h) (0) | 2022.12.13 |