머신러닝

PyTorch의 정체와 자동미분 알고리듬(Automatic Differentiation)

coding art 2019. 6. 15. 12:33
728x90




머신 러닝에서 cost 함수의 설정과 이 cost 함수의 최소값을 찾아내기 위한 경사하강법은 너무나 중요하다. TensorFlow 코딩에 있어서도 Hypothesis를 도입 후 cost 함수를 구성하고 경사하강법을 적용하는 코스로 이루어진다. 물론 learning rate 도 파라메터로 설정해야 하지만 Gradient Descent 알고리듬의 내적인 흐름에 대한 모니터링 수단은 없는 듯하다. 즉 그 내적인 흐름이란 것이 바로 cost 함수의 Gradient를 계산하기 위한 미븐 알고리듬을 뜻한다. 많이 사용해 보니 아무런 문제가 없을 정도로 완벽하다고 느끼고는 있으나 지금의 추세가 머신 러닝의 알고리듬이 획기적으로 개선되어야 할 시점이므로 보다 효율적인 연구를 위해서라도 좀 더 오픈되어야 할 필요성이 있어 보인다. 그런 면에서 뒤이어 출시된 PyTorch 가 그러한 필요성을 인정하지 않았나 하는 생각이다.

 

PyTorch가 제공하는 자동미분 알고리듬 명령들을 사용하여 cost 함수의 Forward Back Propagation 특성을 잘 이해할 수 있는 기회로 삼도록 하자.

아주 간단한 선형회귀 문제의 최소제곱법 머신 러닝의 사례에서는 Deep Learning 까지 갈 것도 없이 cost 함수의 1회 편미분에 의해 문제가 해결되므로 자동미분 알고리듬의 중요성을 알 수는 없다. 하지만 이미 멀티 레이어 뉴럴 네트워크를 사용하는 Deep Learning 시대에 접어 들었기 때문에 자동미분 알고리듬은 치명적일 정도로 중요성이 부각되었다.

 

하지만 PyTorch의 이 튜토리얼 부분을 읽어 보면 이해할 수 없는 암호문처럼 쓰여져 있는데 누구나 알 수 있도록 쉽게 설명해보자.

 

cost 함수가 f 이고 Deep Layer가 둘로 구성된다면 아울러 첫 번째 레이어의 입력 변수가 x, y 인 문제의 Chain Rule에 의한 편미분을 고려해 보자. 미분이나 편미분이나 큰 차이는 없다. 편미분은 변수가 하나 이상일 경우에 특정한 타겟 변수에 대해서만 미분 작업을 실시하는 동안 나머지 변수는 미분과정 동안 상수로 취급하는 행위이다. 즉 독립 변수가 하나인 일차원적인 함수에서는 미분 작업이면 되지만 이차원이나 3차원 곡면의 경우에는 편미분에 의해서 방향별 기울기 함수를 구해야 하는 것이다.



2X2 torch.tensor x1.0으로 초기화하자.

torch.tensor x에 각각 2.0을 덧셈하여 torch.tensor y를 구성한다. yx의 합성함수가 된다.

y를 제곱 후 3.0을 곱하여 torch.tensor z를 구성한다. zy의 합성함수이며 아울러 x의 합성함수가 된다.

out.backward() 명령은 위와 같이 forward 과정에서 함성함수f(z(y(x)))가 구성 완료된 후 최종 합성함수 f(z(y(x)))의 첫 입력 변수였던 torch.tensor x에 대한 편미분 계산을 준비하라는 명령이며 x.grad 에 의해 x에 대한 편미분이 실시된다. 물론 이 과정에서 최종 합성함수 f(z(y(x)))cost 함수라 생각하면 될 것이므로 그 편미분을 계산 후 learning rate를 곱하여 경사하강법 적용이 가능해질 것이다.

 

실제 PyTorch 코딩에서는 첫 입력 변수였던 torch.tensor x에 대한 편미분 계산을 준비하라는 명령차원에서 합성함수를 구성해야 하므로 반드시 requires_grad = True를 설정해야 한다. 그렇지 않으면 torch.tensor x는 더 이상 코드 내에서 연산이 필요 없는 일종의 상수로 취급될 것이다.

   


 

   

이어지는 함수의 합성화 단계에서는 출력해 보면 grad_fn = ∙∙∙ 속성이 부여되며 이는 차후에 Backward Propagation 단계에서 중간 단계의 합성함수의 편미분 계산 역할을 담당하게 될 것이다.

 

TensorFlow에서도 이러한 기능이 내부적으로 있겠지만 사용자에게 오픈하지 않는 부분인데 아주 특별한 합성 함수 형태의 cost 함수를 사용할 때에 내부 연산 흐름을 모니터링 할 수 있으므로 머신 러닝 중급 이상의 사용자가 되면 필수적인 기능이 될 수도 있을 것이다.

 

예제에 사용된 코드는 아주 짧고 간단하므로 직접 아나콘다나 Colabo 에 입력하여 실행시켜 보도록 하자.