-
오차역전파법 - 덧셈 계층, 곱셈 계층딥러닝 2020. 1. 27. 00:39
덧셈 계층과 곱셈 계층을 구현해봅시다.
각각 순전파와 역전파 모두 구현해야겠죠.
우선 덧셈 계층부터 봅시다.
순전파는 그냥 덧셈해주면 됩니다.
역전파는 각 입력에 대해 미분을 해주고 그 값을 곱해주면 됩니다.(합성함수 미분의 원리)
두 개 모두 미분값이 1이군요.
구현해봅시다.
class AddLayer: def __init__(self): pass #순전파 def forward(self, x, y): return x + y #역전파 def backward(self, dout): dx = dout * 1 dy = dout * 1 return dx, dy
덧셈 계층은 역전파에서 순전파의 값을 이용하지 않습니다.
그래서 초기화가 필요없습니다.(pass : 아무것도 하지 말라)
곱셈 계층을 봅시다.
순전파는 그냥 곱해주면 됩니다.
역전파는 각 입력에 대해 미분을 해주고 그 값을 곱해주면 됩니다.(합성함수 미분의 원리)
미분값은 다른 입력값이군요.
입력값이 서로 바뀌어 곱해지는 꼴입니다.
구현해봅시다.
class MulLayer: def __init__(self): self.x = None self.y = None def forward(self, x, y): self.x = x self.y = y return x*y def backward(self, dout): dx = dout * self.y dy = dout * self.x return dx, dy
역전파에서 순전파의 값이 필요합니다.
그래서 초기화에서 순전파값 저장을 위한 변수를 만듭니다.
그럼 전 포스팅에서 본 이 예시를 구현해봅시다.
apple = 100 orange = 150 apple_num = 2 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) # 715 print(dapple_num, dapple, dorange, dorange_num, dtax) # 110 2.2 3.3 165 650
참고로
-역전파의 리턴값은 2개 입니다.
-순전파에서 순전파의 값이 저장됩니다.
이것을 보고 우리가 알 수 있는 사실은
순전파로 오른쪽 끝에 도달한 후, 역전파로 왼쪽 끝에 되돌아오면 모든 매개변수의 미분값을 알 수 있다는 것입니다.
[참고]
-밑바닥부터 시작하는 딥러닝
반응형'딥러닝' 카테고리의 다른 글
오차역전파법 - Softmax-with-Loss계층 구현하기 (0) 2020.01.28 오차역전파법 - 활성화 함수 계층 구현하기1 (0) 2020.01.27 오차역전파법 - 계산 그래프 (0) 2020.01.27 미니배치 학습 구현하기 (0) 2020.01.16 2층 신경망 클래스 구현하기 (0) 2020.01.16