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 노드 리스트 데이터의 반복문 시행,
'dev_AI_framework' 카테고리의 다른 글
계산 그래프는 한 번만 생성해야 해, 완료~ (1) | 2024.09.13 |
---|---|
계산 그래프는 한 번만 생성해야 해, 생성 확인~ (0) | 2024.09.13 |
Dense 클래스 set root_node 메서드 구현 (0) | 2024.09.11 |
Node 클래스 구현 - Dense 연산 부분 수정 (0) | 2024.09.11 |
leaf_node 방문, 그 구조 생각 (6) | 2024.09.11 |