서론?

한 번이라도 머신러닝 프레임워크를 가지고 놀아본 사람이라면 아마 ‘Autograd’라는 이름을 들어봤을 것이다.

솔직히 신기하지 않은가?

고등학교 때 함수 미분하느라 고생해본 경험이 있는 사람이라면 더 그럴 것이다.

나는 각종 미분 관련된 공식 뒤져가면서 힘들게 미분하고 있는데 컴퓨터는 그걸 자동으로 해낸다.

분명히 무언가 머리 싸매지 않고 자동적으로 할 수 있는 방법이 있으니까 자동 미분이라는게 가능하지 않을까?

예전부터 궁금했었는데, 생각보다 원리는 단순한 것이었다.

솔직히 뭐가 더 있을꺼라고 생각했는데 살짝 실망했다.

계산 그래프

-계산 그래프다. 솔직히 다른게 더 있을줄 알았는데.

오류 역전파 (Back propagation)을 한번이라도 들어본 사람이면 계산 그래프에 대해 들어봤을 것이다.

사실 생각해보니까 미분을 계산하는 이유도 역전파 때문이다.

아무튼 각설하고, 역전파 이야기도 건너뛰고, 계산 그래프 자체에 대해서 이야기해 보자.

뭐 일단은 DAG다. 방향이 있고, 고리가 없는 그래프를 DAG(Directed Acyclic Graph)라고 부른다.

단순하게 어느 함수의 출력이 어느 함수의 입력으로 연결되는지를 기억하는 그래프다. 별거는 아니다.

graph1

다음 그래프는 eq1을 계산 그래프로 나타낸 모양이다.

솔직히 이 자체는 더 설명이 필요한게 없을꺼다.

계산 그래프를 만드는 방법도 살짝만 생각해보면 어떻게든 되지 않을까 싶다.

미분

문제는 이 계산 그래프를 가지고 미분하는 방법이다.

가장 단순한 미분 관련된 공식을 하나 보자.

eq

미적분 시간에 배우는 가장 기초적인 공식 중 하나다. 어째서 이렇게 되는지는 생략한다.

이 때 eq, eq라고 두고, y를 x에 대해 미분하는 위의 공식을 다른 방식으로 적어보자.

eq

이 공식을 ‘연쇄법칙’이라고 부른다.

계산 그래프의 미분은 기본적으로 연쇄 법칙의 연속이다.

calcgraph-2

계산 그래프를 이용해 계산할 때는 검은색 선을 따라가면서 각 함수를 적용했었는데,

계산 그래프를 이용해 미분할 때는 그 반대로 주황색 선을 따라간다.

각 함수마다 이러한 ‘역전파’시 적용할 함수가 정해져 있고, 마치 제 방향으로 전파되는 것처럼 이를 이용해서 계산한다.

예컨데 이런 예를 보자.

calcgraph-3

연쇄 법칙에 따라, 해당 노드의 ‘역전파’ 값을 곱해가면 다음과 같은 미분 결과를 얻을 수 있다.

조금 그림이 이해하기 힘든건 양해 부탁한다.

Autograd에 적용

Autograd 역시 같은 식으로 진행된다.

모든 함수(위 계산 그래프의 네모 칸에 해당)는 두 가지 연산을 기억하고 있는데,

하나는 순전파(검은 화살표)때 해야 할 연산이고, 또 하나는 역전파(주황색 화살표)때 해야 할 연산이다.

pyTorch에서는 forward() 메서드와 backward() 메서드가 각각 이를 뜻한다.

한편 미분을 연산해야 할 텐서(대충 n차원 배열)에 대해서 계산 그래프를 만들어야 하는데, 이는 텐서들에 대해 평범하게 각종 함수들을 적용하면 자동으로 만들어진다.

x + y라고 적으면 계산 그래프가 알아서 만들어지는 식이다. (TF 1.0때엔 이걸 직접 만들었어야 했던 것 같았는데)

이후 이 그래프와 backward() 매서드를 가지고 자동으로 미분을 연산하게 된다.

맺음말

생각보다 원리가 간단했고 이미 알고 있는 것이었다.

내부적인 구현은 뭐 어떻게 예쁘게 해놨겠지 싶다.

조금 더 구체적으로 들어가면 야코비안이라던가 그런 것도 나오게 되는데 (대충 행렬 -> 행렬 함수를 미분하면 나오는 행렬)

큰 그림에서는 별 차이가 없는 것 같다.