Autograd

1. 정의

  • PyTorch 내장 자동 미분 엔진
  • Tensor의 모든 연산을 기록하여 방향성 비순환 그래프(DAG, Directed Acyclic Graph) 형태로 추적
  • .backward() 호출 시 연쇄 법칙(Chain Rule) 으로 기울기 계산

2. 동작 과정

순전파(Forward pass)

  1. 요청된 연산 수행 → 결과 Tensor 계산
  2. 연산 기록(grad_fn)이 DAG에 저장

역전파(Backward pass)

  1. 각 Tensor의 .grad_fn으로부터 변화도 계산
  2. .grad 속성에 gradient 값 축적(accumulate)
  3. 연쇄 법칙(Chain Rule) 을 따라 leaf tensor까지 전달
  • Leaf Tensor: 사용자가 직접 생성한 텐서 (모델 파라미터 등), 기본적으로 .grad 저장 대상
  • Non-leaf Tensor: 연산 결과로 생성된 텐서, 기본적으로 .grad 저장 안 됨
  • Root Tensor: 그래프 최종 출력에 해당하는 텐서

requires_grad

1. grad 속성 개념

  • grad: 텐서에 대한 미분 기울기 값(gradient) 저장 공간
  • 텐서 생성 직후 → 항상 None
  • 역전파(Backpropagation) 수행 시 값이 채워짐
import torch
x = torch.ones(1)
print(x.grad)  # None (아직 역전파 전)

순전파(Forward) 에서 연산(grad_fn)을 기록하고, 역전파(Backward) 에서 leaf tensor에 연산 결과.grad가 채워짐

2. requires_grad 설정

  • requires_grad=True → 해당 텐서의 연산 추적 및 자동 미분 가능
  • requires_grad=False → 기울기 추적 비활성화 (기본값)
# scalar tensor
x = torch.tensor(2., requires_grad=True)
y = x**2
y.backward()
print(x.grad)  # tensor(4.)
 
# non-scalar tensor
x = torch.tensor([1.,2.], requires_grad=True)
y = x**2
y.backward(torch.tensor([1.,1.]))
print(x.grad)  # tensor([2., 4.])

3. 학습에 미치는 영향

  • requires_grad=True: 신경망 학습 대상 파라미터 (가중치, 편향 등)
  • requires_grad=False: 고정된 값으로 사용 (학습에 영향 없음)

Gradient 제어

방법적용 대상특징대표 사용 상황
requires_gradTensor 속성- 개별 텐서 단위로 gradient 추적 여부 설정
- 생성 시 지정(기본값:False) or .requires_grad_(True/False) 로 변경
- 학습 파라미터와 고정 파라미터 구분
torch.no_grad()코드 블록(컨텍스트)- 블록 내 연산 전체의 그래프 생성 비활성화
- gradient 추적 X → 메모리 절약, 속도 향상
- 추론(inference) 단계
detach()특정 Tensor- 그래프에서 분리된 새 텐서 반환
- 값은 유지, gradient 연결만 차단
- 중간 결과를 상수처럼 활용
- 특정 경로만 gradient 차단
retain_grad()non-leaf Tensor- 기본적으로 .grad는 leaf에만 저장됨
- 호출 시 중간 텐서의 .grad도 보존 가능
- 디버깅, gradient 흐름 분석

핵심 차이

  • 범위 차이: requires_grad(개별 Tensor) ↔ no_grad(블록 전체)
  • 연결 차이: detach()는 기존 그래프 일부만 끊어 새 텐서 생성
  • 분석 도구: retain_grad()는 학습엔 필요 없지만 gradient 추적 확인용