딥러닝 모델에서 이미지 분할 작업의 성능을 향상시키기 위해 다양한 손실 함수가 사용됩니다. 이번 글에서는 BCE부터 MCCLoss까지 다양한 손실 함수들을 정리해보겠습니다.

순서와 간단한 요약 아래와 같습니다.

  1. BCE (Binary Cross Entropy): 기본적인 손실 함수 중 하나로, 주로 이진 분류 문제에서 사용되는 함수.
  2. DICE: 두 집합간의 유성을 측정하는 지표입니다. $ \text{DICE}= 2|AUB| / (|A|+|B|)$
  3. Jaccard loss: 두 유사성을 측정하느 또 다른 방법. $\text{Jaccard}=|A \cap B| / |A \cup B|$
  4. Tversky Loss: Jaccard 손실 함수의 가중치 버전.  $\text{Tversky}=\frac{ |A \cap B| }{ |A \cap B| + \alpha |A-B| + \beta |B-A| } $
  5. Focal loss: 클래스 불균형을 해결하기 위한 손실함수 $\text{Focal L}= -\frac{1}{N} \sum_{i=1}^{N}(1-p_{i})^{\lambda}log(p_{i})$
  6. SoftBCEWithLogitsLoss: BCE에 label smoothing이 적용
  7. MCCLoss: Confusion matrix의 각 항목을 지표화 시켜놓은 손실함

 

BCE (Binary Cross Entropy)

기본적인 손실 함수 중 하나로, 주로 이진 분류 문제에서 사용됩니다. BCE는 다음과 같은 수식으로 정의됩니다:

$\text{BCE} = - \frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right]$

여기서 $y_i$는 실제 라벨, $p_{i}$는 예측 확률입니다. BCE는 픽셀 단위로 계산되기 때문에 이미지 분할 문제에도 적용할 수 있습니다.

 

DICE

DICE 손실 함수는 분할 작업에서 자주 사용되는 또 다른 손실 함수입니다. DICE 계수는 두 집합 간의 유사성을 측정하는 지표로, 손실 함수로 사용될 때는 다음과 같이 정의됩니다:

$\text{DICE} = \frac{2|A \cap B|}{|A| + |B|}$

손실 함수로 사용할 때는 1에서 DICE 계수를 뺀 값을 사용합니다. DICE 손실 함수는 미분 가능하여 역전파 과정에서 사용할 수 있습니다. IoU랑 거의 흡사하나, IoU은 Intersection인 $ A \cap B| $에 그치지만, 분자 더 집중할 수 있도록 2배를 하였습니다.

 

Jaccard Loss

Jaccard 계수는 두 집합 간의 유사성을 측정하는 또 다른 방법입니다. Jaccard 손실 함수는 다음과 같이 정의됩니다:

Jaccard 손실 함수 역시 픽셀 단위로 계산되며, 미분 가능하여 역전파 과정에서 사용할 수 있습니다

 

Tversky Loss

Tversky 손실 함수는 Jaccard 손실 함수의 가중치 버전입니다. Tversky 지수는 다음과 같이 정의됩니다:

여기서 $\alpha$ 와 $\beta$ 는 가중치로, 두 값에 따라 민감도를 조절할 수 있습니다.

 

 

Focal Loss

Focal Loss는 클래스 불균형 문제를 해결하기 위해 제안된 손실 함수입니다. Focal Loss는 다음과 같이 정의됩니다:

$ \text{Focal Loss} = - \frac{1}{N} \sum_{i=1}^{N} (1 - p_i)^{\gamma} \log(p_i)$

여기서 $\gamma$ 는 조정 가능한 매개변수로, 일반적으로 2로 설정됩니다. Focal Loss는 특히 어려운 클레스를 학습하는 데 유리합니다.

 

 

SoftBCEWeightLogitLoss

SoftBCEWithLogitsLoss는 label smoothing 기법을 적용한 BCE 손실 함수입니다. 이는 모델이 더 일반화된 예측을 할 수 있도록 도와줍니다. 수식은 다음과 같습니다:

$\text{SoftBCEWithLogitsLoss} = - \frac{1}{N} \sum_{i=1}^{N} \left[ y_i' \log(\sigma(p_i)) + (1 - y_i') \log(1  \sigma(p_i)) \right]$

여기서 $y_i' = y_i (1 - \epsilon) + 0.5 \epsilon$이며, $ \epsilon $은 smoothing 계수, $\sigma$ 은 시그모이드 함수입니다.

 

BCE와의 차이는 라벨($y'$)을 그대로 쓰는게 아니라 [0,1]사이의 값을 사용한다는 것입니다. 이 SoftBCE을 사용하려면 통상의 라벨이 0또는 1이기 때문에, Label을 수정해서 label smoothing을 적용해야합니다.

$\text{BCE} = - \frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right]$

 

 

MCC

MCC(Matthews Correlation Coefficient) 손실 함수는 분류 문제에서의 상관 관계를 측정하는 지표로, 다음과 같이 정의됩니다:

여기서 TP는 True Positive, TN은 True Negative, FP는 False Positive, FN은 False Negative를 의미합니다. MCCLoss는 분할 작업에서의 성능을 효과적으로 평가할 수 있습니다.

import torch
import torch.nn.functional as F

def mcc_loss(y_true, y_pred):
    y_pred_pos = torch.round(torch.clamp(y_pred, 0, 1))
    y_pred_neg = 1 - y_pred_pos
    
    y_pos = torch.round(torch.clamp(y_true, 0, 1))
    y_neg = 1 - y_pos
    
    TP = torch.sum(y_pos * y_pred_pos)
    TN = torch.sum(y_neg * y_pred_neg)
    FP = torch.sum(y_neg * y_pred_pos)
    FN = torch.sum(y_pos * y_pred_neg)
    
    numerator = TP * TN - FP * FN
    denominator = torch.sqrt((TP + FP) * (TP + FN) * (TN + FP) * (TN + FN))
    
    return 1 - (numerator / (denominator + 1e-7))  # 1e-7은 ZeroDivision 방지

# 예시 사용법
y_true = torch.tensor([1, 0, 1, 1], dtype=torch.float32)
y_pred = torch.tensor([0.9, 0.1, 0.8, 0.7], dtype=torch.float32)
loss = mcc_loss(y_true, y_pred)
print(loss)

 

반응형

+ Recent posts