3.0 들어가기에 앞서

지난 장에서 다룬 내용을 복기해봅시다.

  1. 인식에 있어 어려움(Challenges of recognition)
    • 관점의 변화(Viewpoint)
    • 크기의 변화(Scale Variation)
    • 조명(Illumination)
    • 변형(Deformation)
    • 가려짐(Occlusion)
    • 배경의 어수선함(Clutter)
    • 클래스 내의 변화(Intraclass Variation)
  2. 데이터 중심의 접근(data-driven approach), kNN
    • CIFAR-10
    • 1-NN classifier vs. 5-NN classifier
    • train-test vs. train-val-test

3.1 선형 분류(Linear Classification)

2장에서는 이미지 분류의 문제, 즉, 정해진 카테고리 집합 중 하나의 라벨을 골라 이미지에 붙이는 문제에 대해 다루어보았습니다. 또한 k-Nearest Neighbor Classifier에 대해서도 알아보았습니다. 이는 이미지와 훈렷셋의 라벨이 붙은(annotated) 다른 이미지를 비교함으로써 라벨을 붙이는 작업입니다. 하지만 앞서 보았다시피 kNN은 몇가지 단점을 가지고 있습니다:

  • Classifier는 모든 트레이닝 데이터를 테스트 데이터와 비교해야하기 때문에 이를 전부 저장할 수 있어야 합니다. 하지만 데이터셋은 기가바이트 단위의 공간을 차지하기 때문에 이는 공간적으로 매우 비효율적입니다.
  • 테스트 이미지를 분류하는 작업은 모든 트레이닝 이미지와 비교해야하기 때문에 연산적으로 매우 값비싼 일입니다.

3.1.1 개요(Overview)

이제 보다 더 강력한 이미지분류 방법을 생각할 차례입니다. 그리고 자연스럽게 신경망(Neural Networks)과 합성곱신경망(Covolutional Neural Networks)으로 접근해나갈것 입니다. 이 방법에는 두 가지 핵심 요소가 있습니다: 첫째는, raw data를 class score로 짝지어주는(map) score function과 둘째는, 예측값(predicted scores)과 실제 라벨(ground truth labels)이 얼마나 일치하는지를 정량화하는 손실함수(loss function)입니다. 최종적으로 이를 score function의 파라미터에 대해 loss function을 최소화하는 최적화 문제(optimization problem)으로 치환합니다.

3.2 Parameterized mapping from images to label scores

첫째로, 이미지의 픽셀 값을 각 클래스에 대한 confidence score로 map하는 score function을 정의합니다. 예를 들어봅시다. 트레이닝셋 \( x_i \in R^D \)이 있고, 각각은 라벨 \( y_i \)가 붙어있다고 가정합니다. (\( i = 1 \dots N \), \( y_i \in { 1 \dots K } \)) 즉, N개의 예시(각각은 D차원)와 K개의 서로 다른 카테고리가 있습니다. 가령, CIFAR-10에서는 N = 50000 장의 학습용 이미지가 있으며, 각각은 D = 32 x 32 x 3 = 3072 픽셀, K = 10(개, 고양이, 차 등 10가지의 다른 클래스가 있음) 입니다. 이제 (raw 이미지 픽셀을 class score로 map하는 score function \(f: R^D \mapsto R^K\) 을 정의해볼 것입니다.

3.2.1 선형 분류기(Linear classifier)

가장 간단한 함수로 시작해보겠습니다: linear mapping

\[f(x_i, W, b) = W x_i + b\]

위 식에서는 이미지 \(x_i\)의 모든 픽셀들이 [D x 1] 형태의 single column vector로 flattened out 되었다는 것을 가정합니다. 행렬 W ([K x D] 크기)와 벡터 b ([K x 1] 크기)는 함수의 파라미터(parameters) 입니다. CIFAR-10에서, \(x_i\) 는 i번째 이미지로, [3072 x 1]의 column으로 flattend된 이미지의 모든 픽셀을 포함합니다. W는 [10 x 3072], b는 [10 x 1]의 크기를 가지므로, 3072개의 숫자들(raw 픽셀값)이 함수로 들어오고 10개의 숫자들(class scores)이 함수에서 나옵니다. W의 파라미터는 종종 가중치(weights)라고도 불리며, b편향 벡터(bias vector)라고 불립니다. 이는 output scores에 영향을 미치지만, 실제 데이터인 \(x_i\)와는 아무런 상호작용을 하지 않기 때문입니다. 하지만, weightsparameters는 같은 의미로 사용되기도 합니다.

다음에는 몇가지 유의사항이 있습니다:

  • 첫째, 단일 행렬 곱 \(W x_i\)은 10개의 다른 classifier(각 classifier는 W의 각 행을 의미)를 parallel(각 클래스당 하나씩)하게 계산하기 때문에 효율적입니다.
  • 입력 데이터 \( (x_i, y_i) \)는 주어지며 고정된다고 간주합니다. 그러나 파라미터 W, b를 설정할 수는 있습니다. 결국, 목표는 파라미터들을 잘 조정하여 모든 트레이닝셋에 대해 계산된 값이 ground truth 라벨과 올바르게 짝지어지도록 하는것입니다. 직관적으로 알 수 있다시피 올바른 클래스의 점수가 그렇지 않은 클래스의 점수보다 높은것이 좋습니다.
  • 이 방법의 장점은 트레이닝 데이터가 파라미터 W, b를 학습하기 위해 사용된다는 것입니다. 학습을 완료한 이후에는 전체 트레이닝셋을 저장하지 않고 버려도 되며, 학습된 파라미터만을 간직하면 됩니다. 왜냐하면 새로운 테스트 이미지는 단순히 함수에 들어올 뿐이고 미리 계산된 점수에 의해 분류되기 때문입니다.
  • 마지막으로, 테스트 이미지를 분류하는 것은 단일 행렬곱과 합을 포함합니다. 이는 테스트 이미지를 모든 트레이닝 이미지와 일일이 비교하는것보다 훨씬 빠릅니다.

Convolutional Neural Networks에서는 위와 같이 이미지 픽셀을 정확히 점수로 mapping합니다. 하지만, mapping(f)는 더 복잡하고 많은 파라미터를 포함할 것입니다.

3.3 선형 분류기의 이해(Interpreting a linear classifier)

Linear classifier는 3개의 색상 채널에 대해 픽셀값 전부를 weighted sum 함으로써 클래스 점수를 계산합니다. weight에 어떤 값을 설정했느냐 따라, 함수는 이미지의 특정 위치에서 특정 색을 좋아하거나 싫어하는(weight의 부호에 따라) 정도(capacity)가 달라집니다. 가령, 이미지의 측면에 파란색이 많이 있으면 “배” 클래스일 가능성이 높다고 생각할 수 있을 겁니다. 그렇다면 “배” classifier는 파란색 채널(파란색이 존재한다면 배의 점수가 높아짐)에 대해서는 양(+)의 weight를 가질 것이고, 적색/녹색 채널(적색/녹색이 존재한다면 배의 점수가 낮아짐)에서 음(-)의 weight를 가질것이라고 예상할 수 있습니다.

imagemap

이미지를 class score로 mappping하는 예. 시각화의 편의를 위해, 우리는 이미지가 4 픽셀(monochrome pixel) (간결함을 위해 색상 채널은 고려하지 않습니다)과 3개의 클래스 (빨간색 = 고양이, 녹색 = 개, 파란색 = 배)를 가지고 있다고 가정합니다. (여기서 색상은 단순히 3개 클래스를 나타내며 RGB 채널과는 관련이 없습니다) 이미지의 픽셀들을 열로 확장한 후 행렬 곱을 수행하여 각 클래스에 대한 점수를 얻습니다. 여기에 나온 W 은 좋은 예시가 아닙니다: weight는 고양이 이미지에 매우 낮은 점수를 부여하며, 특히 개를 보고 있다고 확신하는 것 같습니다.

3.3.1 고차원 점으로서의 이미지 분석(Analogy of images as high-dimensional points)

이미지는 고차원의 열 벡터로 확장될 수 있기 때문에, 각 이미지를 이 공간의 하나의 점으로 해석할 수 있습니다. (가령, CIFAR-10의 각 이미지는 32x32x3 픽셀의 3072차원 공간의 점입니다). 이와 유사하게 전체 데이터 집합은 점의 집합이 됩니다.

각 클래스의 점수를 모든 이미지 픽셀의 weighted sum으로 정의했기 때문에, 각 클래스 점수는 이 공간에 대한 선형 함수가 됩니다. 3072차원 공간을 시각화할 수는 없지만, 만약 이 모든 차원을 단 2차원으로 쪼개는 것을 상상한다면, classifier가 무엇을 하고 있는지 시각화하는 시도를 할 순 있습니다:

pixelspace

이미지 공간을 그림으로 표현한 것으로, 각각의 이미지가 하나의 점으로 되어 있고, 세 개의 classifier가 시각화 되어 있습니다. 빨간색 선은 자동차 classifier(빨간색)의 예를 이용해 차 클래스에서 0점을 받는 공간의 모든 점을 보여줍니다. 빨간색 화살표는 증가 방향을 표시하기 때문에 빨간선 오른쪽의 모든 점은 양(그리고 선형적으로 증가)의 점수를 가지며, 왼쪽의 모든 점은 음(그리고 선형적으로 감소)의 점수를 가집니다.

위에서 보았듯이, \(W\)의 모든 행은 한 클래스의 classifier입니다. 이 숫자에 대한 기하학적 해석은, \(W\) 행 중 하나를 변경하면 픽셀 공간의 해당 선이 다른 방향으로 회전한다는 것입다. 한편, bias \(b\)는 classifier가 그 선을 평행이동(translate)할 수 있게 해줍니다. 특히 bias 항이 없으면, \(x_i = 0 \)를 집어넣었을 때 weight에 관계없이 항상 0점이 되므로 모든 선은 원점을 넘어야 할 것입니다.

3.3.2 템플릿 매칭으로서의 선형 분류기 해석(Interpretation of linear classifiers as template matching)

weight \(W\)에 대한 또 다른 해석은 \(W\)의 각 행이 클래스 중 하나에 대한 template(또는 prototype)이라는 것입니다. 내적(inner product)(또는 dot product)을 사용하여 각 템플릿을 이미지와 하나씩 비교하며 “가장 맞는(fits best)” 것을 찾아내는 방식으로 이미지에 대한 각 클래스의 점수를 매깁니다. 이 용어대로, linear classifier는 템플릿 매칭(template matching)을 하고, 템플릿을 학습합니다. 결국 이는 Nearest Neighbor이긴 하지만, 수천 개의 트레이닝 이미지를 가지고 있는 대신 클래스 당 하나의 이미지만을 사용하며(비록 그 이미지를 학습하긴 하지만, 그것이 트레이닝셋의 이미지 중 하나일 필요는 없습니다), L1 또는 L2 distance 대신 (음의) 내적을 사용하는 효과적인 방법 이라는것 입니다.

templates CIFAR-10 학습이 끝난 후 학습된 weight를 보겠습니다. 가령, 예상대로 배 템플릿에는 파란색 픽셀이 많이 포함되어 있습니다. 따라서 이 템플릿은 일단 바다 위에 떠 있는 배들의 이미지와 내적으로 매치되면 높은 점수를 줄 것입니다.

또한, 말 템플릿에는 두 개의 말 머리가 들어 있는 것 처럼 보이는데, 이는 데이터셋에서 왼쪽과 오른쪽을 보고 있는 말 때문입니다. linear classifier는 데이터의 두 가지 모드의 말을 합쳐서(merges) 하나의 템플릿으로 만듭니다. 마찬가지로, 자동차 classifier도 여러 가지 모드를 모든 방향과 모든 색깔를 식별해야 하는 단일 템플릿으로 합한 것으로 보입니다. 특히 이 템플릿에서는 CIFAR-10 데이터셋에 빨간색 자동차가 유독 많다는 것을 알 수 있습니다. 단일 linear classifier는 다른 색깔의 자동차들도 적절히 고려하기에는 무리가 있지만, 신경망이 이 작업을 수행할 수 있게 해줄 것입니다. 신경망은 hidden layer에 중간 뉴런(intermediate neurons)을 두어 특정 차종(가령, 왼쪽을 향한 녹색 자동차, 앞쪽을 향한 파란색 자동차 등)을 감지할 수 있게 하며, 그 다음 층의 뉴런은 개별 자동차 검출기(detector)에 대한 weighted sum을 통해 보다 정교한 자동차 점수를 얻을 수 있을 것입니다.

3.3.3 가중치 트릭(Bias trick)

다음 단계로 넘어가기 전에, \(W,b\)라는 두 가지 파라미터를 하나로 표현할 수 있는 일반적이고 단순한 트릭을 언급하겠습니다. 우선 score function을 다음과 같이 정의하였음을 상기합니다:

\[f(x_i, W, b) = W x_i + b\]

자료를 검토할 때 두 개의 파라미터 셋(bias \(b\)와 weight \(W\))을 별도로 추적하는 것은 다소 번거로운 일이 아닐 수 없습니다. 이 때, 일반적으로 사용되는 트릭은 벡터 \(x_i\)에 항상 \(1\) - 기본 bias 차원 - 의 상수를 가지는 하나의 추가 차원을 확장하여, 두 파라미터 셋을 하나의 행렬로 결합하는 것입니다. 추가 차원에서는, 새로운 score function이 단일 행렬 곱으로 단순화됩니다:

\[f(x_i, W) = W x_i\]

CIFAR-10에서 \(x_i\)는 이제 [3072 x 1] 대신 [3073 x 1]이 되고 - (상수 1을 가지는 추가 차원이 확장됨), \(W\)는 [10 x 3072] 대신 [10 x 3073]이 됩니다. \(W\)의 추가 열은 이제 bias \(b\)에 대응됩니다. 아래의 그림을 보면 조금 더 명확해질 것입니다:

wb bias trick. 행렬 곱을 한 다음 bias 벡터(왼쪽)를 합하는 것은 모든 입력 벡터에 상수 1의 bias 차원을 추가하고 weight 행렬의 1열을 - bias 열(오른쪽) - 확장하는 것과 같습니다. 따라서, 만약 모든 벡터에 대해 1을 확장하는 데이터 전처리(preprocess)를 한다면, weight와 bias를 가지는 각각의 두 행렬 대신 하나의 weight 행렬만 학습시키면 됩니다.

3.3.4 이미지 데이터 전처리(Image data preprocessing)

위에서 [0 … 255]의 범위를 가지는 raw pixel 값을 사용했습니다. 머신러닝(Machine Learning)에서는, input feature에 대한 정규화(normalization)를 실시하는 것이 일반적인 관행입니다(이미지의 경우, 모든 픽셀을 feature로 생각합니다). 특히, 모든 feature의 평균(mean)을 뺌(subtract)으로써 데이터의 중심을 맞추는 것(center your data)이 중요합니다. 이미지의 경우에는, 트레이닝 이미지에 대하여 평균 이미지(mean image)를 계산하고 모든 이미지로부터 이를 뺌으로써 대략 [-127 … 127] 범위에 픽셀이 분포하는 이미지를 얻는 것입니다. 추가적으로, 일반적인 전처리는 각 input feature의 값이 [-1, 1]부터의 범위를 가지도록 조정하는 것을 말합니다. 이 중 zero mean centering은 gradient descent에 대하여 이야기할 때 그 중요성을 더 잘 알 수 있을 것입니다.

3.4 손실함수(Loss function)

앞에서는 픽셀 값부터 클래스 점수까지에 대한 함수(weight \(W\))에 의해 파라미터화(parameterized)되는)를 정의했습니다. 게다가, ( 주어지며 고정된)데이터 \((x_i,y_i)\)를 원하는대로 설정할 수는 없지만, weight는 가능합니다. 이 weight를 조정함으로써 예측된 클래스 점수(class score)가 트레이닝셋의 ground truth label과 일치하기를 원합니다.

가령, 고양이 이미지로 돌아가서 “고양이”, “개”, “배”에 대한 클래스 점수를 보면, 그 예에서 특정 weight set이 그다지 좋지 않음을 볼 수 있습니다: 고양이를 묘사하는 화소를 제공했지만 고양이 점수(-96.8)는 다른 클래스(개 437.9, 배 61.95)에 비해 매우 낮았습니다. 이러한 결과가 나오는것에 대한 불행의 정도를 손실 함수(loss function)(또는 비용 함수(cost function) 또는 목표(objective)라고도 함)라는 수치로 표현할 것입니다. 직관적으로 트레이닝 데이터에 대해서 분류가 잘 되지 않으면 loss function은 높고, 분류가 잘 될 경우에는 loss function이 낮음을 알 수 있습니다.

loss function은 현재 classifier가 얼마나 좋은지를 말해줍니다.

3.5 Multiclass Support Vector Machine loss

loss function의 세부사항을 규정하는 방법은 여러 가지가 있습니다. 첫 번째로 먼저 Multiclass Support Vector Machine(SVM) loss라고 불리는 일반적으로 사용되는 loss를 다룹니다. SVM은 SVM loss를 설정함으로써 각 이미지에 대한 올바른 클래스가 잘못된 클래스보다 고정된 margin \(\Delta\)만큼의 더 높은 점수를 가지기를 “원합니다(wants)”. 앞서 했다시피 loss function을 의인화(anthropomorphise)하는 것이 때로는 이해에 도움이 됩니다: SVM은 특정 결과가 더 낮은(좋은) loss를 가져올 수도 있다는 점에서 특정 결과를 “원한다고(wants)”할 수 있습니다.

이제 좀 더 정확하게 살펴봅시다. i번째 예시로 이미지 픽셀 \( x_i \)와 올바른 클래스의 인덱스를 나타내는 라벨 \( y_i \)가 주어졌습니다. score function은 픽셀을 가지고 class score의 벡터 \( f(x_i, W) \)를 계산하는데, 이를 \(s\)(score의 줄임말)로 표현합니다. 가령, j번째 class score은 j번째 원소입니다: \( s_j = f(x_i, W)_j \). 그러면 i번째 예시에 대한 Multiclass SVM loss는 다음과 같이 표현됩니다:

\[L_i = \sum_{j\neq y_i} \max(0, s_j - s_{y_i} + \Delta)\]

3.5.1 예시(Example)

예시를 통해 어떻게 작동하는지 파헤쳐봅시다. \(s = [13, -7, 11]\)의 점수를 가지는 세가지 클래스가 있고, 첫번째 클래스가 true class라고 가정합니다 (\(y_i = 0\)). 또한 \(\Delta\) (하이퍼파라미터)는 10으로 둡니다. 위의 식은 틀린 클래스들을 모두 합합니다(\(j \neq y_i\)). 결과적으로 다음의 두 항을 얻을 수 있습니다.

\[L_i = \max(0, -7 - 13 + 10) + \max(0, 11 - 13 + 10)\]

첫번째 항에서는 [-7 - 13 + 10]가 음수이기 때문에 0이 나올것입니다. 즉, \(max(0,-)\) 함수에 의해 0의 문턱(threshold)을 넘지 못하면 0이 나옵니다. 여기서 올바른 class score(13)이 틀린 class score(-7)에 비해 최소한 (margin의 크기인) 10보다 때문에 0의 loss가 나올것입니다. 사실 차이는 20이기 때문에 10보다 크긴 하지만 SVM에서는 차이가 최소 10이 나는것만을 고려합니다; margin을 넘어서는 추가적인 차이는 max 연산에 의해 0으로 clamp됩니다. 두번째 항은 [11 - 13 + 10]을 계산하여 8이 나옵니다. 즉, 올바른 클래스가 틀린 클래스에 비해 높은 점수(13 > 11)를 받았다고 하더라도, 그 차이가 margin의 크기인 10보다 크지 않습니다. 차이는 고작 2이며, loss는 8입니다. 다시 말해, 차이가 margin보다 크다는 것이 충족되어야 합니다. 요약하자면, SVM loss function은 올바른 클래스에 대한 점수인 \(y_i\)가 틀린 클래스 점수 보다 적어도 \(\Delta\) 만큼 크기를 원합니다. 만약 그렇지 않다면, loss는 축적됩니다:

이 특정 모듈에서는 linear score function ( \( f(x_i; W) = W x_i \) )을 다루었으며, loss function을 다음과 같은 형태로 다시 적을 수도 있습니다:

\[L_i = \sum_{j\neq y_i} \max(0, w_j^T x_i - w_{y_i}^T x_i + \Delta)\]

\(w_j\)는 \(W\)의 j번째 행이며, \(W\)는 column으로 reshaped된 것입니다. 글나 score function \(f\)의 좀 더 복잡한 형태를 고려하기 시작하면 반드시 그렇지는 않을 것입니다.

여기서 등장하는 마지막 용어로, 0에서의 문턱(threshold)을 표현하는 \(max(0,-)\) 함수를 종종 hinge loss라고 부릅니다. 간혹 squared hinge loss SVM (또는 L2-SVM)이라고 하는 것을 들을 수 있는데, 이는 \(max(0,-)^2\)를 사용한 것입니다. 제곱(quadratically)을 사용하기 때문에 violated margin에 대해 더 강력히 penalize할 수 있습니다. 제곱이 없는 버전이 더 일반적이지만, 간혹 어떤 데이터셋에 대해서는 squared hinge loss가 더 잘 동작하는 경우도 있습니다. 이는 cross-validation을 통해 결정될 수 있습니다

loss function은 트레이닝셋에 대한 예측의 불행(unhappiness)을 수치화합니다.

margin Multiclass Support Vector Machine은 올바른 클래스의 점수가 다른 모든 점수보다 적어도 델타만큼의 margin이 높기를 “원합니다(wants)”. 만약 어떤 클래스가 적색 지역(또는 그보다 큰 영역) 내에 점수가 있으면, loss는 누적됩니다. 그렇지 않다면 loss는 0이 됩니다. 결국, 목표는 트레이닝 데이터의 모든 예에 대해 이 제약조건(constraint)을 충족시키는 동시에 가능한 한 낮은 total loss를 갖는 weight를 찾는 것입니다.

Multiclass SVM loss: Hinge loss

Q1. 자동차 점수가 살짝 바뀌면 loss는 어떻게 될까요?

  • loss는 변하지 않을 것입니다. 계속 loss는 0일 것입니다.

Q2. loss의 최소/최대는 무엇일까요?

  • 최소=0 / 최대=무한대

Q3. 초기화에서 W가 매우 작고 모든 s는 거의 0에 가까울 때, loss는 무엇일까요?

  • loss = (클래스 수)-1 이 경우, loss는 항상 (클래스 수)-1의 결과를 보이므로, 다른 숫자가 나온다면 초기화가 잘못된것으로 생각할 수 있습니다. 따라서, 디버깅을 할 때 유용하게 사용할 수 있는 방법입니다.

Q4. 모든 클래스에 대해 합을 하는 것이라면 어떻게 바뀔까요? (j=y_i도 포함)

  • loss는 1 증가할 것입니다.

Q5. 합 대신 평균을 사용한다면 바뀔까요?

  • 변하지 않습니다. 그러므로 크게 중요치 않습니다.

Q6. max의 위쪽에 제곱을 사용한다면 바뀔까요?

  • 네. 이 경우에는 달라질것입니다.

Q7. L = 0이 되는 W를 찾았다고 합시다. 그 W는 유일할까요?

  • 그렇지 않습니다! 2W 또한 L = 0일 것입니다!

3.5.2 Regularization

위에서 제시한 loss function에는 버그가 하나 있습니다. 데이터셋과 모든 예제를 정확하게 분류하는 파라미터 W가 있다고 가정합니다(즉, 모든 점수는 모든 margin을 충족하고 모든 i에 대해 \(L_i = 0)입니다). 문제는 이 W가 반드시 고유하지는 않다는 점입니다: 예제를 올바르게 분류하는 비슷한 W가 많을 수 있습니다. 이것을 쉽게 볼 수 있는 한 가지 방법은 일부 파라미터 W가 모든 예제를 올바르게 분류하면(따라서 예제마다 loss가 0), 여기서 이 파라미터 \(\lambda W \) (\( \lambda > 1 \))의 어떤 배수도 모든 점수의 크기(score magnitude)를 균일하게 확장(uniformly stretch)하고, 절대값의 차(absolute differences)도 동일하게 확장되기 때문에 loss가 0이라는 것입니다. 가령, 올바른 클래스과 가장 가까운 잘못된 클래스 간의 점수 차이가 15인 경우, W의 모든 요소를 2로 곱하면 새로운 차이가 30이 됩니다.

다시 말해, 이 애매함을 제거하기 위해 다른 것들보다 어떤 특정한 weight W에 대한 선호도를 부호화(encode)하고자 합니다. 이는 regularization penalty \(R(W)\)를 loss function에 추가하면 됩니다. 가장 일반적인 regularization penalty는 모든 파라미터에 대한 elementwise quadratic penalty를 통해 큰 weight를 억제하는 방식인 L2 norm입니다.

\[R(W) = \sum_k\sum_l W_{k,l}^2\]

위의 표현에서, \(W\)의 모든 요소 제곱(squared elements)을 합산하고 있습니다. Regularization 함수는 데이터에 대한 함수가 아니라 weight만을 기준으로 합니다. Regularization penalty를 포함하면 완전한 Multiclass Support Vector Machine loss가 됩니다. 이는 두가지 요소로 이루어져 있습니다: data loss(모든 예제에 대한 average loss \(L_i\)와 regularization loss. 즉, 완전한 Multiclass SVM loss는 다음과 같습니다:

Data loss: data loss가 낮으면 모델 예측은 트레이닝 데이터에 잘 맞습니다. 여기선 테스트 데이터에 대한 모델의 성능에는 신경쓰지 않습니다. 하지만 우리가 궁극적으로 원하는 것은 테스트 데이터에 대한 정확도이므로 regularization loss가 필요한 것 입니다.

Regularization loss는 모델을 얼만큼 “단순하게” 만들지 결정하여, 테스트 데이터에 대해서도 잘 동작하도록 합니다.

\[L = \underbrace{ \frac{1}{N} \sum_i L_i }_\text{data loss} + \underbrace{ \lambda R(W) }_\text{regularization loss} \\\\\]

full form으로 확장한다면 다음과 같습니다:

\[L = \frac{1}{N} \sum_i \sum_{j\neq y_i} \left[ \max(0, f(x_i; W)_j - f(x_i; W)_{y_i} + \Delta) \right] + \lambda \sum_k\sum_l W_{k,l}^2\]

\(N\)은 트레이닝 데이터의 개수입니다. regularization penalty를 loss objective에 추가했음을 확인할 수 있습니다. 이는 하이퍼파라미터 \(\lambda\)로 weighted되어 있습니다. 이를 설정하는 간단한 방법은 없으며 주로 cross-validation을 통해 결정됩니다.

위에서 제시한 것들 이외에도, regularization penalty를 포함해야 하는 많은 이유들이 있습니다. 가령, L2 penalty는 SVM에서 효과적인 max margin 특성을 가지는것으로 알려져 있습니다.

그 중 가장 주요한 특성은 large weight를 penalizing하는 것이 generalization을 개선하는 경향이 있다는 것입니다. 이는 어떤 입력 차원도 그 자체로 점수에 큰 영향을 미칠 수 없다는 것을 의미하기 때문입니다. 예를 들어, 입력 벡터 \(x = [1,1,1,1] \)와 두 개의 weight 벡터 \(w_1 = [1,0,0,0]\), \(w_2 = [0.25,0.25,0.25,0.25] \)가 있다고 가정합시다. \(w_1^Tx = w_2^Tx = 1\) 이므로 두 weight 벡터 모두 동일한 내적값(dot product)을 가지지만, \(w_1\)의 L2 penalty는 1.0인 반면 \(w_2\)의 L2 penalty는 0.25에 불과합니다. 따라서, L2 penalty에 따르면 weight 벡터 \(w_2\)가 더 낮은 regularization loss를 달성하므로 선호됩니다. 직관적으로 이것은 \(w_2\)의 weight가 더 작고 분산(diffuse)되어 있기 때문입니다. L2 penalty는 더 작고 더 분산되어 있는 weight 벡터를 선호하기 때문에, 최종 classifier는 몇 개의 입력 차원을 강하게 보기 보다 작더라도 모든 입력 차원을 고르게 보도록 권장됩니다. 이 효과는 테스트 이미지에 대한 classifier의 generalization을 개선하여 과적합(overfitting)을 줄일 수 있습니다.

bias는 weihgt와는 달리 입력 차원이 미치는 영향의 정도를 조절할 수 없기 때문에 동일한 효과를 가지지 않습니다. 따라서 \(W\)만 regularize하고 bias \(b\)는 하지 않는 것이 일반적입니다. 실전에서 이는 무시할 수 있을 만한 정도의 차이를 보이는 것으로 알려져 있습니다. 마지막으로, regularization penalty 때문에 어떤 예제에서도 정확히 0.0의 loss를 얻을 수 없습니다. 왜냐하면 이는 \(W = 0\)의 병적인(pathological) 설정에서만 가능하기 때문입니다.

Regularization에는 다음과 같은 것들이 있습니다.

  • L2 regularization(Weight Decay)
  • L1 regularization : sparse solutions
  • Elastic net(L1 + L2)
  • Max norm regularization
  • Dropout
  • Fancier: Batch normalization, stochastic depth

3.5.3 코드(Code)

다음은 (regularization을 제외한) loss function을 unvectorized와 half-vectorized의 두 가지 형태로 파이썬으로 구현한 것입니다:

def L_i(x, y, W):
  """
  unvectorized version. Compute the multiclass svm loss for a single example (x,y)
  - x is a column vector representing an image (e.g. 3073 x 1 in CIFAR-10)
    with an appended bias dimension in the 3073-rd position (i.e. bias trick)
  - y is an integer giving index of correct class (e.g. between 0 and 9 in CIFAR-10)
  - W is the weight matrix (e.g. 10 x 3073 in CIFAR-10)
  """
  delta = 1.0 # see notes about delta later in this section
  scores = W.dot(x) # scores becomes of size 10 x 1, the scores for each class
  correct_class_score = scores[y]
  D = W.shape[0] # number of classes, e.g. 10
  loss_i = 0.0
  for j in xrange(D): # iterate over all wrong classes
    if j == y:
      # skip for the true class to only loop over incorrect classes
      continue
    # accumulate loss for the i-th example
    loss_i += max(0, scores[j] - correct_class_score + delta)
  return loss_i

def L_i_vectorized(x, y, W):
  """
  A faster half-vectorized implementation. half-vectorized
  refers to the fact that for a single example the implementation contains
  no for loops, but there is still one loop over the examples (outside this function)
  """
  delta = 1.0
  scores = W.dot(x)
  # compute the margins for all classes in one vector operation
  margins = np.maximum(0, scores - scores[y] + delta)
  # on y-th position scores[y] - scores[y] canceled and gave delta. We want
  # to ignore the y-th position and only consider margin on max wrong class
  margins[y] = 0
  loss_i = np.sum(margins)
  return loss_i

def L(X, y, W):
  """
  fully-vectorized implementation :
  - X holds all the training examples as columns (e.g. 3073 x 50,000 in CIFAR-10)
  - y is array of integers specifying correct class (e.g. 50,000-D array)
  - W are weights (e.g. 10 x 3073)
  """
  # evaluate loss over all examples in X without using any for loops
  # left as exercise to reader in the assignment

위의 내용이 시사하는 바는 트레이닝 데이터에 대한 예측이 ground truth label과 얼마나 일치하는지 측정하기 위해 SVM loss가 특정 접근방식을 취한다는 것입니다. 또한 트레이닝셋에 대한 좋은 예측을 하는 것은 loss을 최소화하는 것과 같습니다.

이제 loss을 최소화하는 weight를 찾는 방법만 생각해내면 됩니다.

3.6 현실적 고려(Practical Considerations)

3.6.1 Delta 설정(Setting Delta)

앞서 하이퍼파라미터 \(\Delta\)와 그 설정에 대해서는 자세히 다루지 않고 넘어갔었습니다. 어떤 값으로 설정되어야 하고, 교차 검증(cross-validate)을 해야하는지에 대한 것들 말이죠. 이 하이퍼파라미터는 모든 경우에 \(\Delta = 1.0\)로 안정적으로 설정될 수 있는 것으로 알려졌습니다. \(\Delta\)와 \(\lambda\)는 서로 다른 두 하이퍼파라미터처럼 보이지만, 사실 둘 다 동일한 tradeoff를 제어합니다: data loss와 objective의 regularization loss 간의 tradeoff. 이를 이해하는 핵심은 wegiht \(W\)의 크기가 점수에 직접적으로 영향을 미친다는 것입니다: 가령, \(W\) 내의 모든 값을 축소(shrink)하면 점수 차이는 더 낮아지고, weight를 확대(scale up)하면 점수 차이는 모두 더 커집니다. 따라서 점수들 간의 정확한 margin의 값(가령, \(\Delta = 1\)), 또는 \(\Delta = 100\)은 weight가 임의로 차이를 축소하거나 늘릴 수 있기 때문에 어떤 면에서는 의미가 없습니다. 따라서, 유일한 실질적 tradeoff는 얼마만큼 weight가 증가할 수 있게 하느냐라는 것입니다(정규화 강도 \(\lambda\)를 통해).

3.6.2 Binary SVM과의 관계(Relation to Binary Support Vector Machine)

Binary Support Vector Machine의 i번째 예제에 대한 loss는 다음과 같이 쓸 수 있습니다:

\[L_i = C \max(0, 1 - y_i w^Tx_i) + R(W)\]

\(C\)는 하이퍼파라미터이고, \(y_i \in \{ -1,1 \} \)입니다. 여기서 제시한 공식은 두 개의 클래스만 있는 특별한 경우에의 binary SVM을 사용합니다. 즉, 두 개의 클래스만 있는 경우, loss는 위에 표시된 binary SVM로 단순화됩니다. 또한 이 공식에서 \(C\)와 \(\lambda\)는 동일한 tradeoff를 제어하며, 역수(reciprocal relation) \(C \propto \frac{1}{\lambda}\)의 관계를 가집니다.

3.6.3 Aside: Optimization in primal

SVM에 대한 사전지식으로 kernel, dual, SMO algorithm 등을 들어본적이 있으신가요? 여기서는(일반적인 Neural Networks의 경우처럼) 항상 unconstrained primal한 형태의 optimization objective를 가지고 작업합니다. 이러한 objective는 보통 미분 불가능한(not differentiable) 형태를 가집니다(max(x,y) 함수의 경우는 x=y일 때, kink가 생기기 때문에 미분가능 합니다), 그러나 실전에서 이는 문제가 되지 않고, subgradient를 사용하는 것이 일반적입니다.

3.6.4 다른 Multiclass SVM 공식들(Aside: Other Multiclass SVM formulations)ㅇ

앞서 제시한 Multiclass SVM은 SVM을 multiple class에 대해 공식화하는 여러 방법 중 하나입니다. 일반적으로 사용되는 또 다른 형태는 One-Vs-All (OVA) SVM으로, 각 클래스 vs. 다른 모든 클래스에 대해 독립적인 binary SVM을 학습합니다. 관련은 있지만 실전에서 덜 사용되는 AVA(All-vs-All) 전략도 있습니다. 공식은 Weston and Watkins 1999 (pdf) 버전을 따르는데, 이는 OVA보다 더 강력한 버전입니다(multiclass 데이터셋을 구축할 때, 이 버전은 zero data loss를 가질 수 있지만 OVA는 불가능합니다). 마지막으로 Structure SVM이 있습니다. 이는 올바른 클래스 점수와 틀린 클래스 중에서 가장 높은 점수를 받은 2등(runner-up)의 점수 간의 차이(margin)을 최대화합니다.

참고: Rikin et al. 2004, In Defense of One-Vs-All Classification (pdf)

3.7 소프트맥스 분류기(Softmax classifier)

SVM과 함께 소프트맥스 분류기(Softmax classifier)은 가장 일반적으로 볼 수 있는 분류기 중 하나입니다. 이는 SVM과는 다른 loss function을 가집며, Binary Logistic Regression classfier의 multiple class에의 일반화된 형태로 볼 수 있습니다. SVM은 출력 \(f(x_i,W)\)을 (교정되지 않고(uncalibrated) 해석하기 어려운) 각각의 클래스에 대한 점수로 여기는 반면, Softmax classifier는 조금 더 직관적인 출력(클래스에 대한 확률을 정규화하여 보여줌)과 확률론적인 해석을 보여줍니다. Softmax classifier에서 function mapping \(f(x_i; W) = W x_i\)은 그대로지만, 이 점수들을 각각의 클래스에 대한 정규화되지 않은 로그 확률(unnormalized log probabilities)로 해석해야하고 hinge losscross-entropy loss로 대체해야 합니다. 정리하면 아래와 같습니다:

\[L_i = -\log\left(\frac{e^{f_{y_i}}}{ \sum_j e^{f_j} }\right) \hspace{0.5in} \text{or equivalently} \hspace{0.5in} L_i = -f_{y_i} + \log\sum_j e^{f_j}\]

여기서 \(f_j\)는 클래스 점수 벡터 \(f\)의 j-번째 요소를 의미합니다. 이전과 동일하게, 데이터셋 전체 loss는 regularization term \(R(W)\과 함께 모든 트레이닝 데이터에 대한 \(L_i\)의 평균으로 구합니다. 함수 \(f_j(z) = \frac{e^{z_j}}{\sum_k e^{z_k} \) 를 softmax function이라 부릅니다: 임의의 실수를 가지는 점수 벡터 (\(z\)에서)를 가지고 0과 1 사이의 벡터로 축소(squash)시키고, 총합이 1이 되게 만듭니다. softmax function을 포함하는 완전한 cross-entropy loss를 처음 보면 무섭게 보일 수도 있지만 동기부여는 상대적으로 쉬울것 입니다.

Softmax Classfier : Cross-Entropy Loss (Multinomial Logistic Regression)

점수는 unnormalized log probabilities of the classes이며, 올바른 클래스의 log likelihood(1)를 최대화하거나 (loss function의 관점에서) negative log likelihood(0)를 최소화하는 것이 목적입니다.

Q1. L_i에서 loss의 최소/최대는 무엇인가요?

  • 최소=0 / 최대=무한대

Q2. 초기화에서 W가 매우 작고 모든 s는 거의 0에 가까울 때, loss는 무엇일까요?

  • log(C) loss는 항상 log(C)의 결과를 보이므로, 다른 숫자가 나온다면 초기화가 잘못된것으로 생각할 수 있습니다. 따라서, 디버깅을 할 때 유용하게 사용할 수 있는 방법입니다.

3.7.1 정보이론의 관점(Information theory view)

“진짜(true)” 분포(distribution) \(p\)와 예상된 분포 \(q\)사이의 cross-entropy는 다음과 같이 정의됩니다:

\[H(p,q) = - \sum_x p(x) \log q(x)\]

Softmax classifier는 예상된 클래스 확률( \(q = e^{f_i} / \sum_j e^{f_j} \))과 “진짜(true)” 분포 사이의 cross-entropy를 최소화합니다. 여기서 “진짜” 분포라는 것은 모든 확률 질량(probability mass)이 올바른 클래스에 있는 분포하는 것을 말합니다(가령, \(p = [0, \ldots 1, \ldots, 0]\)에서 \(y_i\) 번째에 1 하나만을 가집니다). cross-entropy는 entropy의 면에서 쓰일 수 있고, 쿨백-라이블러 발산(Kullback-Leibler divergence)도 \(H(p,q) = H(p) + D_{KL}(p||q)\)로 쓰일 수 있으며, 델타 함수의 entropy \(p\)가 0이므로, 이 역시 두 분포 사이의 KL divergence(거리)를 최소화하는 것과 동일합니다. 즉, cross-entropy objecive는 예상된 분포의 모든 질량(mass)이 올바른 답에 속하기를 원한다는(wants) 것입니다.

3.7.2 확률론적 해석(Probabilistic interpretation)

\[P(y_i \mid x_i; W) = \frac{e^{f_{y_i}}}{\sum_j e^{f_j} }\]

위의 식은 올바른 라벨 \(y_i\)에 대한 (정규화된) 확률로 해석될 수 있습니다(주어진 이미지 \(x_i\)와 \(W\)에 의해 파라미터화(parameterized)된). softmax classifier는 출력 벡터 \(f\) 내의 점수를 unnormalized log probabilities로 해석한다는 점을 기억합니다. 그러므로 이 quantities를 exponentiating하면 (unnormalized) 확률을 얻을 수 있고, division은 정규화를 통해 확률의 총합이 1이 되게 만들어 줍니다. 이를 확률론적인 관점에서 보면, 올바른 클래스에 대한 negative log likelihood를 최소화 하는것으로 이해할 수 있습니다. 이는 다시 말해, Maximum Likelihood Estimation (MLE)를 수행하는것으로 해석됩니다. 이러한 관점의 훌륭한 점은 full loss function의 regularization term \(R(W)\) 또한 weight 행렬 \(W\)가 아닌 Gaussian prior에서 유래한 것으로 해석할 수 있다는 것입니다. 여기서는 MLE 대신에 Maximum a posteriori (MAP) estimation를 수행합니다.

3.7.3 실질적인 문제: 수적 안정성(Practical issues: Numeric stability)

Softmax function을 계산하기 위한 코드를 실제로 작성할 때, \(e^{f_{y_i}}\)와 \(\sum_j e^{f_j}\) 의 경우 지수(exponentials)로 인해 그 값이 매우 클 수 있습니다. 이렇게 큰 숫자를 나누게 되면 수적으로 불안정(numerically unstable)해질 수 있으므로, 정규화 트릭(normalization trick)을 사용하는 것이 중요합니다. 분수의 상단과 하단을 상수 \(C\)로 곱하고 이를 지수의 합으로 밀어 넣습니다. 이는 수학적으로도 등식이며 다음과 같이 표현됩니다:

\[\frac{e^{f_{y_i}}}{\sum_j e^{f_j}} = \frac{Ce^{f_{y_i}}}{C\sum_j e^{f_j}} = \frac{e^{f_{y_i} + \log C}}{\sum_j e^{f_j + \log C}}\]

\(C\)의 값은 아무거나 선택해도 됩니다. 무엇을 선택하건 결과를 바꾸지 않고, 연산에 있어 수적 안정성(numerical stability)을 가져옵니다. 일반적으로 \(C\)를 \(\log C = -\max_j f_j \)로 설정합니다. 이는 단순히 벡터 \(f\)의 내부의 값을 shift하여 최댓값이 0이 되도록 하기 위함입니다. 코드로 표현하면 다음과 같습니다:

f = np.array([123, 456, 789]) # example with 3 classes and each having large scores
p = np.exp(f) / np.sum(np.exp(f)) # Bad: Numeric problem, potential blowup

# instead: first shift the values of f so that the highest number is 0:
f -= np.max(f) # f becomes [-666, -333, 0]
p = np.exp(f) / np.sum(np.exp(f)) # safe to do, gives the correct answer

3.7.4 헷갈릴 수 있는 명명 규칙(Possibly confusing naming conventions)

정확히 말하면, SVM classifierhinge loss (또는 max-margin loss라고도 불리는)를 사용하고, Softmax classifiercross-entropy loss를 사용합니다. Softmax classifier는 원래의 클래스 점수를 양의 (정규화된) 값으로 축소하며(sqaush) 총합을 1로 만드는 softmax function에서 이름을 따왔습니다. 이 softmax function으로 인해 cross-entropy loss를 softmax classifier에 적용할 수 있습니다. 한편, softmax는 그저 squashing function이기 때문에, “softmax loss”라고 하는것은 기술적으로 이치에 맞지 않습니다. 그러나 이는 비교적 일반적으로 사용되는 약칭입니다.

3.8 SVM vs. Softmax

아래의 그림은 Softmax와 SVM classifier의 차이점을 명확히 하는데 도움을 줄 것입니다:

svmvssoftmax

하나의 데이터에 대한 SVM과 Softmax classifier의 예시를 보여줍니다. 두 경우 모두 같은 score vector f를 계산합니다. 이 둘의 차이는 f의 score에 대한 해석에 있습니다: SVM의 경우, 이를 class score로 해석하며 loss function은 올바른 클래스(클래스2, 파랑색)가 다른 class score에 비해 margin만큼의 더 높은 점수를 가지도록 encourage합니다. 반면, Softmax classifier는 score를 각 클래스에 대한 (unnormalized) log probabilities로 보고 올바른 클래스의 (normalized) log probability가 높기를 encourage합니다(negative는 낮기를). 이 예시의 최종 loss는 SVM은 1.58이고 Softmax classifier은 1.04(밑을 2나 10이 아닌, 자연로그를 사용함)가 나왔습니다. 이 숫자들은 비교할 수 있는 것이 아님에 유의합니다; 같은 classifier와 같은 데이터 내에서 계산된 loss를 비교할 때에만 의미가 있습니다.

3.8.1 Softmax classifier는 각 클래스에 대한 “확률”을 제공합니다(Softmax classifier provides “probabilities” for each class)

모든 클래스에 대해 교정되지 않고(uncalibrated) 해석하기 쉽지 않은 score를 계산하는 SVM과는 달리, Softmax classifier는 모든 라벨에 대한 “확률”을 계산할 수 있게 해줍니다. 가령, 이미지가 주어졌을 때 SVM classifier는 “고양이”, “개”, “배” 클래스에 대해 [12.5, 0.6, -23.0]의 점수를 줄 것입니다. 반면, Softmax classifier는 세 개의 라벨에 대한 확률을 [0.9, 0.09, 0.01]과 같이 계산해줍니다. 이는 각 클래스에 대한 신뢰도(confidence)를 가늠하게 해줍니다. 그러나 “확률”이라는 단어를 사용한 이유는, 이러한 확률을 얼마나 높이고(peaky) 분산(diffuse)시키는가는 regularization strength \(\lambda\)에 직접적으로 의존하기 때문입니다. 이는 시스템의 입력으로서 조정해주어야 하는 하이퍼파라미터입니다. 예를 들어, 어떠한 세 클래스의 unnormalized log probabilities가 [1, -2, 0]이 된다고 가정할 때, softmax function은 다음과 같이 계산됩니다:

\[[1, -2, 0] \rightarrow [e^1, e^{-2}, e^0] = [2.71, 0.14, 1] \rightarrow [0.7, 0.04, 0.26]\]

이 과정은 exponentiate하고 정규화 함으로써 총합을 1로 만듭니다. 여기서 만약 regularization strength \(\lambda\)가 더 높다면, weight \(W\)는 더 많이 penalized되고 이는 더 작은 weight로 이어질 것입니다. 가령, weight가 반으로 줄었다고 가정합니다([0.5, -1, 0]). softmax는 이제 다음과 같이 계산됩니다:

\[[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)되어 있음을 볼 수 있습니다. 여기서 regularization strength \(\lambda\)가 극도로 커져서 weight는 극도로 작아지는 경우, 출력으로 나오는 확률은 거의 같은 값으로 일정(uniform)할 것입니다. 따라서, Softmax classifier에 의해 계산되는 확률은 신뢰도(confidence)로 생각하는 것이 좋습니다. 이는 SVM과 유사하게 점수의 순서는 해석 가능하지만, 기술적으로 절댓값(혹은 차이값)은 해석할 수 없습니다.

3.8.2 실전에서, SVM과 Softmax는 자주 비교됩니다(In practice, SVM and Softmax are usually comparable)

SVM과 Softmax의 성능 차이는 대개 매우 작아서 사람들마다 어떤 classifier가 더 잘 작동하는지에 대해 다른 의견을 가질 것입니다. SVM은 Softmax classifier에 비해 더 local objective한데, 이를 버그 혹은 특징으로 생각할 수 있습니다. 가령, [10, -2, 3]의 점수 중 첫번째 클래스가 올바른 경우인 예시를 생각해봅시다. SVM(원하는 margin이 \(\Delta = 1\))은 올바른 클래스가 다른 클래스에 비해 margin보다 높은 점수를 가지고 있음을 확인하고 0의 loss를 계산합니다. SVM은 개별 점수의 세부사항에 대해선 신경쓰지 않습니다: 만일 점수가 [10, -100, -100] 또는 [10, 9, 9]이라면 SVM은 1의 margin이 충족되어 loss가 0이 되므로 나머지에는 무관심(indifferent)해질 것입니다. Softmax classfier에서는 [10, -100, -100]보다 [10, 9, 9]에서 훨씬 높은 점수의 loss를 누적하기 때문에 조금 다릅니다. Softmax classifier는 그것이 산출하는 점수에 대해 결코 만족하지 않습니다(never fully happy): 올바른 클래스는 항상 더 높은 확률을 가지고 틀린 클래스는 항상 더 낮은 확률을 가지며 loss는 항상 더 개선될 여지가 있습니다. 반면, SVM은 일단 margin이 충족되면 만족하며(happy) 이 제약을 넘어 정확한 점수와 같은 사소한것 까지 신경쓰지(micromanage) 않습니다. 직관적으로 이는 특징으로 생각할 수 있습니다: 가령, 대부분의 “노력(effort)”을 자동차와 트럭을 구분하는 어려운 문제에 투자하는 자동차 classifier는 (매우 낮은 점수를 부여 받았으며, data cloud의 완전히 다른쪽에 클러스터를 형성한) 개구리 예시에 영향을 받아선 안됩니다.

  • SVM은 데이터를 정확히 분류했다고 생각하면 더이상 데이터 포인트에 신경쓰는 것을 포기합니다(give up).
  • 반면 Softmax는 계속해서 모든 데이터 포인트들을 개선하려고 노력합니다.

3.9 요약(Summary)

요약하자면,

  • 이미지 픽셀부터 클래스 점수까지 score function을 정의하였습니다 (weight W와 bias b에 따른 선형함수를 의미합니다).
  • kNN classifier와는 달리, 파라미터적 접근(parametric approach)의 장점은 파라미터를 한번 학습하면 트레이닝 데이터를 버려도(discard) 된다는 것입니다. 또한 모든 트레이닝 데이터 하나하나와 일일이(exhaustive) 비교하는 대신, W와의 행렬곱 하나 만을 요구하기 때문에 새로운 테스트 이미지에 대한 예측속도가 빠릅니다.
  • bias trick은 bias vector를 weight matrix로 fold함으로써, 하나의 파라미터 행렬만 계속 track하면 되는 편의를 제공합니다.
  • 주어진 파라미터와 트레이닝 데이터셋의 ground truth label가 얼마나 일치(compatible)하는지를 측정하는 loss function (linear classifier SVMSoftmax에 사용되는 일반적인 loss)을 정의하였습니다. 트레이닝 데이터에 대해 좋은 예측을 하는 loss function이 작은 loss를 가지는 방식으로 정의됨을 보았습니다.

각각의 이미지 데이터셋을 파라미터에 근거하여 클래스 점수에 map하는 방법을 보았습니다. 그리고 예측의 quality를 측정하는 데 사용되는 두 가지 loss function을 알아보았습니다. 하지만 어떻게 효율적으로 최상의(최저) loss를 가져오는 파라미터를 찾을 수 있을까요? 이 과정을 최적화(Optimization)이라고 하며, 다음 장에서 이어서 알아보도록 하겠습니다.

3.9.1 읽어보면 좋은것들(Further Reading)

관심이 있다면 향후 읽어볼만한 것들입니다: