CS231n Lecture 2 내용을 개인 학습용으로 정리한 글이다.
핵심 한 줄 정리
이미지 분류는 이미지를 텐서 입력으로 받아, 미리 정해진 클래스 중 하나의 라벨을 예측하는 문제이다.
이번 강의의 흐름은 data-driven approach -> Nearest Neighbor / K-NN -> Linear Classifier -> Softmax로 이어진다.
이미지 분류 문제
이미지는 픽셀 값으로 이루어진 텐서이다. RGB 이미지라면 보통 하나의 이미지는 형태를 가진다.
- : height
- : width
- : channel
RGB 이미지에서는 보통 이고, 각 픽셀 값은 대개 부터 사이의 값이다.
이미지 분류의 목표는 이 픽셀 텐서를 입력으로 받아, 예를 들어 cat, car, frog 같은 클래스 중 하나를 예측하는 것이다.
문제는 같은 고양이라도 위치, 크기, 배경, 밝기, 자세가 계속 달라진다는 점이다. 그래서 사람이 직접 규칙을 쓰는 방식은 금방 한계가 온다.
Data-driven approach
데이터 기반 접근법은 사람이 규칙을 직접 만드는 대신, 이미지와 라벨 쌍을 보고 분류 규칙을 학습하는 방식이다.
흐름은 간단하다.
- train set으로 분류기를 학습한다.
- validation set으로 하이퍼파라미터를 고른다.
- test set은 마지막에 한 번만 사용해 최종 성능을 확인한다.
핵심은 test set을 튜닝에 쓰지 않는 것이다. test set까지 보고 나 distance metric을 고르면, 그 순간 test set은 더 이상 공정한 최종 평가 기준이 아니게 된다.
Nearest Neighbor와 K-NN
Nearest Neighbor Classifier는 테스트 이미지와 가장 가까운 학습 이미지를 찾고, 그 학습 이미지의 라벨을 그대로 예측값으로 사용한다.
학습 단계에서는 특별한 파라미터를 배우지 않고 데이터를 저장한다. 대신 예측 단계에서 테스트 이미지와 모든 학습 이미지 사이의 거리를 계산해야 한다.
K-NN은 가장 가까운 이미지 하나만 보지 않고, 가까운 개의 이웃을 본 뒤 다수결로 라벨을 정한다.
- : Nearest Neighbor와 같다.
- 가 너무 작음: 노이즈나 이상치에 민감하다.
- 가 너무 큼: 결정 경계가 너무 부드러워져 세밀한 차이를 놓칠 수 있다.
K-NN에서 고를 하이퍼파라미터는 보통 두 가지이다.
- : 몇 개의 이웃을 볼 것인가
- distance metric: L1을 쓸 것인가, L2를 쓸 것인가
Distance metric
이미지를 비교하려면 먼저 이미지를 긴 벡터로 펼친 뒤, 두 벡터 사이의 거리를 계산한다.
L1 distance
L1 distance는 각 성분 차이에 절댓값을 취한 뒤 모두 더한 거리이다. 좌표축을 따라 이동한 총 거리처럼 볼 수 있다.
2차원에서 같은 L1 distance를 가지는 점들은 다음 식을 만족한다.
그래서 등거리선은 마름모 형태가 된다.
L2 distance
L2 distance는 각 성분 차이를 제곱해서 더한 뒤 루트를 씌운 거리이다. 일반적인 직선거리이다.
2차원에서 같은 L2 distance를 가지는 점들은 다음 식을 만족한다.
그래서 등거리선은 원 형태가 된다.
정리하면 L1과 L2는 단순히 수식만 다른 것이 아니라, 입력공간의 geometry 자체를 다르게 본다. K-NN에서는 이 차이가 decision boundary의 모양에도 영향을 준다.
Pixel distance의 한계
Pixel distance는 직관적이지만 이미지의 의미를 잘 반영하지 못한다.
같은 고양이 이미지라도 위치가 조금 밀리거나 배경과 밝기가 바뀌면 픽셀 거리는 크게 달라질 수 있다. 반대로 의미적으로 전혀 다른 이미지라도 픽셀값이 우연히 비슷하면 가깝다고 판단할 수 있다.
그래서 실제 딥러닝에서는 raw pixel distance보다, 모델이 학습한 feature representation을 이용해 분류하는 방향으로 간다.
Linear Classifier
K-NN은 학습 데이터를 저장해두고, 예측할 때마다 거리 계산을 한다. 반면 선형 분류기는 학습된 파라미터 와 만으로 각 클래스의 score를 계산한다.
기본 형태는 다음과 같다.
여기서 는 이미지를 하나의 긴 벡터로 펼친 입력이고, 는 클래스별 weight matrix, 는 bias vector이다.
출력 는 각 클래스에 대한 score vector이다. 가장 큰 score를 가진 클래스가 예측값이 된다.
CIFAR-10 shape
CIFAR-10 이미지 하나는 형태이다.
이를 펼치면 다음과 같다.
즉, 이다.
CIFAR-10은 클래스가 10개이므로 다음 shape가 된다.
의 각 행은 하나의 클래스에 대응한다. 각 클래스 score는 입력 이미지 벡터 와 해당 클래스 weight vector의 dot product에 bias를 더한 값이다.
Softmax Classifier
선형 분류기의 출력 score는 logits라고도 부른다. 아직 확률은 아니다.
예를 들어 어떤 이미지에 대해 다음 score가 나왔다고 하자.
- cat:
- car:
- frog:
Softmax는 이 raw score를 확률처럼 해석할 수 있는 값으로 바꾼다.
계산 흐름은 logits -> exp -> normalize이다.
| class | logit | softmax probability | |
|---|---|---|---|
| cat | |||
| car | |||
| frog |
지수 함수를 적용하면 모든 값이 이상이 된다. 하지만 아직 합이 은 아니다.
따라서 각 값을 전체 합으로 나눠 정규화한다.
정규화 후에는 모든 값이 이상이고, 전체 합이 이 된다. 그래서 softmax는 score를 확률 분포처럼 다룰 수 있게 해준다.
Softmax loss
Softmax로 각 클래스의 확률을 얻었다면, 정답 클래스에 얼마나 높은 확률을 줬는지로 손실을 계산할 수 있다.
데이터셋을 다음과 같이 두자.
모델 파라미터를 라고 하면, 모델이 번째 입력 에 대해 정답 를 맞힐 확률은 다음과 같다.
전체 데이터가 나올 확률, 즉 likelihood는 각 샘플의 확률을 곱한 값이다.
MLE는 이 likelihood를 가장 크게 만드는 파라미터를 찾는다.
곱은 다루기 불편하므로 로그를 씌운다. 로그는 단조 증가 함수라서 최댓값의 위치는 바뀌지 않는다.
그런데 학습에서는 보통 최대화보다 최소화 형태의 손실함수를 사용한다. 그래서 음수를 붙이면 negative log likelihood가 된다.
따라서 한 샘플 기준 손실은 다음과 같이 쓸 수 있다.
여기서 는 번째 입력 이미지이고, 는 그 이미지의 정답 라벨이다.
softmax 출력에서 정답 클래스에 해당하는 확률을 라고 쓰면 다음과 같다.
one-hot 정답 벡터 를 쓰면 cross entropy 형태로도 쓸 수 있다.
one-hot에서는 정답 클래스만 이고 나머지는 이므로, 결국 정답 클래스의 확률만 남는다.
이 관점은 정답 분포와 모델이 예측한 분포를 비교하는 문제로도 볼 수 있다.
정답 분포를 , 모델의 예측 분포를 라고 하자. 예를 들어 정답이 cat이면 정답 분포는 one-hot으로 다음과 같다.
모델의 softmax 출력이 다음과 같다면,
모델은 정답인 cat보다 car에 더 높은 확률을 준 상태이다. 이 두 분포가 얼마나 다른지를 재는 대표적인 값이 KL divergence이다.
Cross entropy는 다음처럼 쓸 수 있다.
여기서 는 정답 분포 자체의 entropy이다. 정답 분포 가 one-hot이면 이므로, cross entropy를 줄이는 것은 사실상 를 줄이는 것과 같다.
즉, softmax loss는 모델의 예측 분포 가 정답 분포 에 가까워지도록 만드는 손실이라고 볼 수 있다.
정답 클래스의 확률이 높으면 값은 작아지고, 정답 클래스의 확률이 낮으면 손실은 커진다. 즉, 모델이 정답에 높은 확률을 주도록 만드는 손실 함수이다.
과제에서 확인할 것
- K-NN은 train 단계에서 무엇을 하고, predict 단계에서 무엇을 하는가
- distance matrix를 반복문 없이 vectorized implementation으로 계산할 수 있는가
- validation set으로 best 와 distance metric을 고르는 흐름을 이해했는가
- raw pixel distance가 의미적 유사성을 잘 반영하지 못하는 예시를 설명할 수 있는가
내가 막힌 부분
- L1과 L2가 decision boundary의 shape에도 영향을 준다는 점
- L1 등거리선이 왜 마름모이고, L2 등거리선이 왜 원인지
- training data, validation set, test set의 역할 차이
- pixel distance 대신 feature representation을 학습한다는 말의 의미
나중에 다시 볼 질문
- 왜 은 training data에서는 거의 완벽하지만 새로운 데이터에서는 불안정할 수 있는가?
- cross-validation은 왜 안정적인 하이퍼파라미터 선택 방법인가?
- 딥러닝에서는 왜 cross-validation보다 train / validation / test split을 더 자주 쓰는가?
- 선형 분류기는 K-NN과 비교했을 때 어떤 식으로 예측 비용을 줄이는가?
SoftmaxWithLoss의 수치 안정성
한 샘플의 손실은 다음과 같다.
정답 클래스 확률을 라고 하면,
이론적으로 확률 범위는 다음과 같다.
따라서 손실값 범위는 다음과 같다.
즉 가 에 가까우면 손실은 에 가까워지고, 가 에 가까우면 손실은 매우 커진다.
초기 학습 단계에서는 정답 클래스 확률이 매우 낮을 수 있으므로 손실값이 크게 나올 수 있다. 이때 softmax의 계산에서 overflow가 나거나 cross entropy의 문제가 생길 수 있는데, 실제 구현에서는 이를 어떻게 방지하는가?