딥러닝 자동 미분 원리, 계산 그래프란, 미분 과정 파헤치기 - 1 - Whitmem
딥러닝 자동 미분 원리, 계산 그래프란, 미분 과정 파헤치기 - 1
AI 이론 및 개발
2025-04-29 22:33 게시 679cae95184e629ed530

0
0
43
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
PyTorch 와 같이 딥러닝 프레임워크에서는 자동 미분 기능을 제공하고 있다. 기본적으로 딥러닝을 진행하기 위해서는 원하는 기울기를 찾아내고 미분을 해야하는 것이 베이스 구현의 기본 원리가 된다.
인터넷에 원하는 수식을 만들고 그 수식을 딥러닝에 적용하는 과정을 보면 수식의 결과가 이렇게 된다는 것은 이해가 되지만, 이것이 미분이 자동으로 된다는 것은 종종 이해가 안되곤 했었는데, 이번 기회에 자동 미분의 원리를 이해하고, 오차 역전파, 계산 그래프와 어떤 관계가 있는지 이해하는 것을 목표로 한다.
위 코드는 임의 모델을 하나 만들어, Tensor 을 통해 연산을 수행하는 예시이다.
x2 + 4x + 5 라는 수식을 넣었는데, 연산 결과에 대해 미분 값이 출력되는 것을 확인할 수 있다. t.grad 값이 8인데, 이는 x2 + 4x + 5 의 미분 값인 2x + 4 에 x 값 2를 넣은 것이 계산된 것이다.
아무튼, 식을 어떻게 작성 해 넣든, torch 에서 잘 미분을 해주는데, 이는 계산 그래프에서 기초한다.
식을 이렇게 작성하더라도, Pytorch 의 Tensor 은 이를 부분적으로 계산을 수행한다. 즉 x*x, 4*x 를 먼저 연산하고 x*x 결괏값과 4*x 결괏값을 더하고, 마지막 5를 더하는 식으로 계산이 수행된다.
이를 계산 그래프로 나타내면 다음과 같다.
먼저 상기 사용자가 식으로 구현한 x2 + 4x + 5 x2 을 먼저 연산한다.
다음으론, x2 + 4x + 5 4x 을 연산한다.
그리고, x2 + 4x + 5 x2 + 4x 를 더하고,
마지막으로 x2 + 4x + 5 의 5를 더한다.
이 과정을 보면 결과적으로 기본적인 사칙 연산은 덧셈과 곱셈으로 나타낼 수 있는데, 이렇게 각 연산을 나눠서 이해하는 방법은 미분을 수행할 때 큰 영향을 끼친다. 미분도 결과적으로 일반적인 연산 처럼 일부만 미분하여 계산 그래프로 전달하는 방식으로 수행할 수 있기 때문이다.
다시 돌아와서 하나의 연산만 봐보자. 곱셈 처리를 연산 그래프로 나타낸 것이다. a*b 를 곱하는 연산이다. 이 연산 자체를 a*b 에 대해 미분을 하려면 어떻게 해야할까? 예를 들어, a*b 를 b 에 대해 편미분을 하려면 어떻게 해야할까?
크게 어렵지 않다. 단순히 서로 다른 변수 a, b를 곱한 것이기 때문에 b에 대해 편미분 하는 경우 b를 미지수로 두고 나머지를 상수 취급하여 미분하면 된다. 마찬가지로 a*b 를 a에 대해 편미분 하려면, a를 미지수로 두고, 나머지를 상수 취급하면 된다.
즉 곱셈 노드에서 각각 곱셈된 결과에 대해 편미분을 한 결과는 곱하려는 각 상수를 서로 바꿔주면 그것이 결과에 대해 미분한 값이다.
덧셈 노드는 본인 미지수가 있는 영역의 항만 남으므로 사실상 미분 값은 1이 된다. 그런데 보통 우리는 한 노드에 대한 곱셈 결과의 미분이 필요하지는 않고, 매우 수 많은 노드가 겹쳐 있고, 어떤 매우 복잡한 식의 최종 결과에 대해 편미분이 필요하다. 예를 들어 아래와 같은 경우이다.
위 이미지에서 빨간 영역을 봐 본다. 보통 빨간색 영역 내의 계산 결과의 미분이 궁금한 것이 아니라, 전체 식의 계산 결과 (흔히 말하는 로스 함수 결과 E 이다.)의 a에 대한 편미분 값이 궁금한 것이다. 이런 경우는 어떻게 해야할까? 결론부터 말하면 크게 신경쓸 필요 없다. 이 역시 연쇄적으로 미분하면 되기 때문이다.
이해하기 쉽도록 각 계산 결과 값을 K, E 라고 표기하였다. 우리가 지금 필요한 것은 E를 a에 대해 편미분 한 값이다. 그런데 이 편미분 한 값은 ChainRule 연쇄 법칙에 의해 다음과 같이 나타낼 수 있다.
즉 E를 미지수 a에 대해 편미분 한 값을 구하기 위해, 1) 빨간 영역 내인 곱셈 노드의 결과에 대해 편미분 한 값, 2) 파란 영역에 내인 덧셈 노드의 결과에 대해 편미분 한 값, 3) 초록 영역 내인 덧셈 노드의 편미분 한 값이 있으면 이를 모두 곱하면 미분 값이 되는 것이다. 즉 결과적으로 보자면, 초록 -> 파랑 -> 빨강 순으로 역으로 미분을 하면서 미분 값을 전달해가면 최종 빨간 지점에서는 a의 편미분 값을 구할 수 있는 것이다.
예를 들어 보자, 4x+3y 에서 x에 대해, y에 대해 각각 편미분 하는 상황이라고 가정한다.
미분 과정은 계산 결과부터 거꾸로 체인룰에 따라 나아가면 되므로, 계산 결과부터 시작한다. 계산 끝 지점인 덧셈 노드에서는 단순히 덧셈 당시 값과 관련 없이 그냥 무조건 이전 미분 값에 1을 곱해서 이전으로 넘기면 된다. 그리고 각 곱셈 노드는 넘어온 미분 값에서 곱셈 당시 서로 다른 자리의 수를 가져와 곱해주면 그것이 미분 값이 된다. 위에서 4x+3y 에 대해 x로 편미분 한 값은 4이다. x 인풋 자리에 거꾸로 돌아온 미분 값이 4가 된 것을 확인할 수 있다. 이렇게 거꾸로 전파해가는 과정을 오차 역전파의 일부분 이라고 볼 수 있다.
즉 다시 돌아와서 파이썬 torch 에서는 이러한 미분 그래프 과정을 알아서 처리해준다. 그런데 상식적으로 프로그래밍을 조금 공부한 사람이라면, 왜 단순히 숫자를 곱하고 더하는 과정에서 어떻게 저런 계산 그래프가 처리되는지 의문을 가질 것이다. 숫자 하드 코딩 해둔 것이 알아서 잘라내져서 계산 그래프로 적용되는 것도 아닐테니 말이다.
파이썬의 모델 입력은 보통 Tensor로 입력된다. Tensor은 하나의 클래스 인스턴스라고 봐도 된다. Tensor 자체에 곱셈, 덧셈 등의 연산을 하는 경우 내부적으로 바로 덧셈, 곱셈 연산을 하는 것이 아니라 인스턴스 * 숫자, 또는 인스턴스 + 숫자 연산으로 오버라이딩해서 임의로 그 기록을 저장한다.
즉 우리가 보기에는 단순히 덧셈, 곱셈 연산 같아보이지만, 단순한 곱셈, 덧셈 연산이 아니다. Tensor 에 덧셈, 곱셈 등의 연산을 하는 순간 사실 실제 연산되는 것이 아니라 __add__ 와 같은 내부 오버라이딩 메서드를 통해 인스턴스 & 실수 또는 인스턴스 & 인스턴스 연산으로 들어가 torch 라이브러리 내에서 내부적으로 연산 그래프를 생성한다. 그리고 비로소 결과를 반환하는 것이다. 위 코드를 보면 Test 클래스에 임의 add 오버라이딩을 했다. 이 경우 Test(3) 에 + 3 연산을 하는 순간 즉시 덧셈이 되는게 아니라 해당 클래스 개발자가 의도한 대로 덧셈이 수행된다. 단순 덧셈이 아니라 안에 연산 그래프를 생성하는 기능을 넣으면 겉으로는 덧셈을 하는 것 같아도 추후 미분에 필요한 그래프 구현을 모두 알아서 하게 된다. 그렇기에 이를 우리는 자동 미분이 알아서 수행된다라고 표현하는 것이다.
다음 게시글에서는 임의 다른 언어로 자동 미분이 수행되는 클래스를 개발해보고자 한다. 아마 웹에서 인공지능을 구현하는 것이 주요 목표이므로, Javascript 에서 구현하게 될 것으로 보인다.
댓글 0개
댓글을 작성하는 경우 댓글 처리 방침에 동의하는 것으로 간주됩니다. 댓글을 작성하면 일회용 인증키가 발급되며, 해당 키를 분실하는 경우 댓글을 제거할 수 없습니다. 댓글을 작성하면 사용자 IP가 영구적으로 기록 및 부분 공개됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.