반응형

Image classficiation은 컴퓨터 비전에서 핵심과제이며 CS231n 강의에서 우리가 주로 다룰 문제이다. Image classificiation 과정에서 첫 단계는 시스템이 이미지를 입력 받는 것이다. 예를 들어 고양이 사진을 입력 받는다고 해보자. 시스템에는 이미 강아지, 고양이, 트럭, 또는 비행기 같이 미리 정해놓은 카테고리나 라벨 집합이 존재한다. 그러므로 컴퓨터가 해야하는 일은 이미지(고양이)를 보고 어떤 카테고리에(고양이 카테고리) 속할지 고르는 것이다. 이 것은 우리 뇌에게는 매우 쉬운 문제이지만, 기계에게는 아주 어려운 문제다. 컴퓨터에게 고양이 이미지는 아주 큰 격자 모양의 숫자집합으로 보인다. 그리고 각 픽셀은 세 개의 숫자로 표현되는데 각각 red, green, blue를 의미한다. 컴퓨터에게는 이미지가 단지 거대한 숫자 배열로 보이고, 이 배열에서 고양이를 인식하는 것은 매우 어려울 것이다. 고양이라는 레이블은 우리가 이 이미지에 붙인 의미상의 레이블일 뿐이고, 컴퓨터가 보는 픽셀 값들과는 큰 차이가 있다 (semantic gap=의미상의 갭/차이). 이 문제는 매우 어려운 과제인데, 예를 들어, 우리가 이미지에 변화(카메라 위치의 변화, 조명의 변화, 객체 자체에 변화 (고양이 자세의 변화,  부분 가림 등..)를 줬을 때 컴퓨터가 바라보는 이미지의 픽셀 값은 모조리 달라지지만 이미지가 고양이를 나타낸다는 사실엔 변화가 없다. Background clustter라는 고양이가 배경과 거의 비슷하게 생겼을 수도 있는 문제도 있다. 또 다른 과제는, 고양이라는 하나의 클래스 내에도 생김새, 크기, 색, 나이에 따라 다양성이 존재하는데, 알고리즘은 고양이라는 하나의 개념으로 고양이의 다양한 모습들을 모두 포함해야 한다.

 

 

데이터 중심 접근방법(Data-Driven Approcach)은 고양이는 무엇이다, 물고기는 무엇이다 식으로 우리가 직접 코딩을 통해 어떤 규칙을 써내려 가는 것 대신에 인터넷에 접속해서 엄청 많은 양의 고양이/비행기/사슴 데이터를 수집하는 것이다. 각 카테고리마다 많은 다양한 데이터들을 모으기 위해 Google Image Search와 같은 도구를 이용해 데이터를 수집한 다음, 데이터로 기계 학습 분류기(machine learning classifier)를 학습시킨다. ML 알고리즘은 어떤 식으로든 데이터를 잘 요약해서는 다양한 객체들을 인식할 수 있는 모델을 만들어 낼 것이고, 우리가 새로운 이미지를 학습된 모델에 적용했을 때, 모델은 고양이나 개를 잘 인식해 낼 것이다.

 

 

Nearest neighbor라는 가장 단순한 분류기(classifier)를 살펴보면, 학습 단계(train step)에서 모든 학습 데이터를 기억해 모델을 만든 후, 예측 단계에서 새로운 이미지가 들어왔을 때 기존의 학습 데이터를 비교해 가장 유사한 이미지로 이미지의 레이블을 예측한다. 아주 간단하지만, Data-Driven Approcach로서는 좋은 알고리즘이다.

 

Cifar-10은 Machine Learning에서 자주 쓰는 연습용 데이터셋으로 10가지 카테고리와 50,000개의 학습용 이미지, 10,000개의 테스트용 이미지가 있다.

NN알고리즘에서 중요한 점은 위 사진의 오른쪽 처럼 테스트 이미지와 비슷한 이미지들 여러장이 있을 때, 어떻게 비교를 해 가장 비슷한 이미지를 찾느냐는 점이다. 테스트 이미지 하나를 모든 트레이닝 이미지와 비교를 할 때 어떤 비교 함수를 사용하는지에 따라 여러가지 비교 방법들이 있는데, 위 예제는 L1 distance 또는 Manhattan distance라고 불리는 함수를 사용했다. 이 방법은 매우 간단한데, 이미지의 각 픽셀을 비교하는 거다. 테스트/트레이닝 이미지의 같은 자리에 픽셀을 서로 빼고 절댓값을 취하는 방식으로 두 이미지 간에 픽셀 간 차이 값을 계산하고, 모든 픽셀의 차이값을 더한다.

 

NN Classifier를 구현한 Python 코드

NN알고리즘에서 학습시간(train time)은 데이터를 기억만 하면 됨으로 상수시간 O(1)시간이 걸리지만, 테스트시간은 n개의 학습 데이터 전부를 테스트 이미지와 비교해야되기 때문에 O(N)이라는 상당히 느리다. 우리는 train time은 조금 느려도 되지만 예측은 빠른 classifier를 원하는데, 성능이 좋은 모델을 위해 train time에 많은 시간을 쏟을 수 있지만, 이 모델이 핸드폰이나 브라우저 같은 low power device에서 동작해야될 수도 있기 때문에 classifier의 test time 성과는 어느정도 빨라야한다.

 

NN알고리즘을 실제로 적용했을 때 어떻게 생겼을까?

위 그림은 NN classifier의 decision regions으로 2차원 평면 상의 각 점은 학습 데이터이고 점의 색은 점의 카테고리 혹은 클래스 레이블을 나타낸다. 이 그림을 보면 NN classifier에서 발생 가능한 문제들을 살펴볼 수 있는데, 가령 초록색 점 사이에 노란 점이 끼어있다던가 (모델이 가장 가까운 이웃만 보기 때문에), 초록색 영역이 파란색 영역을 침범하고 있는 (아마 잡음(noise)이거나 가짜(spurious)일 초록색 점이 끼어들었기 때문에) 점이다. 이러한 문제 때문에 NN의 조금 더
일반화된 버전인 k-NN 알고리즘이 탄생했는데, 가장 가까운 이웃만 찾는 것이 아니라 distance metric을 이용해서 가까운 이웃을 K개의 만큼 찾고, 이웃끼리 투표해 가장 많은 특표수를 획득한 레이블로 예측하는 방법이다.

 

예측값을 봤을 때 K-NN 모델은 별로 성능이 안좋은 것을 알 수 있다(분류를 잘 못한다). 하지만 K값을 높이거나 서로 다른 점들을 어떻게 비교할 것인지 결정함(distance metric)으로서 모델의 성능을 향상시킬 수도 있다. 지금까지는 L1 distance를 이용했지만 제곱 합의 제곱근을 거리로 이용하는 방법인 Edclidean distance를 사용할 수 있다. 만약에 입력값의 요소들이 개별적인 의미를 가지고 있다면(e.g. 키, 몸무게 또는 직원을 분류하는 문제에서 봉급, 근속년수와 같이 직원의 특징에 영향을 주는 요소들) L1 distance가 더 잘 어울릴 수도 있는 반면, 요소들간의 실질적인 의미를 잘 모르는 경우라면, L2 Distance가 더 잘 어울릴 수도 있다.

 

 

우리는 어떻게 우리의 문제와 데이터에 꼭 맞는 모델을 찾을 수 있을까? 앞에서 k값과 거리척도에 관한 이야기를 했는데, 모델을 만들기 전에 우리가 하는 이런 선택들을 하이퍼파라미터(hyperparameter)라고 한다. 우리는 다양한 하이퍼 파라미터를 시도해보고 그 중 최고를 선택해야한다. 단순하게 학습 데이터의 정확도와 성능을 최대화 하는 하이퍼파라미터를 선택하면 아주 나쁜 방법인데, 학습데이터에는 없던 테스트 데이터를 넣었을 때 성능이 아주 안좋게 나올 수 있기 때문이다. 앞 예제에서도 보았듯이 NN classifier는 k=1일 때 학습 데이터를 완벽히 분류하지만, 실제로는 k 값이 더 큰 모델이 새로운 데이터에 대해서 더 좋은 성능을 보인다. 우리가 잊지 말아야할 것은 궁극적으로 기계학습에서는 학습 데이터를 얼마나 잘 맞추는지는 중요하지 않고, 한번도 보지 못한 데이터를 얼마나 잘 예측하는지가 중요하다는 것이다. 2번째 방법은 전체 데이터를 쪼개서 일부를 테스트 셋으로 사용하고 학습시킨 모델들 중 테스트 셋에 가장 잘 맞는 모델을 선택하는 것인데 이것도 좋지 못한 방법이다. 우리는 모델이 한번도 보지 못했던 데이터에 대해 좋은 예측력을 보이길 바라는데, 이 모델은 테스트 셋에서만 잘 동작하는 하이퍼파라미터를 고른 것일 수도 있기 때문이다. 일반적인 방법은 데이터를 세개로 나누는 것이다. 데이터의 대부분은 training set으로 나누고, 일부는 검증 셋(validation set), 그리고 나머지는 test set으로 나눈다. 다양한 하이퍼파라미터로 training set을 학습시키고, validation set으로 검증을 하고 가장 좋은 하이퍼파라미터를 선택한 후 가장 좋았던 모델을 가지고 test set를 한번만 수행하는 것이다. 또 다른 하이퍼파라미터 선택 전략은 교차 검증(cross validation)으로 우선 test set을 정해놓고 나머지 데이터는 training/validation set으로 나눌껀데, 데이터를 여러부분으로 나눠(보통 5, 5-Fold Cross Validation) 번갈아 가면서 validation set을 지정해주는 것이다.

 

하이퍼파라미터 설정 예시

 

우리는 실제로 입력값이 이미지인 경우에는 K-NN classifier를 잘 사용하지 않는다. K-NN이 너무 느리고, L1/L2 Distance가 이미지간의 거리를 측정하기에는 적절하지 않고, K-NN이 잘 동작하려면 충분한 트레이닝 샘플이 필요한데, 고차원의 이미지는 K-NN으로 공간을 잘 분할할 만큼의 데이터를 모으는 일이 현실적으로 불가능하다.

 

Linear classifier는 parametric model의 단순한 형태이다. 이 모델에는 입력 이미지를 보통 x로 쓰고, 파라미터 또는 가중치 W라고 하는 두개의 요소가 있다. 이 함수는 data x와 parameter W를 가지고 10개의 숫자를 출력하는데 이 숫자는 각 10개 카테고리의 스코어다. 고양이 카테고리의 스코어가 가장 높다면 입력값 x가 고양이일 확률이 크다는 것을 의미한다.

 

반응형