이미지 분류의 수학
본문우편 번호를 손으로 써도 기계가 읽어 낸다. 사람마다 '7'을 쓰는 모양이 다른데, 컴퓨터는 처음 보는 손글씨가 어떤 숫자인지 어떻게 판단할까? 가장 단순한 생각은 이미 정답을 아는 손글씨들 가운데 새 글씨와 가장 닮은 것을 찾는 것이다. 그런데 두 그림이 '닮았다'는 것을 어떻게 수로 잴까?
3.3.1이미지 사이의 거리
두 이미지가 같은 크기의 행렬 \(A\), \(B\)이면, 대응하는 픽셀의 밝기 차이로 닮은 정도를 잴 수 있다. 각 픽셀의 차이를 제곱해 모두 더한 뒤 제곱근을 취하면, 좌표평면의 두 점 사이 거리를 픽셀 수만큼의 차원으로 늘린 것이 된다. 이 값이 작을수록 두 이미지가 닮았다.
같은 크기의 이미지 행렬 \(A = (a_{ij})\), \(B = (b_{ij})\)에 대하여 \[d(A, B) = \sqrt{\sum_{i, j}(a_{ij} - b_{ij})^2}\] 이다. 이미지를 픽셀 수만큼의 성분을 가진 벡터로 보고 구한 유클리드 거리와 같다.
3.3.2k-최근접 이웃
정답을 아는 학습 이미지들과 새 이미지 사이의 거리를 모두 계산하고, 가장 가까운 \(k\)개의 정답 가운데 가장 많은 것을 새 이미지의 답으로 정한다. 이 방법을 k-최근접 이웃(k-NN)이라 한다. 학습이라고 할 만한 계산 없이, 자료를 저장해 두었다가 비교하기만 한다.
그림 1에서 새 점을 두 무리 사이로 옮겨 보자. \(k = 1\)이면 가장 가까운 점 하나가 우연히 다른 무리이기만 해도 판정이 뒤집힌다. \(k\)를 3이나 5로 늘리면 여러 이웃의 다수결이라 한두 점의 우연에 덜 흔들린다. 하지만 \(k\)가 지나치게 크면 먼 점까지 투표에 들어와 경계가 흐려진다. \(k\)를 홀수로 잡는 것은 두 무리를 가를 때 동점을 피하기 위해서이다.1
3.3.3예제 풀이
2 × 2 흑백 이미지를 0(흰색)과 1(검정)로 나타낸다. 학습 이미지 '세로줄' \(\begin{pmatrix} 1 & 0 \\ 1 & 0 \end{pmatrix}\)과 '가로줄' \(\begin{pmatrix} 1 & 1 \\ 0 & 0 \end{pmatrix}\)이 있을 때, 새 이미지 \(\begin{pmatrix} 1 & 0 \\ 1 & 1 \end{pmatrix}\)는 어느 쪽에 가까운가?
세로줄과의 차이는 \(\begin{pmatrix} 0 & 0 \\ 0 & 1 \end{pmatrix}\)이므로 거리는 \(\sqrt{1} = 1\)이다. 가로줄과의 차이는 \(\begin{pmatrix} 0 & -1 \\ 1 & 1 \end{pmatrix}\)이므로 거리는 \(\sqrt{3} \approx 1.73\)이다.
따라서 새 이미지는 세로줄에 더 가깝고, \(k = 1\)이면 '세로줄'로 판정한다. 손글씨 숫자도 같은 원리이다. 28 × 28 픽셀이면 784개 성분의 차이로 거리를 계산하며, 이 단순한 방법만으로도 손글씨 숫자를 95% 넘게 맞힐 수 있다고 알려져 있다.
아래 탐구 카드에서 손글씨 숫자 사이의 거리를 재고, 이웃의 수를 바꾸며 판정이 어떻게 달라지는지 확인해 보자.
- 픽셀 거리는 글씨가 한 칸만 옆으로 밀려도 크게 달라지는 약점이 있다. 그래서 실제로는 윤곽선 같은 특징을 먼저 뽑은 뒤 거리를 재거나, 신경망이 특징을 스스로 배우게 한다.
같은 크기의 두 이미지는 대응하는 픽셀 차이의 제곱합의 제곱근으로 거리를 잴 수 있고, 거리가 작을수록 닮았다. k-최근접 이웃은 가장 가까운 \(k\)개 학습 이미지의 다수결로 새 이미지의 답을 정한다. 그래서 처음 질문의 손글씨 숫자는, 정답을 아는 손글씨들 가운데 픽셀 거리가 가장 가까운 것들을 찾아 판정할 수 있다.