티스토리 뷰

(한빛미디어에서 모집하는 혼공학습단 활동 일환으로 혼자 공부하는 머신러닝+딥러닝 책을 공부하고 작성한 글입니다. 책은 돈으로 샀습니다. 본문의 코드는 책의 소스코드를 기반으로 하되 글 흐름에 맞게 수정한 것입니다. 원본 코드는 저자 에서 보실 수 있습니다. 책에 나오는 넘파이, 판다스 등의 내용은 본 글에는 넣지 않았습니다.)

 

머신러닝은 어떻게 시작되었나?

머신러닝에서 가장 유명한 문제는 아마 고양이와 개를 구별하는 문제일 것입니다. 사람은 태어나서 고작(?) 년의 훈련만 거치면 사진을 보고 개인지 고양이인지 있습니다. 실제로 년이 걸리는지 언급한 기사나 연구가 있는지 찾아봤는데 안타깝게도 찾아지지 않네요. 저만 궁금한가 봅니다.

 

 

정확히 정의된 작업을 처리하는 속도는 사람이 컴퓨터를 따라갈 없습니다. 문제는 사람이 만들지만 푸는 사람보다 빠른 컴퓨터한테 시키는 셈이죠. 그런데 세상의 모든 문제가 정의되는 아닙니다. 여러분은 외계인에게 사진 동물이 고양이인지 개인지 구별하는 매뉴얼 만들어줄 있나요? 귀가 접혀있으면 개라고요? 그럼 얘는요?

 

 

수염이 있으면 고양이일까요? 그럼 얘는요?

 

 

결국 방법은 가지밖에 없습니다. 고양이와 사진을 엄청 많이 보여주고 알아서 학습하게 해야죠. 귀납적 학습법이라고도 있겠군요. 간혹 개처럼 생겼지만 사실 고양이인 사진이 있다면 목록 업데이트도 해야겠네요.

 

우리가 어떻게 개와 고양이를 구별하는지 우리 스스로도 설명할 없습니다. 그냥 아는 거죠. 문제는 정확히 정의하기 어렵습니다. 그런데 정의조차 되지 않는 문제를 컴퓨터에게 풀게 하려면 어떻게 하면 좋을까요? 포기하자니 컴퓨터의 성능과 개발비용이 아깝습니다. 질문에서 시작된 것이 머신러닝입니다.

 

머신러닝은 규칙을 일일이 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야입니다. 인공지능의 하위 분야 중에서 지능을 구현하기 위한 소프트웨어를 담당하는 핵심분야입니다.

박해선, 혼자 공부하는 머신러닝 + 딥러닝, 한빛미디어, 28

 

방법은 아주 간단합니다. 사람의 구조, 동작방식, 규모(!)까지 그대로 구현한 컴퓨터를 만들면 됩니다. 단지 시간과 돈이 많이 뿐입니다. 그래서 아직까지 못하고 있죠. 아래 이미지들을 보면 과연 가능하긴 한걸까 하는 생각마저 듭니다. 많은 이미지는 여기에서 보실 있습니다. 보다가 뿜을 있으니 마시던 커피는 넘기고 누르시길 권장합니다.

 

출처: https://imgur.com/a/K4RWn
출처: https://imgur.com/a/K4RWn

 

참고로 /고양이 구별 문제는 이해를 돕기 위해 예시를 것이고, 실제 머신러닝이 문제를 풀고자 시작된 것은 아닙니다. 머신러닝의 역사는 여기 설명되어 있으니 관심있는 분들은 한번 들어가보시면 좋겠습니다. 1 서두에 언급된 2번의 AI 겨울에 대해서도 설명되어 있네요. ( 읽기: 컴퓨터는 개와 고양이 구별을 못할까?, AI 번째 겨울은 언제 것인가?)

 

머신러닝(Machine Learning; ML) 인공지능(Artificial Intelligence; AI), 단어는 동의어로 자주 사용되고 있습니다. 하지만 책에도 언급되어 있듯이 엄밀히는 인공지능의 하위 분야 하나가 머신러닝입니다. 머신러닝을 나머지 인공지능 분야에서는 새로운 먹거리가 찾아지지 않아서인지 요즘은 좁은 의미 인공지능과 머신러닝을 뜻으 사용하는 경우가 많은 같네요.

 

출처 : https://commons.wikimedia.org/wiki/File:AI-ML-DL.svg

 

책에서는 6장까지 사이킷런scikit-learn 사용합니다. 컴퓨터 과학 분야의 대표적인 머신러닝 라이브러리로, 오픈소스인데다 파이썬 API 사용하므로 파이썬만 알면 누구나 가져다 있습니다. 사이킷런이 2013 8 만들어졌으니 9 되었네요. 성능이 어느 정도 안정적이고 검증되어 있다고 하니 믿고 써도 같습니다.

 

그럼 6장까지는 배우는 머신러닝이라 치고, 7장부터는 배우나요?

 


 

딥러닝은 deep해서 딥러닝인가?

그림에도 있듯이, 머신러닝의 하위 분야 하나가 딥러닝입니다.

 

많은 머신러닝 알고리즘 중에 인공신경망artificial neural network을 기반으로 한 방법들을 통칭하여 딥러닝deep learning이라고 부릅니다. 종종 사람들은 인공 신경망과 딥러닝을 크게 구분하지 않고 사용합니다.

박해선, 혼자 공부하는 머신러닝 + 딥러닝, 한빛미디어, 29쪽

 

제가 수업을 들었던 신경회로망 과목 사실 딥러닝이었던 거군요. 저는 지금까지 신경회로망의 deep 버전이 딥러닝인 알았거든요. 부끄... 그런데 보면 제가 맞는 같기도 한데, 모르겠습니다. 당장 중요한 아니니 넘어가도록 하지요. 딥러닝의 역사는 여기 설명되어 있습니다. 책에서 언급된 LeNet AlexNet 나오네요. Lenet-5 손글씨를 인식한 1998년인데 딥러닝이 제대로 2010년대이니 갭이 있습니다. 여기엔 가지 이유가 있습니다.

 

LeNet-5나 AlexNet과 같이 인공 신경망이 이전과 다르게 놀라운 성능을 달성하게 된 원동력으로 크게 세 가지를 꼽을 수 있습니다. 복잡한 알고리즘을 훈련할 수 있는 풍부한 데이터와 컴퓨터 성능의 향상, 그리고 혁신적인 알고리즘 개발입니다.

박해선, 혼자 공부하는 머신러닝 + 딥러닝, 한빛미디어, 30쪽

 

우리나라에서 딥러닝이 터진 것은 역시 알파고입니다. 아래는 이세돌과 알파고가 겨루었던 구글 딥마인드 챌린지 매치 다큐멘터리입니다. 90분이라 길긴 한데, 저는 정말 시간 가는 모르고 재밌게 봤습니다. 4국을 중점적으로 다룬 12분짜리 영상 있기는 합니다만 이왕이면 버전을 보시길 추천합니다.

 

 

가지 안타까운 점은, 우리나라의 정부와 사회는 과연 머신러닝/딥러닝을 얼마나 진지하게 다루고 있는가입니다. 알파고 이전에는 소위 그들만의 리그라 불러도 정도로 관심 밖이었고, 알파고 덕분에 떴으며, 시간이 지나자 다시 시들해진 느낌입니다. 물론 알파고 이전에 비해 엄청난 투자가 이루어지고 있는 것은 맞습니다만, 돈을 들인다고 모두 성공하는 아니니까요. 알파고 vs 이세돌 같은 이벤트의 부재와 함께 사람들의 관심도 시들해졌지만, 알파고는 이후로도 계속 업그레이드되어 왔습니다.

 

  • 알파고 제로: 인간의 기보 입력 없이 처음부터 자체 강화학습
  • 알파 제로: 바둑 이외의 게임에 적용할 수 있는 버전
  • 뮤 제로: 게임의 규칙을 입력해주지 않아도 알아서 학습하는 버전

 

구글은 2015 딥러닝 라이브러리인 텐서플로TensorFlow 공개했습니다. 알파고도 텐서플로우를 사용한다고 하네요. 이에 뒤질세라 페이스북도 2018 파이토치PyTorch 딥러닝 라이브러리를 발표합니다. 사이킷런과 마찬가지로 둘다 오픈소스이며 파이썬 API 제공합니다. 책에서도 7장부터 9장까지 텐서플로를 사용한다고 하니 기대해보겠습니다.

 

딥러닝의 맛을 보기에 좋은 자료 있어서 링크를 올려봅니다. 자료에도 나와있듯이멋진 것에는 이름이 있습니다. 딥러닝의 암흑기와 부활에 중요한 역할을 녀석이 바로 XOR입니다. XOR 딥러닝에서 중요했는지는 여기 읽어보시기 바랍니다.

 


 

코랩인가?

책의 모든 예제는 구글 코랩Colab에서 실행합니다. 코랩은 웹브라우저 내에서 파이썬 스크립트를 실행할 있는 클라우드 기반 개발환경으로 많은 장점을 가지고 있습니다.

 

  • 클라우드 기반이므로 인터넷만 되면 어디서든 코드를 이어서 작성할 수 있습니다.
  • 클라우드 기반이므로 로컬 컴퓨터의 성능을 타지 않습니다. 다시 말해 개발 환경에 신경을 쓰지 않아도 된다는 뜻입니다. 처음에 개발 환경 세팅하느라 고생한 경험이 있는 분들은 어떤 말인지 아실 겁니다.
  • GPU를 무료로(!) 사용할 수 있습니다.
  • 코드를 공유하여 공동작업을 편하게 할 수 있습니다.

 

코랩은 간단히 말해 클라우드 기반의 주피터 노트북입니다. 따라서 주피터 노트북을 번이라도 써보신 분들은 어렵지 않게 사용할 있습니다. 마치 코드를 대화형(동적) 워드 문서처럼 있는 거죠. 텍스트는 텍스트 셀에, 파이썬 코드는 코드 셀에 작성합니다. 텍스트 셀은 HTML 마크다운 문법을 사용합니다. 저는 조금 익숙한 마크다운을 사용하기로 했습니다. 아래는 가지 마크다운 문법을 연습한 화면입니다.

 

 

코랩은 단점도 있습니다.

  • 가상서버는 동시에 5개까지만 사용할 수 있습니다.
  • 1개의 노트북은 최대 12시간까지만 실행할 수 있습니다.
  • 서버 메모리는 12기가, 디스크 공간은 100기가입니다.

제약을 풀고 싶으면 돈을 내면 됩니다. 책에서는 그렇게까지는 필요하지 않을 같으니 넘어가도록 하지요.

 


 

번째 머신러닝: k-최근접 이웃 알고리즘

1장에서 간단한 몸풀기로 k-최근접 이웃 알고리즘(K-Nearest Neighbor; K-NN) 돌려보겠습니다. 분류 알고리즘의 종류로, 비슷한 종류끼리는 비슷한 특징을 가질 것이라는 믿음을 알고리즘화 것입니다. 알고리즘의 자세한 내용은 위키피디 링크 갈음하기로 하지요. 책은 이론보다 실전을 중요시합니다. 언제 어떻게 사용하는지, 무얼 조심해야 하는지 정도만 알고 바로 뛰어들어도 됩니다. 일단 익숙해지고 나서 나중에 이론을 찾아보는 것도 공부의 가지 방법이니까요.

 

생선 분류 문제입니다. 생선의 길이와 무게만 보고 도미 또는 빙어로 분류하고 싶습니다. 도미는 빙어보다 길고 무겁습니다. 따라서 길이와 무게를 기준으로 나누면 같습니다. 앞에서 고양이/ 구별보다는 훨씬 쉬워 보이네요. 그런데 기준을 어디로 잡아야 할까요? 대충 길이 20cm쯤이면 같긴 한데 왠지 자신이 없습니다. 이럴 K-NN 출동합니다. 생선의 길이와 무게 데이터, 정답-도미인지 빙어인지- 모두 알려준 , 분류 기준을 컴퓨터에게 알아서 정하게 시키는 겁니다. 심지어 우리는 컴퓨터가 정한 분류 기준을 몰라도 됩니다. 답만 나오면 장땡입니다.

 

우선 도미bream 빙어smelt 길이, 무게를 그래프로 그려보겠습니다.

 

도미(bream) 데이터: https://bit.ly/bream_list, 빙어(smelt) 데이터: https://bit.ly/smelt_list

 

파란색이 도미, 주황색이 빙어입니다. 길이와 무게로 확실히 구별되는군요. 정도면 20cm 기준으로 나눠도 같긴 한데세상이 일이 그렇게 호락호락한 아니겠죠. 20.1cm짜리 빙어가 나오는 순간 불려가서 혼날지도 모르니까요.

 

K-NN에게 데이터를 넘겨주려면 우선 생선의 데이터를 하나로 합쳐야 합니다. 그리고 정답도 알려줘야 하죠. 길이, 무게, 정답 데이터를 리스트로 만듭니다. 정답은 도미를 1, 빙어를 0으로 하겠습니다.

 

 

K-NN 사용하기 위해 KNeighborsClassifier import 하고 바로 객체를 만듭니다.

 

 

이렇게 만든 kn K-NN 담당하는 소위 매니저입니다. 매니저에겐 대학원생처럼 뭐든지 시킬 있습니다. 빈말이 아니라 정말로 데이터 저장, 파라미터 설정, 훈련, 평가, 예측까지 모두 kn이 담당하게 됩니다. 바로 데이터를 주고 훈련을 시켜보죠. 훈련은 fit()으로 합니다. 데이터와 타겟(정답) 주고 알아서 분류모델을 만들라고 시킵니다. 제대로 훈련되었는지 평가는 score() 있습니다. 분류모델에 데이터를 넣은 결과가 타겟과 같은지를 봅니다.

 

 

스코어가 1.0이라는 것은 모델이 완벽하다는 뜻입니다. 번째 머신러닝 코드가 돌아갔습니다. 잠시 기쁨의 춤사위를 추고 오겠습니다.

 


 

분류 모델 검증

스코어가 1.0이라니 기쁘면서도 약간 찜찜한 기분이 듭니다. 코드가 에러 없이 한방에 돌다니 그럴 리가 없잖아요? 시험 점수도 100점이 나오면 기쁨과 의심이 동시에 드는 법이죠. 정말 제대로 한 게 맞나? 점수가 잘못된 건 아닐까? 실수는 없었나? 훈련 데이터와 평가 데이터가 같아도 되나? ( 부분은 중요하므로 2장에서 다룹니다.) 한번 확인해보겠습니다. 그래프를 보면 길이 30cm, 무게 600g짜리 생선은 도미(1) 분류되어야 하고, 길이 12cm, 무게 10g짜리 생선은 빙어(0) 분류되어야 합니다. 아래와 같이 predict() 메서드를 사용합니다.

 

 

되는군요! 약간은 안심이 됩니다.

 

K-NN 동작방식은 사실 매우 간단합니다. 새로운 데이터가 들어오면 데이터와 가까운 곳에 어떤 데이터가 있는지를 살핍니다. 도미 데이터와 가까우면 도미로, 빙어 데이터와 가까우면 빙어로 분류하는 방식입니다. 그래서 사실 훈련이라고 불러도 되는지도 모르겠습니다. 가까운 데이터 중 개를 확인할지를 정할 있습니다. KNeighborsClassifier 기본적으로 5개를 확인합니다. 값은 KNeightborsClassifier 객체를 만들 n_neighbors 파라미터로 바꿀 있습니다.

 

 

훈련 데이터가 49개였는데 새로운 데이터를 분류할 가까운 49개를 확인하라고 시켰습니다. 어떤 데이터를 넣어도 가까운 49 도미가 가장 많겠죠. 그래서 훈련 데이터로 평가한 결과는 35/49 0.714 나옵니다. 장난을 쳐보겠습니다. 훈련 데이터가 49개인데 n_neighbors 50 넣으면 어떻게 될까요?

 

 

에러가 뜨는군요. 그냥 한번 확인해보고 싶었습니다. 딱히 컴퓨터를 괴롭히려는 아니니 오해는 하지 말아주세요.

 


 

k-최근접 이웃 알고리즘과 k-평균 알고리즘

K-NN 이름이 비슷한 알고리즘으로 k-평균(k-means clustering)이라는 것이 있습니다. k-평균 군집화라고도 부릅니다. 이름은 비슷한데 동작방식은 많이 다릅니다. 아래는 k-평균 알고리즘을 간단히 설명한 영상입니다.

 

 

 

아래는 K-NN k-평균을 비교한 것입니다. ()

 

K-NN

  • 정답을 알고 학습하는 지도학습
  • 분류 또는 회귀 알고리즘
  • 게으른 학습(lazy learner)으로 모델을 만드는 훈련 과정이 없음

 

k-평균은

  • 정답을 모르고 학습하는 비지도학습
  • 군집화 알고리즘
  • 부지런한 학습(eager learner)으로 모델을 만드는 훈련 과정이 있음

 

1 내용정리는 여기서 마치겠습니다. 끝까지 읽어주셔서 고맙습니다.

 

 

읽기

Types of Artificial Intelligence

인공지능의 결정적 순간들 1

인공지능의 결정적 순간들 2

 

 

댓글