Softmax Classificaition의 필요성?
이전 글에서 입력 데이터를 2개의 부류로 나누는 방법인 Logistic Classification을 다뤘어요. 이 방법은 이분적인 데이터를 처리하는데 유용하지만 만약 데이터가 셋 중 하나, 혹은 넷, 다섯 중 하나라면 Logistic Classification을 바로 쓰기는 어려워요. 그래서 이것을 확장한 분류 방법, Softmax Classification을 알아봐요.
여러 개로 "분류"하기
한번 3가지로 나누어질 수 있는 데이터를 생각해봐요. 예를 들어 성적을 A, B, C로 나누는 학교를 생각해요. 즉, class는 A, B, C가 되는 거예요. 그리고 공부시간에 따른 성적을 정리해보면 다음과 같을 것이에요.
공부시간이 많아질 수록 A에 가까워지네요. 분류한다는 것은 A, B, C를 구분하는 "칸막이"를 설치하는 것으로 해석할 수 있어요. 공부시간에 따른 예상 성적을 알려주는 인공지능을 만들려면 성적에 기반하여 칸막이를 설치해야겠죠. 이것을 위해서 기존의 Logistic Classificaiton을 다음과 같이 3번 사용할게요.
- A인가 아닌가?
- B인가 아닌가?
- C인가 아닌가?
그리고 셋 중 가장 값이 크게 나온 class, 예를 들어 A인 가능성이 0.45, B일 가능성이 0.96, C일 가능성이 0.45이면 B로 예측하는 것이죠. 이것을 구체적으로 표현할게요. 입력 데이터(공부 시간)는 $X$, 실제 성적은 $Y$, 예측된 성적 $\overline{Y}$이라고 하고, 앞서 알아본 Logistic Classificaiton의 함수를 $H(X)$라고 할게요. 그러니 Linear regression의 함수가 $W(X)$이고 Sigmoid 함수가 $S(X)$이면 $H(X)=S(W(X))$이에요. 그럼
로 표현할 수 있어요. 수학적으로 쓰면 앞서서 $H(X)$에서 입력 데이터를 weight와 곱하는 과정을 다음과 같이 간단히 쓸 수 있다고 했는데
$\begin{bmatrix}w_1&w_2&w_3\end{bmatrix} \cdot \begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}$
위와 같이 $H(X)$를 여러 번 쓰려면 단순히 weight 텐서만 늘려서 X 텐서에 점곱을 돌려주면 되지요.
$\begin{bmatrix}w_{a1}&w_{a2}&w_{a3}\\w_{b1}&w_{b2}&w_{b3}\\w_{c1}&w_{c2}&w_{c3}\end{bmatrix}\cdot\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} = \begin{bmatrix}\overline{Y_a}\\\overline{Y_b}\\\overline{Y_c}\end{bmatrix}$
복잡해 보이지만 별 거 아니에요.
Softmax 함수 통과하기
앞서서 Logistic Classification을 여러 번 시행해서 $\overline{Y}$의 텐서를 얻었어요. 하지만 아직 이걸로는 어떤 class일 확률이 높을지 말하기 힘들어요. 예를 들어 다음과 같은 텐서가 결과로 나왔다고 해봐요.
$\begin{bmatrix}0.81\\0.53\\0.52\end{bmatrix}$
보아하니 A등급이 가장 그럴듯해 보이지만, 정확히 A를 받을 확률이 얼마인지, 아니면 B나 C를 받을 확률은 얼마인지 보기 힘들어요. 우리가 원하는 건 예를 들면 다음과 같은 것이죠.
$\begin{bmatrix}0.44\\0.28\\0.28\end{bmatrix}$
그래서 각각의 class를 받을 확률을 계산해서 총합이 1이 되도록 값을 바꾸기 위해 Softmax 함수를 사용해요. Softmax 함수는 다음과 같은 함수입니다.
$S(Y,\;i) = \frac{e^{Y_i}}{\sum e^{Y_i}}$
일단 식을 보면 간단히 ($i$번째 경우일 확률)/(전체 확률) 인걸 알 수 있어요. 그런데 기묘하게 그냥 대수적 확률의 합이 아닌 자연상수에 지수로 값을 대입해서 확률을 계산하고 있네요. 이러는 이유는 실제적인 확률과는 별개로 머신러닝을 위해서 Softmax 함수가 미분 가능하도록 설계되어있어야 하기 때문이에요.
Cost 함수 생각하기
이제 Hypothesis와 활성화 함수는 완성했어요. 이제 label(실제 결과)과 예측된 결과가 얼마나 차이 나는지 수치화하고, 최소화할 수 있게 해주는 cost를 생각해봐야 해요.
Softmax classification에서는 다음과 같이 생긴 cross-entropy 함수를 활용해서 cost를 구해요. $S$는 Softmax 함수의 결과이고, $L$은 label, 그러니 실제 결과예요.
$D(S,\;L)=-\sum {L \log(S)}$
$S$와 $L$ 모두 1행$n$열짜리 텐서이니까 각각의 원소에 대해 계산해서 합을 하는 거예요.
그럼 왜 cost 함수가 이렇게 될까요? cross-entropy 함수인
$-\sum{L \log(S)}$
는 다음과 같이 -부호를 안으로 넣을 수 있어요.
$\sum{((L)(-\log(S)))}$
이제 간단히 2개의 class가 있는 경우를 생각해볼게요. 상황은 다음과 같아요.
정답: $Y=\begin{bmatrix}1\\0\end{bmatrix}$
예측 1: $\overline Y_1=\begin{bmatrix}1\\0\end{bmatrix}$
예측 2: $\overline Y_1=\begin{bmatrix}0\\1\end{bmatrix}$
이 경우 정답은 A에요. 예측 1은 A를 예측하여 정답을 정확히 맞혔어요. 그래서 cost를 계산해보면 다음과 같겠죠. 여기서 $\odot$은 텐서의 원소끼리 곱한다는 뜻이에요.
$\begin{bmatrix}1\\0\end{bmatrix} \odot\left(-\log \begin{bmatrix}1\\0\end{bmatrix} \right)$
정리하면 다음과 같아요.
$\begin{bmatrix}(1)(-\log(1))\\(0)(-\log(0))\end{bmatrix}$
$y=-\log(x)$의 함수를 정의역 0~1로 잡고 그리면 다음과 같아요.
보면 $-\log(1)=0$ 이고 $-\log(0)=\infty$이니 결국 cost는 다음과 같아요.
$\begin{bmatrix}0\\0\end{bmatrix}$
그리고 각 원소의 합을 하면 cost=0이죠
반대로 예측 2의 경우 cost는 다음과 같아요.
$\begin{bmatrix}1\\0\end{bmatrix} \odot\left(-\log\begin{bmatrix}0\\1\end{bmatrix} \right)$
정리하면
$\begin{bmatrix}(1)(-\log(0))\\(0)(-\log(1))\end{bmatrix}$
log값을 대입해서 계산해보면 다음과 같죠.
$\begin{bmatrix}\infty\\0\end{bmatrix}$
그래서 cost가 무한이 돼요.
예측이 반대인 경우에도 같은 결과가 나올 거예요.
이렇게 예측에 성공하면 cost를 작게, 실패하면 크게 해서 cost를 계산하는 거예요.
여기까지 하나의 데이터 쌍에 대한 cost였고 각 데이터에 대한 cost를 평균 내면 다음과 같아요.
$\mathcal{L}=\frac{1}{N}D(S(W(X)),\;L)$
COST의 최솟값 찾기
마지막 단계는 Cost를 최소화하는 방법을 알아보는 것이에요.
사실 더 생각할 건 없는데, 왜냐하면 cost 함수가 이미 convex, 즉 볼록한 함수이기 때문이에요. 따라서 앞서 사용한 경사 하강법을 그대로 사용해도 돼요!
'이것저것 > AI' 카테고리의 다른 글
로지스틱 회귀를 사용한 분류(Logistic regression classification) (0) | 2022.01.16 |
---|---|
선형회귀(Linear Regression) (0) | 2021.12.29 |
인공지능 - 머신러닝의 개념 (0) | 2021.12.28 |