해당 글은 이수안 컴퓨터 연구소의 파이토치 한번에 끝내기 PyTorch Full Tutorial Course 의 강의 자료를 정리한 글입니다.
Autograd(자동미분)
- torch.autograd 패키지는 Tensor의 모든 연산에 대해 자동 미분 제공
- 이는 코드를 어떻게 작성하여 실행하느냐에 따라 역전파가 정의된다는 뜻
- backprop를 위해 미분값을 자동으로 계산
requires_grad 속성을 True로 설정하면, 해당 텐서에서 이루어지는 모든 연산들을 추적하기 시작
기록을 추적하는 것을 중단하게 하려면, .detach()를 호출하여 연산기록으로부터 분리

기본적으로 텐서는 requires_grad를 False로 가지고 있다.
requires_grad_(...)는 기존 텐서의 requires_grad 값을 바꿔치기(in-place)하여 변경
grad_fn: 미분값을 계산한 함수에 대한 정보 저장 (어떤 함수에 대해서 backprop 했는지)

즉, 우리가 나중에 backprop을 할 때, 어떤 연산, 어떤 연산이 수행되었는지를 다 기록에 남기고 , 그거를 가지고
어떤 함수에 대해 backprop을 했는지 , 기록을 다 가지고 있는 것이 grad_fn (fn: function) 이다.
기울기(Gradient)

더하던, 곱하던, 어떤 연산이 적용이 되었는지 알 수 있다.
계산이 완료된 후, .backward()를 호출하면 자동으로 역전파 계산이 가능하고, .grad 속성에 누적된다.

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



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이 될 수 있도록 자동 미분이 수행된다.
'인공지능 > PyTorch' 카테고리의 다른 글
파이토치(PyTorch) 기초 한 번에 part1 (0) | 2023.06.03 |
---|