페이지

2022년 8월 6일 토요일

3.2 함수 연결

 Function클래스의 __call__메서드는 입력과 출력이 모두 Variable 인스턴스이므로 자연스럽게 DeZero 함수들을 연이어 사용할 수 있습니다. y= (eX**2)**2 이라는 계산을 예로 생각해보죠. 

A = Square()
B = Exp()
C = Square()

x = Variable(np.array(0.5))
a = A(x)
b = B(a)
y = C(b)
print(y.data)

1.648721270700128

3개의 함수 A, B, C를 연이어 적용했습니다. 여기서 중요한 점은 중간에 등장하는 4개의 변수 x, a, b, y가 모두 Variable 인스턴스라는 것입니다. Function 클래스의 __call__메서드의 입출력이 Variable 인스턴스로 통일되어 있는 덕분에 이와 같이 여러 함수를 연속하여 적용할 수 있는것이죠. 참고로 방금 한 계산은 [그림 3-1]과 같이 함수와 변수가 교대로 늘어선 계산 그래프로 표현할 수 있습니다.





[그림 3-1]과 같이 여러 함수를 순서대로 적용하여 만들어진 변환 전체를 하나의 큰 함수로 볼 수도 있습니다. 이처럼 여러 함수로 구성된 함수를 합성 함수(compuosite function)라고 합니다. 합성함수를 구성하는 각 함수의 계산은 간단하더라도, 연속으로 적용하면 더 복잡한 계산도 해낼 수 있다는 사실을 기억하세요.

그런데 일련의 계산을 '계산 그래프'로 보여드린 이유는 무엇일까요? 그 이우는 계산 그래프를 이용하면 각 변수에 대한 미분을 효율적으로 계산할 수 있기 때문이랍니다(정확하게는 그럴 준비가 됩니다). 그리고 변수별 미분을 계산하는 알고리즘이 바로 역전파입니다. 다음 단계부터는 역전파를 구현할 수 있도록 DeZero를 확장하겠습니다.

댓글 없음: