반응형

1. Image Classification Pipeline [cs231]

석사 1학기를 시작하며 "비전 데이터 딥러닝" 과목을 수강 신청하고 오늘 첫 수업을 다녀왔다.

본 강의의 base가 cs231n 강의라고 하여 방학동안 공부했던 내용들을 복습도 할 겸 처음부터 다시 강의를 들으며 블로그에 정리할 예정이다.

본 강의는 YouTube에 무료로 공개되어 있고 강의 링크는 다음과 같다. 더보기란에 강의 슬라이드 링크도 포함되어 있으니 이를 활용하여 학습하면 된다.

강의 링크: https://www.youtube.com/watch?v=OoUX-nOEjG0&list=PLC1qU-LWwrF64f4QKQT-Vg5Wr4qEE1Zxk&index=2

 

1강은 Introduction이기 때문에 생략하고 바로 2강부터 진행한다.

 

1. Image Classification

이미지 분류: 컴퓨터 비전의 핵심적인 작업으로 input image가 어떤 category에 해당하는지 prediction하는 작업

 

사람의 눈으로 봤을 때 위 이미지를 고양이로 분류하는 것은 너무나 쉽지만, 머신러닝(including deep learning)에서는 상당히 어려운 일이다. 그 이유는 아래와 같이 이미지 데이터는 0~255의 픽셀값으로 데이터가 구성되어 있기 때문이다. 즉 아래를 보면 800x600 pixel로 구성된 고양이 이미지는 R, G, B 각각의 채널에 대해 800 x 600 사이즈의 픽셀값이 포함되어 있는데 각 채널의 숫자들과 고양이는 의미적으로 관련이 없기 때문에 숫자만으로 cat으로 분류하는 것은 상당히 어려운 일이다.

 

 

또한 위 이미지를 정확히 cat으로 분류하는 것에는 여러 문제가 더 존재한다. 첫째로는 카메라의 촬영 방향에 따라 모든 픽셀 값이 변경되기 때문이다. 이 외에도 조명의 변화, 부적절한 자세, 가려짐(occlusion), 배경과의 유사성, 여러 유사한 클래스의 존재 등 다양한 문제를 고려해야 하기 때문에 상당히 어려운 문제라고 할 수 있다.

 

여러 시도가 있었는데 그 중 하나는 아래와 같이 물체의 edge들을 추출하여 그것들을 계산하여 눈, 코, 입 등 중요한 정보의 값들과 비교하여 cat이라고 분류하는 것이다. 하지만 이러한 방법은 잘 작동하지 않았다.

 

이후 많은 연구들은 위와 같이 특징에 따른 분류 작업을 hard-coding 하는 방식이 아닌 데이터 주도의 접근법을 연구했다.

 

 

데이터 주도 접근법에서 첫 번째 작업은 인터넷에서 각 레이블에 알맞는 이미지들을 수집하여 데이터셋을 구성하는 것이다. 그리고 머신러닝 분류기를 해당 데이터와 레이블을 활용하여 훈련하고, 새로운 테스트 이미지에 대해 어떠한 성능을 보이는지 평가하는 방식으로 구성되어 있다. 최근에 활용하는 딥러닝 방식도 모두 이러한 순서로 구성되어 있다.

 

이와 같은 Data-Driven Approach의 첫 번째 분류기는 최근접 이웃(Nearest Neighbor) 방식이 있다. 최근접 이웃 방식은 상당히 쉽고 간단한 방식이지만 성능이 좋아 아직도 간단한 작업에는 사용되는 머신러닝 알고리즘이다.

 

먼저, 훈련 단계에서는 아무것도 하지 않고 단지 훈련 데이터와 훈련 레이블을 기억시킨다. 그리고 예측 단계에서는 새로운 이미지가 들어 왔을 때 기억하고 있는 데이터와 가장 유사한 레이블을 출력하는 방식이다.

 

 

내용을 설명하기 위해 이 강의에서 사용되는 데이터셋은 CIFAR10이라는 데이터셋으로, 10개의 카테고리에 대해 32x32x3의 정보가 담긴 총 60,000개의 이미지로 구성된 데이터셋이다. 좌측은 각 레이블에 대한 이미지이고, 우측은 최근접 이웃 알고리즘을 활용하여 새로운 이미지를 넣었을 때 어떤 유사한 이미지들을 찾았는지에 관한 그림이다. 다른 이미지들도 있으나 상당히 간단한 알고리즘에도 불구하고 높은 정확도로 유사한 이미지들을 찾는다는 것을 확인할 수 있다.

 

2. Distance Metrics

최근접 이웃 알고리즘을 이해하기 위해서는 Distance Metric에 대한 이해가 필요하다. 이것은 선형대수의 Norm 개념을 사용하는 것으로써, 거리를 계산하는 방법이다.

 

테스트 이미지와 기억하고 있는 모든 훈련 이미지를 비교하기 위해서 L1 거리를 사용한다. 이는 두 이미지 간의 각 픽셀의 차이의 절대값의 합으로 표현한다. 이렇게 픽셀간의 차이가 가장 작다면 가장 유사한 클래스라고 판단할 수 있기 때문이다. 코드를 예제로 보면 다음과 같다.

 

train() 함수에서는 변수에 데이터들을 할당하여 각각을 memorize하고 predict() 함수는 L1 distance를 계산하여 가장 거리가 가까운 요소를 찾아 반환하여 해당 label을 반환한다.

 

이제 한 가지 질문을 던져볼 수 있다. 최근접 이웃은 얼마나 빠를까? N개의 예제가 있을 때 시간 복잡도 차원에서 보면 훈련 과정은 단순히 기억만 하고 있기 때문에 O(1)의 시간 복잡도를 갖는다. 하지만 예측에는 O(N)의 시간 복잡도를 갖는다. 즉, 훈련은 빠르고 예측이 오래 걸린다.

하지만 이러한 방식은 좋은 방식이 아니다. 실제 task에서 사용하기 위해서는 훈련이 오래 걸리더라도 예측이 빨라야 한다.

 

이제 다음으로 넘어가서, 정확하게 최근접 이웃 알고리즘이 어떤 식으로 작동하는지 결정 영역(decision regions)의 그림을 보고 이해하자.

 

위 그림을 보면 2차원 평면에 여러 색의 점들과 5가지 색으로 구분된 구역이 나눠진 것을 볼 수 있다.

각각의 점들은 훈련 데이터이고 5가지 색의 배경으로 구분된 영역들은 이에 대한 각각의 레이블이라고 이해하면 된다.

하지만 이 방식은 그렇게 좋지 않다는 것을 확인할 수 있는데, 그림의 중앙의 영역을 보면 하나의 노란 점은 초록 영역에 있거나 초록색 영역이 파란색 영역을 침범하는 등의 문제가 발생하는데 이는 옳지 않게 분류를 이끌 수 있다. 이는 가장 가까운 1개의 데이터와 비교를 하기 때문인데, 이러한 이유로 majority vote 라는 방법을 도입하여 가장 가까운 K개의 점들과의 거리를 비교하여 cluster를 구성하는 K-Nearest Neighbor 알고리즘이 생겼다.

 

실제 K를 조금씩 증가시키며 decision boundary를 확인해보면 조금 더 정확하게 영역을 구분하는 것을 확인할 수 있다.

 

지금까지는 L1 distance를 이용했지만 L2 distance를 이용하는 방법도 있다.

 

L2 distance는 유클리드 거리라고도 하며 각 차이의 제곱의 제곱근을 거리로 이용하는 방법이다. 각 입력값의 요소가 개별적인 의미를 갖고 있다면 L1 distance가 잘 어울리지만 요소들 간의 실질적인 의미를 잘 모르는 경우 L2 distance가 더 잘어울린다.

 

3. Hyperparameters & Splitting Data & Cross-Validation

지금까지 모델을 구성하면서 어떤 K를 선택하고 어떤 distance 기준을 선택하는지에 따라 많은 성능 차이가 있다는 것을 확인했다. 이와 같이 모델을 구현하는 이가 직접 정해야되는 것들을 하이퍼파라미터라고 한다. 좋은 모델을 만들기 위해서는 다양한 하이퍼파라미터를 하나씩 넣어보고 최고의 하이퍼파라미터를 선택해야 한다. 그런데 단순히 훈련 데이터의 성능을 최대화하는 방식으로 진행하는 것은 좋지 않다. 그 이유는 모델의 일반화 성능을 높이는 것이 목표인데, 즉 한번도 본 적 없는 데이터에 대해서 높은 성능을 보이는 것이 목표이기 때문에 데이터를 분리할 필요가 있다. 그래서 Train, Test와 같이 데이터셋을 구분하는 방법을 생각할 수 있다.

 

 

하지만 이 방식 또한 좋은 방식이 아니다. 그 이유는 테스트셋에서만 좋은 성능을 보이는 모델로 적합되기 때문이다.

이에 가장 좋은 방식은 데이터의 대부분을 훈련 데이터로 나누고, 일부는 검증 데이터(validation), 그리고 나머지는 테스트 데이터로 나누는 것이다. 테스트 데이터는 훈련 과정 중에 절대 사용하지 말고 최적의 하이퍼 파라미터를 찾기 위해서는 검증 데이터만을 사용하고 최종 테스트에서만 테스트 데이터를 사용하는 것이 가장 옳은 방식이다. 이를 그림으로 나타내면 다음과 같다.

 

그리고 하나의 하이퍼파라미터 선택 전략이 더 있는데 교차 검증(cross validation)이라는 방식이다.

이 방식은 데이터셋 중 테스트 데이터셋을 정해놓고 나머지 데이터를 몇개로 쪼개어 훈련/검증 데이터셋으로 나누고 번갈아 가면서 검증 데이터셋으로 사용하여 평균적인 성능을 확인하는 것이다.

 

4. K-Nearest Neighbor & Curse of Dimensionality

이제 다시 한번 K-최근접 이웃 알고리즘으로 돌아와 보자. 이 방식은 거의 사용되지 않고 있는데 그 이유 중 가장 큰 이유는 테스트 시간이 오래 걸린다는 것이고, 픽셀에 대한 거리 평가는 유의미한 정보가 없어 여러 noise에 약하기 때문이다.

 

속도가 느린 이유를 이해하기 위해 차원의 저주(curse of dimensionality)에 대해 알아보자.

단순히 1차원에서의 4개의 점은 4개로 나타낼 수 있지만, 2차원에서의 4개의 점은 제곱수인 16개, 3차원이라면 64개로 기하급수적으로 늘어나는 것을 확인할 수 있다. 대부분 디지털 이미지는 R, G, B 3개의 채널로 구성되어 있고 이에 대해 각각 픽셀이 포함되는데, 그렇다면 최근 고화질 이미지의 픽셀을 생각했을 때 엄청난 연산이 필요하고 따라서 예측을 수행할 때 매우 오래 걸릴 것이라는 것을 이해할 수 있다.

 

5. Linear Classification

이제 이미지 분류를 하는데 K-최근접 알고리즘은 그렇게 좋지 않은 선택지라는 것을 알게 되었다.

지금부터는 선형 분류(linear classification)에 대해서 배워 보고자 한다. 선형 분류는 상당히 간단한 알고리즘이지만 딥러닝까지 이어지는 아주 중요한 내용이다. 그 이유는 신경망(neural network)는 아래 이미지와 같이 선형 분류기 여러 개를 레고 블럭을 조립하듯이 쌓은 모델이기 때문이다.

 

6. Parameteric Classification

위에서 소개한 선형 분류기는 parametric model의 단순한 형태인데, 행렬과 벡터간의 선형 결합으로 이해할 수 있다.

아래 f(x, W) = Wx의 수식에서 f는 모델이고, x는 원본 이미지, W는 가중치 혹은 파라미터로 이해하면 된다.

즉, 어떤 원본 이미지가 input으로 들어왔을 때 적절한 가중치들이 곱해져 각 카테고리의 확률을 output으로 제공한다.

각각의 class scores는 각 카테고리의 확률을 나타내고 만약 cat의 스코가 높다면 해당 이미지가 고양이일 확률이 높다는 것을 의미한다.

 

계산 과정을 조금 더 상세히 보자면 아래와 같다.

예를 들어 4픽셀로 구성된 예제이고 이때 각 클래스는 cat, dog, ship이라고 가정하자.

이미 구성되어 있는 가중치와 입력 이미지의 픽셀을 각각 곱하여 계산하고 bias(편향)만큼 더해주면 각 클래스의 score가 출력되는 것을 확인할 수 있다.

 

이제 선형 분류기가 어떻게 분류를 하는지 이해하기 위해 훈련된 가중치들을 시각화한 것을 보자.

 

각 가중치를 시각화 한 결과를 보면 색상의 차이에 따라 분류하는 것이라고 추측할 수 있고, 고차원 공간에서 선형 결정 경계를 기준으로 선형적으로 분류됨을 확인할 수 있다.

 

다음 강의에서는 손실 함수(비용 함수), 최적화, 컨볼루션 신경망(CNN)에 대해 학습할 예정이다.