| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
- 머신러닝
- gradient
- linear regression
- importancesampling
- 역전파
- Miracle morning
- probabilisticmodeling
- 암호화폐
- ML
- 일기
- 시계열분석
- Chain rule
- neural network for causality
- backpropagation
- UCB
- SF
- 비트코인
- MCMC
- meta-learner models
- neural network
- English
- 선형회귀분석
- 알고리즘
- Montecarlo
- Causality
- diary
- bayes ball algorithm
- LSTM
- category
- Causal Inference
- Today
- Total
zip-sa | Data is important
Neural Network: Understanding the Basics and Implementation 본문
Neural Networks (신경망)은 현대 인공지능의 핵심 기술 중 하나로, 복잡한 데이터를 처리하고 다양한 문제를 해결하는 데 널리 사용됩니다. 이 글에서는 Neural Network의 기본 개념을 이해하고, PyTorch를 사용해 간단한 신경망을 구현하는 방법을 살펴보겠습니다.
1. What is a Neural Network?
Neural Network는 생물학적 뉴런의 구조와 기능을 본떠 만든 컴퓨팅 시스템입니다. 기본적으로, 신경망은 여러 개의 뉴런(neurons)이 레이어(layer)로 구성되어 있으며, 각 뉴런은 입력을 받아 계산한 후 결과를 다음 레이어로 전달합니다.
신경망의 가장 기본적인 구성 요소는 입력층(input layer), 은닉층(hidden layers), 그리고 출력층(output layer)입니다. 입력층은 외부 데이터가 들어오는 부분이고, 은닉층은 입력 데이터를 처리하여 유용한 피처를 추출하는 역할을 합니다. 마지막으로 출력층은 최종 예측을 내놓습니다.

2. Forward Pass: How Data Flows Through the Network
Neural Network에서 Forward Pass는 입력 데이터가 네트워크를 통해 어떻게 전달되고, 결과가 계산되는지를 의미합니다. 이 과정에서 입력 데이터는 각 뉴런의 가중치(weight)와 편향(bias)을 통해 변환되고, 활성화 함수(activation function)를 거쳐 다음 레이어로 전달됩니다.
활성화 함수는 신경망의 출력 값을 비선형적으로 만들어 주며, 네트워크가 복잡한 패턴을 학습할 수 있도록 돕습니다. 자주 사용되는 활성화 함수로는 ReLU(Rectified Linear Unit), 시그모이드(sigmoid), 그리고 소프트맥스(softmax) 함수가 있습니다.
$$
\text{y} = \sigma(\mathbf{W} \cdot \mathbf{x} + b)
$$
여기서 $\mathbf{x}$는 입력 벡터, $\mathbf{W}$는 가중치 행렬, $b$는 편향, $\sigma$는 활성화 함수를 나타냅니다.
3. Backpropagation: Learning from Errors
Neural Network는 예측을 할 때마다 예측 값과 실제 값의 차이를 계산합니다. 이 차이를 오차(error)라고 하며, 이를 최소화하기 위해 Backpropagation(역전파)이라는 학습 알고리즘을 사용합니다. 역전파는 오차를 네트워크의 마지막 층에서부터 첫 번째 층까지 역으로 전파하면서 각 뉴런의 가중치와 편향을 조정합니다.
역전파 과정은 다음과 같이 이루어집니다:
- 오차 계산: 손실 함수(loss function)를 사용해 예측 값과 실제 값의 차이를 계산합니다.
- 기울기 계산: 오차에 대한 가중치의 기울기(gradient)를 계산합니다.
- 가중치 업데이트: 경사 하강법(Gradient Descent) 등을 사용해 가중치를 업데이트합니다.
이 과정은 오차가 최소화될 때까지 반복됩니다.

4. Implementing a Simple Neural Network in PyTorch
이제 PyTorch를 사용해 간단한 Neural Network를 구현해 보겠습니다. 이 예제에서는 MNIST 데이터셋을 사용하여 손글씨 숫자를 분류하는 신경망을 구현합니다.
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
# 데이터 로드 및 전처리
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
# Neural Network 모델 정의
class SimpleNeuralNet(nn.Module):
def __init__(self):
super(SimpleNeuralNet, self).__init__()
self.fc1 = nn.Linear(28*28, 128)
self.fc2 = nn.Linear(128, 64)
self.fc3 = nn.Linear(64, 10)
self.relu = nn.ReLU()
def forward(self, x):
x = x.view(-1, 28*28) # Flatten the image
x = self.relu(self.fc1(x))
x = self.relu(self.fc2(x))
x = self.fc3(x) # No activation at the output layer
return x
# 모델 초기화
model = SimpleNeuralNet()
# 손실 함수 및 최적화 함수 정의
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 모델 학습
for epoch in range(10):
running_loss = 0.0
for images, labels in trainloader:
# Forward pass
outputs = model(images)
loss = criterion(outputs, labels)
# Backward pass and optimization
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f'Epoch {epoch+1}, Loss: {running_loss/len(trainloader):.4f}')
print('Finished Training')
이 코드는 간단한 3층 신경망을 정의하고, MNIST 데이터셋에 대해 학습하는 예제입니다. nn.Linear 레이어를 사용하여 각 층을 구현하고, ReLU 활성화 함수를 사용하여 비선형성을 추가했습니다. 손실 함수로는 CrossEntropyLoss를, 최적화 알고리즘으로는 SGD를 사용했습니다.
5. Evaluating the Neural Network
모델이 학습된 후에는 테스트 데이터를 사용하여 모델의 성능을 평가해야 합니다. 이를 위해 정확도(accuracy) 등의 지표를 사용할 수 있습니다.
(모델 평가 결과를 설명하는 이미지)
# 모델 평가
correct = 0
total = 0
testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)
with torch.no_grad():
for images, labels in testloader:
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Accuracy: {100 * correct / total:.2f}%')
이 코드는 테스트셋을 사용하여 학습된 모델의 정확도를 계산합니다. torch.no_grad()를 사용하여 평가 시에는 역전파가 발생하지 않도록 합니다.
결론
Neural Network는 복잡한 데이터 패턴을 학습하고 예측할 수 있는 강력한 도구입니다. 이 글에서는 기본 개념과 함께 PyTorch를 사용하여 간단한 신경망을 구현하고 학습시키는 과정을 살펴보았습니다. Neural Network의 핵심은 Forward Pass와 Backpropagation을 통해 데이터를 학습시키고, 이를 바탕으로 예측을 최적화하는 데 있습니다. 추후 다양한 아키텍처와 데이터셋을 활용하여 더 복잡한 문제를 해결할 수 있는 신경망을 구현해볼 수 있을 것입니다.
'AI > ML' 카테고리의 다른 글
| Monte Carlo (MC) 근사와 샘플링 기법 (6) | 2024.09.05 |
|---|---|
| Backpropagation with PyTorch (5) | 2024.08.16 |
| Building Machine Learning Models with PyTorch: Key Concepts and Fundamentals (6) | 2024.08.16 |
| Machine Learning Life Cycle(with Titanic) (5) | 2024.08.16 |
| Linear Regression: A Comprehensive Overview with PyTorch Implementation (1) | 2024.08.14 |