[CS231n] 2. Image Classification Pipeline
📗강의노트/CS231n

[CS231n] 2. Image Classification Pipeline

728x90
반응형
Image Classification은 어떻게 하는 것 일까?

우선 입력 이미지를 받는다. 그리고 시스템에는 미리 정해놓은 카테고리 집합이 존재한다. 이미지를 보고 어떤 카테고리에 속할지 고르는 것.

컴퓨터에게는 이미지는 그저 숫자의 집합에 불과하다. 

카메라를 조금만 옮겨도 모든 픽셀 값이 달라진 것이다. 
그렇기에 우리가 만드는 알고리즘은 이런 상황에데 대해 강인해야한다.
( 조명,자세,가려짐, 배경과 비슷할 때 또한 마찬가지이다. )

직관적이고 명시적인 알고리즘은 존재하지 않는다.


이미지를 보고 edges를 계산하고 , corners와 edges를 각 카테고리로 분류한다. 
-> 하지만 이런 알고리즘은 “확장성”이 없는 것이다. 다른 물체를 인식하려면 다시 처음부터 진행해야 하는 것이 문제이다. 

그래서 “데이터 중심 접근방법(Data-Driven Approach)"가 중요하다. 


물체의 특징을 하나하나 규정하기보다는 각각의 이미지와 라벨이 달린 데이터를 수집한다. 


이제는 하나의 함수가 아니라 2개의 함수가 필요해졌다.

하나는 Train함수이다. 입력은 이미지와 레이블이고, 출력은 우리 모델이다.
다른 하나는 Predict함수이다. 입력이 모델이고, 출력은 이미지의 예측값이다.  

Data-Driven Approach은 딥러닝에서 아주 일반적인 개념이다. 
더 복잡한 알고리즘을 배우기전에 기초적인 분류기를 배우는 것이 좋다. 



< KNN >

Train Step에서는 아무 것도 하지 않고, 그저 학습 데이터를 기억한다.

그리고 predict Step에서는 새로운 이미지가 들어오면 기존의 가장 유사한 이미지로 라벨링한다. 


앞으로 CIFAR-10 데이터를 사용할 것이다. 


중요한 것은 이미지 쌍이 있을 때, 어떻게 비교를 할 것인지가 관건이다. 
어떤 비교 함수를 사용할지를 선택해야한다.

여기서는 “L1 Distance”를 사용했다. 

L1 Dist는 아주 간단한 방법이다. 이미지를 Pixel-Wise로 비교하는 것이다. 

Test Image에서 Train image를 뺀것에 절대값을 취하고 그것을 총합한 것을 결과로 내는 것이다. 

두 이미지간의 차이를 어떻게 측정 할 것인가에 대한 구체적인 방법을 제시한 것이다. 

여기서는 456만큼의 차이를 보인다.  


 
 만약에 N개의 Example이 있다면 Training / Prediction의 시간은 얼마나 걸릴까? -> Training시에는 데이터를 기억하기만 하면 되기 때문에 0이다. 
Predict에서는 이미지를 하나하나 비교해야 하기 때문에 느리다. 

하지만 우리는 학습은 느려도 테스트는 빠르기 바란다.

CNN 같은 Parametic model들은 NN과 정 반대이다. 
Train은 느리고 Test는 빠르기 때문이다. 

NN을 통해 Decision regions를 얻을 수 있다. 
2차원 평면 내의 모든 좌표에서 각 좌표가 어떤 학습 데이터와 가장 가까운지 계산한다. 
NN 분류기는 공간을 나눠서 각 레이블로 분류한다. 
하지만 그렇게 좋지 않다. 
가까운 좌표들을 찾아 카테고리를 나누는 것인데, 노란색이 초록색안에 속해있고, 초록색이 파란색 영역을 침범하고 있다. 이 점은 noise로 볼 수 있다. 
 

그래서 더 일반화된 방법이 바로 KNN이다. 단순히 가장 가까운 이웃만 찾기보다는 더 고급진 방법을 도입할 것이다. 


 Distance Metric을 이용해서 가까운 이웃을 K개 만큼 찾고 이웃끼리 투표하는 방법이다. 가장 많은 득표수를 기록한 레이블로 정한다. 

KNN을 사용할 때는 K는 적어도 1보다 큰 값으로 사용한다.  그래야 결정 경계가 더 부드러워지고 더 좋은 결과를 보이기 때문이다. 

흰색부분은 임의로 처리할 수 있다. 하지만 여기서는 가장 가까운 이웃이 존재하지 않으면 단순하게 흰색으로 칠한 것이다.
 이미지 픽셀들을 하나의 고차원 벡터로 생각하는 관점은 매우 중요하다. 
이 두 관점을 오갈  수 있는 능력은 매우 유용하다. 

이미지를 다루기에는 KNN은 적당하지 않다.  
그리고 KNN을 사용할 때 서로 다른 점들을 어떻게 비교할지 또한 정해야한다. 
지금까지는 L1 Distance = 픽셀간 차이 절대값의 합 을 이용했다. 
하지만 L2 = Euclidean distance를 사용해도 된다. 이는 “ 제곱 합의 제곱근”을 거리로 이용하는 방법이다. 

Distance Metric 을 정해야한다 : L1(Manhattan) Dist / L2(Euclidean) Dist

근본적인 기하학적인 구조가 다르다.  


왼쪽의 사각형은 L1관점에서 보는 원이다.  사각형위의 점들이 원점에서 다 같은 거리를 가지고 있다고 생각한다. 

L2관점에서의 원은 우리가 생각하는 원의 모양과 같다. 

이 두 거리 척도간에는 흥미로운 차이가 있다. 
L1은 어떤 좌표 시스템이냐에 따라 많은 영향을 받는다. ( 좌표계 돌리면 모양이 달라짐 )
하지만 L2는 좌표계와는 아무 연관이 없다.



-> 특징 벡터의 각각 요소들이 개별적인 의미를 가지고 있다면(키, 몸무게) = L1
 
특징 벡터가 일반적인 벡터이고, 요소들간의 실질적인 의미를 잘 모르는 경우 = L2



KNN의 거리척도에 따라 다양한 문제를 해결할 수 있다. 벡터나 이미지 말고도 문장을 분류할 수도 있다. 
거리 척도만 정해주면 어떤 종류의 데이터도 다룰 수 있다. 

어떤 거리 척도를 사용하는지에 따라, 실제 기하학적으로 어떻게 변하는지 알아보자


결정 경계의 모양 자체가 달라진다. L1은 좌표 축의 영향을 받아 결정 경계를 만들었고, L2는 좌표 축의 영향을 받지 않기 때문에 조금 더 자연스러운 결정 경계를 만들었다. 

KNN을 사용하려고 하면 선택해야하는 것이 있다. K와 거리척도, 이를 “하이퍼 파라미터”라고 한다. 하이퍼 파라미터는 Train Time에 학습하는 것이 아니므로 학습 전 사전에 반드시 선택해야 한다. 

그렇다면 하이퍼파라미터를 어떻게  정할까?
이는 문제의존적(데이터와 어떤 문제인지)이다. 다양한 값을 시도해보고 가장 좋은 값을 찾는 것이 방법이다.

가장 좋은 하이퍼파라미터를 정하는 것의 척도는 “학습데이터의 정확도와 성능”을 최대화 하는 하이퍼파라미터를 선택하는 것이다. 

K=1일 경우 Training에서 가장 정확한 모습을 보이지만 약간의 문제가 있다. (Overfit)
K를 더 큰 값으로 선택하는 것이 학습데이터에서는 몇 개 잘못 분류할 수 있지만 새로운 데이터에 대해 더 좋은 성능을 보일 수 있다. 

학습에서의 정확도가 아닌, 새로운 데이터에 대한 정확도가 중요한 것이다.  



학습 데이터로 다양한 하이퍼파라미터 값들을 학습을 시키고 테스트 데이터에 적용시켜본 다음, 하이퍼파라미터를 선택하는 방법이다. 
이 것도 좋은 방법이 아니다. 아예 한 번도 보지 못했던 데이터에서 알고리즘의 성능을 측정해야 한다.  위와 같이 한다면 그저 “테스트 셋에서만” 잘 동작하는 하이퍼파라미터를 고른 것일 수 있다. 데이터에서의 성능을 대표할 수가 없는 것이다. 

그래서 일반적인 방법은 데이터를 3개로 나누는 것이다. 
Train, Validation, Test 으로 나누는 것이다
다양한 하이퍼파라미터로 “training set”을 학습시킨다. 그리고 validation set으로 검증을 하고 가장 좋았던 하이퍼파라미터를 선택한다. 그리고 Test set에 대해 가장 좋았던 분류기를 가지고 “오직 한 번만” 실행하는 것이다. 




또 다른 선택 전략은 “Cross Validation(교차 검증)”이다. 
작은 데이터셋일 경우 사용하고, 딥러닝에서는 많이 사용하지 않는다. 

그냥 트레이닝 데이터로 여러 개를 나누고 번갈아 가면서 validation set을 지정해준다. 여기서는 5-fold로 하고 있다. 처음 4개의 fold에서 하이퍼 파라미터를 학습시키고 남은 한 fold에서 알고리즘을 평가하는 것이다. 그리고 1,2,3,5 fold에서 다시 학습시키고 4fold로 평가한다. 계속 순환한다. 

이를 통해 최적의 하이퍼파라미터를 얻을 수 있다. 
계산량이 많기 때문에 딥러닝에서는 실제로 잘 사용되지 않는다. 
트레이닝 label 0 / validation label x

분산을 같이 계산하게 되면, 어떤 하이퍼파라미터가 가장 좋은지 뿐만 아니라, 그 성능의 분산도 알 수 있다.  

 Validation에서 가장 좋은 성능을 내는 하이퍼파라미터를 선택할 것이다. 



하지만 KNN은 너무 느리고, L1/L2 Distance가 이미지간의 거리를 측정하기에 적절하지 않다는 점이다. 거리 척도들은 이미지들 간의 “지각적 유사성”을 측정하는 척도로는 적절하지 않다.

기존의 사진과 조금씩 변경시킨 이미지를 L2를 통해 비교해봤을 때 모두 동일한 L2 Distance를 가진다. 매우 좋지 않은 현상이다. 
지각적 유사도를 측정하기에 적합하지 않다는 것이다. ( 이미지간의 유사도를 잘 포착해 내지 못한다 )


그리고 “차원의 저주”가 존재한다. KNN이 잘 동작하려면 전체 공간을 조밀하게 커버할 만큼의 충분한 트레이닝 샘플이 필요하다는 것을 의미한다. 
그렇지 않다면 이웃이 사실은 엄청 멀 수도 있고, 그렇다면 테스트 이미지를 제대로 분류할 수 없을 것이다. 

데이터의 양이 증가함에 따라 차원이 기하급수적으로 증가하게 된다. 매우 좋지 않은 현상이다. 고차원의 이미지라면 모든 공간을 조밀하게 메울만큼의 데이터를 모으는 일은 현실적으로 불가능하다.  


 


< Linear Classification >



아주 간단하지만, NN(Neural Network)과 CNN의 기반 알고리즘이다. 기본 블럭이 되는 것이다. 


다양한 종류의 딥러닝 알고리즘들의 가장 기본이 되는 블럭중 하나가 바로 Linear Classifier이다. 이는 전체 NN을 이루게 된다.




Linear Classifier는 “parametic model”의 가장 단순한 형태이다. parametic model에는 두 가지 요소가 있다. 입력 이미지는 고양이 이미지이다.  이를 보통 X로 쓴다. 그리고 가중치 파라미터를 W라고 한다. 그리고 10개의 숫자를 출력하는데 이는 10개 카테고리의 스코어이다. 
 고양이의 스코어가 높다는 것은 입력 X가 고양이일 확률이 크다는 것을 의미한다. 

이제 더이상 test를 할 때 train set을 이용하지 않고 그 요약된 정보가 담긴 W가 중요하게 사용된다. 이는 작은 디바이스에서 모델을 동작시켜야 할 때 아주 효율적이다. 

가장 쉬운 조합은 W, X를 곱하는 것이고, 이 방법을 바로 Linear Classification이다.



dim을 맞춰주고 있는 것을 보여준다. 
32x32x3의 이미지를 쭉 펼치고 이를 내적하기 위해 dim을 맞춰주고 있다. 

bias는 데이터와 무관하게 특정 클래스에 “우선권”을 부여한다. 예를 들어 데이터셋이 불균형한 상황을 볼 수 있다. 

고양이 데이터가 개 데이터보다 훨씬 더 많은 상황이다. 이 상황에서는 고양이 클래스에 상응하는 bias가 더 커지게 된다. 



이 Linear classifier는 2x2 이미지를 입력으로 받고 이미지를 4-dim 열 벡터로 쭉 펼친다. 

고양이 스코어는 입력이미지의 픽셀 값들과 가중치 행렬을 내적한 값에 bias term을 더한 것 이다. 

가중치 행렬 W의 각 행은 각 이미지에 대한 템플릿으로 볼 수 있고, 그 행 벡터와 이미지의 열벡터 간의 내적을 계산하는데, 여기서 내적이란 결국 클래스 간 탬플릿의 유사도를 측정하는 것과 유사함을 알 수 있다.
bias는 데이터 독립적으로 각 클래스에 scailing offsets를 더해주는 것이다.  


Linear classifier는 이미지를 학습한다. 각각의 W들의 행을 이미지화함으로 써 어떤 과정을 거치는지 알 수 있다. 각각의 클래스에 
대한 템플릿 이미지를 나타내는 것이다.

한 클래스 내에 다양한 특징들이 존재할 수 있지만, 모든 것들을 평균화 시키기 때문에 다양한 모습들이 있더라도 각 카테고리를 인식하기 위한 템플릿은 단 하나밖에 없다. 

 Linear classifier가 클래스 당 하나의 템플릿밖에 허용하지 않으므로 이 방법이 최선이다. 하지만 NN같이 복잡한 모델이라면 조금 더 정확도 높은 결과를 볼 수 있을 것이다. 클래스 당 하나의 템플릿만 학습할 수 있다는 것과 같은 제약조건이 없을 때 가능하다. 

또 다른 관점은 이미지를 고차원 공간의 한 점으로 보는 것이다.  



 Linear classifier는 각 클래스를 구분시켜주는 선형 결정 경계를 그어주는 역할을 하게되는 것이다. 

하지만  Linear classifier로 분류하기 힘든 case가 많다. 


 홀짝의 문제와 같은 Parity problem(맨 왼쪽)은  Linear classifier으로 풀기 힘든 문제이다. 

Multimodal problem 또한 풀기 힘들다. (맨 오른쪽)

섬이 두 개인데 선을 하나만 긋는 것은 좋은 방법이 아니다
Multimodal data라면 한 클래스가 다양한 공간에 분포할 수 있으며, 이 문제는  Linear classifier로 풀 수 없다. 

 Linear classifier는 단순히 행렬과 벡터 곱의 형태라는 것을 알았고, 템플릿 매칭과 관련이 있고, 이 관점에서 해석해 보면 각 카테고리에 대해 하나의 템플릿을 학습한다는 것을 배웠다. 그리고 가중치 행렬 W를 학습시키고 나면 새로운 학습 데이터에도 스코어를 매길 수 있다. 


 

다음 강의에서는 Loss function / optimization / ConvNets와 좋은 W를 선택하는 것에 대해 배울 것이다. 
 


 


728x90
반응형