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