파이토치의 주요 손실함수(Loss Function)
종류 | 손실함수 | 설명 | 사용예 |
회귀 (Regression) |
nn.MSELoss() | 평균 제곱 오차 (Mean Squared Error) | 연속적인 값 예측 (예: 가격) |
nn.L1Loss() | 절대값 오차 (Mean Absolute Error) | 이상치에 덜 민감한 회귀 | |
nn.SmoothL1Loss() | MSE와 L1의 중간 형태 | 이상치가 일부 있는 경우 | |
이진 분류 | nn.BCELoss() | Binary Cross Entropy | sigmoid |
nn.BCEWithLogitsLoss() | Sigmoid + BCE를 함께 처리 | ||
다중 분류 | nn.CrossEntropyLoss() | Softmax + NLLLoss 결합 형태 | 다중클래스 분류 |
다중 라벨 분류 | nn.MultiLabelSoftMarginLoss() | 여러 클래스에 동시에 속할 수 있는 경우 | 태그 분류 등 |
기타 | nn.NLLLoss() | 음의 로그 우도 (Negative Log Likelihood) | LogSoftMax 입력값 |
nn.CTCLoss() | Sequence to Sequence 정렬 필요 없는 Loss | 음성 인식, OCR 등 | |
nn.MarginRankingLoss() | 두 입력 간 순위 비교 | 추천 시스템, 랭킹 | |
nn.TripletMarginLoss() | anchor-positive-negative 거리 학습 | 얼굴 인식 등 |
딥러닝에서 대표적으로 회귀는 MSE, 분류는 CrossEntropy를 사용합니다.
회귀(Regression) 문제에서 사용하는 손실 함수로 주로 MSELoss (Mean Squared Error)를 사용합니다.
(1) MSELoss (Mean Squared Error)
예측값과 실제값의 차이를 제곱하여 평균낸 손실 함수입니다.
오차가 클수록 제곱으로 인해 더 큰 패널티를 주게 됩니다.
이상치에 민감합니다.
$MSE = \frac{1}{n} \sum_{i=1}^{n}(y_i - \hat{y}_i)^2$
PyTorch: nn.MSELoss()
(2) L1Loss (Mean Absolute Error)
예측값과 실제값의 차이를 절대값으로 계산하여 평균낸 손실입니다.
절대값이라 이상치에 덜 민감합니다.
$MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|$
PyTorch: nn.L1Loss()
(3) SmoothL1Loss (Huber Loss)
MSE와 MAE의 장점을 결합한 손실 함수입니다.
오차가 작을 땐 MSE처럼 작동하고, 오차가 클 땐 MAE처럼 작동하여 이상치의 영향을 줄이면서도 안정적인 학습을 유도합니다.
PyTorch: nn.SmoothL1Loss()
분류(Classification) 문제에서 사용하는 손실 함수 주로 CrossEntropyLoss를 사용합니다.
(1) CrossEntropyLoss (다중 클래스 분류)
분류에서 가장 널리 사용되는 손실 함수입니다.
softmax를 통해 예측값을 확률로 만든 뒤, 정답 클래스에 대해 log 확률 값을 계산합니다.
$L = -\frac{1}{n} \sum_{i=1}^{n} y_i \cdot \log(\hat{y}_i)$
PyTorch: nn.CrossEntropyLoss()
※ 내부적으로 log_softmax + NLLLoss가 혼합되어 사용됩니다.
(2) BCELoss (Binary Cross Entropy)
이진 분류(binary classification) 문제에서 BCELoss (Binary Cross Entropy)사용됩니다.
정답이 0 또는 1일 때, 그에 해당하는 예측 확률에 로그를 취해 손실을 계산합니다.
$L = -\frac{1}{n} \sum_{i=1}^{n} \left( y_i \cdot \log(\hat{y}_i) + (1 - y_i) \cdot \log(1 - \hat{y}_i) \right)$
수식은 복자배보이지만 CrossEntropyLoss를 이전 형식으로 변경된 수식으로
실제값이 0과 1이므로 +로 연결된 부분의 한쪽만 사용되어 실제 계산은 단순화됩니다.
(3) BCEWithLogitsLoss
이진 분류에서는 모델의 출력값이 logit인 경우가 많기 때문에, BCELoss보다는 BCEWithLogitsLoss를 더 자주 사용합니다.
이 손실 함수는 내부적으로 Sigmoid 함수와 BCELoss를 결합한 형태입니다.
CrossEntropyLoss 역시 다중 클래스 분류에서 Logit 값을 입력으로 사용하며, 내부적으로 Softmax + NLLLoss를 포함하는 것과 동일한 맥락입니다.
수식은 다음과 같이 Sigmoid를 포함한 Binary Cross Entropy 형태로 표현됩니다:
$L = - \left( y \cdot \log(\sigma(x)) + (1 - y) \cdot \log(1 - \sigma(x)) \right)$
여기서 sigmoid 함수는 다음과 같이 정의됩니다
$\sigma(x) = \frac{1}{1 + e^{-x}}$
결론적으로 대부분의 경우
회귀는 MSELoss를 사용하고, 이상치에 민감한 경우에는 SmoothL1Loss가 더 적합합니다.
분류의 경우 다중클래스 분류는 CrossEntropyLoss, 이진 분류는 BCEWithLogitsLoss 를 사용하면 됩니다.
'딥러닝 > 파이토치' 카테고리의 다른 글
파이토치 - Optimizer (0) | 2025.04.18 |
---|---|
파이토치 04. 동적 계산 그래프(Dynamic Computational Graph) (0) | 2025.03.30 |
3. 파이토치 패키지 및 주요 클래스 (0) | 2025.03.29 |
파이토치 - 02. Tensor (0) | 2025.03.15 |
파이토치 - 01 개요 (0) | 2025.03.15 |