이번에는 ResNET을 이해하기 위해 CNN을 기초 개념에 대해 탄탄히 다시 되새기고 넘어가고자 포스팅을 합니다. CNN은 2012년도 이미지 인식 대회에서 주목받게 되었는데요 여기서 토론토대 교수인 제프리 힌튼의 AlexaNet이 다른 머신러닝 모델들을 압도적인 차이로 이겼었습니다.
CNN이 나오기 까지
AlexaNet은 컨볼루전 신경망인 CNN입니다. CNN은 이미지를 인식하는 대표적인 딥러닝 모델입니다. CNN도 여느 딥 러닝 모델처럼 사람의 시각 피질을 참고하여 만들어졌습니다.
뇌의 시각피질은 서로 계층적으로 연결되어 있습니다. 낮은 계층에서는 단순한 패턴을 인식하고 상위 계층으로 올라갈 수록 패턴을 인식해서 보다 복잡한 이미지로 추상화 하게 되는 것이죠. 처음의 CNN의 시초는 네오코그니트론이라는 비지도 학습용 모델이였습니다. 이는 비지도 학습 모델이였기에 성능이 그렇게 좋지 못하였습니다. 그러다 1989년 벨 연구소에 있었단 얀 르쿤이 네오코그니트론에 지도학습을 적용한 CNN을 공개합니다. 당시 은행에서 수표의 숫자를 인식하는데 사용할만큼 상당한 성과를 거두기도 했죠.
지금 딥러닝의 가장 대표적인 데이터셋인 MNIST는 이때 얀 르쿤이 모델을 훈련싴기 위해 만든 것이기도 하죠. 하지만 CNN은 큰 문제점이 있습니다. 해상도가 크거나 복잡한 사진은 학습되지 않는다는 점입니다. 그래서 점차 CNN은 사람들의 기억에서 사라져갔지만, 딥러닝의 창시자인 제프리 힌턴 교수가 CNN의 고질적인 문제들을 해결했기 때문입니다.
위와같이 신경망의 층이 깊어지면 학습이 안되던 것을 ReLU라는 활성화 함수로 성능을 높였습니다. 훈련 데이터에만 딱 맞게 고정되던 과대적합은 제가 이전에도 읽었던 드롭아웃 기법을 써서 완화했습니다. 덕분에 CNN이 딥러닝의 핵심 모델이 되었죠.
CNN의 구조
사진이 입력으로 들어오면 먼저 특징을 추출합니다. 예를 들어, 새의 사진이라면 깃털의 색깔, 부리의 크기, 눈의 모양 등 여러가지 특징들로 나누어서 파악합니다. 이 과정을 컨볼루션이라고 부릅니다.
여기서 특징을 추출하는 패턴은 정사각형 모양의 필터입니다 이 필터를 입력의 왼쪽 상단부터 오른쪽으로 이동하며, 각 위치마다 포개지는 숫자를 곱해서 모두 더합니다. 컨볼루전 결과를 기록한 것이 특성 맵이라고 합니다. 말 그대로 필터의 특성이 입력 사진의 어느 부분에 많이 존재하는지 보여주는 지도라 할 수 있는 것이죠. 특성 맵의 숫자가 높으면 그 위치가 필터와 유사하다는 것을 의미합니다.
일반 신경망은 모든 노드가 연결되어 있습니다. 그리고 각 연결의 가중치를 학습하죠. 반면에 CNN은 미리 고정된 연결이 없습니다. 대신 컨볼루션 과정을 통해 출력을 계산합니다. CNN에서 학습하는 것은 바로 필터의 가중치입니다. 과거처럼 사람이 직접 특징 필터를 만들지 않고 모델 스스로 어떤 특징이 좋은지 학습을 통해 배웁니다.
여기 각각 세로와 가로를 판별하는 필터가 있습니다. 같은 이미지라도 다른 필터를 거치면 특성 맵에서 추출된 패턴이 달라짐을 알 수 있습니다. 컨볼루션에서 필터의 개수만큼 특성 맵이 나옵니다. 그 다음 맥스 풀링으로 특성 맵의 크기를 줄입니다. 맥스 풀링이란 가장 큰 값만 추출하여 출력을 작게 만드는 방법입니다. 이렇게 컨볼루션과 맥스 풀링을 하나의 단위로 하여 여러 층으로 깊게 쌓아 올립니다.
이도 시각 피질과 마찬가지로 낮은 층에서는 단순한 패턴을 높은 충으로 올라갈 수록 복잡한 패턴으로 추상화됩니다. 컨볼루션과 맥스 풀링의 층들이 끝나면 사진의 고차원적인 패턴이 담긴 특성 맵이 나옵니다. 그리고 사진이 무엇인지 판별하기 위해 마지막에 완전연결 신경망을 붙혀 특성 맵을 사진의 클래스로 최종 분류합니다.
이 과정은 CNN의 절차를 한눈에 보여줍니다. 먼저 숫자 2 사진이 입력으로 들어왔습니다. 총 6개의 필터를 컨불루션으로 계산하여 서로 다른 패턴을 뽑아낸 6개의 특성맵이 나왔습니다. 그리고 맥스 풀링으로 특성 맵의 크기를 줄입니다. 다음 층에서는 17개로 동일한 작업을 반복합니다. 여기서 층이 올라갈 수록 사람이 이해하기 어려운 고차원적인 특징으로 변하는 것을 알 수 있습니다. 마지막에서는 특성 맵의 출력을 쭉 일렬로 이어붙혀 완전연결 신경망으로 최종 클래스를 분류합니다. 여기서는 2의 결과를 1101111111 로 뽑아내게 됩니다.