일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- linear classifier
- 다익스트라
- 응원가
- 앱
- 해커톤
- 이미지 분류
- 백준
- 더보기창
- 알고리즘
- OSAM
- 앱 개발
- KUsic
- ModalBottomSheet
- 국방오픈소스아카데미
- flutter
- 고려대학교
- image_picker
- 고연전
- 고려대학교 응원가
- 앱 출시
- text recognition
- google_ml_kit
- optimization
- 뮤직플레이어
- loss function
- Dijkstra
- image classification
- CS231n
- Firebase
- K-nearest neighbor
- Today
- Total
영주머니의 개발주머니
[cs231n 강의 정리] Linear Classification, Loss function, Optimization 본문
Linear Classifier
Input image는 크기가 32*32 픽셀이고 한 픽셀은 RGB값으로 표현되므로 32*32*3의 배열로 표현된다.
f(x, W)에서 x가 input data이고 W는 weight(parameter)이다. 이러한 parametic한 접근의 경우 학습 과정에서 학습 데이터들을 가장 잘 요약하는 W 값을 값을 찾는 것을 목표로 한다. 학습을 마치고 최적의 W 값을 얻으면 더 이상 학습 데이터를 기억하지 않아도 된다. 이는 이전의 KNN 방식에서 모든 학습 데이터를 계속 기억하고 있던 것과 비교된다. Parametic한 접근 방식에서는 학습으로 얻은 W의 값만 testing에 사용되므로 더 효율적이다.
f는 x와 W의 관계를 나타내는 함수로 다양한 형태가 있을 수 있다. 그 중 가장 단순한 방식이 W와 x를 곱하는 Linear Classifier이다. 위의 예시의 경우, x는 32*32*3 = 3072개의 숫자로 이루어진 3072*1의 긴 vector로 표현된다. 우리는 Input image를 10개의 카테고리로 분류하려고 하는 것이므로 W는 10*3072의 행렬이다. Wx는 10*1의 행렬로 Input Image의 10개의 카테고리 각각에 대한 점수를 나타낸다. b는 bias로 각 class에 대한 선호도와 같은 추가적인 정보를 줄 수 있는 부분이다. 예를 들어 data set에 dog보다 cat 이미지가 더 많다는 정보를 알고 있으면 cat에 해당하는 bias값을 더 높게 설정하여 dog보다 더 선호되도록 조작할 수 있다.
위의 예시에서는 Input image가 4개의 숫자로 표현되며, Input image를 3개의 class로 분류한다고 가정하자. 그러면 x는 4*1의 행렬, W는 3*4의 행렬이다. W의 각 행을 각 class의 특성을 나타내는 template으로 생각할 수 있다. W의 행과 input image의 vector를 곱하고 bias값을 더해주면 그 행에 해당하는 class에 대한 input의 score가 나온다. Score는 input image와 어떤 class의 행 template 사이의 유사도로 해석할 수 있다. 즉, score가 높으면 그 class에 속할 확률이 높다는 뜻이다.
그러나 위의 예시에서 Input image가 "cat"이지만 Cat Score는 -96.8로 Dog Score와 Ship Score에 비해 낮다. 이는 우리의 Linear Classifier가 성공적으로 분류를 수행하지 못하고 있다는 뜻이다. 다시 말해, W의 값이 적합하지 않다는 것이다.
그렇다면 최적의 W값을 찾기 위해서는 어떻게 해야할까?
우선, W가 얼마나 부적합한지 정량적으로 나타낼 수 있는 loss function을 정의한다. 만약 classifier가 분류를 잘하지 못한다면 loss function 값이 커진다. 그런 다음, loss function 값을 최소화하는 W값을 찾으면 그 값이 최적의 W값이다. 이렇게 최적의 W값을 찾는 과정을 optimization이라고 한다.
Loss function
x_i는 input image의 pixel value이고 y_i는 label, 즉 x_i의 correct category를 의미한다. 예를 들어, 10개의 카테고리로 분류한다면 y_i는 1~10의 값을 가질 것이다. Loss function L_i는 f를 통해 예측한 score와 label y를 인자로 받아 i번째 data에 대해 classifier의 성능이 얼마나 나쁜지 정량적으로 측정한다. final loss L은 전체 데이터의 loss의 평균값이다.
Loss function의 예시로 Multiclass SVM loss가 있다. Multiclass SVM loss에서는 모든 incorrect category의 score를 correct category의 score와 비교해서 correct score가 incorrect category의 score보다 safety margin(여기서는 +1)만큼 더 크다면 loss function의 값이 0, 아니라면 (incorrect category score) - (correct category score) + 1이 loss function의 값이 된다. safety margin은 correct category의 score가 나머지 score들보다 충분히 크다는 것을 보장하기 위해 설정한 것이다.
max를 이용하여 L_i를 간단하게 표현하는 것도 유용하다.
3개의 training data가 주어지고 이를 3개의 class로 분류하는 예시를 살펴보자. 첫번째 data의 label은 "cat"이다. 따라서 해당 data의 SVM loss를 구하기 위해서는 cat score(3.2)를 car score, frog score와 각각 비교해서 더해야한다.
max(0, 5.1 - 3.2 + 1) + max(0, -1.7 - 3.2 + 1) = 2.9 + 0 = 2.9
같은 방식으로 2번째, 3번재 data의 loss를 구하면 각각 0, 12.9가 나온다.
따라서 final loss는 (2.9 + 0 + 12.9) / 3 = 5.27이다.
만약 우리가 Loss = 0이 되는 W를 찾았다면, W는 unique할까? 그렇지 않다. 예를 들어, 2W를 사용하더라도 Loss = 0이다. 그렇다면 Loss가 0이 되게 하는 수많은 W값 중 어떤 것을 고르는 것이 좋을까? 이를 위해 잠시 Regularization에 대해 살펴보자.
위의 예시에서 파란색 동그라미들이 training 과정에서 사용하는 data set이고 초록 네모는 test data이다. 우리는 training 과정에서 training data set을 최대한 정확하게 예측하는 W를 찾는다. 파란색 그래프는 training data를 정확하게 예측하고 있다. 그러나 training data의 정확도를 너무 높이는 바람에 test data에 대한 정확도가 낮다. 이러한 현상을 "overfitting"이라고 한다. Regularization은 overfitting이 발생하지 않도록 모델을 제한하는 과정이다.
결론적으로 일반적으로 Loss function은 Data loss와 Regularization loss를 더한 형태로 나타난다. 만약 모델이 복잡한 형태가 되어서 overfitting이 예상되면 R(W)의 값이 커짐으로써 penalty를 받게된다. 따라서 모델은 최대한 simple한 형태가 되도록 유도된다.
다시 처음의 질문으로 돌아가서 Loss가 0이 되도록하는 W가 여러개라면 무엇을 선택해야 할까? Data loss = 0으로 모두 같기 때문에 Regularization loss를 최소화하는 W를 선택하면 된다. 이렇게 하면 가장 단순한 형태의 모델이 선택되어 test data에도 잘 적용될 수 있다.
Optimization
Optimization은 Loss function을 최소화하는 W를 값을 실제로 찾는 과정이다.
Optimization은 골짜기의 높이가 가장 낮은 부분을 찾는 과정으로 비유될 수 있다. 골짜기의 높이를 Loss function의 크기라고 생각하고 높이가 가장 낮은 부분이 Loss function이 최소가 되는 지점이다. 높이가 가장 낮은 부분을 찾는 방법에는 여러가지가 있을 수 있다.
우선, Loss function 자체를 미분해서 최솟값을 찾으려는 시도를 해볼 수 있다. 만약 Loss function이 아래로 볼록한 2차함수라면 미분을 통해 함수값이 최소가 되는 지점을 쉽게 찾을 수 있을 것이다. 그러나 우리가 앞으로 사용할 대부분의 Loss function들은 매우 복잡해서 단번에 최솟값이 되는 지점을 찾는 것은 어렵다.
다른 방식은 현재 지점에서 아래로 경사가 진 방향을 찾아 그쪽으로 조금씩 이동하는 것이다. 아래 경사를 따라 계속 이동하다보면 결국 높이가 가장 낮은 지점에 도달할 수 있을 것이다. 이 방식을 Loss function에 대입해보면 Loss function을 미분해서 현재 지점에서의 gradient를 구한 뒤 값이 음수인 coordinate의 방향으로 반복해서 이동하는 것이다. 이런 과정을 수행하는 알고리즘이 Gradient Descent(경사 하강법)이다.
여기서 step_size(learning rate)는 한번에 얼마나 이동할지를 지정하는 hyper-parmeter이다.
'cs231n' 카테고리의 다른 글
[cs231n 강의 정리] Image Classification, KNN (0) | 2023.07.07 |
---|