인공지능/머신러닝

[머신러닝 - Python] 손실함수 - 오차제곱합, 교차엔트로피 합 구현 (Loss Function - Sum of Squares Error, Cross Entropy Error Implementation)

바보1 2022. 5. 9. 11:23
import numpy as np


def sum_squares_error(pred, target):
    # 오차제곱합
    return 0.5 * np.sum((pred - target) ** 2)


def cross_entropy(pred, target):
    # 교차 엔트로피 합
    delta = 1e-7        # log 0을 계산할 수 없으므로, 아주 작은 값을 넣음
    return -np.sum(target * np.log(pred + delta))


if __name__== "__main__":
    target = np.array([0, 0, 1, 0, 0])      # 2가 정답
    pred1 = np.array([0.1, 0.05, 0.6, 0.05, 0.2])       # 2 예측
    pred2 = np.array([0.6, 0.1, 0.05, 0.2, 0.05])       # 0 예측

    for func in [sum_squares_error, cross_entropy]:
        print(func.__name__)

        error1 = func(pred1, target)
        error2 = func(pred2, target)

        print(error1)
        print(error2)
sum_squares_error
0.10750000000000003
0.6575
cross_entropy
0.510825457099338
2.9957302735559908

 

 

참고로 오차제곱합은 모든 벡터를 계산해서 값을 출력합니다.

하지만 교차엔트로피는 타겟 값이 0이면, 그냥 0을 출력하므로 실질적으로 타겟 값이 1인 인덱스와 예측 값의 인덱스가 일치하는 곳만 계산합니다.

(One-Hot Encoding의 경우)

 

그리고 log 0은 계산할 수 없으므로, 혹시 모르니 1e-7이라는 아주 작은 값을 추가해주도록 합니다.

 

감사합니다

 

 

지적 환영합니다.