인공지능/PyTorch

파이토치(PyTorch) 기초 한 번에 part2

해리누나 2023. 6. 3. 05:49
728x90
반응형

해당 글은 이수안 컴퓨터 연구소의 파이토치 한번에 끝내기 PyTorch Full Tutorial Course 의 강의 자료를 정리한 글입니다.

Autograd(자동미분)

  • torch.autograd 패키지는 Tensor의 모든 연산에 대해 자동 미분 제공
  • 이는 코드를 어떻게 작성하여 실행하느냐에 따라 역전파가 정의된다는 뜻
  • backprop를 위해 미분값을 자동으로 계산

requires_grad 속성을 True로 설정하면, 해당 텐서에서 이루어지는 모든 연산들을 추적하기 시작

기록을 추적하는 것을 중단하게 하려면, .detach()를 호출하여 연산기록으로부터 분리

기본적으로 텐서는 requires_gradFalse로 가지고 있다.

 

requires_grad_(...)는 기존 텐서의 requires_grad 값을 바꿔치기(in-place)하여 변경

grad_fn: 미분값을 계산한 함수에 대한 정보 저장 (어떤 함수에 대해서 backprop 했는지)

즉, 우리가 나중에 backprop을 할 때, 어떤 연산, 어떤 연산이 수행되었는지를 다 기록에 남기고 , 그거를 가지고

어떤 함수에 대해 backprop을 했는지 , 기록을 다 가지고 있는 것이 grad_fn (fn: function) 이다.

 

 

기울기(Gradient)

더하던, 곱하던, 어떤 연산이 적용이 되었는지 알 수 있다.

 

계산이 완료된 후, .backward()를 호출하면 자동으로 역전파 계산이 가능하고, .grad 속성에 누적된다.

 

grad: 현재 텐서에 들어있는 data가  계속 거쳐온 layer에 대한 미분값 저장시킨다.

 

v를 기준으로 backward가 됨.

 

 

with torch.no_grad()를 사용하여 기울기의 업데이트를 하지 않음

기록을 추적하는 것을 방지하기 위해 코드 블럭을 with torch.no_grad()로 감싸면 기울기 계산은 필요없지만, requires_grad = True로 설정되어 학습 가능한 매개변수를 갖는 모델을 평가(evaluate)할 때 유용

(모델을 평가할 때는, 그 모델 자체를 update 하면 안되니 기울기 계산을 하지 않는 것.)

 

detach(): 내용물(content)은 같지만 require_grad가 다른 새로운 Tensor를 가져올 때

 

 

자동 미분 흐름 예제

  • 계산 흐름 a b c out
  • backward()를 통해 a b c out을 계산하면 $\frac{∂out}{∂a}$ 값이 a.grad에 채워진다.

아직 a 텐서에 아무 연산도 들어가지 않았으니 None 반환

 

out 에서 grad_fn 되었던게 SumBackward니 backward()로 SumBackward가 나오는 것.

 

이제 하나 하나씩 단계별로 진행이 되었던 거에 대하여 결과값을 살펴보자.

a의 grad_fn이 None인 이유는 직접적으로 계산한 부분이 없었기 때문

(a의 값을 다른 곳에서 활용했을 분 a에 직접적으로 계산을 가하지 않음.)

 

이렇게 자동미분이 흐름상 어떻게 진행이 되는지 알아보았다.

텐서에, 텐서에, 텐서에 막 계산을 할때, 실제 BackWard를 통해서 그것이 다 backprop이 될 수 있도록 자동 미분이 수행된다.

 

 

728x90
반응형

'인공지능 > PyTorch' 카테고리의 다른 글

파이토치(PyTorch) 기초 한 번에 part1  (0) 2023.06.03