티스토리 뷰

CS231n

CS231n Lecture 2 | Image Classification

망고농장주인 2021. 9. 27. 22:57
처음으로 CS231n을 본 지 8개월 뒤에 다시 강의를 보고 정리한 내용입니다. 

Slide

Lecture 2 강의를 들으면

  • 기계의 입장에서 Image Classification의 이해를 할 수 있습니다.
  • NN 알고리즘에서 K-NN 알고리즘까지 맛 볼 수 있습니다.
  • L1, L2 distance의 대략적인 차이점을 알 수 있습니다.
  • Hyperparameter의 이해에 도움이 됩니다.
  • K-NN 입력(input)에 왜 이미지를 넣지 않는지 알 수 있습니다.
  • Linear Classification 도 간략하게 이해할 수 있습니다.

TimeStamp

Time 내용
04:45 본격적인 수업 시작, image classification의 어려운 점 여러가지
09:23 Image Classifier 함수를 작성한다고 하면 마주할 문제들
10:20 corners과 edges에 집중할 때 생기는 문제점 → 확장성이 없음
11:34 확장성이 가능하게 하는 접근은 데이터 중심 접근 방법 
특징을 써주기 보다, 방대한 양의 이미지(데이터)를 모아서 ML Classifier를 학습
12:36 하나의 함수가 아닌 train과 predict의 두 가지 함수를 가진 API가 필요하다
13:05 Nearest Neighbor (NN알고리즘)
16:00 이미지 쌍을 어떻게 비교할 것인가 → L1 Distance
18:00 Q1, 이미지가 N개 일때, train/test 속도는?
19:40 NN Classifier 예제 →K-NN
24:00 K-NN을 사용할 때 서로 다른 점을 어떻게 비교할 것인지 → L2 Dist
28:30 Setting Hyperparameters
39:30 입력이 이미지일 때, K-NN 잘 쑤지 않는 3가지 이유
41:41 요약 : 이미지 분류가 무엇인지 설명하기 위해 K-NN의 예제를 듦. K-NN 관련 Q&A
46:00 Linear Classification
48:00 Parametric Model의 가장 단순한 형태 → 두 개의 요소가 있음 : 입력이미지와 가중치
51:20 그림으로 가중치 이해하기

 

Image Classification

이미지 분류는 Compution Vision(이하 CV)에서 Core Task.
CS231n 은 주로 Image Classification에 관한 문제를 다룬다.

인간 => 👀 시각인식에 고도화 되어 있어 쉽게 이미지 분류가 가능
기계 => 🖥 아주 큰 숫자 집합으로 인식하기 때문에 이미지를 인식하는 것은 상당히 어렵다

Challenges (기계가 이미지 분류할 때 겪는 어려움)

  1. Viwepoint variation (보는 각도가 살짝만 달라져도 이미지 픽셀 값은 모조리 변하게 된다.)
  2. Illumination (조명에 따른 픽셀 값 변화)
  3. Deformation (다양한 자세의 고양이도 분류할 수 있어야 한다.)
  4. Occlusion (가려진 고양이의 일부를 보고도 분류할 수 있어야 한다.)
  5. Background Clutter (배경과 비슷한 경우에도)
  6. Itraclass variation (고양이들의 다양성도 다룰 수 있어야 한다.)

Data-Driven Approcach

다양한 객체들에게 유연하게 적용 가능한 확장성이 있는 알고리즘을 만들어야 한다.
=> 데이터 중심 접근방법(Data-Driven Approcach)으로 만들 수 있다.

1) 구글 이미지 검색으로 많은 데이터를 모아서
2) Machine Learninf Classifier를 학습시킨다.

위의 방법을 적용하려면 두 개의 함수 필요
=> train & prediction 함수 (입력은 Image과 label, 출력은 이미지 레이블의 예측값)

Nearest Neighbor(이하 NN)

유명한 Neural Network, CNN 그리고 Deep Learning 다룰 예정이지만,
심플한 분류기인 NN 부터 살펴보자

train >>> 아무 일 없이, 그저 모든 학습 데이터를 기억한다.
predict >>> 새로운 이미지와 기존 학습 데이터를 비교해서 가장 유사한 이미지로 label을 예측

How to compare images

NN 알고리즘에서 새로운 이미지와 기존 학습 데이터를 비교한다고 했는데, 어떻게 비교할까?
정확히 말하자면 어떤 비교 함수를 사용할지에 달려있다.

이번 강의에서는 L1 Distance와 L2 Distance, 이렇게 2가지 비교 함수를 배운다.

(1) L1 Distance (Manhatten distance라고도 한다.)

$d_1(I_1, I_2) = \sum_p \left | I_1^p - I_2^p \right |$

위의 함수 식을 이용해 픽셀 간의 차이를 계산하고 픽셀마다 수행 결과를 모두 더한다.
이 sum의 값이 가장 작은 이미지 쌍이 가장 비슷하다고 predict할 수 있다.

이미지 분류에서 별로인 방법이지만 연습삼아 해보도록 하자.

NN 에서 train/test 속도

train => $O(1)$, 저장만 하기 때문에 데이터의 양과 상관없이 적은 시간이 걸립니다.
test => $O(N)$, N개의 학습 데이터와 전부 비교해야 하기 때문에 상당히 느린 작업이다.
이러한 현상은 우리가 원하는 동작과 정 반대입니다.

우리는 train time은 느려도 되지만 test time은 빠르게 동작하기를 원합니다.

NN알고리즘의 실제 적용

NN 알고리즘은 '가장 가까운 이웃'만을 보기 때문에 이미지의 가운데처럼 초록색 사이에 노란색이 끼어들기도 합니다.
또한 경계 또한 고르지 않은 것을 확인할 수 있습니다.
위에서 언급한 사항들은 noise(잡음)이거나 spurious(가짜)일텐데 걸러 내지 못했기 때문에 좋지 않은 일이라고 할 수 있습니다.

이런한 문제 때문에 NN의 일반화 버전인 K-NN 알고리즘이 탄생하게 되었습니다.

K-NN이란

Distance Metric을 이용해서 가까운 이웃 K개를 찾고, 그 이웃끼리 투표(voting)을 하는 방법입니다.
그리고 가장 많은 득표수를 획득한 레이블로 예측값을 내놓습니다.

이때, 투표를 하는 방법도 여러가지 입니다.
거리별로 가중치를 둔다거나 데이터 개수에 따라서 가중치를 두는 방법 등이 있습니다.

아래는 K=1/3/5 에서의 결과입니다.
투표하는 이웃이 많아질 수록 경계들이 점차 매끄러워지고 초록색 사이에 있는 노란점도 노이즈로 처리된 것을 확인할 수 있습니다.

이때 labeling이 되지 않은 흰색 지역은 K-NN이 결정하지 못한 지역입니다.
이런 지역의 경우 추론을 해보거나 임의로 정할 수도 있고 다른 더 좋은 방법으로 매꿔볼 수 있습니다.

(2) L2 Distance (Euclidean Distance라고도 한다.

앞서 어떤 비교 함수를 쓸건인지가 중요하다고 설명했다. 이때 L1 이 아닌 L2 Distance를 사용할 수도 있습니다.
$d_1(I_1, I_2) = \sqrt{\sum_{p}(I_1^p - I_2^P)^2}$
위의 식은 복잡해 보이지만 우리가 원래 알고있던 원(정의 : 한 점에서 같은 거리에 위치한 점들의 모임)의 공식과 동일하다.

이렇게 어떤 거리 기준(distance metric)을 선택할지는 아주 흥미로운 주제입니다.

만약 특징 벡터가 개별적인 의미를 가지고 있다면, 좌표계를 회전시킬 때 값이 변화하는 L1이 어울리고,
특징 벡터가 일반적인 벡터이라면 요소간의 실질적 의미를 잘 모르는 L2까 더 잘 어울릴 수 있습니다.

K-NN 분류기 설계해보기

직접 해보고 결정 경계나 노이즈 처리가 어떻게 달라지는지 확인해보기

Hyperparameter

K-NN을 사용할 때, 선택해야하는 3가지가 있습니다.

  1. 거리의 기준
  2. K의 값
  3. 데이터셋의 형태
    이러한 것들을 하이퍼 파라미터라고 하는다데, 학습을 통해 얻을 수 있는 것이 아니고 problem-dependent(문제 의존적)이기 때문에
    다양한 하이퍼 파라미터를 시도해보고 가장 좋은 값을 찾아야 합니다.

3.데이터셋의 형태

에는 4가지 형태가 있습니다.
#아이디어 1. 모든 데이터를 train데이터로 나누는 경우 -> terrible idea
이 경우 한번도 보지 못한 test데이터에서 잘 작동하지 않기 때문.

#아이디어 2. 데이터를 train과 test 데이터로만 나누는 경우 -> bad idea
이 또한 테스트 데이터를 처음 만나기 되기 때문입니다.

#아이디어 3. 데이터 대부분을 train set으로 두고 일부는 validation set, 나머지는 test set으로 나누는 경우 -> better
다야한 하이퍼 파라미터로 train set을 학습시키고 validation set으로 검증합니다.
그리고 validation set에서 가장 좋았던 하이퍼 파라미터러를 선택해서 test set을 오로지 한번만 수행할 수 있습니다.

#아이디어 4. Cross Validation (교차 검증)
이 방법은 데이터 셋이 작을 때, 그리고 딥러닝이 아닐 때 고려할 수 있는 방법입니다. (연산량이 원래 많기 때문입니다.)
우선 테스트 데이터를 정해놓고 나머지는 여러 트레이닝 데이터와 validation 데이터로 나누고
각 학습마다 각 fold를 validation으로 지정해 중복이 되지 않을 때까지 순환합니다.
이런 방식으로 최적의 하이퍼 파라미터를 찾을 수 있을 것입니다.

Q. train과 validation set의 차이는?
train은 라벨과 함께 이 자체를 기억하지만 validation set에는 분류기가 얼만큼 정확도가 나오는지 확인합니다. (즉, validation set의 label은 볼 수 없습니다.)

K-NN의 치명적 단점

K-NN에 이미지를 input으로 넣었을 때의 치명적인 단점은 너무 느리다는 것입니다.

게다가 L1/L2 Distance는 이미지 간의 거리를 측정하기에는 적절하지 않습니다.
왜냐하면 이미지가 모두 다른 이유로 왜곡 되었을 때에도 L2 distance는 동일할 수 있기 때문입니다.

또 다른 문제는 차원의 저주 입니다.
K-NN 은 공간을 분할하는 일인데, 전체 공간을 분할할 만큼의 충분한 train 데이터가 필요합니다.
그런데 차원이 증가함에 따라 그 train 데이터가 기하급수적으로 증가하는데, 이런 기하급수적인 증가는 언제는 옳지 못합니다.
차원이 커짐에 따라 필요한 train 데이터가 기하급수적으로 늘어가는 현상을 차원의 저주라고 합니다.

Linear Classification

Nueral Network(이하 NN)은 차곡차곡 쌓아 올릴 수 있는 레고에 빗대어 설명할 수 있습니다.
다양한 컴포넌트를 모아서 NN와 ConvolutionNN 와 같은 타워를 지을 수 있기 때문입니다.
이렇게 레고처럼 다양한 종류의 딥러닝 알고리즘 타워의 기본이 되는 블럭 중 하나가 Linear Classification 입니다.

앞서 배운 K-NN은 학습을 통해 update되는 파라미터가 없었지만
Linear Classification은 update되는 파라미터를 가진 parametric model입니다.

파라미터는 train을 하면서 파라미터 W 업데이트를 통해 그 요약된 정보를 모아줍니다.
그러면 그 후 test할 때는 파라미터 W낭 있으면 완성입니다.

이런한 방법은 작은 디바이스에서 모델을 동작시켜야 할 때 아주 효율적입니다.

Linear classification의 가장 쉬운 식은 $F(x,W) = Wx$ 입니다.

그리고 가끔은 bias를 보게 될텐데 데이터 불균형을 해소하기 위해 더해주는 등, 여러 이유로 더해주기도 합니다.