AIFFEL 수업과정 중, 딥러닝 이론 수업이 학생들과 토론, 질문하는 것의 최정점이 아닐까한다. 이 시간만 되면, 전공에 관계없이 다들 혼이 나가 필기를 열심히 하고 있고, 나도 마찬가지로 오후 시간을 그렇게 보냈다. 몰아치는 이론과 몰아치는 교수님의 영어,,, 우리는 모두 폭풍을 견뎌내고 있다. 어떻게 지나는지 모를 오후 시간이다. 이해한 바를 설명한 이후의 학생의 첨언들이 이 시간을 채워준다. AIFFEL 과정에서 이 수업의 CNN의 인트로 부분은 건너뛰고 Lec.2부터 진행했다.
Lecture 2. Image Classification
이번 강의는 우리의 목표인 좋은 분류기를 만들기 전,
- 컴퓨터에서 분류라는 주제가 왜 어려운 문제인가.
- 분류기의 정말 기본적인 이론 이야기 : KNN
- Linear Classification
에 대해 알아봤다.
1. 컴퓨터에서 수행하는 분류 작업이 왜 어려운가?
우리는 고양이 보면 고양이, 개 보면 개 라고 구분할 수 있다. 이미지 그대로를 저장하고 있기 때문이다. 하지만 컴퓨터는 무엇이든지, 지금 내가 입력하고 있는 글조차도 숫자로 인식한다. 0과 1로만 이루어져 있는 컴퓨터의 세계엔 고양이고 뭐고 인식할 수 없어 분류하기 힘들어진다. 컴퓨터가 보는 고양이는?
이미지가 가진 명도에 따라 0~255 사이의 수로 이루어진 행렬일 뿐이다.
고양이를 보는 카메라가 와리가리한다면? 컴퓨터가 받아들이는 숫자들도 다 바뀌게 될 것!
이미지가 갖고 있는 숫자를 이렇게 변하게 하는 이유를 몇 가지 알아보면
- Illumination : 조명에 의한 명암 차이
- Deformation : 일반적이지 않은 모양
- Occlusion : 일부 혹은 대부분이 가려진 상태
- Background Clutter : 주위 배경과 물체의 색이 비슷한 경우
- Intraclass Variation : 여러 물체가 같이 있는 경우
등이 있다.
초반 이미지 분류기 기법에서는 이미지가 갖고 있는 Edge를 특징으로 삼아 이미지를 분류하려는 시도를 했다. 하지만 이런 시도는 모든 경우에 대한 분류기를 새로 작성해야하며, 특징들을 새로 구축해야한다는 단점이 있다. 머신러닝 관점에서 이를 보완하기 위해, 데이터를 많이 모아 학습시키고 테스트하는 분류 기법을 만들게 되었다.
2. Nearest Neighbor
예시 데이터셋은 CIFAR10 으로 클래스 10개, 학습 데이터 50000개, 테스트 데이터 10000개로 이루어져 있다.
import numpy as np
class NearestNeighbor:
def **init**(self):
pass
def train(self, X, y):
self.Xtr = X
self.ytr = y
- 'train' 함수에서 학습 데이터를 변수에 기억하는 과정을 거친다.
def predict(self, X):
num_test = X.shape[0]
Ypred = np.zeros(num_test, dtype = self.ytr.dtype)
for i in xrange(num_test):
distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
min_index = np.argmin(distances)
Ypred[i] = self.ytr[min_index]
return Ypred
- 테스트 이미지 중 학습 데이터와 가장 가까운 (가장 값이 적은) 이미지를 찾아 클래스를 예측한다.
여기서 문제점은??
N 개의 데이터가 있을 때, 예측의 시간 복잡도가 학습 시간 복잡도보다 크다는 문제가 발생한다.
Train O(1) <<< Predict O(N)
(시간 복잡도에 관한 내용은 [여기]에서 다룰 예정이다.)
계속해서 K-Nearest Neighbors(줄여서 KNN)의 개념을 살펴보기 위해, 정중앙에 있는 노란색 점을 어느 공간에 있는 점인지 분류하는 과정을 보자.
그림에서 K는 분류하고자 하는 데이터(중앙의 노란색 점)에서 가장 가까운 점의 개수이다. 이를 강의에서 'Majority vote'로 표현한다. K가 커질수록 경계가 더 부드러워지며, 흰 부분이 조금씩 늘어남을 볼 수 있는데, 흰 부분은 점들로 결정할 수 없는 부분이다.
여기서 다시 거리에 대한 개념이 추가된다.
교수님이 거리의 관점으로 봤을 때 둘 다 원이라고 했던 부분이 계속 걸려 파기 시작했는데,
나는 이렇게 이해했다.(뇌피셜....)
- L1: 1차원에서의 원으로 벡터 원소 간의 차이의 절대값이 곧 거리.
- L2: 2차원에서의 원으로 벡터 간의 거리를 거리로 생각하는 것이다.
- 원이 한 점에 이르는 거리가 일정한 평면 위의 점들의 집합으로 정의되는 도형으로 정의되기 때문에, 차이를 거리로 정의했을 때, 거리가 같은 점들을 모아 그린 도형은 위 그림과 같음을 알 수 있다. 개념적 차이가 있다고 이해했다.
그림에서 보면, L1의 경우 좌표축을 회전하면 놓여진 모양이 바뀐다. 하지만 L2의 경우, 좌표축의 회전에 영향이 없는 것을 알 수 있다.
k-NN에서 중요 요소 중 하나는 K로 알고리즘에 가장 잘 맞게 찾아야 하는 하이퍼파라미터로 취급한다. Trial-Error..? 문제에 매우 의존적인 요소이기 때문에 모든 경우를 적용해보고 가장 좋은 것을 선택해야한다.
K 설정에 대한 아이디어
- 모든 데이터에 적용해보기 : BAD - K=1 학습데이터에 잘 맞기 때문
- 학습 데이터/테스트 데이터로 나눈 후, 테스트 데이터에 가장 잘 맞는 K 값 찾기 : BAD - 새로운 데이터에 알고리즘이 어떻게 적용되는지 알 수 없음
- 학습 데이터/검증 데이터/테스트 데이터로 나눈 후, 검증 데이터에서 가장 잘 맞는 K 값 찾기 : Better!
- Cross-Validation(교차검증)
- 학습 데이터를 몇 부분으로 나누어(강의: 5부분), 한 부분을 검증 데이터로 설정한 후 K 값 찾기
- 변별력이 높아지나 학습 데이터가 많은 경우, 연산량이 많아 사용하지 않음
하지만 K-Nearest Neighbor은 이미지 데이터 분류에서 절대 사용하지 않는다.
- 테스트 시간이 너무 느리다.
- 거리의 개념이 이미지에는 적절하지 않다. 이미지가 가지는 조그마한 변형에도 영향이 크기 때문
- 차원의 저주 : 높은 성능을 바랄 수록 데이터 양이 많아야 하고, 차원이 커지게 되면 데이터를 담을 수 있는 공간이 늘어나기 때문에, 데이터끼리의 거리가 멀어지게 된다. 거리가 멀어질 수록 데이터는 더 많이 필요하게 될 것이고, 필요한 데이터가 기하급수적으로 늘어나게 된다. 그로 인해, 모델 학습에 필요한 연산량도 증가하게 된다.
요약
- KNN 분류기는 nearest training set의 기반으로 한 라벨을 예측한다.
- L1, L2, K는 하이퍼파라미터로 많은 Trial-Error 과정을 거쳐 모델에 맞는 적절한 값을 찾아야한다.
- 검증 데이터셋을 이용해 하이퍼파라미터를 결정한다.
3. Linear Classifier
Neural Network는 Linear Classifier라는 이름의 레고를 쌓은 것과 같다. ? 무슨 소리일까?
신경망(Neural Network) 모델을 만들 때, 분류기를 차곡차곡 모아 만드는 모양과 같아 나온 이야기인데, 신경망 중 대표적인 Convolution Neural Network(CNN)의 생김새를 보면 이해가 갈 것이다.
그림을 보면 신경망 안에 레이어가 굉장히 다양하고 많은 것을 알 수 있다. 신경망에서는 다양한 레이어를 층처럼 쌓아 모델을 만들게 된다. 이번 강의의 후반부에서는 기본적인 레이어를 구성하는 Linear Classifier에 대해 설명한다.
Linear Classifier에서는 이미지를 매개변수화(parametric)하여 행렬로 만든다.
테스트 이미지 입력값 x, 학습 모델의 템플릿(학습된 모델의 대표 데이터)을 행렬화한 W로 나타내면, 모델을 함수식 f(x,W)으로 표현할 수 있다. 이미지 데이터를 함수에 넣었을 때, 가장 큰 값을 가지는 클래스가 모델이 예측한 클래스이다. 선형 분류기 이름에 걸맞게 이 모델은 선형식으로 표현되는데 식은 아래와 같다.
f(x) = Wx
예시로 다시 CIFAR10 데이터를 들고 왔다. 입력값으로 들어갈 데이터는 32x32x3 행렬의 이미지로 3072x1(32x32x3 데이터를 열 데이터로 늘어놓은 모양)의 데이터를 가진다. W 행렬은 10개의 클래스를 가지는 CIFAR10로 학습된 모델의 대표 이미지 데이터로 10x3072 크기의 행렬을 가진다. 행렬 W와 x를 곱한 모델의 결과값(10x1)은 클래스 별로 가지는 score 값으로 가장 큰 값을 가지는 클래스가 예측된 클래스이다.
이 식이 가지는 문제는 학습 데이터가 얼마나 편향되어 있는지 반영되어 있지 않다는 것이다. 이를 보완해주기 위해, bias 항을 더해준다. bias 항은 클래스 당 학습 데이터의 양을 반영해준다. 예를 들어, 고양이 데이터가 비행기 데이터보다 훨씬 많다면 bias도 그를 따라 고양이 클래스의 bias 값이 비행기의 것보다 큰 값을 갖는다. 여기까지 반영한 식은 아래와 같다.
f(x) = Wx + b
여기서 또 문제가 발생하게 된다. 우리는 하나의 W만 쓰게 된다는 것이 문제! 만약 W가 잘 못된 값이라면? 이 템플릿만 보더라도 말 머리가 두 개인 데이터를 적용하게 될 수도 있다!
그리고 클래스 구분을 선형으로 하게 되기 때문에, 아래 그림과 같이 분류기 모델을 적용할 수 없는 사례도 발생하게 된다.
그래서 모델 설정 시, W의 값을 최대한 잘 설정해야한다.
밑도 끝도 없이 끝난 것 같지만 이번 시간은 여기까지 :-)/
다음 시간에는 Linear Classifier에서 W의 성능을 판단하기 위한 loss function(손실 함수), 최대한 좋은 값의 W을 구하기 귀한 Optimization(최적화)를 배우기로 한다.
것보다 티스토리 마크다운 넘 불편행........ 깃허브는 시작부터 어려워................ 얼른 깃허브블로그 만들거야........
'인공지능 > 인공지능 수업' 카테고리의 다른 글
[CS231n] CNN for Visual Recognition Lec 3 (1) | 2021.01.15 |
---|