우리가 보는 이미지와 컴퓨터가 보는 이미지는 굉장히 다르다. 만약 고양이 사진을 본다면 우린 고양이 자체를 보지만, 컴퓨터는 고양이 이미지를 이루고 있는 여러개의 숫자들의 집합을 본다. 이런 이유로 컴퓨터 비전에서 우리가 해결해야 할 문제는 굉장히 많다.
이런 문제점들을 모두 고려하여 이미지를 분류하는 코드를 작성한다? 이것은 불가능하다. 예를 들어 정말 복잡한 코드를 작성해서 고양이의 특징들을 잘 찾는 코드를 작성했다고 가정한다. 위에서 언급한 빛의 각도, 세기, 자세의 변화, 사물에 가려져 있는 정도 등에 큰 영향을 받지 않고 강인하게 이미지 내의 고양이를 찾을 수 있는 코드를 만드는 것 자체가 불가능에 가깝지만, 이런 코드를 만들었다고 할지라도 만약 강아지를 인식하려면? 자동차를 인식하려면? 해당 물체에 대한 코드도 각각 작성해야 한다. 세상에 있는 모든 물체에 대한 코드를 작성하는 것은 말이 되지 않는다.
위에서 언급한 문제를 해결하기 위한 방법이다. 간단하게 요약하자면 많은 양의 이미지와 해다 이미지에 대한 라벨을 컴퓨터에게 학습시키는 방법이다. 어떤 물체 이미지를 인식하기 위한 코드를 우리가 작성하는 것이 아니라 컴퓨터에게 많은 양의 데이터를 제시해줌으로 컴퓨터가 코드를 작성하게 하는 방식이라고 생각하면 쉽다. 해당 개념을 이용한 알고리즘들을 살펴본다.
NN은 학습 데이터를 그대로 학습함에 있어서 문제가 생긴다. 예를 들어 몸무게와 키에 대한 데이터가 있다고 할 때 키가 190인데 몸무게가 40인 데이터가 있다고 가정한다. 이것은 일반적인 데이터가 아니다. 하지만 해당 데이터로 인해 키가 190인 데이터를 예측할 때 몸무게를 40으로 예측할 가능성이 생긴다. 이런 잡음이나 이상치에 취약한 문제로 인해 수정된 알고리즘이 제시된다.
이런 KNN 알고리즘은 굉장히 단순하지만 여러 경우에 처음으로 적용해보기 좋은 알고리즘이다. 예를 들어 글에서 문단을 알기 위해서는 문장과 문장 사이의 간격 정도를 체크하면 될 것이다. 이 경우에 KNN을 사용한다면 문단과 문단 사이는 큰 간격 데이터, 문장과 문장 사이는 작은 간격 데이터로 구분되어 새로운 간격 데이터가 입력되었을 때 이 간격이 큰 부류에 속하는지 작은 부류에 속하는지 KNN알고리즘으로 분류해 문단과 문장을 분류할 수 있을 것이다.
Hyperparameter
하이퍼파라미터란 위에서 말한 KNN의 K와 비슷한 종류의 파라미터를 의미한다. 모델의 퍼포먼스를 결정하는 매개변수라고 생각하면 쉽다. 예를 들어 격투기 로봇의 하이퍼파라미터를 가정해 본다면 팔 길이, 파워, 속도 등을 예로 들 수 있을 것이다. 이런 하이퍼파라미터를 설정할 때 내가 가진 데이터를 학습할 때 좋은 성능이 나오도록만 설정하는 것은 좋지 않다. 왜냐하면 과적합으로 인해 새로운 데이터가 입력되었을 때 오히려 새로운 데이터에는 성능이 좋지 못할 가능성이 높기 때문이다. 머신러닝의 목표는 가지고 있는 데이터를 얼마나 잘 추측하느냐가 아니다. 가지고 있는 데이터를 활용해서 새로운 데이터가 입력되었을 때 새로운 데이터에 대한 예측을 얼마나 잘하느냐가 관건이다. 그래서 우린 가지고 있는 데이터를 3부류로 나누어 학습하고 검증하고 테스트하는 과정을 거치는 것을 가장 좋은 방법이라고 여긴다. 일반적으로 전체 데이터를 train, validation, test 3가지로 분류해놓고 학습하고 검증하며 테스트하지만, 더 발전된 방법들도 존재한다.
KNN 알고리즘은 이미지 분야에 실제로 쓰이지 않는다. 너무 느리고 약간의 변화만 줘도 같은 이미지로 분류를 잘 하지 못하는 것이 이유다.