PyTorch는 Facebook AI Research가 개발한 오픈소스 머신러닝 라이브러리로, 동적 계산 그래프의 장점을 활용합니다. PyTorch는 직관적인 워크플로우와 강력한 기능 덕분에 연구자들과 개발자들에게 인기가 많습니다.
주요 특징
PyTorch를 선택해야 하는 경우
PyTorch에서 Tensor는 다차원 배열로, 효율적인 수치 연산을 가능하게 하는 데이터 구조입니다. CPU, GPU 등 다양한 장치에서 작동하며, numpy.array
와 유사한 기능을 제공합니다.
주요 특징
PyTorch 초기 버전(0.4 이전)에는 Tensor
와 Variable
이 구분되어 있었습니다.
.backward()
를 통해 기울기 계산이 가능했습니다.현재 (0.4 이후)
Variable
이 Tensor
로 통합되어, 현재 모든 Tensor
는 자동 미분을 지원합니다. torch.no_grad()
와 같은 컨텍스트 관리자를 사용하여 미분을 비활성화할 수 있습니다.
NumPy 배열을 PyTorch Tensor로 변환하는 방법은 여러 가지가 있습니다.
import numpy as np
import torch
numpy_array = np.array([1, 2, 3])
tensor = torch.Tensor(numpy_array)
tensor = torch.from_numpy(numpy_array)
이 방식은 Tensor와 NumPy 배열이 메모리를 공유합니다.
.grad
속성은 Tensor의 기울기(gradient)를 저장하며, 역전파(backpropagation)를 통해 계산됩니다.
.requires_grad=True
로 설정된 Tensor의 기울기를 추적합니다..backward()
호출 시 역전파가 수행됩니다.CUDA는 NVIDIA GPU에서 실행되는 병렬 컴퓨팅 플랫폼입니다. PyTorch는 CUDA를 활용하여 GPU 가속을 지원하며, 딥러닝 작업의 속도를 크게 향상시킵니다.
기본 GPU 사용 예제:
import torch
if torch.cuda.is_available():
device = torch.device("cuda")
tensor_on_gpu = torch.rand(2, 2).to(device)
print(tensor_on_gpu)
else:
print("GPU를 사용할 수 없습니다.")
PyTorch의 Autograd는 동적 계산 그래프를 생성하고, 이를 기반으로 역전파를 통해 기울기를 계산합니다.
requires_grad=True
로 설정된 Tensor는 모든 연산을 기록합니다..backward()
호출 시, 계산 그래프를 통해 기울기를 계산합니다.torch.nn.Module
을 상속하여 모델 아키텍처를 정의합니다.예제 코드:
import torch
import torch.nn as nn
import torch.optim as optim
class NeuralNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(NeuralNet, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
model = NeuralNet(28*28, 100, 10)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
torch.nn.Module
을 상속.__init__
메서드에서 레이어 정의.forward
메서드에서 연산 정의.예제:
import torch
import torch.nn as nn
class CustomLayer(nn.Module):
def __init__(self, in_features, out_features):
super(CustomLayer, self).__init__()
self.weight = nn.Parameter(torch.randn(out_features, in_features))
def forward(self, x):
return torch.matmul(x, self.weight.t())
forward
메서드 역할PyTorch에서 forward
메서드는 모델 입력 데이터를 예측값으로 변환하는 핵심 역할을 합니다. 이는 동적 계산 그래프를 생성하고 모델 학습에 필수적인 구조를 제공합니다.
핵심 특징:
forward
메서드 실행 중 계산 그래프를 생성하며, 이 그래프는 역전파(backpropagation) 시 사용됩니다.forward
메서드는 데이터 구조와 모델 아키텍처의 유연한 정의를 지원합니다.model(input)
호출 시 forward
메서드가 실행되어 예측값을 반환하고 계산 그래프를 생성합니다.예제 코드:
import torch
import torch.nn as nn
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.linear1 = nn.Linear(10, 5)
self.activation = nn.ReLU()
self.linear2 = nn.Linear(5, 1)
def forward(self, x):
x = self.linear1(x)
x = self.activation(x)
x = self.linear2(x)
return x
# 모델 인스턴스 생성 및 forward 호출
model = SimpleNN()
input_data = torch.randn(2, 10) # 샘플 입력
output = model(input_data)
print(output)
Optimizers는 학습 과정에서 모델 파라미터를 갱신하는 알고리즘입니다. PyTorch는 torch.optim
모듈에서 다양한 최적화 알고리즘(SGD, Adam 등)을 제공합니다.
주요 Optimizer:
워크플로우:
예제 코드:
import torch
import torch.nn as nn
import torch.optim as optim
model = nn.Linear(10, 1)
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# 학습 루프
for inputs, targets in data_loader:
optimizer.zero_grad() # 기존 기울기 초기화
outputs = model(inputs) # Forward
loss = criterion(outputs, targets) # 손실 계산
loss.backward() # Backward
optimizer.step() # 가중치
zero_grad()
의 목적과 사용 시점zero_grad()
는 기울기 누적 방지를 위해 사용됩니다. 역전파 과정에서 계산된 기울기를 다음 반복에서 초기화하지 않으면 잘못된 업데이트가 발생할 수 있습니다.
코드 예제:
import torch
import torch.optim as optim
model = torch.nn.Linear(1, 1)
optimizer = optim.SGD(model.parameters(), lr=0.01)
inputs = torch.randn(1, 1, requires_grad=True)
target = torch.randn(1, 1)
# 학습 반복
for _ in range(5):
output = model(inputs)
loss = torch.nn.functional.mse_loss(output, target)
optimizer.zero_grad() # 기울기 초기화
loss.backward() # 역전파로 기울기 계산
optimizer.step() # 가중치 갱신
학습률 스케줄링은 학습률을 조정하여 학습 성능을 최적화하는 기술입니다. PyTorch는 torch.optim.lr_scheduler
모듈에서 다양한 스케줄러를 제공합니다.
주요 스케줄러:
예제 코드:
import torch.optim.lr_scheduler as lr_scheduler
scheduler = lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.5)
for epoch in range(20):
# 학습 과정
optimizer.step()
scheduler.step() # 학습률 갱신
Backpropagation은 손실 함수의 기울기를 계산하고, 이를 기반으로 모델 파라미터를 업데이트하는 과정입니다.
Backpropagation의 단계:
.backward()
를 호출하여 계산 그래프를 따라 기울기를 계산.코드 예제:
import torch
import torch.nn as nn
import torch.optim as optim
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc = nn.Linear(1, 1)
def forward(self, x):
return self.fc(x)
model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.01)
features = torch.tensor([[1.0], [2.0], [3.0]], requires_grad=True)
labels = torch.tensor([[2.0], [4.0], [6.0]])
for epoch in range(100):
output = model(features) # Forward Pass
loss = nn.MSELoss()(output, labels) # 손실 계산
optimizer.zero_grad() # 기존 기울기 초기화
loss.backward() # 역전파
optimizer.step() # 가중치 업데이트
print("학습된 가중치:", model.fc.weight)
print("학습된 바이어스:", model.fc.bias)
활성화 함수는 뉴런의 출력값을 결정하며, 출력값을 특정 범위로 매핑합니다 (예: 01 또는 -11).
활성화 함수는 선형(Linear)과 비선형(Non-linear) 함수로 나눌 수 있습니다.
시그모이드 함수는 S-자 형태의 곡선을 가지며, 출력값이 항상 0과 1 사이에 위치합니다.
이는 확률값을 출력해야 하는 모델(예: 이진 분류)에서 적합합니다.
하지만, 기울기 소실 문제(Vanishing Gradient Problem) 때문에 ReLU와 같은 다른 활성화 함수가 더 자주 사용됩니다.
피드포워드는 입력 데이터를 받아서 예측값을 생성하는 프로세스를 의미합니다.
피드포워드 네트워크는 입력층(Input Layer), 숨겨진 계층(Hidden Layer), 출력층(Output Layer)으로 구성됩니다.
컨볼루션 층은 CNN(Convolutional Neural Network)의 첫 번째 층으로, 입력 이미지에서 특징(feature)을 추출합니다.
Stride는 필터가 입력 매트릭스 위를 이동하는 픽셀 단위를 나타냅니다.
패딩은 입력 이미지 가장자리에 추가적인 픽셀(주로 0)을 추가하는 방법입니다.
풀링 층은 이미지를 다운샘플링하여 차원을 줄이고 연산량을 감소시킵니다.
Fully Connected Layer(완전 연결 계층)는 뉴럴 네트워크의 마지막 층으로, 모든 입력 뉴런이 출력 뉴런과 연결됩니다.
Softmax 함수는 숫자(Logits)를 확률로 변환하는 함수입니다.
Auto-Encoder는 비지도 학습 알고리즘으로, 입력값을 동일한 출력값으로 재구성하도록 학습합니다.
Autograd는 PyTorch에서 자동 미분을 지원하는 모듈입니다.
torch.optim
은 PyTorch에서 제공하는 최적화 알고리즘 모듈입니다.
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
MNIST 데이터셋은 손글씨 숫자 이미지 데이터베이스로, 이미지 인식과 딥러닝 모델 실험에 자주 사용됩니다.
CIFAR-10 데이터셋은 컬러 이미지 데이터셋으로, 머신러닝과 컴퓨터 비전 알고리즘 학습에 사용됩니다.