Code › ai-engineering-study

로그 손실과 Cross-Entropy

분류 모델이 확률 예측의 오차를 계산하고 학습하는 과정

오늘은!! 저번 글인 로지스틱 회귀와 결정 경계에 이어서 한번 정리해보려 한다. 수업을 들은지 이것도 한참 되었는데, 어쩔 수 없이 기억이 안나서 코드잇 강의를 다시 들으면서, 자료를 찾아보면서 다시 정리 해 보았다. 수식이 많은데 일단 참고로 정리는 해두었고 나중에 공부한 뒤 돌아와서 볼 때 도움이 될 것 같다.

확률 예측의 오차를 계산하는 방법

분류 모델은 정답을 바로 고르기 전에 각 클래스에 속할 확률을 계산한다. 그렇다면 정답이 1일 때 0.9를 예측한 경우와 0.1을 예측한 경우의 차이를 어떤 기준으로 평가해야 할까. 이 글에서는 로지스틱 회귀를 예시로 로그 손실과 Cross-Entropy가 확률 예측의 오차를 계산하는 방식을 정리했다.

로지스틱 회귀는 선형 점수 zz를 시그모이드 함수에 넣어 0과 1 사이의 확률 y^\hat{y}로 바꾼다. 실제 정답 yy는 0 또는 1이고, 손실 함수는 정답에 높은 확률을 줄수록 작은 값을 내야 한다.


확률 예측에는 왜 MSE가 아니라 Cross-Entropy를 사용할까

선형회귀에서는 예측값과 실제값의 차이를 제곱하는 MSE를 사용했다. 하지만 로지스틱 회귀의 출력은 시그모이드를 통과한 확률이고, 정답은 0 또는 1이다. 이 경우에는 정답에 높은 확률을 줬을 때 손실이 작아지고, 틀린 답에 높은 확률을 줄수록 손실이 크게 증가하도록 만들어야 한다.

정답이 1일 때는 다음 손실을 사용한다.

log(y^)-\log(\hat{y})

y^\hat{y}가 1에 가까워지면 손실은 0에 가까워지고, 0에 가까워지면 손실은 한계 없이 커진다. 로그라서 손실이 기하급수적으로 증가하는 것은 아닌데, log(y^)-\log(\hat{y})y^0\hat{y} \to 0일 때 무한대로 증가하면서, 정답이 1인데 0에 가까운 확률을 낸 예측에 큰 손실을 주는 것이다.

반대로 정답이 0일 때는 다음과 같이 계산한다.

log(1y^)-\log(1-\hat{y})

두 경우를 하나의 식으로 합치면 Binary Cross-Entropy(BCE)가 된다.

(y^,y)=[ylog(y^)+(1y)log(1y^)]\ell(\hat{y},y) = -\left[ y\log(\hat{y}) +(1-y)\log(1-\hat{y}) \right]

y=1y=1이면 두 번째 항이 사라지고 log(y^)-\log(\hat{y})만 남는다. y=0y=0이면 첫 번째 항이 사라지고 log(1y^)-\log(1-\hat{y})가 남기 때문에 하나의 식으로 두 정답을 모두 처리할 수 있다.

이진 분류에서는 BCE를 로그 손실(Log Loss)이라고도 부른다. 위 식은 데이터 하나의 손실이고, 전체 비용은 mm개 데이터의 손실을 평균 내서 계산한다.

J(w,b)=1mi=1m[y(i)logy^(i)+(1y(i))log(1y^(i))]J(w,b) = -\frac{1}{m} \sum_{i=1}^{m} \left[ y^{(i)}\log\hat{y}^{(i)} + (1-y^{(i)})\log(1-\hat{y}^{(i)}) \right]

시그모이드 출력에 MSE를 결합하면 가중치에 대한 비용 함수가 여러 굴곡을 가진 non-convex 형태가 될 수 있어 경사하강법이 최솟값을 찾기 어려워진다. 반면 선형 로지스틱 회귀의 BCE는 가중치에 대해 convex한 비용 함수를 만들며, 확률 모델의 관점에서도 정답이 나올 가능성을 높이도록 학습하는 식으로 이어진다.

여기서 convex하다는 것은 비용 함수가 전체적으로 하나의 그릇 모양이라, 서로 다른 지역 최솟값 중 잘못된 곳에 멈출 문제가 없다는 뜻이다. 선형회귀의 MSE도 convex하지만, 미분한 식을 행렬 형태로 정리하면 정규방정식으로 가중치를 한 번에 계산할 수 있다. 반면 로지스틱 회귀는 시그모이드가 포함되어 미분한 식에서 가중치 ww만 따로 분리할 수 없다. 그래서 BCE가 convex하더라도 경사하강법처럼 값을 조금씩 갱신하는 반복 계산으로 최솟값을 찾는다.


손실을 줄이며 파라미터 학습하기

로지스틱 회귀도 이전에 배운 경사하강법을 사용한다. 먼저 현재 wwbb로 확률을 예측하고 BCE를 계산한 뒤, 비용이 줄어드는 방향으로 파라미터를 반복해서 갱신한다.

선형 점수 z 계산
  → sigmoid로 확률 예측
  → BCE로 손실 계산
  → 경사하강법으로 w와 b 갱신
  → 학습된 w와 b가 결정 경계를 정의

경사하강법으로 BCE가 작아지도록 wwbb를 학습하고, 최종적으로 학습된 파라미터가 wTx+b=0w^{\mathsf{T}}x+b=0이라는 결정 경계를 만든다.

경사하강법 자체는 이전 글에서 정리했다.

손실 함수에서 경사하강법까지 →


다중 분류와 Softmax

로지스틱 회귀는 기본적으로 두 카테고리를 구분한다. 빨강, 파랑, 초록처럼 클래스가 여러 개라면 빨강 대 나머지, 파랑 대 나머지, 초록 대 나머지를 구분하는 이진 분류기를 각각 학습할 수 있다. 이 일대다 방식은 각 모델의 점수나 확률을 비교해 가장 높은 클래스를 선택한다.

Softmax를 사용하면 클래스별 선형 점수 zkz_k를 한꺼번에 확률로 바꿀 수 있다.

pk=ezkjezjp_k=\frac{e^{z_k}}{\sum_j e^{z_j}}

각 클래스의 확률을 모두 더하면 1이 되고, 가장 높은 확률을 가진 클래스를 최종 결과로 선택한다. 학습할 때는 정답 클래스에 높은 확률을 주도록 다중 클래스 Cross-Entropy를 계산하고, 이 손실도 경사하강법으로 줄인다.

Cross-Entropy는 로지스틱 회귀만을 위한 손실 함수가 아니었다. 이진 분류에서는 Sigmoid와 BCE를 사용하고, 여러 클래스 중 하나를 고르는 분류에서는 Softmax와 다중 클래스 Cross-Entropy를 사용한다. 결국 공통점은 정답 클래스에 높은 확률을 줄수록 손실이 작아지도록 모델을 학습한다는 데 있다.

convex하다는 말과 정규방정식의 차이도 처음에는 섞여 있었다. convex는 최솟값을 찾기 좋은 함수 모양을 뜻하고, 해를 행렬 연산으로 한 번에 구할 수 있는지는 별개의 문제다. 로지스틱 회귀에서는 경사하강법처럼 값을 반복해서 갱신하며 그 최솟값을 찾는다.

저번에 정리하면서 로지스틱 회귀 자체는 이해가 많이 되었는데, 오늘 글까지 이어서 전체 흐름으로 이해하는데에는 시간이 조금 걸린 것 같다. 이해가 어렵더라도 일단 정리를 해두는 것이 훨씬 효율이 좋은게 느껴진다. 왜냐하면 이해가 부족한 이번 포스팅을 내 이해로 완성하고, 수정하기 위해 다시 돌아와서 복습하며 반복하게 되기 때문이다!