본문 바로가기
머신러닝,딥러닝/딥러닝(김용담 강사님)

Output function, Loss function(feat. 소프트맥스, 크로스 엔트로피)

by 코듀킹 2023. 7. 5.
목차
1. Output function
    1-1. Softmax function
    1-2. Linear function
2. Loss function
    2-1. cross-entropy
    2-2. MSE

 

1. Output function

Output function으로 사용하는 함수는 크게 2가지이다.

  • Softmax fucntion
  • linear function

 

1-1. Softmax function

여기서 Softmax 함수는 Multi-class classification 문제를 풀기 위해 사용된다. 예를 들어 아래와 같은 문제가 있다고 해보자.

 

 

여기서 cat, horse, dog가 담긴 32 x 32개의 픽셀 데이터를 일자로 펼쳐서 1024개의 픽셀을 feature로 사용하여 Nerual Network의 node에 입력하여 학습시킨다. 최종적으로 output layer로 3개의 데이터가 나오게 된다. 

 

 

아웃풋이 3개인 이유는 dog, cat, horse의 실제 target value를 원-핫 인코딩을 시켜서 모델로 나온 값과 비교해야 하기 때문이다. 원-핫 인코딩을 하지 않고, cat : 0 dag : 1 horse : 2 이렇게 구분 지어 버리면, 모델로 나온 값과 실제 종속변수의 값의 차이, 즉 loss를 계산할 때 각각의 loss 값이 수치적인 의미를 가져버리게 된다. 그래서 아웃풋이 3개인 것이다. 

 

그러면 여기에서 의문이 생긴다. output으로 나오는 값이 꼭 5 4 2 와 같은 값들이어야 할까? 실제 종속변수의 값은 0과 1밖에 존재하지 않기 때문에 이왕이면 종속변수와 비슷한 범위의 값이 나오게 되면, loss 값을 훨씬 많이 줄일 수 있게 된다. 그래서 사용하는 Output function이 바로 Softmax function인 것이다. 

 

 

위 그림에서 볼 수 있듯이 softmax 함수를 활용하면 output이 0과 1 사이의 값으로 나오게 된다. 그러면 sigmoid함수를 써도 되고, minmax normalization을 해도 되지 않나?라는 생각이 들 수 있다.

 

$$ minmax(x) = \frac{x - x_{min}}{x_{max} - x_{min}} $$

 

우선 minmax normalization같은 경우엔 들어온 input에 대해서 전체 값을 다 나눠버리 버리다 보니 모든 score가 다 작아진다는 단점이 생긴다. 전체 Loss를 줄이려면, 모델을 통해 나온 값의 합이 1이 되게끔 만들어주어야 한다. 

근데 minmax 정규화는 합이 1이 되지 않는다. 그래서 더 loss를 줄이는 방법을 생각하다보니, 민맥스보다는 전체 합으로 나누어 주어서 normalization 시키는 방법으로 가게 된다. 이렇게 하면 모델을 통해 나온 값의 합이 무조건 1이 된다. 근데 여기까지만 하게 되면, 전체 값들이 균일하게 분포가 되기 때문에, 정답에 가까운 값을 1에 더 가깝게, 오답에 가까운 값을 0에 더 가깝게 뻥튀기를 하는 방법은 없을까? 하는 아이디어에서 나온 게 숫자가 커질수록 빠르게 숫자가 커지는 지수함수이고, 이를 적용시킨 함수가 바로 소프트맥스 함수이다. 

 

$$ softmax(x) = \frac{e^{x_i}}{\sum_{i}^{c}e^{x_i}} $$

 

식을 보면 알 수 있듯이, 어떤 특정 위치에 있는 스코어를 지수함수에 넣어서 분모는 그 값들의 합으로 정의한다. 이렇게 하면 다음 2가지의 목표를 모두 만족한다.

 

1. 0과 1로 결과가 나오게 만들어 준다. 

2. 값이 큰 output을 더 크게, 작은 값을 더 작게 만들어 준다. 결과적으로 loss가 더 줄어들 수 있다.

 

sigmoid 함수를 쓰지 않는 이유는 첫 번째로, softmax가 기울기가 더 가파르다보니 학습이 더 잘 된다는 이유가 있다. 두 번째로, softmax 함수를 쓰면, Loss function으로 크로스 엔트로피를 사용할 수 있다. 이 조합을 사용하면, 훨씬 학습이 잘 된다. 이러한 이유들로 Multi-class classification 문제에서는 소프트맥스 함수를 사용한다.

 

 

1-2. Linear function

회귀 문제를 풀기 위해서 사용하는 output function은 linear function이다.

 

 

아웃풋으로 나온 값이 결과값으로 그대로 사용된다. 그렇게 해서 실제 값과 target value와 비교할 수 있다. Linear function은 그냥 장식이라고 봐도 된다. 회귀 모델에서는 linear를 쓰기 때문에 그냥 넣어준 것이다. output function은 문제 정의를 어떻게 하냐에 따라서 다른 걸 써도 된다. 마지막에 output function을 쓰긴 해야 하니 보통 linear 함수를 쓴다.

 

2. Loss function

Loss function으로 사용하는 함수도 마찬가지로 크게 2가지이다.

  • Cross-entropy
  • MSE

2-1. Cross-entropy

 

  • S : Softmax 
  • T : Target value

 

$$ Loss = - \frac{1}{output size} \sum_{i=1}^{output size} y_i \cdot \log\hat{y_i} + (1 - y_i) \cdot \log(1-\hat{y_i}) $$

 

위 식이 cross-entropy 함수이다. 2개의 vector 값의 차이를 계산해준다. 여기서 ouput size는 class 개수를 의미한다. 이제 예측값과 실제값과의 loss를 비교해 볼 것이다. loss function은 모델의 예측 결과로 나온 값이 0 1 0 0 이든, 0 0 1 0 이든, 0 0 0 1 이든 loss가 다 같아야 한다. 그리고 이때 최악의 케이스여야 한다. 위 식에서 \(\hat{y_i}\)에 이 값을 대입해 보면, 1일 때는 0, 0일 때는 - 무한대가 되는 걸 알 수 있다. 여기에 -를 붙이면,  반대로 0일 때는 + 무한대가 된다. 즉, 식의 맨 앞에 -가 붙었기 때문에 loss 값이 0에 가까울수록 기하급수적으로 커진다는 뜻이다. 

 

y = -logx 그래프

 

다시 위 교차엔트로피 식을 보면, target이 원핫인코딩 되어있기 때문에 이걸 수식에 집어넣으면, 앞뒤 수식 중에 하나만 남는 걸 알 수 있다. 이런 걸 Indicator라고 부른다. \(\hat{y_i}\)에 0을 넣으면, loss가 무한대가 되는 케이스는 사실, \(y_i\)가 1이라는 전제하에 그렇다. 즉, 실제 종속변수의 값은 1인데, 모델이 0이라고 완전히 반대되는 답을 맞혔기 때문에 그만큼 loss를 극대화시키는 식이다. 이러한 특성이 있기 때문에 교차엔트로피 함수는 소프트맥스 함수와만 사용할 수 있다. 1과 0 사이의 값을 가지고 있고, log를 쓰는 이유가 지수함수 반대의 이유로 쓰는 것이기 때문이다. 

 

2-2. MSE

 

회귀 모델에서 mse를 가장 많이 사용하는 이유는 미분이 가능하기 때문이다. 참고로, 딥러닝에서는 모델디자인을 문제에 맞게 쉽게 정의할 수 있다. 딥러닝은 하나의 모델로 multioutput을 할 수 있다. 머신러닝에서는 multioutput문제를 풀려면, 모델이 output개수만큼 있어야 한다. 

 

mse는 머신러닝에서도 나오는 개념이니, mse에 대한 더 자세한 내용은 아래 포스팅을 참고하면 좋다.

 

기계학습(ML): 선형회귀 모델 학습 원리, 성능 평가 방법

목차 1. 기계학습(ML) 종류 2. 학습데이터와 문제 데이터 준비 3. 알고리즘(혹은 모형) 선택 3-1. 선형 회귀 모델 4. 학습 4-1. 파라미터 최적값 도출 4-1-1. 정규방정식 4-1-2. 경사하강법 4-3. 성능 평가 4

coduking.com

 

댓글