ml_framework

mlp_backpropagation

명징직조지훈 2023. 5. 14. 11:05

먼저 비용 함수의 종류에 따라 마지막 노드에 대한 변화량에 대한 비용 함수의 변화량을 구할 수 있다.

 

비용 함수의 종류에 따라 예측값과 타깃값 사이의 비용 함수 결과의 출력, 

비용 함수를 계산함과 동시에 예측값의 변화량에 대한 비용 함수의 변화량을 계산,

마지막 층의 활성화 함수의 종류에 따라 활성화 함수의 미분 함수에 마지막 층의 입력값을 넣은, 노드 입력의 변화에 따른 비용 함수 변화량을 계산,

        # 비용 함수에 따른 오차 함수의 계산
        if(loss == 'mse'):
          # 비용 함수 계산
          cost_result = self.cost.errer_squared_sum(data, target)

          # 예측 결과의 변화량에 대한 비용 함수의 변화량 
          cost_diff = self.cost.diff_error_squared_sum(data, target)

          # 마지막 층의 활성화 함수 호출
          activation_function = self.layer[-1].get('activation')


          if(activation_function == 'sigmoid'):
            # 마지막 노드의 입력값의 변화량에 대한 비용 함수의 변화량 계산
            delta = cost_diff * self.activation.sigmoid_diff(self.layer[-1].get('hidden_input'))
          
          # 해당 레이어의 delta 딕셔너리 추가
          self.layer[-1]['delta'] = delta

 

이후 마지막 레이어를 제외한 레이어의 역순 순회

해당 층의 레이어 타입얻기, 층의 종류에 따른 delta 값의 계산,

		# 레이어 역순 순환 마지막 층 제외
        for layer_num in range(len(self.layer) - 2, -1, -1):
          
          layer_type = self.layer[layer_num].get('layer_type')

          if(layer_type == "Dense"):
            # 가중치와의 연산을 통해 해당 층의 노드 출력에 대한 비용 함수의 변화량을 계산
            delta = self.layer[layer_num].get('weight').T @ delta

            # 해당 층의 활성화 함수 획득
            activation_function = self.layer[layer_num].get('activation')

            # 활성화 함수 종류에 따른 해당 층의 노드 입력에 대한 비용 함수의 변화량 계산
            if(activation_function == 'sigmoid'):
              delta = delta * self.activation.sigmoid_diff(self.layer[layer_num].get('hidden_input'))

            # 해당 딕셔너리의 delta 값 저장
            self.layer[layer_num]['delta'] = delta

 

delta 값을 통한 가중치 업데이트

        # 가중치 업데이트
        for layer_num in range(len(self.layer) - 1):
          weight_update = self.layer[layer_num].get('delta') @ self.layer[layer_num].get('hidden_output').T

          self.layer[layer_num]['weight'] = self.layer[layer_num].get('weight') - (weight_update.T * learning_rate)