본문 바로가기
AI Framework/PyTorch

[PyTorch] 주요 개념

by cogito21_python 2024. 6. 8.
반응형

PyTorch는 페이스북의 AI 연구팀에서 개발한 오픈 소스 딥러닝 프레임워크로, 특히 연구와 개발 환경에서 많이 사용됩니다. PyTorch는 텐서 계산 및 동적 계산 그래프를 기반으로 하며, 이를 통해 복잡한 모델을 쉽게 설계하고 디버깅할 수 있습니다. PyTorch의 핵심 개념과 기능을 소개하겠습니다.

1. 텐서(Tensor)

  • 텐서는 PyTorch의 기본 데이터 구조입니다. 텐서는 N차원의 배열로, 수학적 연산을 수행하는 데 사용됩니다.

  • 텐서는 torch.Tensor 클래스를 사용하여 생성할 수 있습니다. 예를 들어, 2x3 행렬을 생성하려면 다음과 같습니다.

    import torch
    x = torch.Tensor([[1, 2, 3], [4, 5, 6]])

2. 자동 미분(Autograd)

  • Autograd는 PyTorch의 자동 미분 엔진입니다. 계산 그래프를 동적으로 생성하고, 역전파(backpropagation)를 통해 그래디언트를 자동으로 계산합니다.

  • requires_grad=True로 설정된 텐서는 모든 연산을 추적하며, backward() 메서드를 호출하면 그래디언트를 계산합니다.

    x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
    y = x + 2
    z = y * y * 3
    z = z.mean()
    z.backward()
    print(x.grad)  # x에 대한 그래디언트 출력

3. 신경망(Neural Network)

  • PyTorch는 torch.nn 모듈을 통해 신경망을 쉽게 구성할 수 있는 도구를 제공합니다. nn.Module 클래스를 상속하여 새로운 신경망 모듈을 정의할 수 있습니다.

  • 예를 들어, 간단한 선형 회귀 모델을 정의하려면 다음과 같습니다.

    import torch.nn as nn
    
    class LinearRegressionModel(nn.Module):
        def __init__(self, input_dim, output_dim):
            super(LinearRegressionModel, self).__init__()
            self.linear = nn.Linear(input_dim, output_dim)
    
        def forward(self, x):
            out = self.linear(x)
            return out
    
    model = LinearRegressionModel(1, 1)

4. 최적화(Optimization)

  • PyTorch는 torch.optim 모듈을 통해 다양한 최적화 알고리즘을 제공합니다. 일반적으로 사용되는 알고리즘으로는 SGD, Adam 등이 있습니다.

  • 예를 들어, SGD를 사용하여 모델을 최적화하려면 다음과 같습니다.

    import torch.optim as optim
    
    criterion = nn.MSELoss()
    optimizer = optim.SGD(model.parameters(), lr=0.01)
    
    # 훈련 루프
    for epoch in range(100):
        inputs = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
        targets = torch.tensor([[2.0], [4.0], [6.0], [8.0]])
    
        # 순전파
        outputs = model(inputs)
        loss = criterion(outputs, targets)
    
        # 역전파 및 최적화
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    
        print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')

5. 데이터 처리(Data Loading)

  • PyTorch는 torch.utils.data 모듈을 통해 데이터셋을 쉽게 처리할 수 있는 도구를 제공합니다. DatasetDataLoader 클래스를 사용하여 데이터셋을 정의하고, 배치 단위로 데이터를 로드할 수 있습니다.

  • 예를 들어, 간단한 데이터셋을 정의하고 로드하려면 다음과 같습니다.

    from torch.utils.data import Dataset, DataLoader
    
    class SimpleDataset(Dataset):
        def __init__(self):
            self.data = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
            self.labels = torch.tensor([[2.0], [4.0], [6.0], [8.0]])
    
        def __len__(self):
            return len(self.data)
    
        def __getitem__(self, idx):
            return self.data[idx], self.labels[idx]
    
    dataset = SimpleDataset()
    dataloader = DataLoader(dataset, batch_size=2, shuffle=True)
    
    for data, labels in dataloader:
        print(data, labels)

6. GPU 지원

  • PyTorch는 GPU를 사용하여 연산을 가속화할 수 있습니다. GPU를 사용하려면 텐서나 모델을 GPU로 옮기면 됩니다.

    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model.to(device)

6. 커스텀 레이어 및 모델 정의

PyTorch는 nn.Module을 상속받아 사용자 정의 레이어와 모델을 쉽게 구현할 수 있습니다. 이를 통해 복잡한 모델 아키텍처를 만들 수 있습니다.

import torch.nn as nn
import torch

class CustomLayer(nn.Module):
    def __init__(self):
        super(CustomLayer, self).__init__()
        self.linear = nn.Linear(10, 10)

    def forward(self, x):
        x = self.linear(x)
        return torch.relu(x)

class CustomModel(nn.Module):
    def __init__(self):
        super(CustomModel, self).__init__()
        self.layer1 = CustomLayer()
        self.layer2 = nn.Linear(10, 1)

    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        return x

model = CustomModel()

7. 학습률 스케줄러(Learning Rate Schedulers)

PyTorch의 torch.optim.lr_scheduler 모듈은 학습률을 동적으로 조절할 수 있는 다양한 스케줄러를 제공합니다. 예를 들어, StepLR을 사용하여 일정 간격마다 학습률을 감소시킬 수 있습니다.

import torch.optim as optim
import torch.optim.lr_scheduler as lr_scheduler

optimizer = optim.SGD(model.parameters(), lr=0.1)
scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)

for epoch in range(100):
    # 훈련 코드
    # ...

    # 학습률 업데이트
    scheduler.step()

8. 데이터 증강(Data Augmentation)

데이터 증강은 모델의 일반화 성능을 높이기 위해 입력 데이터를 다양한 방식으로 변형하는 기법입니다. PyTorch는 torchvision.transforms 모듈을 통해 이미지 데이터에 대한 다양한 데이터 증강 기능을 제공합니다.

from torchvision import transforms

transform = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomCrop(32, padding=4),
    transforms.ToTensor(),
])

# Dataset과 함께 사용

9. 혼합 정밀도 훈련(Mixed Precision Training)

혼합 정밀도 훈련은 모델의 일부 연산을 16비트 부동 소수점(float16)으로 수행하여 메모리 사용량을 줄이고 계산 속도를 높이는 기술입니다. PyTorch는 torch.cuda.amp 모듈을 통해 이를 지원합니다.

from torch.cuda.amp import GradScaler, autocast

scaler = GradScaler()

for data, target in dataloader:
    optimizer.zero_grad()

    with autocast():
        output = model(data)
        loss = loss_fn(output, target)

    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()

10. 사용자 정의 데이터셋(Custom Dataset) 및 데이터 로더(Data Loader)

PyTorch의 torch.utils.data.Dataset을 상속받아 사용자 정의 데이터셋을 만들 수 있으며, DataLoader를 사용하여 효율적으로 데이터를 로드할 수 있습니다.

from torch.utils.data import Dataset, DataLoader

class CustomDataset(Dataset):
    def __init__(self, data, labels):
        self.data = data
        self.labels = labels

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        return self.data[idx], self.labels[idx]

data = torch.randn(100, 10)
labels = torch.randn(100, 1)
dataset = CustomDataset(data, labels)
dataloader = DataLoader(dataset, batch_size=4, shuffle=True)

for batch in dataloader:
    inputs, targets = batch
    # 훈련 코드

11. 모델 체크포인트 저장 및 로드(Model Checkpointing)

훈련 중간에 모델을 저장하고 나중에 불러올 수 있습니다. 이를 통해 훈련이 중단되더라도 이어서 계속할 수 있습니다.

# 모델 저장
torch.save(model.state_dict(), 'model.pth')

# 모델 로드
model = CustomModel()
model.load_state_dict(torch.load('model.pth'))
model.eval()  # 추론 모드로 전환

12. 텐서보드 지원(TensorBoard Support)

PyTorch는 텐서보드를 통해 훈련 과정을 시각화할 수 있도록 지원합니다. 이를 통해 손실, 정확도, 그래디언트 등의 메트릭을 모니터링할 수 있습니다.

from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter()

for epoch in range(num_epochs):
    for batch_idx, (data, target) in enumerate(dataloader):
        # 훈련 코드
        writer.add_scalar('Loss/train', loss.item(), epoch * len(dataloader) + batch_idx)

writer.close()

13. 모델 병렬 처리(Model Parallelism)

대규모 모델을 여러 GPU에 분산하여 훈련할 수 있습니다. PyTorch는 torch.nn.DataParalleltorch.nn.parallel.DistributedDataParallel을 통해 이를 지원합니다.

model = nn.DataParallel(CustomModel())
model.to(device)

14. 전이 학습(Transfer Learning)

전이 학습은 사전 학습된 모델을 사용하여 새로운 작업을 빠르게 해결할 수 있는 기법입니다. 일반적으로 대규모 데이터셋에서 학습된 모델의 가중치를 초기화하거나, 일부 레이어를 고정(freeze)하고 새로운 데이터에 맞게 나머지 레이어를 학습시킵니다.

import torchvision.models as models

# 사전 학습된 ResNet 모델 로드
model = models.resnet18(pretrained=True)

# 마지막 레이어를 새로운 작업에 맞게 수정
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, num_classes)

# 특정 레이어 고정
for param in model.parameters():
    param.requires_grad = False

# 새로운 레이어만 학습
for param in model.fc.parameters():
    param.requires_grad = True

15. 하이퍼파라미터 튜닝(Hyperparameter Tuning)

최적의 하이퍼파라미터를 찾기 위해 다양한 검색 방법을 사용할 수 있습니다. optuna, ray.tune 등의 라이브러리를 사용하여 하이퍼파라미터 검색을 자동화할 수 있습니다.

import optuna

def objective(trial):
    lr = trial.suggest_loguniform('lr', 1e-5, 1e-1)
    batch_size = trial.suggest_int('batch_size', 16, 128)
    model = create_model()  # 사용자 정의 모델 생성 함수
    optimizer = torch.optim.Adam(model.parameters(), lr=lr)
    # 훈련 및 검증 코드
    return validation_loss

study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=100)
print(study.best_params)

16. 딥러닝 라이브러리 및 프레임워크 통합

PyTorch는 다른 딥러닝 프레임워크 및 라이브러리와 통합하여 사용할 수 있습니다. 예를 들어, Hugging Face Transformers를 사용하여 자연어 처리 모델을 쉽게 다룰 수 있습니다.

from transformers import BertTokenizer, BertModel

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

inputs = tokenizer("Hello, world!", return_tensors="pt")
outputs = model(**inputs)

17. 모델 해석 및 설명(Explainable AI)

모델의 예측 결과를 해석하고 설명하는 것은 중요합니다. SHAP, LIME 같은 라이브러리를 사용하여 모델의 예측을 설명할 수 있습니다.

import shap

# 데이터 준비
data = ...

# 모델 준비
model = ...

# SHAP 값을 계산하고 시각화
explainer = shap.Explainer(model, data)
shap_values = explainer(data)
shap.summary_plot(shap_values, data)

18. 강화 학습(Reinforcement Learning)

PyTorch를 사용하여 강화 학습 알고리즘을 구현할 수 있습니다. OpenAI Gym과 같은 환경과 함께 사용하여 강화 학습 모델을 학습시킬 수 있습니다.

import gym
import torch
import torch.nn as nn
import torch.optim as optim

# 환경 설정
env = gym.make('CartPole-v1')

# 모델 정의
class PolicyNetwork(nn.Module):
    def __init__(self):
        super(PolicyNetwork, self).__init__()
        self.fc = nn.Linear(4, 2)

    def forward(self, x):
        return torch.softmax(self.fc(x), dim=-1)

model = PolicyNetwork()
optimizer = optim.Adam(model.parameters(), lr=0.01)

# 강화 학습 코드
# ...

19. 컴퓨터 비전 및 자연어 처리(CV/NLP)

PyTorch는 컴퓨터 비전과 자연어 처리 분야에서도 강력한 도구입니다. torchvisiontorchtext 라이브러리를 사용하여 다양한 데이터셋과 모델을 쉽게 활용할 수 있습니다.

컴퓨터 비전

import torchvision.transforms as transforms
from torchvision.datasets import CIFAR10

transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
train_dataset = CIFAR10(root='./data', train=True, transform=transform, download=True)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)

자연어 처리

from torchtext.data import Field, TabularDataset, BucketIterator

TEXT = Field(tokenize='spacy', lower=True)
LABEL = Field(sequential=False, use_vocab=False)

datafields = [('text', TEXT), ('label', LABEL)]
train, val, test = TabularDataset.splits(path='data', train='train.csv', validation='val.csv', test='test.csv', format='csv', fields=datafields)

TEXT.build_vocab(train, vectors="glove.6B.100d")
train_iter, val_iter, test_iter = BucketIterator.splits((train, val, test), batch_size=32, sort_within_batch=True, sort_key=lambda x: len(x.text))

20. 배포(Deployment)

학습된 모델을 실제 서비스에 배포하는 것도 중요합니다. PyTorch는 torch.jit을 사용하여 모델을 TorchScript로 변환하고, 이를 통해 모델을 최적화하여 배포할 수 있습니다.

import torch

# 모델 정의 및 학습
model = ...

# TorchScript로 변환
scripted_model = torch.jit.script(model)

# 모델 저장
torch.jit.save(scripted_model, 'model.pt')

# 모델 로드 및 추론
loaded_model = torch.jit.load('model.pt')
output = loaded_model(input_tensor)
반응형