최근에 학교에서 열었던 행사에 참석하게 되었습니다. 행사의 이름은 <누구나 할 수 있는 AI>이었으며 2박 3일동안 한글 필기 인식을 하는 모델을 튜닝해서 최적의 모델을 만들어 내는 게 행사의 목표였습니다. 이름 그대로 AI에 대해 아무것도 모르는 사람도 할 수 있을만큼 난이도는 쉬웠습니다. 데이터 수집, 데이터 전처리, 데이터 학습을 위한 모델이 모두 제공되었으며, 참여자가 할 일은 오로지 어떤 데이터를 어떻게 만들 것인가, 학습을 얼마나 할 것인가 정도만 건드리는 것 뿐이었습니다. 저와 제 팀원은 직접 모델을 만들어보고 싶어서 2박 3일동안 모델 튜닝은 안하고 모델 만드는데만 매달렸습니다. 모델을 만들긴 했지만 텐서플로우 1.14버전과 2.0 버전 간 호환성 문제가 발생했습니다. 평가가 안되니 결국 순위권에도 못들어갔습니다. 네, 또 삽질을 해버리고야 말았습니다.
함께 공부합시다.
안타까운 마음을 가진 채 집에 가는 길에 곰곰히 생각해보니, AI 공부를 하는 데 있어 프로그래밍 역량 향상의 관점으로 접근한 문서는 많았지만 이를 실제로 써먹는 과정이 없다는 걸 깨닫게 되었습니다. 해외는 좀 더 있지만 한국에서는 이런 과정을 찾기 어려웠습니다. 예제만 냅다 공부하는 AI공부가 아닌, 실제로 써먹을만 한 공부를 할 순 없을까? 하는 생각이 들었습니다. 예제 공부하는 것과 실제로 써먹는것은 좀 다른 개념이기에, AI 공부는 예제만 냅다 풀어서 마냥 늘지 않는다는 걸 깨달았습니다. 그래서 저는 실전AI라는 개념을 제시합니다. 데이터수집부터, 전처리, 모델설계 / 제작까지 모든 과정을 직접 함으로서 AI를 활용해보기로 합니다. 천천히 따라하시다 보면 여러분이나 저나 모두 훌쩍 성장해 있을 겁니다. 최대한 쉬운 언어로 AI를 설명해드리겠습니다.
예제와 실전의 차이, AI 학습에서 데이터 수집의 중요성
예제 문제를 풀다 보면 친절하게 전처리가 완료된 MNIST, fashionMNIST, CIFAR-10 등의 데이터셋을 볼 수 있을 것입니다. 하다못해 위스콘신대학교 유방암자료도 엑셀(쉽게 말해서)로 깔끔하게 정리되어있습니다. 이런 데이터셋으로 모델 설계/제작 공부만 하다 AI를 실무에 활용해보려 하면 우리는 난관에 빠집니다. 위에서 볼 수 있다시피 실전에서는 모델 설계/제작만큼 비중을 차지하는 게 데이터 수집 / 전처리이기 때문이죠. 데이터를 얻기 위해서는 간단히 노가다만 열심히 하면 됩니다. 수 만 개의 데이터를 찾고, 여기에 일일이 이름을 붙여주면 됩니다. 그런데, 이전 글에서 언급했다시피 오늘 쓰는 코드가 내일은 뒤처져 버리는 게 AI 분야입니다. 언제까지고 데이터 수집하는 노가다를 하기는 어렵습니다. 그래서 우리는 일단 오픈소스로 나온 프로그램을 통해 간단히 데이터를 수집해보겠습니다.
Softmax / CNN
AI가 할 수 있는 일은 되게 많고 그만큼 다양한 학습모델이 존재합니다. 그 중에서 우리는 가장 기초적인 모델 중 하나인 CNN(Convolutional Neural Network, 합성곱신경망)을 통해 필기인식 모델을 만들어보기로 합니다. CNN을 설명하기 전에 소프트맥스에 대해 먼저 설명을 드려야 할 것 같습니다. 소프트맥스는 이미지데이터를 말 그대로 무식하게 채썰듯이 썰어서 각 픽셀을 모두 입력층 유닛에 집어 넣습니다. 그 후 은닉층을 거쳤다가 최종적으로 출력층 유닛에서 나오는 값을 보고 1에 가장 가까운 (확률적으로 100%에 가까운 값이 나온 ) 값을 내는 걸 답으로 판별하는 게 소프트맥스입니다. 출력층을 한 번 봅시다. 1이 적힌 유닛에서는 이미지가 1일 확률이 5%라고 판명하고 있고, 3 유닛에서는 이미지가 3일 확률이 50%라고 판단하고 있습니다.
소프트맥스는 이렇게 유닛들이 내는 확률들 중 가장 큰 확률값을 내는 유닛의 판단을 답으로 제시하는 데 의의를 둡니다. AI를 공부하는 거의 대부분의 사람들은 MNIST를 통해 소프트맥스를 접했을 겁니다. MNIST는 28*28 사이즈의 이미지 60000개를 제공합니다. MNIST 데이터셋을 판별하는데 있어 소프트맥스는 큰 무리가 없습니다. 그러나 현실에는 28*28사이즈 이미지로 해결할 수 없는 문제들이 더 많습니다. 지금 32*32 이미지를 학습시키려는데만 해도 1024개의 유닛을 입력으로 받고 있습니다. 640*480 사이즈의 이미지를 학습시킨다면 30만개의 유닛이 입력층에 들어가야 합니다. 입력되는 이미지의 해상도가 클수록 효율이 떨어집니다. 이 시점에서 고양이에게 이미지를 보여주며 뇌파를 측정하는 실험을 진행했었습니다. 그 실험은 고양이가 이미지를 볼 때 모든 뉴런이 활성화되는 게 아니라, 특징이 존재하면 그 특징에 대해서만 뉴런이 활성화된다는 사실을 알려줬습니다. 이게 CNN이 생겨난 배경입니다.
CNN은 이미지에서 특징을 발견하고 해당 이미지를 판별하는 알고리즘입니다. 위의 그림에 설명되어있듯 Convolution1->Pool->Convolution2->Pool2 의 과정을 통해 특징을 추출합니다. Convolution 단계에서는 일정한 규모의 필터를 이용해 입력된 이미지를 한 번 쓱 스캔해서 특징을 선별해냅니다. Pool 단계에서는 스캔된 Feature map에서 가장 큰 값들만 골라내고 나머지는 버립니다. 이렇게 두 단계를 진행하고 나면 이미지에서 뽑아낸 Feature map은 특징만 남습니다. 추출된 특징들을 신경망에 주입하면 은닉층을 거치고 출력층에서는 입력된 데이터가 어떤 데이터인지 판별합니다. 간단하게 소프트맥스에 특징 추출과정이 추가된 거라 보시면 됩니다.
데이터 수집하기
데이터를 수집하는건 생각보다 어려운 일입니다. 그런데 굳이 데이터를 직접 수집하려는 이유는 여러번 반복하지만 그게 현실의 문제 해결과 맞닿아 있기 때문입니다. 데이터가 덩그러니 있을 때, 그 데이터 더미를 처리할 줄 알아야 데이터를 모델에 집어넣을 줄도 알게 됩니다. 이 시리즈에서는 할 수 있다면 한글 필기 데이터를 모으고 싶지만 현실적으로 그게 어려운 일이라는 거는 누구나 잘 알고 있습니다. 다행히 한글 폰트를 이미지데이터로 바꿔주는 프로그램이 있어 그 프로그램을 이용해 이미지 데이터를 생성하도록 하겠습니다. 이후에도 openCV등을 활용해서 이미지데이터를 만들든지 하는 방법들이 있긴 한데 우선 쉽게 데이터를 생성해보고 좀 더 raw한 형태의 데이터는 추후에 다뤄보도록 하겠습니다.
글이 마음에 드셨다면 왼쪽 아래 공감 버튼을 눌러주세요. 고마움을 표현할 수 있는 가장 쉬운 방법입니다.
감사합니다.