[CS231n] Lecture 2 : Image Classification pipeline

정재윤·2021년 9월 14일
0
post-custom-banner

Image Classification?

Image Classification란 시스템이 입력 이미지를 받으면 미리 저장되어 있던 카테고리에서 어떤 카테고리에 속할지 결정하는 것을 의미합니다. 우리에겐 굉장히 쉬운 일이지만 컴퓨터에게는 쉬운 일이 아닙니다.

image
[출처 : CS231n 강의자료]

위의 그림을 보면 알 수 있듯이, 컴퓨터에게 고양이 이미지는 단순히 숫자의 집합에 불과하기 때문입니다. 즉, '고양이'라는 개념이 가진 의미는 실제 컴퓨터가 고양이를 이해하는 픽셀 값과는 큰 차이가 있게 되는데 이러한 문제를 의미적 차이(Semantic Gap)이라고 합니다.

이렇게 컴퓨터가 이미지를 픽셀 값으로 보는 것은 골치 아픈 문제들을 만듭니다. 조금 옆으로 이동해서 대상을 찍거나, 조명 차이, 자세 차이, 일부분만 나타나는 등의 약간의 변화에도 큰 격차가 생겨 대상을 인식하지 못 하기 때문입니다. 따라서 알고리즘은 이러한 변화에도 큰 영향을 받지 않고 (Robust) 객체를 인식할 수 있어야 합니다.

사진 10
[출처 : CS231n 강의자료]

처음 사람들은 이미지 분류 문제를 해결하기 위해서 위의 그림과 같은 방식으로 접근했습니다. 읽어들인 이미지에서 테두리를 추출하고, 꼭지점에 해당하는 곳들을 보면서 객체의 특징을 찾은 뒤 분류를 합니다. 그러나 이 방식은 작은 변화에도 큰 영향을 받고, 새로운 객체를 인식시키려면 새롭게 만들어야 한다는 단점이 있습니다.

사진 11
[출처 : CS231n 강의자료]

그래서 사람들은 Data-Driven Approach(데이터 중심 접근방식)을 고안해냅니다. 이전의 방식과는 달리, 수 많은 label이 달린 이미지 데이터셋을 바탕으로 고안된 방법입니다. 각 카테고리별로 수 많은 데이터셋을 수집한 뒤, Machine Learning Classifier를 학습시켜 객체를 인식하게 됩니다.

따라서 이미지 분류 알고리즘에 대한 생각도 조금 바뀌게 됩니다. 이미지를 넣으면 label이 나오는 단순한 함수에서 images, label을 넣으면 model이 나오는 train함수와 model, test_images를 넣으면 test_labels가 나오는 predict 함수로 말이죠.

Nearest Neighbor

사진 12
[출처 : CS231n 강의자료]

우선 Nearest Neighbor를 먼저 살펴보겠습니다. Nearest Neighbor의 알고리즘은 단순합니다. train에서 모든 이미지와 label을 기억한 뒤, predict에서 기존의 이미지와 새로운 이미지를 비교하여 가장 유사한 이미지로 label을 예측합니다. Nearest Neighbor를 사용한 결과 오른쪽과 같은 결과를 얻을 수 있었습니다.

사진 14
[출처 : CS231n 강의자료]

그렇다면 Nearest Neighbor는 두 이미지가 유사한 지 어떤 기준으로 판단할까요? 일반적으로 거리를 사용하며 위의 사례에서는 L1 distance (manhattan distance)를 사용했습니다. 위의 그림을 보면 알 수 있듯이 L1 distance는 각 이미지 픽셀끼리의 차이에 절대값을 취하여 모두 더한 값입니다. 즉, 현재 test image와 training image는 서로 456의 차이를 가지는 것이죠. Nearest Neighbor는 이 값이 가장 작은 값을 가장 유사한 이미지라고 판단하게 됩니다.

사진 15
[출처 : CS231n 강의자료]

위의 코드가 L1 distance를 사용하여 Nearest Neighbor Classifier를 구현한 코드입니다. 유의해야 할 점은, Train 함수의 시간복잡도보다 Predict 함수의 시간복잡도가 더 짧다는 것입니다. 일반적으로 사람들은 학습에서는 시간이 오래걸려도 괜찮지만 예측에서는 시간이 짧게 걸리길 바라기 때문에, 이는 큰 단점으로 다가옵니다.

K - Nearest Neighbor

사진 16
[출처 : CS231n 강의자료]

왼쪽의 첫 번째 그림 Nearest Neighbor를 한 결과를 나타낸 것입니다. 그림을 보면 몇 가지 특징이 보입니다. 첫 번째로 녹색 지점 한 가운데에 노란 점이고, 두 번째로는 어느 부분에서 다른 영역을 침범하는 모습을 보인다는 점입니다. 즉, 이미지 분류에 있어서 일반화가 부족하다는 점입니다.

그래서 사람들이 고안해낸 방법이 KNN 방법입니다. 가장 가까운 하나의 이웃을 찾는 것이 아닌 K개의 이웃을 찾아서 투표한 뒤, 가장 많은 레이블로 예측하는 알고리즘입니다. 오른쪽의 그림들이 K를 1보다 크게 지정했을 때의 결과입니다. K = 1일 때 나타나던 특징들이 모두 없어졌다는 점을 확인할 수 있습니다.

사진 17
[출처 : CS231n 강의자료]

KNN 알고리즘은 K뿐만 아니라 distance metric도 조절할 수 있습니다. 앞서 우리는 L1 distance만을 사용하여 분류기를 만들었습니다. 그러나 L1 distance가 아닌 L2 distance를 선택해도 됩니다. 실제로 L2 distance를 사용했을 때가 L1 distance를 사용했을 때보다 경계가 훨씬 자연스러운 것을 알 수 있습니다. 일반적으로 L1 distance는 좌표계의 영향을 많이 받으므로 특징 벡터의 요소들이 개별적 의미를 가질 때 사용하면 좋고, L2 distance의 경우 요소들의 실질적 의미를 잘 모를 때 사용하면 좋습니다.

Hyperparameters

K나 distance와 같은 이러한 변수들을 우리는 하이퍼 파라미터라고 부릅니다. 이 변수들은 학습과정에서 자연스럽게 찾아지는 것이 아니기에 직접 정해야 합니다. 그렇다면 어떤 기준으로 이 값을 찾을 수 있을까요?

사진 18
[출처 : CS231n 강의자료]

강의에서는 총 3가지 아이디어를 이야기합니다. 첫 번째는 전체 데이터에 대해서 최고 성능을 내는 값을 선택하는 것입니다. 이 방법은 훈련 데이터셋에 대해서는 좋은 성능을 낼 수 있으나 새로운 데이터에 대해서는 제대로 분류하지 못하는 문제가 발생합니다. 즉, 과적합으로 인해 새로운 데이터는 제대로 예측하지 못하게 됩니다.

두 번째는 훈련 데이터셋과 테스트 데이터셋을 나눠, 훈련 데이터셋만으로 최적의 파라미터를 구하는 방법입니다. 첫 번째보다는 나은 방식이나 여전히 '새로운' 데이터를 완전히 대비하진 못합니다. 최적이라고 생각했던 파라미터가 어쩌면 테스트셋에 대한 것만일 가능성도 있기 때문입니다.

그래서 최종적으로는 데이터셋을 총 train, test, validation set으로 구성해야 합니다. train 데이터셋을 통해 모델을 학습시키고, 이를 validation 데이터셋으로 평가하며 최적의 파라미터를 추정합니다. 마지막으로 test 데이터셋을 통해 모델의 성능을 평가하는 것입니다.

image
[출처 : CS231n 강의자료]

데이터셋이 작을 경우, 위와 같이 Cross Validation이라는 기법을 사용할 수 있습니다. 하지만 딥러닝의 경우, 연산량이 많기 때문에 사용되지 않는 경향이 있습니다.

우선 데이터셋을 train과 test로 분할해줍니다. 그리고 train을 원하는 만큼 나눠줍니다. 위의 그림처럼 번갈아가면서 validation을 정하고 초록색 fold로는 학습을, 노란색 fold로는 최적의 파라미터를 찾는 것입니다.

image
[출처 : CS231n 강의자료]

위와 같은 방법을 통해 KNN의 하이퍼파라미터를 찾을 수 있습니다. 하지만 이미지 분류에 있어서 KNN은 사용되지 않습니다. 왜냐하면 test 시간이 오래걸린다는 점과 이미지간의 유사도를 측정하는 방식으로 사용되는 Distance Metrics가 유사도의 기준으로 적당하지 않는다는 점 때문이죠. 가장 왼쪽의 사진이 원본이고, 오른쪽의 사진들은 왼쪽의 사진들을 조금씩 변형한 것인데요. 이 오른쪽 사진들은 L2 distance로 유사도를 구하면 모두 같은 유사도를 가지는 결과를 보여줍니다.

image
[출처 : CS231n 강의자료]

또한 KNN은 차원의 저주 문제와 관련이 있습니다. 이미지는 굉장히 다 차원의 데이터입니다. 이를 KNN 분류기를 통해 잘 분류하기 위해서는 굉장히 데이터가 촘촘하게 존재해야합니다. 그렇지 않으면 새로운 이미지가 들어왔을 때 제대로 분류해내지 못할 가능성이 굉장히 높습니다. 즉, 높은 차원에서 좋은 성능을 내기 위해서는 데이터가 무수히 많아야 하는데, 원하는 만큼의 데이터를 수집하기는 거의 불가능합니다.

Linear Classification

Linear Classification은 NN과 CNN 등의 딥러닝 알고리즘의 기반이 되는 알고리즘으로 가장 단순한 parametic model입니다.

image
[출처 : CS231n 강의자료]

parametic model은 데이터가 특정 분포를 따른다고 가정하고, 학습과정에서 모델의 가중치가 구해지는 형태의 모델을 의미합니다. 그림을 보면 알 수 있듯이 Lieanr classifier는 크게 W, x, b로 구성됩니다. 여기서 x는 input을 의미하고 W는 가중치를, b는 bias를 의미합니다.

모델은 가중치와 input을 곱해준 뒤 bias를 더해주는 연산을 통해 총 10개의 숫자를 output으로 산출합니다. 이 10개의 숫자는 10개의 카테고리에 대한 스코어로 이 값이 높으면 해당 카테고리일 가능성이 크다는 것을 의미합니다.

파라미터를 사용하지 않는 KNN과는 다르게 Linear classifier에서는 파라미터인 W를 구하는 것이 가장 중요한 일이 됐습니다. train 과정에서 W를 찾으면서 기존에 KNN의 test time이 오래 걸리는 문제를 해결할 수 있게 됐습니다.

image
[출처 : CS231n 강의자료]

강의의 예시를 보겠습니다. 이미지는 2x2 사이즈이며 class는 총 3개입니다. input으로 받은 이미지를 4x1의 벡터로 펼쳐서 가중치 행렬 w와 내적을 해줍니다. 그리고 bias를 더해줌으로서 class에 대한 최종 스코어를 구하는 것입니다. 예시에서는 고양이 이미지를 넣었으나 개라고 분류하고 있는데요. 이는 아직 모델이 제대로 학습하지 못했음을 암시하고 있습니다.

image
[출처 : CS231n 강의자료]

실제로 CIFAR-10의 데이터를 바탕으로 linear classifier의 W를 학습시킨 결과를 이미지로 나타내면 위의 그림과 같이 나타납니다. 굉장히 흐릿하긴 하나 약간은 각 class의 이미지들이 담겨있는 것을 확인할 수 있습니다. 동시에 정확하지 않다는 점들도 눈에 띕니다.

각 class당 하나의 대표 이미지만 학습 가능하다는 점이 단점이지만 이는 나중에 복잡한 모델로 들어가면서 해결하게 됩니다.

image
[출처 : CS231n 강의자료]

Linear classifier를 좀 더 확장된 관점으로 봅시다. 이미지를 그대로 받아드리는 것이 아닌 고차원에서의 하나의 점으로서 보는 것입니다. 그렇게 되면 위의 그림과 같이 linear classifier는 각 class를 구분시켜주는 선형 경계를 그어 나가는 역할을 하게 되는 것이죠.

image
[출처 : CS231n 강의자료]

하지만 이 역시 만능은 아닙니다. 위의 그림처럼 parity problem이나 multimodal problem 등은 선형 경계만으로는 분류해내기 어렵다는 단점을 가지고 있습니다.

post-custom-banner

0개의 댓글