TensorFlow를 사용하여 이진 교차 엔트로피 손실 값 찾기

Hafiz Muhammad Zohaib 2023년6월21일
TensorFlow를 사용하여 이진 교차 엔트로피 손실 값 찾기

이 짧은 기사에서는 Binary Cross-Entropy를 계산하는 두 가지 방법(즉, TensorFlow 프레임워크의 내장 함수 및 원시 Python에서 수식의 사용자 정의 구현)을 설명합니다. 또한 두 방법 모두 동일한 결과를 산출한다는 것을 증명합니다.

교차 엔트로피 손실을 계산하기 전에 먼저 이진 교차 엔트로피 손실과 추정 이유를 이해해야 합니다. 그런 다음 원시 Python을 사용하여 TensorFlow 프레임워크에 따라 공식을 구현합니다.

TensorFlow를 사용하여 이진 교차 엔트로피 손실 값 찾기

loss 함수는 기계 학습에서 모델 성능을 측정하는 데 사용됩니다. 손실이 높으면 모델의 성능이 좋지 않은 것입니다.

반대로 낮으면 모델이 잘 수행되고 Ground Truth에 가까운 결과를 생성합니다.

교차 엔트로피는 또한 손실(로그 손실이라고도 함)의 척도입니다. 일반적으로 이진 분류 문제에서 손실을 계산하는 데 사용됩니다.

Binary Cross Entropy는 수정된 예측 확률 로그의 음수 평균입니다.

다음 공식을 사용하여 이진 교차 엔트로피를 계산합니다.

$$
\text { 로그 손실 }=\frac{1}{N} \sum_{i=1}^{N}-\left(y_{i} * \log \left(p_{i}\right)+\left (1-y_{i}\right) * \log \left(1-p_{i}\right)\right)
$$

Python을 사용하여 위의 수식을 구현해 봅시다.

import numpy as np


def BinaryCrossEntropy(y_true, y_pred):
    y_pred = np.clip(y_pred, 1e-7, 1 - 1e-7)
    term_0 = y_true * np.log(y_pred + 1e-7)
    term_1 = (1 - y_true) * np.log(1 - y_pred + 1e-7)
    return -np.mean(term_0 + term_1, axis=0)


print(
    BinaryCrossEntropy(
        np.array([1, 0, 1]).reshape(-1, 1), np.array([0, 0, 1]).reshape(-1, 1)
    )
)

위의 코드를 한 줄씩 이해해 봅시다. 우리는 y_truey_pred라는 두 개의 인수를 취하는 BinaryCrossEntropy 함수를 정의했습니다.

이러한 인수는 이진 분류에서 1D 배열입니다. y_true는 실제 값이고 y_pred는 ML 모델의 예측 값입니다.

np.clip(array, min_val, max_val) 호출은 입력 배열을 잘라냅니다. 예를 들어 [0,0,1][1e^-7, 1e^-7, 0.9999999]로 잘립니다.

np.mean()은 배치 크기 N으로 나누어 입력 배열의 평균을 찾습니다.

클리핑에 1*e^-7과 같은 최소값을 사용하는 이유는 무엇입니까?

위의 공식에는 몇 가지 로그 항이 포함되어 있습니다. log(0)(즉, 자연 로그 0)은 정의되지 않음(무한대)을 생성합니다.

무한대를 N(예: 예측/참 값의 배치 크기)으로 나누면 오류가 발생합니다. 따라서 클리핑에 1*e^-7의 최소값을 사용했습니다.

위의 코드는 다음과 같은 출력을 제공합니다.

[5.14164949]

이제 TensorFlow를 사용하여 이진 교차 엔트로피 손실 값을 찾습니다. 아래 코드를 살펴보자.

import tensorflow as tf
import numpy as np

y_true = np.array([1.0, 1.0, 1.0]).reshape(-1, 1)
y_pred = np.array([1.0, 1.0, 0.0]).reshape(-1, 1)

bce = tf.keras.losses.BinaryCrossentropy(
    from_logits=False, reduction=tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE
)
loss = bce(y_true, y_pred)

print(loss.numpy())

내장 함수 tf.keras.losses.BinaryCrossentropy( from_logits=False , reduction=tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE)는 실제 레이블과 예측 레이블 간의 교차 엔트로피 손실을 계산합니다.

위의 코드에서 bce( y_true, y_pred)는 두 개의 인수를 사용합니다.

  1. y_true(참 레이블): 0 또는 1입니다.
  2. y_pred (예측된 값): 이것은 모델의 예측값으로, logit 을 나타내는 단일 부동 소수점 값입니다 (즉, from_logits=True 일 때 [-inf, inf] 범위의 값) 또는 확률을 나타내는 값입니다 (즉, from_logits=False 일 때 [0., 1.] 범위의 값).

Binary Cross-Entropy에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

위의 코드는 다음 이진 교차 엔트로피 값을 제공합니다.

5.1416497230529785

이는 TensorFlow를 사용한 Binary Cross Entropy Loss 값과 공식의 값이 같다는 결과에서 분명합니다.