본문 바로가기

implement_ml_models/RNN

implement_RNN (delta-to-sequence 2)

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' 카테고리의 다른 글