본문 바로가기

카테고리 없음

(밑바닥부터 시작하는 딥러닝) 5장-2 계산그래프

계산그래프란 

신경망의 순전파와 역전파 코드를 이해되게 쉽게 그림으로 보여주려 계산그래프를 사용한다.

 

계산그래프를 이용하면 신경망 전체가 아무리 복잡해도 각 노드에 수행되는 계산에만 집중하여 문제를 해결할 수 있다.

즉 노드마다의 계산문제로 큰 신경망 전체 문제를 해결해가는 것이다.

 

계산그래프

위의 계산그래프로 순전파와 역전파의 모습을 알 수 있다. 

순전파는 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