Loss Function
입력 받은 가 얼마나 나쁜지 평가하여야 해서 가장 나쁘지 않은 를 결정해야함.
그것을 위해 사용하는 함수를 Loss Function이라고 함.
: N개의 샘플들의 Average Loss, : Weight Matrix, : Predict Function, : 이미지, : 분류 결과
Multi Class SVM
Support Vector Machine이란?
Support Vector Machine은 분류를 위한 Decision Boundary를 결정하는 모델이다.
Decision Boundary는 무수히 많이 존재하지만, 여기서는 Class로부터 가장 멀리떨어진 Boundary를 최적의 Boundary라고 한다.
이때, Support Vector는 Decision Boundary로부터 가까이 떨어진 Data이고, Decision Boundary로부터 Support Vector 까지의 거리를 Margin 이라고 한다.
최적의 Decision Boundary가 Class로부터 가장 멀리 떨어졌다고 하였으므로, 이는 곧 Margin이 가장 큰 Decision Boundary가 최적 될 것이다.
아래 링크를 참조하였다.
Multi Class SVM은 Class가 2개인 Binary Class SVM을 응용하여 여러 클래스를 분류할 수 있도록 한 모델이다.
Multi Class SVM Loss
Multi Class SVM에서 Loss는 다음과 같이 정의한다.
( : 정답, 는 Classifier가 내놓은 스코어, 는 정답 스코어)
이를 풀어서 적어보자.
이 함수의 의미는 Classifier가 정답이 아닌 Class에 대해서 내놓은 Score들을 순회하면서 정답의 Score와 비교하는데, 정답의 Score가 오답의 Score보다 유의미하게 (Saftey Margin 보다 더) 커야 한다는 것이다. 그렇게 된다면 Loss는 0이 되고 해당 Class를 잘 분류한 것이다.
그래프로 이를 작성하면 위와 같은 모양이 되어 이를 Hinge Loss 라고 하기도 한다.
모든 Class에 대해 Loss를 계산하고 이를 평균 내면 Classifier의 Average Loss가 된다.
Regularization
Loss Function을 통해 괜찮은 를 찾는 다는 것은, Training Data를 이용하여 를 찾는 다는 것이다.
하지만 우리가 찾은 Classifier가 Test Data에 얼마나 잘 맞는가를 알아야 하기 때문에 Training Data에서 나타나는 성능보다 Test Data에서 얼마나 좋은 성능이 나타나는지를 알아야 한다.
Training Data를 통해서 학습을 하면, 해당 Training Data에 가장 잘 맞게 학습이 되기 때문에 학습된 모델이 복잡할 수 있다. (파란색 곡선) 하지만 모델이 단순할 수록 다른 데이터에도 잘 들어맞기 때문에 (Occam's Razor) 모델을 단순화 할 필요가 있고,
그래서 아래와 같이 Data Loss에 Regularization Loss를 추가한다.
는 두 항간의 Trade-off로 Hyperparameter이다.
L2 Regularization
L2 Regrularization에서는 Euclidean Norm 이 작을수록 less complex 하다고 생각한다.
따라서 의 Euclidean Norm에 페널티를 주어 Euclidean Norm이 작은 (값들이 Coarse한, 값들이 고른) 를 선호하게 한다.
데이터의 모든 요소가 골고루 결과에 영향을 미치는 것을 원한다면, 다시 말해서 데이터의 특정 값에 의해 결과가 좌우되는 것을 원하지 않는다면 L2 Regularization을 해볼 수 있을 것이다.
L1 Regularization
L1 Regularization에서는 에 0이 많을 수록(Sparse 할수록) less complex하다고 생각한다.
따라서 의 Sparsity를 높인다. (W를 희소 행렬이 되도록, 0의 갯수를 늘려서)
Elastic Net Regularization
L1과 L2를 섞은것
Max Norm Regularization, Dropout등의 다른 Regularization도 있음
Softmax Classifier (Multinomial Logistic Regression)
Multiclass SVM 에서는 정답 점수가 오답 점수보다 높기만 하면 됐지만, Multinomial Logistic Regression에서는 점수 각각에 추가적인 의미를 부여한다.
Logistic Regression
Linear Regression과 달리 결과가 연속적인 값이 아닌 Category가 있는 이산적인 값일 경우 Linear Regression을 적용할 수 없다. 이런 경우에 특정 Category가 속할 확률을 이용해서 회귀 분석을 하게 되는데, 이런 방법을 Logistic Regression이라 한다.
로지스틱 회귀 분석에서는 Category에 속할 확률의 Odds(승산) 값을 사용한다. Odds란, 어떤 사건 가 발생할 확률을 발생하지 않을 확률로 나눈 값()이다.
이때, Odds의 값은 0보다 크므로 회귀식을 사용하기 위해 로그를 취해 사용한다. 이를 바탕으로 Logistic Regression 의 식을 적어보면,
이고, 이를 정리하면
이다.
이를 응용하여 개의 Class를 분류할 수도 있다. (다항 로지스틱 회귀 분석)
Softmax Function
입력 받은 값을 0에서 1사이의 값으로 바꾸고, 해당 값을 전부 더하면 1이 되도록 하는 함수이다.
Softmax Classifier의 Loss Function
점수를 Softmax 함수에 넣고, 나온 확률 값을 취한다. 따라서,
를 취하는 이유는?
Kulllback-Leibler Divergence에 의한 결과이다. Kullback-Leibler Divergence란 두 확률 분포 사이의 차이를 계산하는 방법이다.
Softmax 함수에 넣어서 만들어진 확률 분포()와 정답 확률 분포() (정답은 1 나머지는 0)를 비교하면,
정답 스코어는 가 1, 오답 스코어는 가 0이다. 따라서 Kullback-Leibler Divergence의 결과는 가 된다.
고양이를 완벽하게 분류했다면 마찬가지로 0이 나와야 하지만, 유한 정밀도에서는 0이 나올 수 없다. (정답이 무한대여야 하기 떄문에)
SVM Loss Function에서 점수들이 0에 가까이 모여있을 경우 (클래스의 개수 - 1) 이 나온 것처럼,
Softmax Classifier의 Loss Function에서는 (클래스의 개수)가 나온다.
Softmax Classifier와 SVM Classifier의 차이
SVM의 경우 Margin을 넘기만 하면 얼마나 넘던 값이 같음.
Softmax의 경우 Class에 속할 확률이 1이 되기 위해 계속해서 성능 개선을 할 수 있음.
Optimization
Loss가 작아지는 를 구하는 과정을 Optimization이라고 한다.
Random Search
를 대충 아무거나 놓고 해보기
개구림
Gradient Descent
Loss는 에 따라 변한다. 따라서 를 조금씩 변화시켜보면서 Loss가 점점 작아지는 방향으로 를 업데이트하는 방법을 Gradient Descent (경사 하강법) 이라고 한다.
를 임의의 값으로 초기화 하고, Loss와 Gradient를 계산한 후에 Weight를 Gradient의 반대 방향으로 업데이트 한다.
while True:
weight_grad = evaluate_gradient(loss_function, data, weights)
weights += - step_size * weights_grad
Python
복사
step_size는 Hyperparameter의 일종으로, Learning Rate라고도 한다.
Stochastic Gradient Descent
Dataset의 크기가 커지면 Dataset 전체를 이용해서 Loss를 계산하는 것은 매우 시간이 오래 걸린다.
따라서 전체 Dataset을 이용하는 것 보다 Minibatch라는 작은 Training sample로 나눠서 Loss의 추정치와 Gradient의 추정치를 계산해서 사용한다.
while True:
data_batch = sample_traing_data(data, 256)
weights_grad = evaluate_gradient(loss_funfction, data_batch, weights)
weights += - step_size * weights_grad
Python
복사
Image Feature
이미지를 쌩으로 집어 넣는 것 보다 이미지의 여러 특징들을 계산해서 특징 벡터로 만들고 집어넣는게 성능이 더 좋을 수 있다.
이미지의 색조만 넣는 Color Histogram이나, 이미지의 Edge 정보를 넣는 Histogram of Oriented Gradients (HOG)나, Bag of Words 등이 있음