이전 포스팅 기준으로 컴퓨터비전에서 가장 대표적인 task인 image classification에 대해서 설명했다. 그리고 간단한 모델인 KNN(k -Nearest Neighbor) classifier에 대한 소개도 했었다. Image Classification에서 해결해야할 여러 문제들을 제시했고, 이러한 문제들을 해결하기 위해 data driven algorithm을 사용한다고 언급했었다. 그러나 단순히 각 샘플에 대한 거리 메트릭 비교를 통한 분류의 경우 다음과 같은 두 가지 문제점을 가지고 있다.
KNN 방식은 일반화 성능을 기대하기 힘들면서 동시에 메모리를 비효율적으로 사용한다는 점이 걸림돌이 된다. 이러한 문제로부터 앞으로 Image classification에 보다 효율적인 방법을 필요로 하였고, 그 다른 방법이 바로 Neural Network(신경망)을 이용한 학습이다. 따라서 이전까지 다뤘던 내용 전반은 사실 딥러닝에 대한 내용이 아니었고 computer vision과 같은 task를 어떠한 방식으로 정의하는지, 그리고 data-driven algorithm의 의미와 해당 방법론을 선택한 이유에 대해서였다.
신경망 회로 방법은 인간의 신경망이 작동하는 원리를 모방한 방법이다.
뉴런이 정보를 전달하고 받아들이는 과정을 input $X$에 대해 weight $W$로 반응하고, activation function $f$(활성화 함수)를 통해 output을 내보내는 과정을 거친다. 이를 Perceptron(퍼셉트론)이라고 부르는데, 사실 퍼셉트론은 뉴런을 완전히 모방할 수 없기 때문에 dendrite, soma, axon 등등을 직접 퍼셉트론의 구성 요소에 대입해서 설명하는 것은 옳지 않다. 다만 정보가 전달되는 과정을 input $X$에 대한 affine transform $X\cdot W + b$으로 정의한 후, 논리 복잡도를 높이기 위해 비선형 함수 $f$를 적용한 구조라고 생각하면 된다. 조금 더 구체적으로 들어가게 되면 우리는 어떠한 input $X$이 연산에 들어왔을 때, 사전에 정의된 parameter $W$와 $b$를 통해 output을 내보내고 여기에 비선형 함수를 적용한 결과를 하나의 점수 혹은 결과에 대한 지표로 생각해볼 수 있다.
[ output = f(X \cdot W + b)
]
만약 정의된 parameter $W$와 $b$가 입력 dataset에 대해 의도대로 잘 동작하는 값이라면, output과 label(ground truth)와의 차이를 구했을 때 차이가 $0$에 수렴할 것이다.
[ \rho(output,~label)
]
바로 여기서 정의해야하는 것이 output과 label의 차이를 유의미하게 계산해줄 거리 메트릭인 $\rho$이며, 이 거리 메트릭을 기준으로 신경망 회로의 파라미터를 조금씩 조정해갈 것이다.
위에서 언급한 거리 메트릭 $\rho$를 적절히 설정하는 것은 중요하다. Ground truth로 작용하는 label이 어떤 task에 대한 label인지도 중요하게 적용된다. 만약 거리 메트릭 $\rho$가 적절하지 않은 함수가 된다면 ground truth와 output의 차이를 잘 나타낼 수 없거나, 학습 과정에서 수렴이 불가능한 경우가 생길 수 있다. 바로 여기서 사용되는 메트릭 $\rho$를 함수 관점에서 명명한 것이 loss function 혹은 cost function이다. 둘 다 단어의 뜻을 보면 어떤 기준으로부터 '얼마나 모자라는지'에 대한 의미가 내포되어있고, 여기서 미리 조금 스포하자면 unsupervised learning, semi-supervised learning 그리고 supervised learning 모두 결론적으로는 ground truth 역할을 대신할 수 있는 기준점이 필요하다. 다시 돌아와서 하고자 했던 말은 신경망 회로 방법에서는 loss function과 cost function이 최적화에 필요하다는 것이다.
이 글을 linear classification에 대한 글이기 때문에 해당 task에 맞춰 조금 더 설명하도록 하겠다. Loss라는 개념은 어느 정도 알았는데, 여기서 score function이라는 개념도 추가로 언급하겠다. Score function이란 날것의 데이터(raw data)를 classification에 맞게 각 class별 점수(score)로 mapping하는 함수가 되고, loss function이 이 score function을 이용해 예측된 score와 label과의 차이를 수치화한다. 날것의 데이터란 앞서 쭉 설명했던 것과 같이 신경망의 입력으로 사용되는 input $X$와 같은 의미다.
그렇다면 image를 score로 mapping한다는 것이 구체적으로 어떻게 수식화가 되는지 확인해보도록 하자. $N$개의 이미지 샘플이 있고, 각각의 이미지는 $K$개의 클래스 중 하나로 대응된다.
[ x_i~(i = 1,~2,~3,~\cdots,~N) \rightarrow y_j~(j = 1,~2,~\cdots,~K)
]
각각을 행렬 차원에서 해석하게 되면 예를 들어 CIFAR-10 dataset의 input image가 $32 \times 32 \times 3$의 크기를 가지므로,
[ x_i \in \mathbb{R}^D,~D = 32 \times 32 \times 3 = 3072 ]
이미지 샘플 $x_i$를 하나의 차원을 가지는 벡터로 바꿀 수 있고, 이 벡터의 크기는 이미지 텐서의 3개의 차원을 모두 곱한 값이 된다. 예시로 사용한 CIFAR-10은 이름에서 알 수 있듯이 총 10개의 class로 구성된 dataset이므로, 앞서 언급한 식에서 $K = 10$인 경우에 해당된다.
$D = 32 \times 32 \times 3$의 차원을 가지는 input image vector를 $K = 10$개의 클래스에 대한 score로 치환해야한다. 앞서 언급한 신경망 회로 방법에서는 다음과 같이 구현 가능하다.
[ \begin{aligned} W &\in \mathbb{R}^{D \times K}, \newline X &\in \mathbb{R}^{1 \times D}, \newline b &\in \mathbb{R}^{1 \times K} \end{aligned}
]
[ f(X \cdot W + b) = f(Y),~Y \in \mathbb{R}^{1 \times K}
]
Activation function $f$는 벡터의 element-wise로 연산되기 때문에 affine mapping된 $Y$의 크기 그대로 output이 결정된다. 따라서 신경망 회로에 의해 $3072$의 차원을 가지던 input 이미지가 $10$개의 클래스 score로 치환될 수 있다. 앞서 소개했던 것처럼 학습 가능한 parameter인 $W$와 $b$는 weight, bias로 부른다. 지금까지 길게 써온 내용을 4가지로 요약하면 다음과 같다.
$(x_i, y_i)$ 데이터는 모두 고정이다. 그러나 함수에서의 parameter인 $W$, $b$는 조정 가능하다.
Training data $(x, y)$를 신경망에 통과시키면서 데이터셋에 대한 output을 잘 예측하는 $W$, $b$를 찾는 것이 목표가 된다. 그렇기 때문에 이전처럼 training data를 계속 메모리에 가지고 있을 필요가 없다. 즉, 학습이 끝나고 나면 training data는 메모리에 유지될 필요가 없다.
연산 과정을 그림으로 표현하면 위와 같이 나타낼 수 있다. 사실 여기서 그림으로 나타낸 내용은 앞서 언급했던 신경망에서의 activation function $f$와는 다르게 동작한다. 이 예제에서는 $f$가 그냥 affine function $X \cdot W + b$를 나타내는 함수라고 생각해주면 된다. 가장 우측의 결과가 classification에 사용될 예측 score가 된다. 점수표를 기준으로 해당 인공지능은 dog score가 가장 높게 나왔기 때문에 아마도 강아지라고 예측할 것이다. 물론 이건 명백한 오답.
이미지가 고차원의 벡터로 확장되었는데, 3072개의 axis가 있는 좌표계에서의 하나의 점으로 해석할 수 있다. 모든 image dataset $X$를 3072차원에 그대로 mapping하고, linear classification을 진행하는 것과 같다. 위의 그림은 3072차원을 2차원으로 줄여서 이해하기 쉽게 그려놓은 그림이라고 보면 된다.
이전에 설명했듯이 $W$의 각 row vector가 각각의 label 분류에 사용되는데, 기하적으로 해석한다면 row vector를 변화시키는 것은 classifier가 다른 방향으로 rotate하는 것과 같다. 그리고 bias에 해당하는 $b$는 classifier을 원점 기준으로 이동시키는 역할이라 보면 된다.
그리고 linear classifier를 KNN 알고리즘과 같은 template matching으로도 해석이 가능하다. 모든 $X \cdot W$의 계산은 $W$의 row vector와 $X$(column vector)의 내적으로 해석 가능하다. 그래서 $W$는 template, prototype로 학습이 가능한 상태가 되어 벡터 상으로 가장 가까운 값을 찾아가게 된다. 결국 이 문제는 각 샘플을 prototype으로 사용하여 가장 가까운 $K$개의 샘플을 통해 예측을 진행하는 KNN과 동일하게 해석이 가능하다. 잘 안 와닿을 순 있지만, inner product 계산 자체가 $L_1$, $L_2$ distance를 계산한 것처럼 거리 메트릭에 해당되기 때문이다.
이를테면 horse의 경우에도 데이터셋에 두마리의 말이 서로 마주하는 형태가 된다던지, car의 경우에 다양한 색상이나 종류의 차를 구분할 수 있어야하지만, 데이터셋 상으로 biasing된 붉은색 정보가 두드러지는 상황이 생길 수 있다. 아래 그림은 각 class에 대해 학습된 weight가 된다.
따라서 단순히 training dataset을 통한 Linear classifier 계산을 한다면 위의 그림과 같이 각 class 별로 weight prototype을 만들어내고, 이 prototype에 새로운 sample을 projection 했을 때 유사할수록 그 값이 크게 나오는 메커니즘이 되기 때문에 결론적으로는 일반화 성능이 그리 좋다곤 말할 수 없는 상황이 된다. 이런 문제들을 해결하기 위해 이후에 hidden layer를 사용하여 prototype 형태의 학습에서 벗어나고자 하는 심층 신경망 구조를 고안하게 된다.
만약 bias와 weight를 따로 학습하고 연산하게 되면, 앞서 설명했던 row vector 연산의 병렬화는 bias에 대해서는 적용될 수 없다. 하지만 결국 bias가 더해지는 형태는 $X$와 $W$가 linear projection된 각각의 element에 element-wise한 합을 구하는 과정이기 때문에 굳이 따로 학습할 필요 없이 축을 추가하여 계산할 수 있다.
Input에 $1$을 element로 추가해주고, bias를 row vector 우측으로 확장시킨다. 이렇게 되면 더이상 두 연산을 따로 처리할 필요없이 함께 최적화가 가능하다.
사실상 계속 설명했던 내용은 신경망으로 하여금 원하는 개수의 class 만큼 score를 예측하는 과정이었다. 네트워크가 입력된 데이터에 대해 오답을 내거나 애매한 정답을 output으로 내보낼 경우 이를 수치화하고 최적화에 사용할 수 있게끔 기준을 정해야할 필요가 있다. 따라서 앞서 소개했던 식에서의 objective function인 $\rho$의 기본적인 형태에 대해서 다룰 것이고, 그 중 support vector machine에 대해서 간략하게 소개해보도록 하겠다.
SVM의 기본 원리는, 각 이미지에 대해 원하는 정답이 있을 것이며 그 정답에 해당되는 score를 다른 class에 대한 정답보다 특정 threshold 이상 margin($\Delta$)을 주고 싶을 때 사용한다. Linear classification model에 대해 정답이 되는 class index에 대한 score는 최대화하되, 나머지 class index에 대한 score는 최소화하는 방향이다. 1부터 $K$까지의 class index를 나타내는 변수 $j$에 대해 각 $i$번째 샘플($x_i$)의 score는 다음과 같이 표현할 수 있다.
[ s_j = f(x_i,~W)_j ]
SVM loss의 정의는 정답에 해당되는 class의 score를 다른 class의 score보다 특정 margin($\Delta$) 이상으로 주고싶을 때 사용하기 때문에, $i$번째 샘플에 대한 SVM loss는 다음과 같다.
[ L_i = \sum_{j \neq y_i} \max (0, s_j - s_{y_i} + \Delta)
]
$i$번째 샘플의 정답은 $y_i$이고, 이는 $K$개의 클래스 중 하나의 값으로 매핑되어있다고 생각해보자. $s_{y_i}$는 $i$번째 샘플이 정답인 $y_i$ 클래스일 점수를 의미하고, 나머지 $s_j$는 $i$번째 샘플이 정답이 아닌 $j$ 클래스일 점수를 나타낸다. 만약 $j$번째 클래스일 점수가 정답인 $y_i$번째 클래스일 점수보다 margin 이상 작지 않다면 $\max$ 함수 뒤에 있는 인자가 0보다 큰 값을 가지게 되므로 loss가 증가하게 된다. Loss의 정의는 task마다 다르지만 원하고자 하는 기준과 멀어질수록 큰 값을 가지게 하는 것이 일반적이고, 지금 상황에서는 정답인 클래스일 점수보다 나머지 클래스일 점수들이 margin 이상으로 낮아지지 않으면 loss 값이 증가하는 구조가 된다.
그림으로 표현한 것이 위의 그림이다. 결론적으로는 다른 클래스의 모든 점수를 margin 만큼 차이가 나게끔 줄일 때까지 학습이 진행된다. 이를 신경망에서의 행렬 연산으로 표현하면 다음과 같다.
[ L_i = \sum_{j \neq y_i} \max (0, W_j^\top x_i - W_{y_i}^\top x_i + \Delta)
]
Score 값을 구하고 싶은 class index를 $k$라고 했을 때, 해당 연산에 필요한 요소는 $W$ matrix에서의 $k$번째 row vector이므로 sample $x_i$와 내적 연산을 통해 inner production을 진행한다. 위와 같이 threshold를 기준으로 loss를 주는 방식을 hinge loss라고 부르며, 만약 네트워크의 예측에 따라 cost를 더 크게 주고 싶거나, loss를 미분 가능하게 만들고 싶다면 다음과 같은 함수를 사용할 수 있다.
[ \max (0,~-)^2
]
하지만 SVM loss에는 큰 문제점이 있는데, 바로 학습이 완료된 $W$가 우리가 원하는 방향대로 특정 class의 score를 $\Delta$만큼 크게 만들 수 있다고 한다면 그와 마찬가지로 $W$의 모든 scalar 배수들 또한 같은 역할을 할 수 있다. 예를 들어 $\lambda > 1$인 모든 $\lambda$에 대해, $\lambda W$가 내보내는 score 또한 1보다 큰 값으로 scaling되므로 같은 조건을 만족할 수 있게 된다. Optimization 관점에서 global minima가 여러 곳 존재한다는 것은 convex optimization의 조건에 부합하지 않는다. 만약 우리가 해결하고자 하는 문제에서 이를 제한할 수 있는 조건이 없다면 학습 속도가 느려지거나 발산할 수 있는 문제가 생긴다. 따라서 이러한 문제를 없애주기 위해 regularization penalty를 주어, 보다 feasible(실제로 탐색했을때 유의미한 manifold를 의미한다)한 영역만 찾고자 한다.
[ R(W) = \sum_k \sum_l W_{k,~l}^2
]
2차원 matrix $W$의 $L_2$ norm은 정의에 입각하여 위와 같이 구할 수 있고, 수많은 $W$들 중에서 우리는 원점으로부터 거리가 가장 가까운($n$차원의 hypersphere) 곳이 최적화가 되었을 때 이상적인 weight가 되게끔 해준다. 결국 우리가 최소화해야할 loss는 앞서 언급했던 hinge loss와, 방금 위에서 소개한 $L_2$ regularization loss가 된다.
[ \begin{aligned} L =& \frac{1}{N} \sum_i L_i + \lambda R(W) \newline L =& \frac{1}{N} \sum_i \sum_{j \neq y_i} \max \left( 0, W_j^\top x_i - W_{y_i}^\top x_i + \Delta \right) + \lambda \sum_k \sum_l W_{k,~l}^2 \end{aligned} ]
보통 최적화하고 싶은 loss function이 여러 개일 때, hyperparameter $\lambda$를 사용자가 직접 정하고, 이를 cross-validation하면서 찾아간다. 최적화 관점에서는 앞서 설명했던 것처럼 보다 convex optimization에 가깝게 해주기 위해 정규화 term을 추가해주고, 학습이 끝났을 때의 성능을 기준으로 생각해보면 weight parameter가 클수록 input의 값 변화에 따라 변동성이 큰 네트워크가 생성될 수 있기 때문에 overfitting의 문제가 있다. 따라서 보통 regularization이라고 이름이 붙은 loss나 방법들의 경우 설명하는 내용들을 찾아보면 오버피팅을 방지하는 효과가 있기 때문에 사용한다라고 설명되어있다. 물론 정답이긴 하지만 regularization을 사용하는 이유의 전부가 아니라는 점만 말하고 넘어가고 싶었다.
앞서 조정할 수 있는 hyperparameter로 $\lambda$를 설명했는데, 사실 hinge loss 부분의 $\Delta$ 역시 사용자가 직접 정해줘야하는 문제가 있다. 하지만 앞서 말했던 것과 같이 $\lambda$가 weight의 scale에 대해 고려해줄 수 있는 값이 되기 때문에, 만약 $\lambda$ 값을 조정하게 되면 그에 맞게 $\Delta$도 조정해야한다. 두 하이퍼파라미터가 성능에 있어 독립적으로 작동하는 것이 아닌 서로 연관된다는 점에서 우리는 $\Delta$를 굳이 변화시킬 필요 없이 weight의 크기를 조절해줄 수 있는 $\lambda$ 값만 hyperparameter로 고려할 수 있다. 계속 설명했던 SVM classifier는 class의 개수에 무관하게 적용될 수 있는 식이었다. Class 개수가 2인 binary classification에 대해서 생각해보면 만약 margin을 $1$로 고정해서 사용할 경우에,
[ L_i = C \max \left(0,~1-y_iw^\top x_i \right) + R(W)
]
위와 같이 표현할 수 있고 식에서의 상수 $C$는 $\lambda$의 역수에 비례하는 hyperparameter로 사용된다. Binary support vector machine은 $y_i$가 class의 인덱스를 나타내는 것이 아닌 $-1,~1$의 값으로 사용한다.
앞서 소개했던 SVM은 classifier의 한 종류였고, 또다른 classifier로 대표적으로 사용되는 softmax classifier를 소개하도록 하겠다. 사실상 최근에 진행한 모든 프로젝트나 딥러닝 관련 과제들에서 SVM을 사용했던 적은 없었으며, 대부분의 energy based function을 적용하는 과정에서 softmax 함수 형태를 자주 볼 수 있기 때문에 어찌보면 SVM보다 조금 더 중요한 개념이라고 해도 될 것 같다. 우선 softmax는 binary logistic regression을 multiclass를 가지는 classifier에 사용했다고 요약할 수 있다. Binary logistic regression이란, 대상이 되는 데이터가 분류되는 카테고리가 $0$과 $1$, 두 개라고 생각하고 시작한다. 그리고 각각의 카테고리로 분류될 확률의 합은 1이다. Logistic regression은 선형 모델을 특수하게 사용하기 때문에 단순한 linear regression과는 차이가 있다. 하지만 logistic model의 경우 target이 되는 $y$의 범위가 $0$부터 $1$ 사이에 놓이게 된다. 다음과 같은 예시를 보자. 만약 독립변수 $x$에 대해 $0$과 $1$, 두 개의 값을 가지는 종속 변수 $y$를 예측하는 모델이 필요하고, 이를 일반적인 선형 모델로 구현한다고 생각해보면 선형 모델은 $y = Wx+b$로 나타낼 수 있다. 선형 회귀는 여러 데이터 점을 대표하는 1차 방정식의 기울기(weight)와 절편(bias)를 구하는 것인데, 종속 변수가 오직 두 개만 존재하는 classification에서는 선형 모델링이 크게 도움되지 않는다.
선형 함수의 치역은 우리가 parameter로 하여금 데이터를 어떠한 방식으로 주어도 $0$과 $1$ 사이의 값이 아닌 무한대의 영역에 뻗어있게 된다. 사실상 우리가 원하는 결과랑 무관하기 때문에, 실제로 우리가 얻고자 하는 종속 변수 $y$인 $0$과 $1$을 기준으로 mapping이 가능한 방법을 고안하였다. 이 방법이 바로 logistic 모형인 $g(x) = \frac{e^x}{1+e^x}$과 검벨 모형 $g(x) = e^{-e^x}$가 된다. 그러나 검벨 모형의 경우 exponential 연산이 중첩되기 때문에 연산이 어려웠고, 이 중 계산상 간단한 logistic model을 사용하게 되었다.
Logistic function의 형태를 보면 알 수 있듯이 연속 독립 변수인 $x$에 대해 종속 변수의 결과가 항상 0과 1 사이의 값으로 나오게 된다. 연산에 사용되는 개념으로는 Odds와 Logit이 있다. Odds는 실패에 대해 성공할 확률의 비율을 의미한다. 만약 특정 독립 변수가 들어왔을 때 종속 변수가 $1$에 속할 확률을 성공할 확률이라고 생각한다면,
[ \text{Odds} = \frac{p(y = 1 \vert x)}{1-p(y = 1 \vert x)}
]
위와 같이 표현이 되고, 확률인 $p$는 0부터 1까지의 값을 가질 수 있기 때문에 여기에 log를 취한 logit은
[ \text{Logit} = \log(\text{Odds}) = \log \left( \frac{p}{1-p} \right)
]
으로, 실수 전체의 범위를 갖게 된다. 앞서 말했던 것과 같이 종속($p$)에 대해서 독립($x$)의 관계를 정의할 수 있는 함수를 가져왔고, 이제는 linear regression을 적용해볼 수 있다.
[ \log \left( \frac{p}{1-p} \right) = Wx+b
]
하지만 이 식은 $y$에 대한 관계로 정의되지 않았기 때문에 이를 직접 종속 변수인 $p$를 통해 표현하게 되면 logistic regression 문제로 치환할 수 있다.
[ p = \frac{e^{b+Wx}}{1+e^{b+Wx}}
]
즉, 신경망 조건에서도 softmax를 사용한 classification이 가능함을 증명할 수 있다. 지금까지는 binary에 대해서만 살펴보았고, 만약 multiclass인 경우에는 이를 보다 확장시킨 개념으로 바꿀 수 있다. Logistic regression을 사용할 때 사용되는 logistic 함수는 input에 대한 score를 class의 확률 추정으로 변환할 수 있다. 따라서 SVM의 classifier에서는 score를 그대로 사용했다면, 여기서는 logistic mapping을 토대로 확률을 사용할 수 있게 된다.
[ p_i = \frac{e^{z_i}}{ \sum_{j = 1}^k e^{z_j}},~\text{for }i = 1,~2,~\cdots,~k
]
이를 softmax function이라고 부른다. $i$가 의미하는 것은 클래스의 인덱스이고, $z_i$는 score라고 생각하면 된다. 결국 $k$개의 class를 확률로 반환하기 위해서는 $k$개의 score를 logistic 연산을 통해 $0 ~ 1$ 사이의 값을 가지는 벡터로 변환한다는 것이다. 다르게 표현하면 normalized probability라고도 한다. 변환된 벡터에 대한 loss를 계산할 때, 기준이 되는 목표는 class에 맞는 index의 확률을 $1$에 가깝게 만드는 것이고, loss를 연산하는 과정에서는 softmax 결과에 negative log를 취한 값을 사용한다.
[ L_i = -\log \left( \frac{e^{f_{y_i}}}{\sum_j e^{f_j}} \right) = -f_{y_i} + \log \sum_j e^{f_j} ]
결국 이를 최소화하는 것은 목표가 되는 class의 점수 $f_{y_i}$를 키우고, 나머지 점수들을 낮추는 방향이 되기 때문에 결론적으로 SVM과 softmax의 결은 동일하다고 할 수 있다. 이렇게 해석되는 loss를 cross-entropy loss라고 부른다.
일반적으로 혼란스럽거나 불확실할 때 엔트로피가 높다는 표현을 사용한다. 확률적으로 생각하게 되면 특정 정보가 어떤 것인지 확신할 수 없을 때 엔트로피가 크다고 표현할 수 있다. 샤넌 엔트로피라고 부르는 식은 가능한 outcome(결과 혹은 정보) $x_1,\sim x_n$에 대해 각각의 결과가 도출될 수 있는 probability인 $p(x_1),\sim p(x_n)$가 있다고 했을 때 다음과 같이 표현할 수 있다.
[ H(X) = -\sum_{i = 1}^n p(x_i) \log p(x_i)
]
이 식은 확률 $p(x)$가 $p(x)$에 대해 보존할 수 있는 정보량으로 해석된다. 만약 각 결과가 나올 확률을 확신할 수 없다면 $p(x_i)$가 균등하게 분포될 것이고, 만약 그렇다면 모든 결과를 품기 위해 정보 보존량은 그만큼 증가해야하기 때문에 entropy 값이 증가한다. 그와 반대로 만약 각 결과가 나올 확률을 확신할 수 있을 정도로 $p(x_i)$가 균등하지 않다면 모든 결과를 품지 않아도 결과에 대한 정보 보존이 가능하기 때문에 entropy 값이 감소한다. 이번에는 만약 예측된 $p(x)$가 $q(x)$에 대한 정보량을 얼마나 보존할 수 있는지 확인해야하는 경우를 생각해보자. 우리는 예측해야할 분포에 대한 정보를 알고 있고, 이를 ground truth $q(x)$라고 생각해보자.
[ H(p,~q) = -\sum_{i = 1}^n q(x_i) \log p(x_i)
]
Classification의 관점에서 보면 $x_i$는 각각 특정 class index를 기준으로 정답인 class는 확률 $1$, 나머지 class는 확률 $0$이 되는 것이 이상적이다. 앞서 계속 본 softmax 식에 해당되는 $\frac{e^{f_{y_i}}}{\sum_j e^{f_j}}$가 예측된 확률 $p(x_i)$이다. Cross-entropy 식을 다음과 같이 분리하면,
[ H(p,~q) = -\sum_{i = 1}^n q(x_i) \log \left( \frac{p(x_i)}{q(x_i)} \right) + q(x_i) \log q(x_i) ]
위의 식에서 좌측의 term은 KL divergence로, 두 분포 $p(x)$와 $q(x)$의 거리를 표현한다. 이 값은 거리에 해당되므로 0보다 크거나 같은 값을 가지기 때문에 다음과 같은 대소 관계를 가진다.
[ H(p,~q) = D_{KL}(q \parallel p) + H(q) \ge H(q) ]
따라서 cross-entropy는 entropy보다 크거나 같을 수 밖에 없다. 원래의 확률인 $H(q)$는 상수로 취급하기 때문에 이에 대한 미분값은 $0$이 되고, 결론적으로는 학습에 영향을 미치지 않기 때문에 cross-entropy를 최적화하는 것은 KL divergence를 최적화하는 것과 같다.
모델이 예측하는 score는 normalized되지 않은 값을 가지는데, 이를 exponential 함수가 포함된 softmax를 통해 normalized probability로 바꾼다. 특정 이미지가 어떤 class에 속할 확률은 곧 likelihood를 최대화하는 것과 같으며, 다음의 Bayes에서 MLE와 같은 의미를 가질 수 있다.
[ p(x_i \vert y_i) = \frac{p(y_i \vert x_i)p(x_i)}{p(y_i)}
]
하지만 이럴 경우 input의 prior를 고려할 수 없다는 문제가 있다. 하지만 신경망에서는 이를 matrix $W$를 통해 대체가 가능하다. 만약 $y_i$가 input $x_i$에 대해 parameter $W$를 통한 변환으로 해석된다면, 기존의 prior를 다음과 같이 바꿀 수 있다.
[ p(x_i \vert W) = \frac{p(y_i \vert W)p(W)}{p(y_i)}
]
따라서 classification에 대한 likelihood를 최적화하는 과정에서 동시에 $W$가 prior 역할을 대신해줄 수 있기 때문에 MAP(Maximum a posterior)로 해석 가능하다는 관점이다.
위의 식대로 exponential을 계산하고, 이에 log likelihood를 적용하는 과정을 거치게 되면 denominator($\sum_j e^{f_j}$)로 사용되는 exponential의 합이 매우 커지는 문제가 발생한다. 이는 score가 normalized되지 않았기 때문인데, 연산 과정에서 값이 너무 커지게 되면 오버플로우가 발생하거나 일부 값을 유실할 수 있기 때문에 값을 줄여서 연산이 가능하게끔 다음과 같은 trick을 사용한다.
[ \frac{e^{f_{y_i}}}{\sum_j e^{f_j}} = \frac{e^{f_{y_i} - \delta}}{\sum_j e^{f_j - \delta}}
]
분모와 분자에 모두 같은 값인 $e^{-\delta}$로 나눠주면 계산값은 동일하다. 따라서 원래의 score에서 가장 maximum value인 $f_{j^*} = \max (f_j)$에 대해서,
[ \frac{e^{f_{y_i} - f_{j^*}}}{\sum_j e^{f_j - f_{j^*}}} ]
이와 같이 최댓값을 기준으로 re-scaling해주게 된다면, 최댓값을 기준으로 모두 0보다 작거나 같은 값이 되기 때문에 exponential 값이 $0 \sim 1$에 형성될 수 있다.
지금까지 linear classification에서 사용될 수 있는 두 가지 classifier인 support vector machine(SVM)과 softmax에 대해서 살펴보았다.
SVM은 신경망의 output으로 나오는 score function의 결과를 토대로 hinge loss를 적용하는 분류기이며, Softmax는 신경망의 output으로 나오는 score function을 softmax를 통해 normalized probability로 치환하여, MLE 혹은 MAP 최적화를 진행하는 cross entropy loss를 사용한다.
앞서 SVM에서는 동일한 loss를 내보내는 $W$ 값이 존재할 수 있기 때문에 overfitting을 방지하기 위해 $\lambda$를 통해 weight를 준 regularization term을 사용하였다. 그러나 softmax에서 사용하는 cross entropy loss에서는 weight가 scaling될 경우 동일한 loss 값이 나오지 않게된다. 그럼에도 불구하고 softmax에서도 $L_2$ regularization을 사용하는 이유에 대해서 살펴보면 다음과 같다.
[ (1, -2, 0) \rightarrow (e^1, e^{-2}, e^0) = (2.71, 0.14, 1) \rightarrow (0.7, 0.04, 0.26)
]
어떤 $W$를 통한 neural network 연산을 통해 계산된 결과가 위와 같다고 하자. Softmax classifier를 사용하기 때문에 score인 $(1, -2, 0)$을 softmax 함수를 사용한 normalized probability $(0.7, 0.04, 0.26)$으로 바꿀 수 있다. 이 $W$에 regularization을 주어 이보다 0.5배만큼 element가 작아진 neural network parameter에 대해서 계산된 확률은 다음과 같다.
[ (0.5, -1, 0) \rightarrow (e^{0.5}, e^{-1}, e^0) = (1.65, 0.37, 1) \rightarrow (0.55, 0.12, 0.33)
]
결과가 더 diffuse된(보다 dense한 확률 분포라고 표현하며, 흔히 엔트로피가 낮은 상태로 표현함) 형태가 되었다. 즉, weight parameter가 작아지려 하면 할수록 output probability는 보다 uniform해진다는 것. 결국 SVM의 점수표와 비교하여 절대적인 값이나 차이를 반영한다기 보다는 각 확률의 대소는 그대로 가져가되, confidence에 차이가 생기게 된다.
SVM과 Softmax의 퍼포먼스에 대한 차이가 그리 크지는 않다. 그래서 task마다도, 사람들 마다도 어떤 classifier가 더 적합하다고는 정답을 내릴 수 없다. Softmax classifier에 비해 SVM이 margin보다 큰 점수차에 대한 loss를 무시할 수 있기 때문에 더 local objective(집중할 수 있는 부분에만 신경을 쓰는 것)하다고 표현된다. 반면에 Softmax는 아무리 score가 차이가 나더라도 loss가 0이 되지 않기 때문에 이러한 조건을 만족하지 않는다. 이를 요약하자면 SVM은 한 번 조건을 만족하게 되면 학습을 멈추게 되고, softmax는 계속 학습을 진행하고, 성능을 높이려는 방향으로 parameter 학습을 진행한다.
나름의 장단점이 있기에 어떤 classifier가 더 좋다고는 확신할 수 없지만, 개인적으로는(그냥 제 의견입니다만) softmax classifier가 지속적으로 학습이 가능하다는 점, logistic 연산을 통해 계산된 class의 confidence를 활용할 수 있다는 점에서 더 좋아보인다.