본문 바로가기
Study 공부할레나

[스터디/밑시딥3] 제 3고지 고차미분계산_31. 고차 미분(이론 편)

by LENA-cfg 2023. 9. 9.

이전 단계에서 정리된 내용은

1. 계산의 '연결'은 Function 클래스의 __call__ 메서드에서 만들어집니다.

2. 구체적인 순전파와 역전파 계산은 Function 클래스를 상속한 클래스의 forward 메서드와 backward 메서드로 처리합니다.

31.1 역전파 계산

역전파의 계산 로직

class Sin(Function):

    def backward(self, gy):
        x = self.inputs[0].data
        gx = gy * np.cos(x)
        return gx

gx = gy * np.cos(x) 라는 계산이 진행되는데 현재는 이 계산과 관련된 계산 그래프가 만들어지지 않고 있습니다.

역전파를 계산할 때 '연결'이 만들어지면 고차 미분을 자동으로 계산 할 수 있게 됩니다.

 

y = sin(x)의 계산 그래프

y = sin(x)의 계산 그래프인데 sin 함수의 결과인 y에 y.backward를 호출하면 y의 x에 대한 미분이 나옵니다.

여기는 1차 미분에 해당이 됩니다.

 

 

y = sin(x)의 미분을 구하는 계산 그래프

위의 그래프는 y = sin(x)의 y를 x에 대한 미분을 하여 gx를 구하는 과정이 담긴 계산 그래프인데

이런 그래프가 구현이 되어있다면 우리는 gx.backward()를 함으로써 gx의 x에 대한 미분을 계산 할 수 있게됩니다.

이렇게 되면 x의 2차 미분이 되는 겁니다. 2차 미분은 일반적으로 뉴턴 방법 같이 고급 최적화 알고리즘에서 사용됩니다. 

 

앞으로 DeZero에서도 미분 계산(역전파 때 계산)을 계산 그래프로 만들어 연결하는 것이 목표입니다.

31.2 역전파로 계산 그래프 만들기

DeZero는 Variable 인스턴스를 사용하여 계산(순전파)를 하는 시점에 '연결'을 만들었는데 

이는 backward메서드에서도 ndarray 인스턴스가 아닌 Variable 인스턴스를 사용하면 계산의 '연결'이 만들어진다는 뜻입니다.

 

(왼) 지금까지 Variable 클래스, (오) 새로운 Variable 클래스

위의 그림처럼 지금까지 Variable 클래스의 grad는 ndarray 인스턴스를 참조했는데

grad를 Variable 인스턴스를 참조하도록 변경해줍니다.

 

sin  클래스의 순전파와 역전파의 계산 그래프(역전파 계산 내용 생략)

Sin 클래스의 순전파와 역전파를 수행한 후의 계산 그래프입니다.

미분값을 나타내는 gy가 Variable 인스턴스가 된 덕분에 gy를 사용한 계산에도 '연결'이 만들어지는 것입니다.

 

Sin 클래스의 backward 메서드를 구현했을 때 그 미분을 계산하는 코드는 gx = gy * cos(x) 였는데 이때 변수가 Variable로 바뀌었다고 하면 아래의 이미지 처럼 됩니다.

 

역전파 계산 내용이 포함된 계산 그래프

 

y.backward()를 호출함으로써 역전파에 의해 새로운 계산 그래프(위 그래프)가 만들어집니다.

해당 계산 그래프에서 gx.backward()를 호출함으로써 y의 x에 대한 2차 미분이 가능해집니다.