전공/머신러닝

[ML] 소프트맥스 회귀 (Softmax Regression)

mhiiii 2024. 11. 20. 14:36
728x90

이전에 2개의 선택지에서 1개를 고르는 이진분류를 로지스틱 회귀로 풀어봄

 

 

로지스틱 회귀에서 시그모이드 함수는 예측값을 0과 1 사이의 값으로 표현


이번에는 소프트맥스 회귀를 통해 다중 클래스 분류를 설명

소프트맥스 회귀

 

확률의 총 합이 1이 되는 이 아이디어를 다중 클래스 분류 문제에 적용

 

소프트맥스 회귀는 각 클래스. 즉, 각 선택지마다 소수 확률을 할당. 이때 총 확률의 합은 1

이렇게 되면 각 선택지가 정답일 확률로 표현

 

결국 소프트맥스 회귀는 선택지의 개수만큼의 차원을 가지는 벡터를 만들고,

해당 벡터가 벡터의 모든 원소의 합이 1이 되도록 원소들의 값을 변환시키는 어떤 함수를 지나게 만들어야 함

그 함수를 Softmax라고 함

 

H(X) = Softmax(WX + B) 

 


Softmax

소프트맥스 함수는 분류해야하는 정답지(클래스)의 총 개수를 k라고 할 때,

k차원의 벡터를 입력받아 각 클래스에 대한 확률을 추정

 

$$p_{i}=\frac{e^{z_{i}}}{\sum_{j=1}^{k} e^{z_{j}}}\ \ for\ i=1, 2, ... k $$

 

k=3일 때, 3차원 벡터 z=[$z_1 z_2 z_3$]의 입력을 받으면 소프트맥스 함수는 아래와 같은 출력을 리턴

 

$$ softmax(z)=[\frac{e^{z_{1}}}{\sum_{j=1}^{3} e^{z_{j}}}\ \frac{e^{z_{2}}}{\sum_{j=1}^{3} e^{z_{j}}}\ \frac{e^{z_{3}}}{\sum_{j=1}^{3} e^{z_{j}}}] = [p_{1}, p_{2}, p_{3}] = \hat{y} = \text{예측값} $$

 

$p_1, p_2, p_3$ 각각은 1번 클래스가 정답일 확률, 2번 클래스가 정답일 확률, 3번 클래스가 정답일 확률을 나타냄

각각 0과 1사이의 값으로 총 합은 1

 

분류하고자 하는 클래스가 k개일 때, k차원의 벡터를 입력받아서 모든 벡터 원소의 값을 0과 1사이의 값으로 값을 변경하여 다시 k차원의 벡터를 리턴

 

  1. 소프트맥스 함수의 입력으로 어떻게 바꿀까?
    • 하나의 샘플 데이터는 4개의 독립 변수 x를 가지는데 이는 모델이 4차원 벡터를 입력으로 받음을 의미
    • 그런데 소프트맥스의 함수의 입력으로 사용되는 벡터는 벡터의 차원이 분류하고자 하는 클래스의 개수가 되어야 하므로 어떤 가중치 연산을 통해 3차원 벡터(z)로 변환되어야 함
    • 소프트맥스 함수의 입력 벡터 z의 차원수만큼 결과값의 나오도록 가중치 곱을 진행
    • 위의 그림에서 화살표는 총 (4 × 3 = 12) 12개이며 전부 다른 가중치를 가
  2. 오차를 어떻게 구할까?
    • 소프트맥스 회귀에서는 예측값(확률)과 비교를 할 수 있는 실제값의 표현 방법인 원-핫 벡터로 표현

위 그림에서 예측값과 실제값의 오차가 0이 되는 경우는 소프트맥스 함수의 결과가 [0 1 0]이 되는 경우.

 

이 두 벡터의 오차를 계산하기 위해서 소프트맥스 회귀는 비용 함수로 크로스 엔트로피 함수를 사용

 

최종적으로, 아래와 같이 파라미터가 업데이트 됨

 

 

지금까지의 연산을 벡터와 행렬 연산으로 표현해보면

 $$\left(
    \begin{array}{c}
      y_{11}\ y_{12}\ y_{13}\ \\
      y_{21}\ y_{22}\ y_{23}\ \\
      y_{31}\ y_{32}\ y_{33}\ \\
      y_{41}\ y_{42}\ y_{43}\ \\
      y_{51}\ y_{52}\ y_{53}\ \\
    \end{array}
  \right)
=
softmax\left(
\left(
    \begin{array}{c}
      x_{11}\ x_{12}\ x_{13}\ x_{14}\ \\
      x_{21}\ x_{22}\ x_{23}\ x_{24}\ \\
      x_{31}\ x_{32}\ x_{33}\ x_{34}\ \\
      x_{41}\ x_{42}\ x_{43}\ x_{44}\ \\
      x_{51}\ x_{52}\ x_{53}\ x_{54}\ \\
    \end{array}
  \right)
\left(
    \begin{array}{c}
      w_{11}\ w_{12}\ w_{13}\ \\
      w_{21}\ w_{22}\ w_{23}\ \\
      w_{31}\ w_{32}\ w_{33}\ \\
      w_{41}\ w_{42}\ w_{43}\ \\
    \end{array}
  \right)
+
\left(
    \begin{array}{c}
      b_{1}\ b_{2}\ b_{3}\\
      b_{1}\ b_{2}\ b_{3}\\
      b_{1}\ b_{2}\ b_{3}\\
      b_{1}\ b_{2}\ b_{3}\\
      b_{1}\ b_{2}\ b_{3}\\
    \end{array}
  \right)
\right) $$


Cross Entropy

 

소프트맥스 회귀에서는 비용 함수로 크로스 엔트로피 함수를 사용

 

$$cost(W) = -\sum_{j=1}^{k}y_{j}\ log(p_{j})$$

 

y는 실제값을 나타내며, k는 클래스의 개수로 정의.

$y_{j}, p_{j}$는 각각 실제값 원-핫 벡터의 j번째 인덱스, 샘플 데이터가 j번째 클래스일 확률를 의미

 

$-\sum_{j=1}^{k}y_{j}\ log(p_{j})$ 이 값을 최소화하는 방향으로 학습해야 함

 

이제 이를 n개의 전체 데이터에 대한 평균을 구한다고 하면 최종 비용 함수

$$cost(W) = -\frac{1}{n} \sum_{i=1}^{n} \sum_{j=1}^{k}y_{j}^{(i)}\ log(p_{j}^{(i)})$$

 

 

로지스틱 회귀에서 배운 크로스 엔트로피 함수식과 달라보이지만, 본질적으로는 동일한 함수식

$$cost(W) = -(y\ logH(X) + (1-y)\ log(1-H(X)))$$

 

위의 식에서 y y1, 1−y y2로 치환하고 H(X) p1, 1−H(X) p2로 치환하면 같은 식이 나오게 됨

728x90