어떻게 이미지를 보는 눈, CNN
앞 레슨은 질문 하나를 남기고 끝났다. 사진처럼 무엇이 단서인지 사람이 하나하나 고르기 어려운 데이터는 어떻게 다뤄야 할까? 사진 한 장은 작은 점 수만 개에서 수백만 개로 이루어진다. 이 점들을 한 줄로 늘어놓고 보통 신경망에 넣으면 배워야 할 연결이 너무 많아지고, 같은 고양이가 옆으로 조금만 비켜 서도 완전히 다른 입력이 돼요. 그래서 사람 눈처럼 작은 부분을 차례로 훑으며 특징을 찾는 신경망이 나왔다. 합성곱 신경망, 줄여서 CNN이다.
사진은 숫자 격자예요
우리 눈에는 그림이지만, 컴퓨터에 사진을 건네려면 결국 숫자로 바꿔야 한다. 사진을 아주 가까이 들여다보면 픽셀이라는 작은 점이 모눈종이 칸처럼 빼곡하게 놓여 있다. 흑백 사진이라면 점 하나가 밝기를 숫자 하나로 담는다. 밝은 점은 큰 수, 어두운 점은 작은 수예요.
컬러 사진은 점마다 빨강, 초록, 파랑의 세기를 숫자 세 개로 담는다. 어느 쪽이든 사진 한 장은 칸마다 숫자가 들어찬 격자다.
확대해서 보기 버튼을 눌러 보자. 손으로 쓴 숫자로만 보이던 그림이 가까이서는 칸마다 밝기 숫자로 바뀌어, 사진이 숫자 격자라는 것이 드러나요.
확대하니 칸마다 숫자가 보였다. 사람은 무슨 숫자인지 한눈에 알아보지만, 컴퓨터가 받는 것은 숫자가 빼곡한 표뿐이다. 이 숫자 더미에서 모서리나 곡선 같은 특징을 어떻게 찾아낼까?
한꺼번에 다 보기에는 너무 많으니 작은 부분부터 차근차근 살펴요.
작은 필터로 특징을 찾아요
특징을 찾는 도구는 필터다. 필터는 이미지보다 훨씬 작은 숫자 판으로, 돋보기를 한 군데에 대 보는 것과 비슷하다. 예를 들어 세로 모서리를 찾는 필터는 왼쪽이 어둡고 오른쪽이 밝은 무늬에 반응해요.
필터를 이미지의 한 자리에 겹쳐 놓고, 그 자리의 숫자가 필터 무늬와 얼마나 닮았는지 점수로 계산한다. 이 위젯에서는 오른쪽 두 칸의 밝기 합에서 왼쪽 두 칸의 합을 뺀 값이 점수다. 무늬가 잘 맞으면 점수가 높고, 맞지 않으면 낮다.
격자에서 자리를 골라 필터를 대 보자. 필터 무늬처럼 왼쪽이 어둡고 오른쪽이 밝은 자리는 점수가 높아서, 거기에 세로 모서리가 지나간다는 뜻이 돼요.
자리마다 점수가 달랐다. 어두운 칸과 밝은 칸이 맞닿은 곳에서 점수가 가장 높았고, 그곳이 바로 세로 모서리다. 밝기가 고른 곳에서는 점수가 영 근처에 머물렀어요.
여기서 중요한 점이 하나 있다. 같은 필터는 어느 자리에 대든 같은 특징을 찾는다. 모서리가 그림 왼쪽에 있든 오른쪽에 있든 똑같이 잡아낸다. 그렇다면 한 자리만 볼 것이 아니라 필터로 격자 전체를 훑으면 된다.
필터를 훑어 특징 지도를 만들어요
이제 필터를 한 칸씩 옮긴다. 왼쪽 위에서 시작해 오른쪽으로 한 칸씩 가고, 줄 끝에 닿으면 한 줄 내려와 다시 왼쪽부터 훑는다. 자리마다 나온 점수를 같은 위치에 적어 두면 점수들이 모여 새로운 작은 격자가 돼요.
이 격자를 특징 지도라고 부른다. 특징 지도를 보면 그 특징이 어디서 강한지 한눈에 알 수 있다.
한 칸 훑기 버튼을 눌러 필터를 옮겨 보자. 자리마다 점수가 특징 지도의 같은 위치에 채워지고, 다 훑고 나면 세로 모서리가 강한 자리가 밝게 드러나요.
필터가 격자를 다 훑자 특징 지도가 완성됐다. 가로세로 다섯 칸짜리 격자에서 네 칸짜리 지도가 나왔으니 원래보다 조금 작지만, 세로 모서리가 지나가는 줄이 밝게 드러난다. 필터 하나가 찾는 특징은 한 가지뿐이에요.
그래서 실제 CNN은 세로 모서리, 가로 모서리, 곡선처럼 무늬가 다른 필터를 수십, 수백 개씩 함께 쓴다. 필터 안의 숫자도 사람이 정하지 않는다. 앞에서 본 경사 하강법과 역전파로 오차가 줄어드는 쪽으로 조금씩 고쳐 가며 배운다. 사람이 특징을 고르던 일을 신경망이 스스로 하게 된 것이다.
층을 올릴수록 더 큰 특징
특징 지도 위를 다시 필터로 훑으면 작은 특징들이 모여 더 큰 특징이 된다. 첫 층은 짧은 모서리 같은 작은 조각을 잡고, 그 위 층은 모서리를 엮어 눈이나 코 같은 부분을 잡아요. 더 위 층은 부분을 모아 얼굴 전체를 알아본다.
뉴런을 층층이 쌓던 신경망과 같은 생각이지만, CNN은 층마다 필터로 훑는다는 점이 다르다. 층이 올라갈수록 한 칸이 원래 사진의 더 넓은 범위를 대표하게 되고, 그만큼 더 추상적인 특징을 잡는다.
층 올리기 버튼을 눌러 한 단계씩 올라가 보자. 모서리 조각에서 눈과 코 같은 부분으로, 다시 얼굴 전체로 보는 것이 점점 커져요.
층을 올릴 때마다 보이는 것이 커졌다. 낮은 층은 작고 단순한 조각을 보고, 높은 층은 그 조각들을 엮어 뜻이 있는 모양을 본다. 선을 보고, 부분을 알아보고, 마지막에 전체를 아는 순서는 사람이 사물을 알아보는 과정과도 닮았어요.
실제로 학습을 마친 CNN을 들여다보면 아래층 필터는 모서리나 색이 바뀌는 경계에, 위층 필터는 눈이나 바퀴 같은 부분에 반응하는 경우가 많다. 위젯의 얼굴 그림은 이 흐름을 단순하게 그린 것이다.
정리
정리하면 이렇다. 사진은 칸마다 밝기 숫자가 들어찬 격자다. CNN은 작은 필터를 한 자리에 대고, 그 자리에 찾는 특징이 있는지 점수를 매긴다. 같은 필터로 격자 전체를 훑으면 특징이 어디 있든 찾아내는 특징 지도가 나와요.
이런 층을 여러 겹 쌓으면 모서리에서 눈과 코로, 다시 얼굴로 점점 추상적인 특징을 잡는다. 필터 안의 숫자는 데이터에서 배운다.
핵심을 차례로 눌러 되짚어 보자. (사진은 밝기 숫자 격자 → 작은 필터로 특징 점수 → 훑어서 특징 지도 → 층을 올릴수록 추상적인 특징)
이제 컴퓨터가 그림을 어떻게 보는지 알았다. 사진을 숫자 격자로 바꾸고, 작은 필터로 훑어 특징을 찾고, 층을 쌓아 점점 큰 특징을 잡는다. 같은 필터가 사진 전체를 훑으니 고양이가 옆으로 비켜 서 있어도 찾아낼 수 있어요.
그런데 단어나 문장은 사진처럼 처음부터 숫자 격자로 주어지지 않는다. 단어를 숫자로 바꾸는 방법인 임베딩을 다음 레슨에서 다룬다.