인공지능 in 네부캠 AI 4기/파이토치

AutoGrad & Optimizer

제로타이 2022. 9. 28. 11:23

자동미분과 그것의 핵심이되는 옵티마이저가 무엇인지 알아보자. 옵티마이저는 종류가 다양하고 또 레고 블럭처럼 쌓아나갈 수도 있는데 그 개념이 뭔지 알아내어 프로세스를 이해해보자.
현재 나와있는 논문들을 보면 resnet 같은 것들은 구조가 매우 복잡하다. 그런데 사실 잘 보면 블록 반복의 연속인 것을 확인할 수 있다. 이처럼 딥러닝은 사실 각 레이어들을 레고블럭처럼 쌓고 연결하는 방식이다. 레고 블록 형태를 만들어서 값을 넘기고,역전파 때는 거꾸로 학습되는 값들을 업데이트하는 구조. 
트랜스포머도 마찬가지. 

torch.nn.Module

딥러닝을 구성하는 베이스 클래스. 기본적으로 input, output, forward, backward를 정의해주어야 한다.
이때 backward는 자동 미분이 일어나도록 미리 설정되어 있다. 이전에도 우리도 쉽게 활용해봤지.

순전파와 역전파 구조를 나타내는 그래프.

학습의 대상이 되는 가중치는 보통 nn.Parameter에 담는다. 이것은 그냥 일반 텐서 객체 같지만, 모듈에서 attribute될 때 자동으로 미분의 대상이 되도록 설정된다. 또한 부덕이 과제에서도 나오지만 이렇게 담을 경우 데이터가 메모리에 저장이 되어 나중에도 계속 꺼내어 확인해볼 수 있게 된다. (텐서 객체는 휘발되거나, 어디에 담겨있는지 알 수 없다. 정확히 어느 쪽인지는 모르겠다)

간단한 구조

우리가 학습할 대상인 W와 b는 Parameter로 선언되는 것을 확인할 수 있다. 실제로 이렇게 하는 경우는 매우 드물긴 하지만, 기본적인 방식은 이해할 필요가 있겠지.
forward는 그냥 순전파로 흘러갈 때의 모양을 나타내고 있다. 

backward

backward는 대충 자동 미분을 해준다는 것은 알고 있지만, 조금 더 자세하게 살펴보자면, forward에서 나온 결과값과 모델이 가진 output의 로스에 미분을 실행할 때 쓰인다. 

epoch은 반복 횟수를 지정하는 값. 
optimizer.zerograd는 이전 연산값이 현재 연산에 영향을 주지 않도록 초기화를 해주는 함수이다.
critrerion은 로스 값을 도출해준다.
backward를 통해 미분 연산!
optimizer.step으로 해당 값을 업데이트 해준다.

이전에 미리 설정을 이렇게 한다

보다시피 파이토치에서 이미 관련된 함수들을 제공해주고 있기 때문에 이에 맞춰서 지정을 해주기만 하면 된다.

backward와 optimizer 심화

우리는 이제 backward와 optimizer가 어떻게 활용되는지 알았다. 이 값들은 어차피 파이토치에 기본적으로 내장된 것으로 활용할 수 있지만, 우리가 지정해줄 수도 있다. 물론 그럴 필요는 없다! 그래도 작동 모양을 잠시보자면,
backward는 정말 말 그대로 미분하는 것밖에 없다. 

시그모이드라면 이런 미분값이 나올 것이다.
optimizer

값을 갱신하는 과정! 실제 optimizer은 조금 달라서, zerograd를 계속 해야만 한다. 

직접 만든 backward와 optimize

보다시피 직접 만들 수도 있다! 위에서 말했듯이 별도의 zerograd 과정은 필요하지 않다. 
데이터를 iter를 통해 순환을 하는데 데이터 관련은 다음 강의에서.

  • zerograd가 없으면 일어나는 일

왼쪽은 zero_grad가 있을 때, 중앙은 없을 때, 오른쪽은 나와야 할 값

..? 식이 단순해서 그런 걸까 오히려 zero_grad가 없을 때 예측력이 올라가는 것이 확인된다. 몇 번 해본 바로는 계속 비슷한 결과가 나오는데 정확히 zerograd가 필요한 이유를 다른 예제를 통해 보는 것이 좋겠다. 

추가

나는 계속 zero_grad가 있는 셀만 수정해서 실행하는 식으로 시도를 했는데, 한번 학습이 끝난 모델에다가 계속 실행을 해서 문제가 발생하는 것이었다. 처음에 모델이 선언되는 셀부터 다시 실행해서 돌려보니 zero_grad가 없을 때는 확실하게 값이 이상하게 나왔다. 모든 값이 일정하게 나왔는데, 아무래도 정말 이전에 이루어진 미분 연산이 계속 영향을 끼치고 있는 듯했다.

'인공지능 in 네부캠 AI 4기 > 파이토치' 카테고리의 다른 글

모델 불러오기  (0) 2022.09.29
Pytorch Dataset  (0) 2022.09.28
Pytorch 프로젝트 구조 이해하기  (0) 2022.09.28
Pytorch Basics  (0) 2022.09.26
Introduction to Pytorch  (0) 2022.09.26