LEC3 - Linear Classifiers
오늘은 선형 분류기에 대해서 알아보자. 이제 진짜 딥러닝에서의 신경망을 슥 배워보자.
신경망이란, linear classfier 라는 블록들을 쌓아놓은 것이라고 생각할 수 있습니다. 즉 linear model들을 매우 쌓아 강력한 효과를 낼 수 있다는 것이지요. 즉 이번에 배울 linear classifier 는 단순하지만, Neural Network의 근간을 이루는 매우 중요한 요소인 것이지요.
parametric approach (모든 데이터를 저장하는 것이 아니라 파라미터 값만 저장하겠다.)
이전 K-NN 에서는 input image 를 분류 과정에서만 활용했지만, Linear Classifier는 input 'x' 와 함께 learnable parameter 인 'w' 를 같이 활용한다는 것이 특징이다. 이런 Parametric Approach 를 함수 f(x, W) 로 표현하며, 이 때 x는 categorize 할 output의 갯 수가 된다. 여기서 b는 bias 이며, 생략할 수 있다. Wx 는 2차원 Parameter 행렬 W와 이미지를 변환(쭉 늘어놓는) 방법을 통해 만들어진 'x' 사이의 행렬곲을 나타내며, 여기서 1차원 벡터 x는 이미지의 spatial structure는 당연하게도, 잃어버린 상태다. 이후 이런 위치정보를 잊고 싶지 않아 CNN 이 등장하게 되는데, 나중에 다룰 것이다.
★ x를 열벡터로 변환하는 과정을 flattern 이라고 하며, 그냥 행렬을 늘어놓는 것을 말한다.
이런 Linear Classifier를 이해하기 위한 관점으로는 몇 개가 있는데, 지금 부터 알아보자.
첫 번째로 볼 관점은 Algebraic 관점인데, 결국 선형대수적 관접 행렬곱의 형태로 보자는 것이다. 이 관점에서는 다음과 같이 도식화 할 수 있고, 그것을 과정 별로 나타내면
1. flattern : 2x2 입력 이미지를 4x1 열벡터로 바꿔준다.
2. 분류하고자 하는 클래스가 3개, input 열벡터의 크기가 4 이기 때문에, 가중치 행렬은 3by4의 행렬이 된다.
3. 가중치 행렬과 입력 이미지의 열벡터 사이에서 벡터 내적을 하고, 끝에 bias를 더해주면 각 클래스별 위 그림과 같은 방식을 취할 수 있다.
앞서 본 matrix 처럼 bias term을 따로 관리하게 되면, 관리가 귀찮기 때문에, 행렬에 한 개의 열을 추가하고, input data의 마지막에 1을 넣어주게 되면, bias 에 대한 vector를 따로 관리 할 필요가 없어지게 된다. 하지만 이런 트릭을 사용하는 것의 단점도 있는데,
1. Linear Classifier 에서 Conv network로 넘어갈 때 매끄럽지 않다.
2. 식이 간단해질 수 있지만, 파라미터 초기화 및 정규화시 가중치와, bias를 따로 보는 것이 좋을 때가 많다.
대수적 관점에서의 또 다른 이점은, Linear Classifier의 결과가 그 이름대로 Linear 하다는 것이다. image에 0.5 씩 곱한 값이 들어온다고 하면, 결과 값도 동일하게 정확히 0.5 를 곱한 score가 된다는 것이다.
이번에는 visual viewpoint 에서 한 번 바라볼 것인데, 뭐 엄청나게 복잡한 관점은 아니고, 아까 본 것과는 달리 flattern 하기 전인 2x2의 shape를 그대로 가져보자는 것이다. 가중치 행렬이 input image와 같은 형태를 갖기 때문에, 각 가중치에 대해 시각적으로 볼 수 있으며, 그 결과는 클래스당 하나씩 총 10개의 template이 생성된다. 지금 loss func 에 대한 정의가 없어서 그 개념이 모호해 보일 수 있지만, 각 weight는 자기가 담당하는 class 를 가지게 된다는 말이다. 이후 내용을 보면 보다 잘 이해될 것이다.
이런식으로 각 weight가 각 class를 담당한다는 개념은 linear classfier의 실패와 직결되는데, 예를 들면, 바다위에 사슴이 있다고 하면, 우리 모델은 매우 혼란스러워 할 것이다. 배경색은 plane에 가깝지만, 중앙에 사슴이 있으니, 둘 중 무엇인지 매우 혼란스러워 할 것이다. 또한 하나의 카테고리가 하나의 템플릿만 학습할 수 있다는 것은 하나의 카테고리내의 다양한 자세에 대해서 잘 나타내지 못할 가능성이 많다. 예로, 만일 말이 반대방향을 보고 있는경우 예측할 수 없다.
이제 마지막 관점인데, 이는 geometric 과점이다. 즉 기하학적 관점에서 그래프로 보자는 것이다. 예를 들어 우리가 입력이미지가 차인지 구별하는 상황이라고 해보자.
1. 우선 이미지에서 무작위 픽셀 2개를 잡아. 각각 x축, y축에 대응시켜보자.
2. 이때 car score에 0.5가 되는 선을 긋는다. 이 선을 기준으로 오른쪽에 있다면, 차에 대한 점수가 높은 것, 왼쪽에 있다면 차에 대한 점수가 낮은 것이 된다. 이 직선식은 앞에 (wx+b) 를 도식화 했다고 보면 될 것이다.
3. car score 0.5 선을 기준으로 오른쪽으로 갈수록 car score 가 증가하기 때문에, 이 선의 수직인 방향으로 갈 수록 car 일 확률이 높다고 볼 수 있으며, 자동차는 해당 수직인 직선에 있다고 볼 수 있다.
이를 2차원이 아닌 고차원으로 확장한다고 하면, 오른쪽에 있는 hyper plane이 될 것이다.
동일한 image classifier에 대해서, 다양한 관점으로 살펴본 것이다.
지금부터는 linear classifier로 풀기 힘든 예제들에 대해서 알아보고자 한다.
앞서 계속 보았던 것처럼, 그 중에서 기하학적 관점에서 본 것 처럼. 우리는 각 class 에 대해서 한 직선만을 가질 수 있고, 그 직선 만으로는 우리는 위의 예시 중 그 어떤 것도 나타낼 수 없다. XOR 문제는 XOR 기호를 도식화 한 함수에 대해 우리가 한 직선으로는 나타낼 수 없다는 것이고, 단일 퍼셉트론으로는 해결할 수 없는 문제로 알려져 있다. 아래 그림을 보면 보다 이해가 쉽다.
이 관점은 역사적으로 유용했는데, 초기 머신러닝 알고리즘인 perceptron에서 XOR 연산을 수행할 수 없었다. 당연한 이야기이다.
지금부터는 score func, loss func 에 대해서 알아보자, 우리는 가중치(파라미터)를 정의 했고, 이를 통해 분류 할 수 있음을 제시했지만, 이 가중치를 어떤 식으로 구해야 할지에 대한 이야기를 해보자.
우리는 parameter와의 연산을 통해 score 를 정의 할 수 있었지만, 이 정답과의 괴리를 줄이기 위한 방식으로 W를 update해가야만 한다. 지금 부터 loss func 에 대해 알아보고, 다음 4장에서 loss를 감소시키는 optimizer에 대해 알아보자.
Loss func 는 우리의 분류기가 얼마나 잘 역할을 수행하고 있는지를 나타내며, loss 가 작으면 잘 역할하고 있는 것이고, loss가 크다면, 잘 못 역할하고 있다는 것을 의미한다. 일반적으로 loss 와 classifier는 반비례 하는데, 때때로 loss 와 classifier의 성능이 반비례하는 경우에는 -를 붙혀 사용한다. 대표적인 예시로 NLL(negative log-likelihood) 가 있다. loss는 우리 모델의 예측값과 정답값 사이의 차이를 나타내는 것이다.
많은 loss func 이 있지만, 우리가 처음으로 볼 loss 는 multi class SVM 에서 사용되는 hinge loss다. svm은 내 데이터와 다른 데이터를 구분하는 선을 구하는 것인데, 이때 각 data에서 떨어진 정도인 margin 을 최대화 하는 방식으로 직선을 구하는 것이다. 이 때 $s_j - s_yi$ 는 margin을 나타내며, 다른 class 의 score와 해당 클래스이 class score의 차가 일정한 margin 보다 크면 0 아니면 차이 + margin 이다. 여기서 score 값은 W^T x + b 로 나타나지게 된다. $s_j - s_y$ s_y 는 정답에 대한 score 값이 되고, s_j 는 다른 class의 score 값이 된다. loss 를 구하는 예시를 보게 되면 다음과 같다.
각 class 에 대해 정답인 category의 값의 차이에 1을 더한 값과 0의 값 중에, 큰 값을 우리는 채택한다. 즉 이 loss가 실제 hinge loss 인지는 알 수 없지만, 이 loss가 나타내는 것은, 내가 예측해야하는 모델의 점수가 높도록 하는 방식으로 설계된 것임에는 틀림이 없다. 같은 방식으로 자동차, 개구리 이미지에 대한 loss를 산출하고, 이들의 평균을 내어 전체 Multiclass SVM Loss를 구할 수 있다.
Q. 차 이미지에 대한 score가 조금 변한다고 할 때, loss 값의 변화는 어찌 될까.
A. 한번 옳게 예측한다고 하면 score가 조금 변해도 loss에 큰 영향을 주지 않는다.
Q. loss의 최소, 최댓값의 범위는 어찌 되는가.
A. 0, 무한대가 된다.
Q. 만일 모든 score가 random 이라고 하면, loss의 기댓값은 어떤지?
A. Loss 값 또한 small random 값이 된다.
Q. 만약 정답 클래스도 loss sum 계산에 포함된다면?
A. 모든 loss 값이 1씩 증가하게 되기 때문에, 순서에는 영향을 주지 않아 결과는 달라지지 않는다.
Q. Loss에 sum대신 mean을 사용한다면?
A. 전체적인 경향성을 해치지 않기 때문에, 스케일만 변할 뿐 결과에 변화는 없다.
Q. 만일 loss의 제곱을 사용한다고 하면?
A. 더 이상 Multiclass SVM Loss 라 할 수 없고, squared hinge loss라 하며, 비선형적으로 바뀌게 된다.
Q.L = 0이 되는 w를 찾았다. 이 W는 하나뿐인 값이냐?
A. Score가 선형적인 관계이기 때문에, 2W, 3W등 W의 배수이면 전체 score도 선형적인 변화를 겪기 때문에 Loss를 0으로 만든다.
앞서 loss를 작게 만드는 가중치가 좋은 가중치라고 말했는데, 그렇다면 loss를 아예 0으로 보내버리는 것은 좋은 일일까? 에 대해서 생각해보면 그렇지 않다. 왜냐하면, 우리가 하고 싶은 일은 train`ing dataset에 대해 잘 나타내는 모델을 찾고 싶은 것이 아니라, testdataset에 대해서 잘 예측하는 모델을 만들고 싶은 것이기 때문이다. 그래서 우리는 과적합되지 않도록 하기 위해서, Regularization을 통해 model에 규제를 가한다. 여기서 람다는 정규화 텀으로 hyperparameter로서, 우리가 주는 값이다.
w1 과 w2는 동일한 출력을 내보내는 가중치인데, 이 때, L2 regularization을 사용하면, w2가 더 적은 loss 값을 갖게 된다. 즉 L2는 가중치들을 spread 하게 해주는 역할을 한다고 볼 수 있다. 생각해보면 당연한 이야기 인 것이, reguralization 이라는 것이 결국, 과적합을 막고 싶다는 의미고, 과적합을 막는다는 것은 특정 input에 과도하게 반응하는 가중치들을 눌러주겠다는 이야기이다.
여기서 f1은 overfitting 된 모델을 나타내고, f2는 reguralization 을 통해 보다 일반적인 특성을 학습한 모델을 나타낸다.
다음은 cross-entropy loss와 KL divergence에 대해서 다루는데, 나는 이미 다른 포스팅을 통해 이 문제에 대해 자세히 다뤘기 때문에, 설명은 생략하도록 하겠다.