PyTorch Reference
PyTorch 딥러닝 프레임워크 레퍼런스
PyTorch Reference 소개
PyTorch 레퍼런스는 PyTorch 딥러닝 프레임워크를 위한 체계적이고 검색 가능한 치트 시트입니다. 텐서, 자동미분, 신경망, 옵티마이저, 데이터, 학습, GPU, 저장/로드 등 8개 핵심 카테고리로 구성되어 있으며, 각 항목에는 설명과 실제 코드 예제가 포함되어 있어 신경망 모델을 구축하고 실험하는 데 실용적으로 활용할 수 있습니다.
PyTorch는 연구 분야의 선도적인 딥러닝 프레임워크로, 컴퓨터 비전, 자연어 처리, 강화학습, 과학 컴퓨팅 분야의 팀에서 널리 사용됩니다. 동적 계산 그래프(autograd)를 통해 유연한 모델 아키텍처와 쉬운 디버깅이 가능합니다. 이 레퍼런스는 텐서 생성과 DataLoader를 통한 데이터 로딩, nn.Module로 모델 정의, 손실 함수와 옵티마이저 선택, 학습/검증 루프 실행, 체크포인트 저장까지 전체 학습 워크플로를 다룹니다.
또한 CUDA 가용성 확인, 디바이스에 모델·텐서 이동, 멀티 GPU용 nn.DataParallel, GPU 메모리 모니터링, `autocast`와 `GradScaler`를 이용한 혼합 정밀도 학습 등 GPU 가속도 다룹니다. 데이터 섹션에는 커스텀 Dataset 클래스, torchvision transforms와 내장 데이터셋, 학습/검증 분할을 위한 random_split이 포함됩니다. 저장/로드 섹션에서는 권장되는 state_dict 방식과 학습 재개를 위한 체크포인트 저장·로드 패턴을 다룹니다.
주요 기능
- 텐서·자동미분·신경망·옵티마이저·데이터·학습·GPU·저장/로드 8개 카테고리 수록
- 텐서 생성: torch.tensor, zeros/ones, randn, arange — shape, dtype, device 조작 포함
- 자동미분: requires_grad, backward(), zero_grad(), detach(), torch.no_grad() 컨텍스트 매니저
- 네트워크 레이어: nn.Linear, nn.Conv2d, nn.LSTM, nn.BatchNorm2d, nn.Dropout, nn.Sequential
- 옵티마이저: Adam과 SGD(모멘텀), StepLR 학습률 스케줄러
- 데이터 파이프라인: 커스텀 Dataset, DataLoader(batch_size/shuffle), torchvision transforms
- GPU: CUDA 가용성 확인, tensor.to(device), DataParallel, 혼합 정밀도(autocast + GradScaler)
- 저장/로드: state_dict(권장), 전체 모델, 완전한 학습 체크포인트 패턴
자주 묻는 질문
PyTorch 텐서란 무엇이고 NumPy 배열과 어떻게 다른가요?
PyTorch 텐서는 NumPy ndarray와 유사한 다차원 배열이지만, 두 가지 핵심 차이가 있습니다. 첫째, 텐서는 GPU에서 실행되어 하드웨어 가속 연산이 가능합니다. 둘째, 텐서는 자동 미분(autograd)을 지원합니다. `torch.tensor()`, `torch.zeros()`, `torch.randn()` 등으로 생성하며 `.shape`, `.dtype`, `.device` 속성을 가집니다. `.to("cuda")`로 GPU로 이동할 수 있습니다.
PyTorch의 autograd는 어떻게 동작하나요?
`requires_grad=True`로 텐서를 생성하면 PyTorch는 모든 연산을 계산 그래프에 기록합니다. 스칼라 출력에서 `.backward()`를 호출하면 그래프를 역방향으로 순회하며 `requires_grad=True`인 모든 텐서의 그래디언트를 계산해 `.grad` 속성에 저장합니다. 학습 루프에서는 역전파 전에 `optimizer.zero_grad()`로 그래디언트를 초기화하고, `loss.backward()`로 역전파를 실행한 후 `optimizer.step()`으로 가중치를 업데이트합니다.
PyTorch에서 신경망을 어떻게 정의하나요?
`nn.Module`을 상속하는 클래스를 정의합니다. `__init__`에서 레이어를 속성으로 선언하고(예: `self.fc1 = nn.Linear(784, 256)`), `forward` 메서드에서 데이터가 레이어를 통과하는 방식을 정의합니다. 단순한 순차 구조에는 `nn.Sequential`이 편리합니다: `nn.Sequential(nn.Linear(784, 256), nn.ReLU(), nn.Linear(256, 10))`. 분기, 스킵 연결 등 비순차적 로직이 필요할 때는 커스텀 모듈이 필요합니다.
Adam과 SGD 옵티마이저의 차이는 무엇인가요?
SGD는 학습률 비율만큼 그래디언트를 빼서 가중치를 업데이트합니다. 모멘텀(`momentum=0.9`)을 추가하면 속도 벡터를 누적해 진동을 완화합니다. Adam은 그래디언트의 1차·2차 모멘트 추정치를 기반으로 파라미터별 적응 학습률을 유지합니다. Adam은 일반적으로 수렴이 빠르고 학습률 선택에 덜 민감해 좋은 기본값이 됩니다. SGD with momentum은 이미지 분류 태스크에서 일반화 성능이 더 좋을 수 있습니다.
PyTorch에서 데이터를 효율적으로 로드하려면 어떻게 하나요?
`Dataset`과 `DataLoader` 클래스를 사용합니다. `torch.utils.data.Dataset`을 상속하고 `__len__`과 `__getitem__`을 구현해 커스텀 Dataset을 만듭니다. 이를 `DataLoader`에 `batch_size`와 `shuffle=True`로 래핑합니다. 이미지 태스크에는 `torchvision.datasets`(MNIST, CIFAR10 등)과 `torchvision.transforms.Compose`로 전처리 단계를 연결해 사용합니다.
PyTorch 모델은 어떻게 저장하고 로드해야 하나요?
권장 방식은 state_dict(모델 가중치)만 저장하는 것입니다: `torch.save(model.state_dict(), "weights.pth")`. 로드할 때는 모델 아키텍처를 재생성하고 `model.load_state_dict(torch.load("weights.pth"))`를 호출한 뒤 추론을 위해 `model.eval()`을 실행합니다. 학습을 재개하기 위한 체크포인트에는 epoch, model state_dict, optimizer state_dict, loss를 딕셔너리로 저장합니다.
PyTorch에서 GPU 가속은 어떻게 사용하나요?
먼저 가용성을 확인합니다: `device = torch.device("cuda" if torch.cuda.is_available() else "cpu")`. 그런 다음 모델과 데이터를 디바이스로 이동합니다: `model.to(device)`, `data.to(device)`. 멀티 GPU 학습에는 `nn.DataParallel(model)`을 사용합니다. 혼합 정밀도 학습(속도 향상 및 메모리 절약)에는 순전파에 `torch.cuda.amp.autocast()` 컨텍스트와 역전파에 `GradScaler`를 사용합니다.
그래디언트 클리핑이란 무엇이고 언제 사용해야 하나요?
그래디언트 클리핑은 옵티마이저 스텝 전에 그래디언트 크기를 제한해 폭발 그래디언트 문제를 방지합니다. `loss.backward()` 이후, `optimizer.step()` 이전에 `torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)`을 사용합니다. 폭발 그래디언트는 긴 시퀀스를 학습할 때 여러 시간 단계에 걸쳐 그래디언트가 곱해지는 RNN, LSTM에서 흔히 발생합니다.