45. 마지막 정리, 새로운 시작 (종강)

머신러닝을 준비하면서 마치 롤러코스터를 타는 듯한 감정의 기복에 여러 번 놀랐다.

누구나 할 수 있는 머신러닝! 통계나 수학을 전공하지 않아도, 프로그래머가 아니어도 할 수 있다고 했다. 지금 시작하지 않으면 비전공이라고 부르는 사람들에게까지 나의 자리를 내주어야 할 것 같았다.

나는 파이썬 강사이며, 여러 개의 프로젝트를 수행한 프로그래머다. 머신러닝이 너무 어렵다. 파이썬을 잘 해도 TensorFlow에 대해서 모르기 때문에 어렵다. 잠깐 등장하는 미분이 너무 어렵다. 미분 때문에 내부 구조를 유추할 수 없어서 어렵다. 머신러닝 구동환경이 너무 어렵다. 우분투에 TensorFlow는 좋은 조합일까?

너무 어려워서 마음이 놓인다. 내 자리를 쉽게 내어줄 것 같아서 마음 고생이 심했다. 프로그래밍을 하면 차이를 낼 수 있는 부분이 있을 거라고 위로하면서 견뎠다.

프로그래밍을 하는 사람은 많지만, 제대로 하는 사람은 많지 않다. 머신러닝을 하는 사람은 많겠지만, 제대로 하는 사람은 많지 않을 것이다. 유행 때문에, 옆 사람이 하기 때문에, 달라 보이기 위해서. 여러 가지 이유로 시작을 하겠지만, 목표가 분명하지 않다면 도태될 것이다.

나의 머신러닝 시즌1은 끝났다. 나는 시즌2를 준비하고 있지만, 내 글을 읽은 사람들은 무엇을 해야할지 모를게 틀림없다.


1. 파이썬 정리
프로그래밍을 몰라도 머신러닝을 할 수 있다고 믿는 사람이 있다? 그런데, 왜 머신러닝을 활용해서 결과를 내지 못하는 것일까? 프로그래밍 외에 미분 등의 중차대한 요소가 발목을 잡고 있어서 그런 것일까?

프로그래밍에 대한 정리가 확실하지 않으면, 머신러닝은 불가능하다. 머신러닝 이전 시대에 비해 진입 장벽이 낮아진 것은 사실이지만, 없어지지는 않았다. 먼, 어쩌면 가까운 미래에는 사라질 수도 있겠지만, 아직 아니다.

파이썬을 포함한 모든 프로그래밍 언어의 핵심은 반복문이다. 1차원과 2차원의 기본적인 반복문 형태에 익숙해지는 것이 우선되어야 한다. 내가 본 머신러닝 코드는 기본적인 반복문을 조금 확장한 정도여서 코드 때문에 어렵다는 말은 나오지 않을 거라고 확신한다.


2. TensorFlow 정리
머신러닝의 도구로 Theano 혹은 caffe 등의 도구를 선택해도 상황은 동일하다. TensorFlow 라이브러리의 코드에 익숙해져야 한다. Theano 라이브러리에 익숙해져야 한다.

개인적으로는 TensorFlow에 익숙하지 않아서 너무 힘들었다. 머신러닝 자체에 대해서도 공부할 것이 많아서 TensorFlow를 볼 시간이 없었다, 라고 생각했다. TensorFlow에 대한 최소한의 정리를 먼저 하는 것이 유리하다.

TensorFlow 홈페이지에 가면 개요부터 시작해서 설명이 잘 되어 있다. 이들 문서를 읽어보지도 않고 시작을 했다. 전체 문서를 읽어보고 TensorFlow를 구성하는 요소들에 대해 파악할 시간이 됐다.


3. 얕은 수학적 지식
수학적 지식을 필요로 하지 않는다는 것은 맞을 수도 있고, 틀릴 수도 있다. 어디나 그렇지만, 만드는 사람과 사용하는 사람의 두 종류가 있다. 나는, 우리는 만드는 사람이 될 수 없다. 충분히 사용한 이후라면 가능할 수도 있지만, 기대하지 말자.

실적이란 것을 내기 전까지는 철저하게 사용자로 살기로 했다. 만드는 사람에게는 고난이도의 수학이 필요하다. 사용하는 사람에게는 저난이도의 수학이 필요하다. 제대로 사용하기 위해서는 최소한의 수학적 지식이 필요하다. 그것이 김성훈 교수님 동영상에서 소개한 정도라고 믿고 있다. Gradient Descent 알고리듬이 제대로 동작하는 것을 이해하기 위해서는 미분을 알아야 한다.

운전하는 도중에 기어를 바꿀 수 있을까, 없을까? 오버드라이브라고 부르는 것이 있어서 뭔가를 한다고 하는데, 그게 뭘까? 나는 훌륭한 운전자가 아니다. 이들에 대해서 전혀 모른다. 심지어 엔진 오일이나 타이어를 언제 갈아야 하는지도 모른다. 그래도 운전을 한다.

미분과 지수 함수에 대한 좋은 동영상 강좌를 찾아보자. 1타 수능강사들이 올려 놓은 동영상도 있을 것 같다. 무료로 볼 수 있지 않을까? 머신러닝이 인생을 바꿀 거라고 믿기 때문에 머신러닝 고수가 될 것이다. 운전은 인생을 바꾸어 주지 못하기 때문에 자세히 알고 싶지 않았다.


4. 핵심 알고리즘
머신러닝을 관통하는 가장 중요한 알고리즘이 두 개 있다. 극히 개인적인 생각이다. 가장 먼저 배운 Linear Regression과 이를 응용한 Binary Classification. 이들은 지금까지의 지식으로는 이후에 나오는 모든 알고리듬에 적극적으로 개입한다. 뭐가 됐든 이들로부터 시작한다.

교수님의 동영상을 5번 이상은 꼭 봤다. 이해가 안 되서. 그런데, 스터디를 진행한 이후에 보는 그 다음 주 동영상이 이해가 됐다. 4번, 5번 볼 때는 이해가 안 됐는데, 앞의 부분을 이해하니까 전에 놓쳤던 부분들까지 모두 보였다. 순차적으로 진행해야 하는 것을 나중에 알았다. 강사라서 알고 있긴 했는데, 믿고 싶지 않았다.


5. 실습
지금까지 배운 코드를 응용해서 자신만의 코드를 만들어 보자. 이게 될리가 없다. 이게 된다면, 천재?

흥미 있는 부분부터 자신만의 예제를 만들자. 함께 했던 분들은 대부분 RNN에 많은 관심을 보였다. 자신만의 예제를 만들어 발표하기로 했다.

개인적으로도 RNN부터 해보는 것을 추천한다. RNN 이전의 알고리듬과 코드는 어디에 적용해야 할지 막연한 느낌이다. 반면, RNN은 교수님께서 알려주시기만 했고 소개하지 않은 코드도 많이 있었다. 특히, 텍스트를 기반으로 구현할 수 있기 때문에 데이터를 모으는 것도 어렵지 않다.


6. 추가 강좌
다른 강좌를 듣는 것도 좋다. 그렇지만 지금은 아니다. 여유를 갖고 교수님의 동영상을 다시 한번 정주행 하자. 교수님 강의가 좋은 것도 있지만, 강사로써 복습을 통한 이해에 한 표를 던질 수밖에 없다.

머신러닝 알고리듬을 이해하고 싶다!
나한테 익숙한 설명과 코드로 시작하는 것이 가장 좋은 방법이다.


7. 추천 사이트
구글링을 통해 몇 개 사이트로 정리할 수 있었다. 도움이 되는 사이트가 정말 많겠지만, 머신러닝을 어떻게, 무엇을 공부할지에 대해서는 많이 없다. 중요도 순이 아니라 구글링에 나온 순서대로 나열했다.

1. 머신러닝, 제대로 배우는 법
2. 수학을 포기한 직업 프로그래머가 머신러닝 학습을 시작하기위한 학습법 소개
3. 딥러닝을 처음 시작하는 분들을 위해
4. 딥러닝 공부 가이드 (HW / SW 준비편)
5. 빅데이터와 머신러닝에 대한 즐겨찾기 모음


8. 실전(캐글)
지금까지 배운 것을 실제로 접목해야 한다. 그렇지 않으면 머신러닝과 금방 멀어지게 된다. 이때 캐글(www.kaggle.com) 사이트를 이용하면 좋다.

이전에 스터디를 했던 분들과 함께 캐글에 올라온 몇 개의 예제를 분석했다. 많이 배웠다. 텐서플로우 외에도 많은 도구들이 있고, 특히 데이터 선처리에 대한 이해를 높일 수 있었다. 프로그래머로써 "이렇게 하면 될 것이다"라는 막연한 생각만 있었는데, 그런 생각들에 대해 확신을 갖게 된 것도 있었고 잘못 생각한 부분도 많았다.

캐글에는 기업에서 제안한 모든 문제들에 대해 먼저 다녀간 사람들이 남겨놓은 자신만의 소스코드가 있다. 이걸 통해 텐서플로우로부터 어느 정도는 벗어나야 한다는 것을 배우는 중이다. 텐서플로우가 가장 좋다고 믿지만, 모든 것을 대신할 수 없다는 겸손함 정도.

나는 여기까지 배웠고, 얘기할 수 있는 것도 여기까지이다. 더 배우게 된다면.. 뒷부분을 더 채울 수 있을텐데.. 아쉽다!