Story of CowHacker

딥러닝 4.1 오차역전파법 본문

공부/딥러닝

딥러닝 4.1 오차역전파법

Cow_Hacker 2020. 8. 17. 14:09
728x90

이번 글에서는 먼저 연쇄 법칙에 대해서 알아볼 것이다.

 

연쇄 법칙이란?

합성 함수의 미분은 합성 함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있다.

 

여기서 합성 함수가 뭔지 알아야만 한다.

 

합성함수란?

여러 함수로 구성된 함수다.

 

그림1

그림 1의 식은

 

그림2

그림 2처럼 두 개의 식으로 구성된다.

 

 

 

 

다음은 역전파에 대해서 알아보겠다.

 

역전 파는 연쇄 법칙이랑 같은 원리다.

 

먼저 덧셈 노드의 역전파에 대해 알아보겠다.

 

z = x + y

라는 식을 미분해보면

 

 

 

 

 

 

그림3

그림 3처럼 된다.

이것을 계산 그래프로 표현하면

 

그림4

 

그림5

그림 4는 순 전파를 나타낸 것이고, 

그림 5는 역전파를 나타낸 것이다.

 

 

 

그림 5에서 상류에서 전해진 미분에 1을 곱하여 하류를 거친다.

결국 덧셈 노드의 역전 파는 1을 곱하기만 할 뿐이므로 입력된 값을 그대로 다음 노드로 보내게 된다.

 

 

 

 

다음은 곱셈 노드의 역전파에 대해서 알아보겠다.

 

z = xy

라는 식을 미분해보면

 

그림6

그림 6처럼 되는데 이걸 계산 그래프로 나타내 보면

 

 

 

그림7

 

그림8

 

그림 7은 순 전파를 나타낸 것이고

그림 8은 역전파를 나타낸 것이다.

 

덧셈의 역전파에서는 순 전파의 입력이 필요하지 않았는데

곱셈의 역전파에서는 순 전파의 입력이 필요하다.

 

 

그럼 이제 곱셈 계층을 파이썬으로 구현해보겠다.

 

 

코드는

출처 : https://github.com/WegraLee/deep-learning-from-scratch

 

WegraLee/deep-learning-from-scratch

『밑바닥부터 시작하는 딥러닝』(한빛미디어, 2017). Contribute to WegraLee/deep-learning-from-scratch development by creating an account on GitHub.

github.com

위에서 다운로드한 파일의

ch05/layer_naive.py에 있다.

 

곱셈 계층 코드

 

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  # x와 y를 바꾼다.

        dy = dout * self.x

 

        return dx, dy

 

위 코드를 해석해보면

forward는 순 전파

backward는 역전파를 처리한다.

 

 

 

__init__ 에서 인스턴스 변수인 x와 y를 초기화한다.

이 두 변수는 순 전파 시의 입력 값을 유지하기 위해 사용한다.

forward에서는 x와 y를 인수로 받고 두 값을 곱해서 반환한다.

backward에서는 상류에서 넘어온 미분 ( dout )에 순 전파 때의 값을 서로 바꿔 곱한 후 하류로 보낸다.

 

다음은 덧셈 계층을 파이썬으로 구현해보겠다.

 

덧셈 계층 코드

 

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

 

위 코드를 해석해보면

덧셈 계층에서는 초기화가 필요 없으니 __init__에서는 아무 일도 하지 않는다.

덧셈 계층의 forward에서는 입력받은 두 인수 x, y를 더해서 반환한다.

backward에서는 상류에서 내려온 미분 ( dout )을 그대로 하류로 흘러 보낸다.

 

 

이까지 연쇄 법칙의 덧셈 곱셉 계층에 대해 알아보았다.

 

728x90

'공부 > 딥러닝' 카테고리의 다른 글

딥러닝 4.3 오차역전파법  (0) 2020.08.18
딥러닝 4.2 오차역전파법  (0) 2020.08.17
딥러닝 4.0 오차역전파법  (0) 2020.08.16
딥러닝 3.5 신경망 학습  (0) 2020.08.14
딥러닝 3.4 신경망 학습  (0) 2020.08.13
Comments