본문 바로가기
ML & DL/밑바닥부터 시작하는 딥러닝

[파이썬 딥러닝]순전파와 역전파 기초

by Glory_Choi 2023. 3. 28.
반응형

덧셈 노드의 순전파와 역전파

왼쪽 : 순전파, 오른쪽 : 역전파

순전파는 우리가 알고 있는 덧셈입니다. 위 그림을 보면 덧셈노드를 통해 더하게 됩니다. 따라서 순전파를 통과하면 z = x + y라는 식이 나옵니다. 이 식을 편미분을 하게되면 z를 x에 대해 미분해도 y를 통해 미분해도 모두 1이 됩니다. 따라서 역전파때 상류에서 전해진 미분값을 그대로 하류로 흘리게 됩니다.

 

곱셈 노드의 순전파와 역전파

곱셈 노드도 순전파는 덧셈 노드와 크게 다르지 않습니다. 우리가 알고 있던 곱셈입니다.

z = xy라는 식을 미분하면 z를 x에 대해 미분 했을대 y가 되고 z를 y에 대해 미분 했을때 x가 남게 됩니다. 따라서 곰셈의 역잔파에서는 입력 신호를 바꾼 값을 곱하여 흘려 보내줍니다. 때문에 곱셈의 역전파는 순방향 입력 신호의 값이 필요합니다.

 

단순한 계층 구현하기

곱셈 계층

class MulLayer:
    def __init__(self):
        self.x = None
        self.y = None
    
    def forward(self, x, y):
        self.x = x
        self.y = y
        out = x * y

        return out
    
    def backward(self, dout):
        dx = dout * self.y
        dy = dout * self.x

        return dx, dy

이 MulLayer를 사용하여 사과 쇼핑을 구현해보겠습니다.

순전파

apple = 100
apple_num = 2
tax = 1.1

mul_apple_layer = MulLayer()
mul_tax_layer = MulLayer()

apple_price = mul_apple_layer.forward(apple, apple_num)
price = mul_tax_layer.forward(apple_price, tax)

print(price)

[출력]
220.00000000000003

역전파

dprice = 1
dapple_price, dtax = mul_tax_layer.backward(dprice)
dapple, dapple_num = mul_apple_layer.backward(dapple_price)

print(dapple, dapple_num, dtax)

[출력]
2.2 110.00000000000001 200

덧셈 계층

class AddLayer:
    def __init__(self):
        pass

    def forward(self, x, y):
        out = x + y
        return out

    def backward(self, dout):
        dx = dout * 1
        dy = dout * 1
        return dx , dy

돗샘

덧셈 계층과 곱셈 계층을 사용하여 사과 2개와 귤 3개를 사는 상황을 구현해보겠습니다.

apple = 100
apple_num = 2
orange = 150
orange_num = 3
tax = 1.1

#계층들
mul_apple_layer = MulLayer()
mul_orange_layer = MulLayer()
add_apple_orange_layer = AddLayer()
mul_tax_layer = MulLayer()

#순전파
apple_price = mul_apple_layer.forward(apple, apple_num)
orange_price = mul_orange_layer.forward(orange, orange_num)
all_price = add_apple_orange_layer.forward(apple_price, orange_price)
price = mul_tax_layer.forward(all_price, tax)

#역전파
dprice = 1
dall_price, dtax = mul_tax_layer.backward(dprice)
dapple_price, dorange_price = add_apple_orange_layer.backward(dall_price)
dapple, dapple_num = mul_apple_layer.backward(dapple_price)
dorange, dorange_num = mul_orange_layer.backward(dorange_price)

print(price)
print(dapple_num, dapple, dorange, dorange_num, dtax)

[출력]
715.0000000000001
110.00000000000001 2.2 3.3000000000000003 165.0 650

 

반응형