본문 바로가기

dev_AI_framework

backpropagate 메서드 확인

    def backpropagate(self, node, upstream_gradient=1.0, leaf_nodes=None):
        if leaf_nodes is None:
            leaf_nodes = []

        # 1. 현재 노드에서 그래디언트 계산
        # node.operation 별로 알맞게 저장됨...
        grad_input, grad_weight = node.calculate_gradient(upstream_gradient)

        print("입력값의 변화에 대한 비용 함수의 변화량 : ", grad_input)
        print("가중치의 변화량에 대한 비용 함수의 변화량 : ", grad_weight)

        # 2. 부모 노드로 전파된 그래디언트 합산
        node.grad_input += grad_input
        node.grad_weight += grad_weight

        # 3. 자식 노드로 그래디언트 전파
        children = node.get_children()
        if not children:  # 자식 노드가 없으면 리프 노드
            leaf_nodes.append(node)
        else:
            # 각 자식노드 리스트 내 접근
            for child in children:
                # 각 자식 노드 리스트 접근과 함께 입력 값의 변화량에 대한
                # 비용 함수의 변화량인, grad_input 값을 갱신해준다.
                self.backpropagate(child, grad_input, leaf_nodes)

        return leaf_nodes

backpropagate 

입력 받은 leaf_node 가 없다면, 빈 리스트 생성

입력 받은 노드의 calculate_gradient() 메서드 시행, grad_input, grad_weight 값이 저장됨, upstream_gradient 값은 ㅁㅁ의 변화량에 대한 비용 함수의 변화량으로

맨 처음 loss 값의 계산시에만 초기,  1.0 의 값이 사용되고 계속 갱신됨

노드 가중치 갱신, 

자식 노드 탐색, 자식 노드가 없으면 해당 노드가 리프 노드임, 리프 노드 리스트의 반환

자식 노드가 있을 시

children 노드 리스트 데이터의 반복문 시행,