AI 개발 공부 공간

AI, 머신러닝, 딥러닝, Python & PyTorch, 실전 프로젝트

딥러닝/딥러닝: PyTorch

PyTorch 8 : 손실함수와 옵티마이저

qordnswnd123 2025. 1. 19. 11:47

1. 손실함수(Loss Function)

1) 손실함수

손실함수는 딥러닝 모델을 학습시키는 과정에서 사용하는 기준으로, 모델의 예측값과 실제값 사이의 차이를 측정합니다.
이 차이, 즉 '손실'을 통해 모델의 성능을 평가하고, 모델의 파라미터를 최적화하기 위한 기준으로 활용됩니다.
손실함수의 값이 낮을수록 모델의 예측이 실제값과 더 잘 일치한다는 것을 의미하며, 모델 학습의 목표는 이 손실함수의 값을 최소화하는 것입니다.

 

파이토치는 다양한 종류의 손실함수를 제공하며, 이는 주로 사용되는 문제의 유형(예: 회귀, 분류 등)에 따라 선택됩니다.
아래는 손실함수의 예시입니다.

  • 평균 제곱 오차 손실(Mean Squared Error Loss, MSE):
    회귀 문제에 주로 사용되며, 예측값과 실제값의 차이를 제곱하여 평균한 값입니다.
    torch.nn.MSELoss()
  • 교차 엔트로피 손실(Cross-Entropy Loss):
    분류 문제에 주로 사용되며, 모델이 실제 클래스를 정확히 예측하는 데 얼마나 잘하는지를 측정합니다.
    torch.nn.CrossEntropyLoss()
  • 이진 교차 엔트로피 손실(Binary Cross-Entropy Loss):
    이진 분류 문제에 사용되며, 두 클래스에 대한 예측 확률을 사용하여 손실을 계산합니다.
    torch.nn.BCELoss()

2) 사용방법

손실함수를 사용하는 방법은 간단합니다.

먼저 손실함수의 인스턴스를 생성하고, 모델의 예측값과 실제값을 손실함수에 전달하여 손실값을 계산합니다.
그 후, 이 손실값을 사용하여 모델의 파라미터를 업데이트하는 과정(예: 역전파)을 수행합니다.

  1. 손실함수 인스턴스 생성
  2. 모델의 예측값과 실제값을 손실함수에 전달
  3. 손실함수가 반환한 손실값을 이용해 역전파 계산

3) 손실함수의 종류

 


2. 옵티마이저(Optimizer)

1) 옵티마이저

딥러닝 모델을 훈련시키는 과정에서, 우리의 목표는 손실 함수(loss function)의 값을 최소화하고 가장 정확한 예측을 할 수 있는 모델 파라미터를 찾는 것입니다.

이 목표를 달성하기 위해 사용하는 도구가 바로 '옵티마이저(optimizer)'입니다.

옵티마이저는 모델이 학습 데이터로부터 얼마나 잘 학습하고 있는지를 평가하는 손실 함수의 값을 최소화하기 위해 모델 파라미터를 조정하는 방법을 정의합니다.

이 과정에서 사용하는 가장 기본적인 알고리즘은 '경사 하강법(Gradient Descent)'입니다.

경사 하강법은 손실 함수의 기울기(gradient)를 계산하여, 이 기울기가 감소하는 방향으로 모델 파라미터를 조금씩 업데이트합니다.

하지만 실제로는 경사 하강법의 여러 변형이 존재합니다.

이들 각각은 다른 수학적 기법을 적용해, 학습과정의 속도를 개선하거나, 더 나은 수렴을 달성하도록 설계되었습니다.

대표적인 옵티마이저로는 SGD(Stochastic Gradient Descent), Adam, RMSprop 등이 있습니다.

옵티마이저의 선택은 모델의 성능에 큰 영향을 미칠 수 있으며, 사용되는 데이터셋이나 모델의 구조에 따라 최적의 옵티마이저가 달라질 수 있습니다.

따라서 다양한 옵티마이저를 실험해보고, 문제에 가장 적합한 옵션을 찾는 것이 중요합니다.

2) 옵티마이저 사용 방법

옵티마이저는 torch.optim 모듈에서 불러올 수 있습니다.

import torch.optim as optim

다음으로, 옵티마이저 객체를 생성합니다.

옵티마이저 객체를 생성할 때는 최소 두 가지 주요 인자를 전달해야 합니다.

모델의 파라미터 model.parameters()와 학습률(lr) 입니다.

3) 옵티마이저의 종류

4) 코드예시

# 딥러닝 모델 정의
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.layer1 = nn.Linear(in_features=1, out_features=5)  # 첫 번째 선형 레이어
        self.relu = nn.ReLU()  # ReLU 활성화 함수
        self.layer2 = nn.Linear(in_features=5, out_features=1)  # 두 번째 선형 레이어

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

# 모델 인스턴스 생성
model = SimpleNN()
# SGD 옵티마이저 설정
optimizer = optim.SGD(model.parameters(), lr=0.01)
print(optimizer)
SGD (
Parameter Group 0
    dampening: 0
    differentiable: False
    foreach: None
    fused: None
    lr: 0.01
    maximize: False
    momentum: 0
    nesterov: False
    weight_decay: 0
)