반응형

손실함수 분류 문제

손실 함수에서 분류 문제의 대표인 교차 엔트로피에 대해 알아본다.

이전 포스팅에서 회귀 문제에 대해 알아봤다.

과거의 정보를 활용해서 결과를 예측하는 방식이 회귀다.

과거 정보(입력값)에 따라 결과가 결정(종속적)된다.

2025.05.14 - [인공지능(AI)/딥러닝(DeepLearning)] - 쉽게 풀어 쓴 딥러닝 손실함수 1 : 회귀 문제에서 오차제곱합(SSE), 평균제곱오차(MSE) 코딩하기.

 

쉽게 풀어 쓴 딥러닝 손실함수 1 : 회귀 문제에서 오차제곱합(SSE), 평균제곱오차(MSE) 코딩하기.

딥러닝(Deeplearning)에서 손실 함수란?딥러닝 스터디 중 손실 함수(loss function)를 알게 되었다.머신러닝, 딥러닝에서 해당 모델의 성능을 평가할 사용하는 함수다.모델이 예측, 인식한 값과 실제 값

tiboy.tistory.com

 

분류 문제

회귀가 정보를 입력받고 예측(주가, 집값 등)하는 문제라면,

분류는 고체나 액체 같은 종류, 개와 고양이 같은 문제다.

 

분류 문제에 사용하는 대표적인 손실 함수가 교차 엔트로피다. (cross entropy loss)

교차 엔트로피는 다양한 식을 가지고 있다.

예측한 값과 실제 값의 오차를 수치로 결과를 보여준다.

손실 함수는 결국 이 오차를 최소화하기 위해 사용되는 함수다.

이진 교차 엔트로피(Binary Cross Entropy, BCE)

둘 중 하나로 분류하는 경우 사용한다.

예를 들어,

합격과 불합격, 정상과 실패 등으로 시그모이드 활성화 함수를 사용하면 0과 1로 결과가 나오게 된다.

이진 교차 엔트로피 수식

엄청 복잡한 식이 나타났다.

딥러닝 공부 중 이런 식 때문에 어려움을 겪을 수 있을 거라 생각한다.

분리해서 같이 하나씩 살펴보면 별거 아니다. 걱정은 이제 그만!

∑는 밑의 i=1부터 N까지 1씩 증가해서 옆의 식에 대입 후 합산한다는 SUM을 의미한다.

아래 예제를 보면 i는 1부터 3까지 순서대로 시그마 옆 i에 대입하고 더한다.

시그마 원리

시그마는 주어진 범위의 값을 하나씩 넣고 그 모든 값을 SUM 한다.

이제 시그마 뒤의 식을 보자.

y는 정답(0 또는 1)이 들어온다.

y가 0이면 앞의 식은 0이 되고 뒤의 식은 살아남고,

y가 1이면 뒤의 식은 0이 되고 앞의 식은 살아남는다.  (0 × log() = 0 이므로)

log는 계산기 또는 파이썬 넘파이(numpy)에서 계산하면 된다.

파이썬 numpy로 log 계산

만약 y에 1(정답)이 들어오면 0이 되고 log와 곱하면 0이 되고 식은 사라진다.

y가 0(오답) 일 때 log 식 내 꺽쇠 y값(0~1 사이값)으로 계산된다.

샘플 데이터로 계산해 보자.

정답값 y = [0, 1]

신경망 출력 y(꺽쇠) = [0.2, 0.8]

교차 엔트로피 수식 : 1일 확률 0.8인 경우 0.22314...

위 값을 대입해서 직접 풀어봤다.

손실 함수 교차 엔트로피 결과는 0.22314가 나왔다.

신경망 출력 y(꺽쇠) = [0.3, 0.7]라면?

1일 확률이 앞 식보다 0.1 작은 0.7로 설정했다.

교차 엔트로피 수식 : 1일 확률 0.7인 경우 0.35667...

신경망 결과 1일 확률이 더 낮게 나오면 식의 결과 값은 더 크게 나온다.

1일 확률이 0.8일 때 0.22314가 나왔는데 0.7로 낮아지면 0.35667이 나왔다.

즉, 정답일 확률이 높을수록 교차 엔트로피 식의 값은 작아진다.

이제 이 식을 파이썬으로 구현해서 딥러닝에서 활용해 보자.

import numpy as np

def cross_entropy_error(y, k):
    dt = 1e-8   # log(0)은 무한이다. 이를 방지하기 위해 필요
    return -np.sum(k * np.log(y + dt))


k = [0, 1]  #정답
y = [0.2, 0.8]  #신경망 결과

print(cross_entropy_error(np.array(y), np.array(k)))
#결과 : 0.2231435388142097

y = [0.3, 0.7]

print(cross_entropy_error(np.array(y), np.array(k)))
#결과 : 0.35667492965301817

값의 범위가 0~1인데 dt(1e-8)는 log(0)이 안되게 하기 위해 넣었다.

log(0)은 무한대로 계산 오류가 나기 때문이다.

파이썬 코드도 손으로 푼 결과와 같다.

정리

신경망 학습 중 손실함수에 대해 알아봤다.

딥러닝 개발자로 공부하다 보면 나타나는 복잡한 식으로 당황할 수 있다.

이 포스팅을 보고 계산에 도움이 되길 바란다.

인공지능 개발자를 위해~

끝.

반응형
반응형

딥러닝(Deeplearning)에서 손실 함수란?

딥러닝 스터디 중 손실 함수(loss function)를 알게 되었다.

머신러닝, 딥러닝에서 해당 모델의 성능을 평가할 사용하는 함수다.

모델이 예측, 인식한 값과 실제 값과의 오차를 알려준다.

손실 함수는 회귀와 분류 문제로 구분되어 있다.

용어도 어렵고 계산식도 한참을 봤다.

인공지능 학습이 쉽지 않을 거라 생각은 하고 있었다.

최대한 쉽게 이해하고 싶어 꼼꼼히 정리해 봤다.

손으로 숫자 5를 써서 딥러닝 학습을 통해 인식하고자 한다.

3같기도 한 숫자 5

숫자 5를 썼지만 학습 결과 5일 확률이 0.3 정도 나왔다 가정하자.

1을 기준으로 무려 0.7을 잘못 인식했다는 결과다.

숫자 5인데도 손으로 쓴 글씨라 0.3 정도만 인식했다는 의미다.

무려 0.7을 잘못 인식했다고 알려줘야 한다.

인식률을 높여 숫자 5로 인식하게 알려줘야 한다.

바로 손실 함수가 그 역할을 한다.

즉, '얼마나 잘못 예측했나'를 수치로 보여주는 함수가 손실 함수다.

 

회귀 문제

과거 거래량, 과거 주가, 경제 전망 등을 활용해서 앞으로의 주가를 예측한다.

예측하는 주가는 입력값에 따라 결정된다.

입력값의 종류와 값 범위에 따라 결괏값이 결정된다는 의미다.

회귀는 결괏값이 연속적이라는 특징이 있다.

주가가 0 또는 1처럼 둘 중 하나값이 아니다.

이런 경우를 분류문제라고 한다. 0 또는 1.

회귀는 입력값이 따라 연속적인 금액값 중 하나가 종속된다.

이번 포스팅에서는 회귀 문제에 대한 손실 함수를 먼저 확인해 보자.

사실 용어만 봐서는 감이 안 잡힌다.

손실 함수 중 회귀 문제는 평균 제곱 오차(Mean Squared Error, MSE)와 오차 제곱 합(Sum of Squared Errors, SSE).

우선 이 2개의 함수를 확인해 보겠다.

 

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

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

우와~ 어려운 식이 나타났다.

∑ (이하 시그마)를 처음 본다면 당황스러울 수 있다.

어렵지 않다.

시그마는 우측 식을 i=1부터 n까지 순서대로 대입한 값을 전부 더한다는 의미다.

간략하고 쉬운 식을 보자.

시그마 예제 식

시그마 옆 i에 1부터 3까지 입력한다.

1 + 2 + 3으로 식이 만들어지고 결과는 6이 된다.

평균 제곱 오차(Mean Squared Error, MSE)의 경우는

다음 식을 i=1부터 n번째까지 값들을 위 예제 식처럼 쭈욱 더한다는 의미다.

그리고 1/n으로 나누는 의미다. 0.5를 곱해도 된다.

식에 대한 설명을 했다.

이제 딥러닝에서 평균 제곱 오차(Mean Squared Error, MSE)를 사용하는 예를 들어보자.

평균 제곱 오차(Mean Squared Error, MSE) 파이썬 코드

3번 라인은 mean_squard_error함수로 평균 제곱 오차(Mean Squared Error, MSE)를 구현했다.

np.mean이 수식의 복잡한 평균을 쉽게 구해준다.

t는 true value로 6번 라인 index 4번째가 1이다.

y는 추측값을 가정해서 만들어 봤고 8번 라인 index 4번째가 0.7로 높은 확률이 나왔다.

함수를 실행하면 결과는 0.011500000000000003가 나온다.

정말 작은 수이다.

만약 true value는 그대로인데 17번 라인을 보면 index 4번째가 0.1로 낮은 확률이 나왔다.

그 결과 함수를 실행하면 결과는 0.1315으로 0.7로 나온 경우보다 높은 값이 나왔다.

결론은 결과가 낮을수록 오차가 적다는 의미로 볼 수 있다.

결괏값을 보고 오차를 조정하면 된다.

 

오차 제곱 합(Sum of Squared Errors, SSE)

오차 제곱 합(Sum of Squared Errors, SSE)의 식.

(실제 값 - 예측 값)의 제곱을 2로 나눈 식이다.

약간 변형된 식을 보기도 한다.

오차 제곱 합(Sum of Squared Errors, SSE).

이 식은 시그마의 인수값이 다르다.

위 쪽에 인수값 n이 없고 아래 i만 있다.

i=1부터 n까지도 아니고 달랑 i 하나면 값을 하나만 받는다는 의미일까?

numpy.array를 실제값과 예측값에 할당하면 비록 배열 하나지만 내부의 많은 값을 활용할 수 있다.

예제 소스를 보자.

오차 제곱 합(Sum of Squared Errors, SSE) 파이썬 코드

4번 라인의 식을 보면 np.sum을 사용했다.

합계 구하고 반으로 나눴다.

식은 심플하다.

7번 라인 t는 index 4번째 값이 1이다.

9번 라인 y는 index 4번째 값이 0.7로 높은 확률이다.

결과는 0.057500000000000016로 아주 작은 값이 나왔다.

그렇다면 오차가 크면 어떨까?

18번 라인 y는 index 2번째 값이 0.7이고 매칭되는 index 4는 0.1로 낮은 확률이다.

결과는 0.6575로 0.7보다는 꽤 큰 값이 나왔다.

마찬가지로 결과 값이 0에 가까워질수록 오차가 없어진다는 의미고,

결과 값이 0보다 커질수록 오차도 커진다는 의미다.

제곱이라 오차가 커질수록 더 큰 차이가 나타난다.

정리.

손실 함수 중 회귀 문제를 다루는 함수 2 종류를 확인했다.

평균 제곱 오차(Mean Squared Error, MSE)와 오차 제곱 합(Sum of Squared Errors, SSE) 두 함수다.

손실 함수로 출력 값으로 정확도와 오차를 확인할 수 있다.

그 값을 활용해 신경망 성능을 향상할 수 있다.

오차를 줄여서 정답에 가까워져라~~~

지금까지 손실 함수 중 회귀 문제에 대해 정리해 봤다.

잘못된 정보는 댓글 바란다.

반응형