계산그래프란
신경망의 순전파와 역전파 코드를 이해되게 쉽게 그림으로 보여주려 계산그래프를 사용한다.
계산그래프를 이용하면 신경망 전체가 아무리 복잡해도 각 노드에 수행되는 계산에만 집중하여 문제를 해결할 수 있다.
즉 노드마다의 계산문제로 큰 신경망 전체 문제를 해결해가는 것이다.

위의 계산그래프로 순전파와 역전파의 모습을 알 수 있다.
순전파는 100 —→ 200 —→ 220 으로 값이 전파되고 역전파는 다시 거꾸로
1———> 1.1 ——> 2.2 순으로 미분값(기울기) 이 전달되면서 역전파 되는 것이다.
계산그래프의 역전파
계산 그래프의 역전파를 자세히 보자.
역전파를 통해서 미분을 효율적으로 계산할 수 있다.
그 때 중요한 것은 각각의 뉴런을 클래스로 만들어야한다는 것이다!
뉴런을 클래스로 만드는 이유
왜냐하면 한 클래스로 만든 것끼리만 수정이 가능하고, 다른 클래스는 서로 관여하지 않기 때문.
은닉층의 파라미터를 바꿀때 클래스를 만들지 않으면 전체 코드를 다 수정해야하지만,
각각의 노드(뉴런)마다 클래스로 만들면 은닉1층의 파라미터를 수정할 때 은닉1층의 클래스만 변경하면 되기 때문이다.
이렇게 응집력이 높은 각각 뉴런의 순전파와 역전파 함수를 클래스로 만들어줘야 한다.

순전파를 클래스로 만든 코드
class MulLayer:
def _init_(self): # 클래스를 가지고 객체를 생성할 때 바로 작동되는 함수
self.x = None # 사과 가격이 잘못 계산될 수 있으므로 처음에
self.y = None # x 와 y 둘다 None 으로 초기화
def forward(self, x, y): # 순전파 함수
self.x = x # x 에 사과 가격이 입력됩니다.
self.y = y # y 에 사과 개수가 입력됩니다.
out = self.x*y # 계산해서
return out # 리턴합니다
만약에 맨 위 계산그래프의 뉴런(계층) 한개만 출력한다면
mul_apple_layer = MulLayer() # 곱셈계층
apple_price= mul_apple_layer.forward(100,2)
print(apple_price)
결과 200
최종가격까지 출력한다면 (뉴런 2개) 각각의 클래스를 만들어서 출력해줘야한다.
class MulLayer:
def _init_(self): # 클래스를 가지고 객체를 생성할 때 바로 작동되는 함수
self.x = None # 사과 가격이 잘못 계산될 수 있으므로 처음에
self.y = None # x 와 y 둘다 None 으로 초기화
def forward(self, x, y): # 순전파 함수
self.x = x # x 에 사과 가격이 입력됩니다.
self.y = y # y 에 사과 개수가 입력됩니다.
out = self.x*y # 계산해서
return out # 리턴합니다
mul_apple_layer = MulLayer() # 곱셈 계층
apple_price= mul_apple_layer.forward(100,2)
mul_tax_layer=MulLayer() # 세금 곱셉 뉴런
apple_total_price = mul_tax_layer.forward(apple_price,1.1)
print(round(apple_total_price))
결과 220