Autograd
1. 정의
- PyTorch 내장 자동 미분 엔진
- Tensor의 모든 연산을 기록하여 방향성 비순환 그래프(DAG, Directed Acyclic Graph) 형태로 추적
.backward()호출 시 연쇄 법칙(Chain Rule) 으로 기울기 계산
2. 동작 과정
순전파(Forward pass)
- 요청된 연산 수행 → 결과 Tensor 계산
- 연산 기록(
grad_fn)이 DAG에 저장
역전파(Backward pass)
- 각 Tensor의
.grad_fn으로부터 변화도 계산 .grad속성에 gradient 값 축적(accumulate)- 연쇄 법칙(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_grad | Tensor 속성 | - 개별 텐서 단위로 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 추적 확인용