대학원 일기

[딥러닝 신경망] 손실 함수(Loss function) 본문

Computer vision/딥러닝 공부

[딥러닝 신경망] 손실 함수(Loss function)

대학원생(노예) 2023. 10. 17. 03:12

 

 

 

손실 함수(Loss function)

손실 함수는 정답 레이블과 예측값과의 차이인 로스(loss)를 구하는 함수이다. 손실 함수를 부르는 명칭은 목적 함수(objective function), 에러 함수(error function) 등이 있다. 

 

인공신경망의 목표는 정답 레이블과 예측값을 최소화하는 것이다. 손실 함수는 로스(loss)를 최소화하는 방향으로 가중치를 업데이트하며 진행된다. 이밖에도, 모델의 성능 평가나 과적합(over fitting)을 감지하는데 사용한다. 

 

일반적으로 분류 문제에서 손실 함수는 크로스 엔트로피(cross-entropy, CE)를 사용하고, 회귀 문제에서는 평균 제곱 오차(mean sqeared error, MSE) 또는 평균 절대 오차(mean absolute error, MAE)를 사용한다.

 

크로스 엔트로피(Cross entropy)

크로스 엔트로피에서 엔트로피의 의미는 불확실성의 정도를 나타내는 수치이다. 크로스 엔트로피는 분류 문제에서 사용되는 손실 함수이다. 크로스 엔트로피는 두 확률 분포 또는 확률 예측값 사이의 유사성을 측정하는데 사용된다. 분류 모델의 예측값과 실제 클래스 레이블 간의 차이를 측정하여 모델을 학습하는 데 도움을 준다.

$ h(p,q)= -\sum_{i=1}^{n}(log_{2}(q^{i})*p^{i}) $

아래 코드는 다중 분류에서의 크로스 엔트로피 코드이다. 

def categorical_cross_entropy(true_labels, predicted_probabilities):
    return - np.sum(true_labels * np.log(predicted_probabilities))
    
true_label = 1
predicted_probabilities = np.array([0.2, 0.7, 0.1])
categorical_loss = categorical_cross_entropy(true_labels, predicted_probabilities)
print("Categorical Cross-Entropy Loss:", categorical_loss)

 

다중 분류 문제에서는 주로 소프트맥스 활성화 함수와 크로스 엔트로피 손실 함수를 사용한다. 소프트 맥스 함수는 출력을 다중 클래스 확률 분포로 변환하고, 크로스 엔트로피는 예측 확률 분포와 실제 클래스 분포(one-hot 인코딩된 실제 클래스) 사이의 차이를 측정한다. 즉, 소프트맥스 활성화 함수를 사용하여 모델의 출력을 확률 분포로 변환한 후 크로스 엔트로피를 사용하여 모델의 예측 확률 분포와 실제 클래스 분포 간의 차이를 측정해 가며 손실값을 최소화하도록 클래스 예측을 수행한다.

 

케라스에서 제공되는 주요 손실 함수

  • sparse_categorical crossentropy: 클래스가 배타적으로 구분. 즉, (0, 1, 2, 3, 4, 5, ... , 9)와 같은 방식으로 구분되어 있을 때 사용
  • categorical_cross_entropy: 클래스가 원-핫 인코딩 방식으로 되어 있을 때 사용
  • binary_crossentropy: 이진 분류를 수행하고자 할 때 사용

 

 

평균제곱오차(Mean Squared Error, MSE)

MSE는 가장 직관적이며 대표적인 손실함수로 회귀 문제에서 예측 모델의 성능을 평가하는데 사용된다. MSE는 제곱 오차를 하기 때문에 모든 오차가 양수로 측정되어 미분이 깔끔해진다. 

 

$ MSE = \frac{1}{n}\sum_{i=1}^{n}(y_{i}-\hat{y}_{i})^{2} $

위 수식에서 $y_{i}$는 정답 레이블이고, $\hat{y}_{i}$는 예측값이다.

import numpy as np

def mean_squared_error(y_true, y_pred):
    # y_true: 실제 값(타깃 또는 레이블)의 배열
    # y_pred: 모델의 예측 값의 배열
    # 반환값: MSE 값
    return np.mean((y_true - y_pred) ** 2)

# 예제 데이터
y_true = np.array([3.0, 4.0, 2.0, 7.0])
y_pred = np.array([2.8, 4.2, 2.5, 6.8])

# MSE 계산
mse = mean_squared_error(y_true, y_pred)

# 결과 출력
print("Mean Squared Error:", mse)

 

평균 절대 오차(MAE)는 MSE의 제곱 대신 절댓값 계산을 취한 방법이다. MSE는 제곱 오차를 사용하므로 이상치(크게 벗어난 오차)에 민감하게 반응하고, MAE는 절댓값 오차를 사용하므로 상대적으로 이상치에 대한 영향이 적다. 따라서 MSE는 모델이 정확한 예측을 중요하게 생각하는 경우에 유용하며, MAE는 모델이 일반적인 정확도를 중요하게 생각하는 경우에 유용하다.

 

평균절대오차(Mean Absolute Error, MAE)

평균 절대 오차는 오차가 커져도 손실함수가 일정하게 증가한다. 이는 이상치에 강건하는 특성을 가진다. 즉, 손실 함수의 최소값으로 가는 정도의 영향력이 크지 않은 특성을 가지고 있다. 

 

$ MAE = \frac{1}{n}\sum_{i=1}^{n}|y_{i}-\hat{y}_{i}| $

import numpy as np

def mean_absolute_error(y_true, y_pred):
    # y_true: 실제 값(타깃 또는 레이블)의 배열
    # y_pred: 모델의 예측 값의 배열
    # 반환값: MSE 값
    return np.mean(abs((y_true - y_pred)))

# 예제 데이터
y_true = np.array([3.0, 4.0, 2.0, 7.0])
y_pred = np.array([2.8, 4.2, 2.5, 6.8])

# MAE 계산
mae = mean_absolute_error(y_true, y_pred)

# 결과 출력
print("Mean Squared Error:", mae)

MAE vs MSE

둘 다 오차를 기준으로 총합을 해 평균을 구하며 각각의 오차를 절대 값으로 다룰지 혹은 제곱 값으로 처리하는지가 다르다. 

Comments