본문 바로가기

수업 내용 정리/CS231n

Lecture 3 | Loss Functions and Optimization

Summary

2강에서 linear classification에 대해 배웠었다. linear classification은 Weights를 통해 예측을 하는 것이다. 이번 강의에서는 Weights를 평가하고 어떻게 좋은 weights를 구할지에 대해 다룬다. 

Multiclass Support Vector Machine Loss

loss funciton은 w(앞으로 weights를 w로 표기)가 얼마나 구린지 수치화하는 함수이다. 따라서 loss를 줄이는 것이 궁극적인 목표이다. 그럼 loss를 구해보자!

사진 밑의 숫자는 w를 이용해 구한 예측값이다. 자동차를 제외한 나머지는 부정확하게 예측된 것을 알 수 있다. 최종 Loss는 고양이, 자동차, 개구리의 Loss의 평균이다.(종류별 로스의 평균)

종류별 Loss를 구하는 공식은 다음과 같다.

S_ j: 정답이 아닌 것의 score
S_yi: 정답 score
1: safety-margin
수식을 해석해보자면 정답 score가 1보다 크다면 loss는 0이고 이외의 상황에서는 loss가 측정되고 loss를 합산하라는 것이다. 
(예. 고양이의 loss를 계산해보자 max(0, 5.1 - 3.2 +1) + max(0, -1.7 - 3.2 +1) = 2.9 + 0 = 2.9)

Multiclass SVM Loss: Example code

def L_i_vectorized(x, y, W):
    scores = W.dot(x)
    margins = np.maximum(0, scores - scores[y] + 1)
    margins[y] = 0
    loss_i = np.sum(margins)
    return loss_i

Regularization

사실 정확하게 이해하지 못했다. 하지만 사용할 때 구체적인 이해는 그렇게 필요하지 않다. 추상적으로만 알고 있었도 충분히 사용가능한 경우가 많다. 우선 이해한 바에 대해 적어보도록 하겠다.

Regularization의 목적이 무엇인가?
우리는 학습데이터에 대한 예측 정확도를 올리기 위해 loss를 측정한 것이 아니다. 본 적 없는 데이터 셋(예를 들어 test data)에 대해 정확도를 높이는 것이 목표이다. 하지만 학습데이터의 loss를 줄이데만 몰두한다면 overfitting이 발생한다. 이를 막기 위해 Loss 계산식에 Regularization 항을 넣어 overfitting 될 수록 Loss가 증가 되도록 하는 것이 목표이다. 

  • L1 Regularization
    • 특징 : 가중치  W에 0의 갯수에 따라 모델의 복잡도를 다룸
    • 0의 갯수가 많으면 덜 복잡 적으면 복잡
  • L2 Regularization
    • 특징 : 가중치 W가 치중되어있는 지에 따라 모델의 복잡도를 다룸
    • W가 퍼져있을 경우 덜 복잡 몰려 있을 경우 복잡

Softmax Classifier

도출된 score에 지수를 취해 모두 양의 값으로 만든 후 정답 score를 전체score를 합한 값으로 나누어 확률을 구하는 것.

손실함수는 다음과 같다.

확률은 0~1의 범위이고 정답 class의 확률이 높을 수록 Loss는 0에 수렴하고 낮을 수록 양의 무한대로 발산한다.

Softmax 의 손실함수와 SVM의 손실함수를 비교해보자!
svm에서는 정답 스코아와 정답이 아닌 스코어간의 마진을 신경썼고 softmax에서는 정답클래스를 신경썼다. 이로인해 svm은 정답 스코어가 마진을 넘어가면 loss는 0으로 변함이 없지만 softmax는 정답클래스의 확률이 증가할수록 loss도 감소해 지속적으로 확률을 증가시키려고 한다는 점이다. 

Optimization

그럼 Loss를 계산하는 방법을 알았으니 이것을 이용하여 최적의 W를 구해야 겠다. 가장 단순하게 생각해볼 수 있는 건 random search이다. 임의의 W의 loss를 구하고 반복하며 loss가 가장 낮을 때를 W를 구하는 것이다. 당연히 이렇게 안한다. ㅋ

w를 입력값으로 받고 loss를 리턴하는 함수인 L(w)의 기울기를 구하여 최적의 w를 구한다. gradient는 벡터 x의 각 요소의 편도함수들의 집합이다. 그래서 gradient의 모양은 x의 모양과 같다. 

이를 통해 w가 어떻게 증가하고 감소해야 하는지 알 수 있다. 하지만 이렇게 하면 데이터 셋의 Loss를 여러번 계산해야 하는데 이건 컴퓨터도 귀찮아 하는 일이다. 그래서 stochastic gradient descent라는 방법을 이용한다. 

Stochastic Gradient Descent (SGD)

gradient descent

while True:
    weights_grad = evaluate_gradient(loss_fun, data, weights)
    weights += - step_size * weights_grad

경사에 따라 loss가 줄어드는 방향으로 weights를 수정하는 것을 볼 수 있다. 

Stochastic Gradient Descent

while True:
    data_batch = sample_training_data(data, 256) # sampel 256 examples
    weights_grad = evaluate_gradient(loss_fun, data_batch, weights)
    weights += - step_size * weights_grad # perform parameter update

data 전체를 이용하는 것이 아닌 mini batch만큼의 데이터를 이용해서 loss와 gradient를 구하는 것이 특징이다. 이렇게 하면 연산량을 줄일 수 있다. 

Image Features

지금까지 Linear classifier는 실제 raw 이미지 픽셀을 입력으로 받았다. 하지만 이것은 별로다. 그래서 다른 접근법에 대해 알아보겠다. 

Color Histogram

이미지에서 hue 값만 뽑아서 모든 픽셀을 각 양동이에 넣는 것이다. 이렇게 하면 전체 이미지가 전체적으로 어떤 색인지 알 수 있다. 그림에서는 초록색 계열이 많은 것을 알 수 있다.

Histogram of Oriented Gradients (HOG)

이미지에서 edge를 추출하여 feature로 쓰는 방법이다.

Bag of Words

visual words를 이용하여 어떤 visual words의 갯수를 세는 방법이다. 이를 이용하면 visual words를 통해 색 특성도 알 수 있고 oriented edge도 알 수 있다.