05.1 계산 그래프

계산 그래프 computational graph는 계산 과정을 그래프로 나타낸 것입니다. 여기에서의 그래프는 우리가 잘 아는 그래프 자료구조로, 복수의 노드 node와 에지 edge로 표현됩니다(노드 사이의 직선을 ‘에지’라고 합니다). 이번 절에서는 계산 그래프에 친숙해지기 위한 간단한 문제를 풀어보려 합니다. 간단한 문제에서부터 한 단계씩 나아가면서 마지막에는 오차역전파법에 도달할 예정입니다.

5.1.1 계산 그래프로 풀다

그럼 간단한 문제를 계산 그래프를 사용해서 풀어봅시다. 곧 보게 될 문제는 암산으로도 풀 정도로 간단하지만 지금의 목적은 계산 그래프에 익숙해지는 것입니다. 계산 그래프는 뒤에 나올 복잡한 계산에서 진짜 위력을 발휘하므로, 지금 기회에 꼭 그 사용법을 익혀두길 권합니다.

문제 1 : 현빈 군은 슈퍼에서 1개에 100원인 사과를 2개 샀습니다. 이때 지불 금액을 구하세요. 단, 소비세가 10% 부과됩니다.

순전파 연산 흐름 사과 2개를 구입해 10% 소비세가 붙는 순방향 계산 과정(순전파)을 도로시가 손으로 짚어가며 풀어보고 있어요.

도로시의 순방향 계산 (순전파)

  • 도로시: “사과 100원에 2개를 곱해서 200원이 되고, 여기에 소비세율 1.1을 곱해서 최종 지불 금액 220원이 나오는구나! 이렇게 왼쪽에서 오른쪽으로 계산을 전파해가는 것을 순전파(Forward Propagation)라고 하는 거네!”
  • 지니: “정답이야, 도로시! 우리가 일상적으로 계산하는 방식이 바로 계산 그래프에서의 순전파란다!”

계산 그래프는 계산 과정을 노드와 화살표로 표현합니다. 노드는 원(O)으로 표기하고 원 안에 연산 내용을 적습니다. 또, 계산 결과를 화살표 위에 적어 각 노드의 계산 결과가 왼쪽에서 오른쪽으로 전해지게 합니다. 문제 1을 계산 그래프로 풀면 [그림 5-1]처럼 됩니다.

그림 5-1 계산 그래프로 풀어본 문제 1의 답

그림 5-1

[그림 5-1]과 같이 처음에 사과의 100원이 ‘$\times 2$’ 노드로 흐르고, 200원이 되어 다음 노드로 전달됩니다. 그런 다음 200원이 ‘$\times 1.1$’ 노드를 거쳐 220원이 됩니다. 따라서 이 계산 그래프에 따르면 최종 답은 220원이 됩니다.

또한, [그림 5-1]에서는 ‘$\times 2$’와 ‘$\times 1.1$’을 각각 하나의 연산으로 취급해 원 안에 표기했지만, 곱셈인 ‘$\times$’만을 연산으로 생각할 수 있습니다. 이렇게 하면 [그림 5-2]처럼 ‘2’와 ‘1.1’은 각각 ‘사과의 개수’와 ‘소비세’ 변수가 되어 원 밖에 표기하게 됩니다.

그림 5-2 계산 그래프로 풀어본 문제 1의 답 : ‘사과의 개수’와 ‘소비세’를 변수로 취급해 원 밖에 표기

그림 5-2

그럼 다음 문제입니다.

문제 2 : 현빈 군은 슈퍼에서 사과를 2개, 귤을 3개 샀습니다. 사과는 1개에 100원, 귤은 1개 150원입니다. 소비세가 10%일 때 지불 금액을 구하세요.

문제 2도 문제 1과 같이 계산 그래프로 풀겠습니다. 이때의 계산 그래프는 [그림 5-3]처럼 됩니다.

그림 5-3 계산 그래프로 풀어본 문제 2의 답

그림 5-3

이 문제에는 덧셈 노드인 ‘+’가 새로 등장하여 사과와 귤의 금액을 합산합니다. 계산 그래프는 왼쪽에서 오른쪽으로 계산을 진행합니다. 회로에 전류가 흐르듯 계산 결과가 왼쪽에서 오른쪽으로 전달된다고 생각하면 됩니다. 계산 결과가 오른쪽 끝에 도착하면 거기서 끝! 그래서 [그림 5-3]에서의 답은 715원입니다.

지금까지 살펴본 것처럼 계산 그래프를 이용한 문제풀이는 다음 흐름으로 진행합니다.

  1. 계산 그래프를 구성한다.
  2. 그래프에서 계산을 왼쪽에서 오른쪽으로 진행한다.

여기서 2번째 ‘계산을 왼쪽에서 오른쪽으로 진행’하는 단계를 순전파 forward propagation라고 합니다. 순전파는 계산 그래프의 출발점부터 종착점으로의 전파입니다. 순전파라는 이름이 있다면 반대 방향(그림에서 말하면 오른쪽에서 왼쪽)의 전파도 가능할까요? 네! 그것을 역전파 backward propagation라고 합니다. 역전파는 이후에 미분을 계산할 때 중요한 역할을 합니다.

5.1.2 국소적 계산

계산 그래프의 특징은 ‘국소적 계산’을 전파함으로써 최종 결과를 얻는다는 점에 있습니다. 국소적이란 ‘자신과 직접 관계된 작은 범위’라는 뜻이죠. 국소적 계산은 결국 전체에서 어떤 일이 벌어지든 상관없이 자신과 관계된 정보만으로 다음 결과(그 후의 결과)를 출력할 수 있다는 것입니다.

국소적 계산을 구체적인 예를 들어 설명하겠습니다. 가령 슈퍼마켓에서 사과 2개를 포함한 여러 식품을 구입하는 경우를 생각해보세요. 이를 [그림 5-4]와 같은 계산 그래프로 나타낼 수 있을 겁니다.

그림 5-4 사과 2개를 포함해 여러 식품을 구입하는 예

그림 5-4

[그림 5-4]에서는 여러 식품을 구입하여 (복잡한 계산을 거쳐) 총금액이 4,000원이 되었습니다. 여기에서 핵심은 각 노드에서의 계산은 국소적 계산이라는 점입니다. 가령 사과와 그 외의 물품 값을 더하는 계산($4,000 + 200 \rightarrow 4,200$)은 4,000이라는 숫자가 어떻게 계산되었느냐와는 상관없이, 단지 두 숫자를 더하면 된다는 뜻이죠. 다시 말하면 각 노드는 자신과 관련한 계산(이 예에서는 입력된 두 숫자의 덧셈) 외에는 아무것도 신경 쓸 게 없습니다.

이처럼 계산 그래프는 국소적 계산에 집중합니다. 전체 계산이 제아무리 복잡하더라도 각 단계에서 하는 일은 해당 노드의 ‘국소적 계산’입니다. 국소적인 계산은 단순하지만, 그 결과를 전달함으로써 전체를 구성하는 복잡한 계산 결과를 얻을 수 있습니다.

NOTE_ 비유하자면 복잡한 자동차 조립은 일반적으로 ‘조립 라인 작업’에 의한 분업으로 행해집니다. 각 담당자(담당 기계)는 단순화된 일만 수행하며 그 일의 결과가 다음 담당자로 전달되어 최종적으로 차가 완성됩니다. 계산 그래프도 복잡한 계산을 ‘단순하고 국소적 계산’으로 분할하고 조립 라인 작업을 수행하며 계산 결과를 다음 노드로 전달합니다. 복잡한 계산도 분해하면 단순한 계산으로 구성된다는 점은 자동차 조립과 마찬가지인 것이죠.

지니의 계산 조립 라인 (계산 그래프)

  • 지니: “도로시, 아무리 복잡하고 거대한 계산 식도 자동차 조립 공장의 분업 라인처럼 단순한 덧셈(+)과 곱셈(x) 노드로 작게 쪼개어 나타낼 수 있어. 이렇게 노드와 화살표로 계산 과정을 연결한 것을 계산 그래프(Computational Graph)라고 해!”
  • 도로시: “와! 각 노드는 이전 노드가 어떻게 계산해 왔는지 알 필요 없이, 그냥 자기한테 들어온 두 숫자만 곱하거나 더해서 다음으로 넘겨주는 ‘국소적 계산’만 하면 되니까 머리가 하나도 안 아프겠네!”
  • 토토: “왈왈! (노트를 짚으며) 내 업무는 사과 개수 곱하기다 멍!”

사과 가격 계산 그래프 렌더링 도로시가 사과 100원 노드와 소비세 10% 노드가 연결된 ‘계산 그래프’ 판넬을 보며 순방향 및 역방향 계산의 이점을 짚어보고 있고, 지니와 토토가 그 곁에서 조립 라인 비유를 돕고 있어요.

5.1.3 왜 계산 그래프로 푸는가?

지금까지 계산 그래프를 써서 두 문제를 풀어봤습니다. 자, 계산 그래프의 이점은 무엇입니까? 이점 하나는 방금 설명한 ‘국소적 계산’에 있습니다. 전체가 아무리 복잡해도 각 노드에서는 단순한 계산에 집중하여 문제를 단순화할 수 있습니다. 또 다른 이점으로, 계산 그래프는 중간 계산 결과를 모두 보관할 수 있습니다. 예를 들어 사과 2개까지 계산했을 때의 금액은 200원, 소비세를 더하기 전의 금액은 650원인 식이죠. 그러나 이 정도만으로는 계산 그래프를 사용하는 이유가 충분히 와 닿지 않을지도 모릅니다. 자, 이것이 전부가 아닙니다. 실제 계산 그래프를 사용하는 가장 큰 이유는 역전파를 통해 ‘미분’을 효율적으로 계산할 수 있는 점에 있습니다.

계산 그래프의 역전파를 설명하기 위해 문제 1을 다시 꺼내보겠습니다. 문제 1은 사과를 2개 사서 소비세를 포함한 최종 금액을 구하는 것이었죠. 여기서 가령 사과 가격이 오르면 최종 금액에 어떤 영향을 끼치는지를 알고 싶다고 합시다. 이는 ‘사과 가격에 대한 지불 금액의 미분’을 구하는 문제에 해당합니다.

역전파 국소적 미분 흐름 지니가 최종 출력 지점(오른쪽)에서 입력 지점(왼쪽)으로 거꾸로 거슬러 올라가며 미분 값을 전파하는 역방향 계산 흐름(역전파)을 설명하고 있고, 도로시가 열심히 받아적고 있어요.

지니의 거꾸로 계산 (역전파)

  • 지니: “도로시! 순전파와 달리 최종 출력 $L$(지불 금액)에서 시작해서 입력 변수(사과 값, 사과 개수 등)를 향해 거꾸로 거슬러 가면서 국소적인 미분을 곱해나가는 방식을 역전파(Backward Propagation)라고 해!”
  • 도로시: “와! 역방향으로 한 번만 쓱 지나가면 사과 가격이 올랐을 때 지불 금액에 주는 영향력(미분값)이 전부 계산되는구나! 매번 수치 미분을 처음부터 다시 할 필요가 없어서 엄청 편하겠다!”
  • 토토: “왈왈! (지니 흉내를 내며) 거꾸로 메아리 계산이다 멍!” 기호로 나타낸다면 사과 값을 $x$, 지불 금액을 $L$이라 했을 때 $\frac{\partial L}{\partial x}$를 구하는 것이죠. 이 미분 값은 사과 값이 ‘아주 조금’ 올랐을 때 지불 금액이 얼마나 증가하느냐를 표시한 것입니다.

앞에서 말했듯이 ‘사과 가격에 대한 지불 금액의 미분’ 같은 값은 계산 그래프에서 역전파를 하면 구할 수 있습니다. 먼저 결과만을 나타내면 [그림 5-5]처럼 계산 그래프 상의 역전파에 의해서 미분을 구할 수 있습니다(역전파가 어떻게 이뤄지느냐는 곧 설명합니다).

그림 5-5 역전파에 의한 미분 값의 전달

그림 5-5

[그림 5-5]와 같이 역전파는 순전파와는 반대 방향의 화살표(굵은 선)로 그립니다. 이 전파는 ‘국소적 미분’을 전달하고 그 미분 값은 화살표의 아래에 적습니다. 이 예에서 역전파는 오른쪽에서 왼쪽으로 ‘$1 \rightarrow 1.1 \rightarrow 2.2$’ 순으로 미분 값을 전달합니다. 이 결과로부터 ‘사과 가격에 대한 지불 금액의 미분’ 값은 2.2라 할 수 있습니다. 사과가 1원 오르면 최종 금액은 2.2원 오른다는 뜻이죠(정확히는 사과 값이 아주 조금 오르면 최종 금액은 그 아주 작은 값의 2.2배만큼 오른다는 뜻입니다).

여기에서는 사과 가격에 대한 미분만 구했지만, ‘소비세에 대한 지불 금액의 미분’이나 ‘사과 개수에 대한 지불 금액의 미분’도 같은 순서로 구할 수 있습니다. 그리고 그때는 중간까지 구한 미분 결과를 공유할 수 있어서 다수의 미분을 효율적으로 계산할 수 있습니다. 이처럼 계산 그래프의 이점은 순전파와 역전파를 활용해서 각 변수의 미분을 효율적으로 구할 수 있다는 것입니다.

서브목차