funcs리스트에는 다음에 처리할 함수의 '후보'들이 들어 있습니다. 그러나 지금까지는 (아무생각없이)'마지막' 원소만 꺼냈습니다. 물론 funcs리스트에서 적절한 함수를 꺼낼 수 있어야 합니다. 앞의 예로 말하면 [B, A]상태의 리스트에서 출력 쪽에 더 가까운 B를 꺼낼 수 잇어야 합니다. 이 문제를 해결하기 위해서는 함수에 '우선순위'를 줄 수 있어야 합니다. 만약 A보다 B의 우선쉬위가 높다면 B를 먼저 꺼내는 식이죠.
그럼 우선순위는 어떻게 설정하면 좋을까요? 첫 번째로, 주어진 계산 그래프를 '분석'하여 알아내는 방법이 있습니다. 가령 위상 정렬(Topological Sort)알고리즘을 사용하면 노드의 연결 방법을 기초로 노드들을 정렬할 수 있습니다. 그 정렬 순서가 바로 우선순위가 됩니다. 그러나 더 쉬운 방법도 있습니다. 사실 우리는 그 답을 이미 목격했습니다.
우리는 일반적인 계산(순전파) 때 '함수'가 '변수'를 만들어내는 과정을 '목격'하고 있습니다. 즉, 어떤 함수가 어떤 변수를 만들어내는가 하는 '창조자-피조물 관계' 혹은 '부모-자식 관계'를 이미 목격하고 있습니다. 이 관계를 기준으로 [그림 15-8]처럼 함수와 변수의 '세대(generations)를 기록할 수 있습니다.
[그림 15-8]에서 말하는 '세대'가 바로 우선순위에 해당합니다. 역전파 시 세대의 수가 큰 쪽부터 처리하면 '부모'보다 '자식'이 먼저 처리됨을 보장할 수 있습니다. [그림 15-8]의 예에서는 함수 B와 A중 하나를 선택해야 할 때 세대수가 큰 B를 먼저 꺼내면 됩니다. 이상이 역전파를 올바른 순서로 진행하는 요령입니다. 다음 단계에서는 이 이론을 코드로 구현하겠습니다.
댓글 없음:
댓글 쓰기