2015년 5월 31일 일요일

수학을 포기한 직업 프로그래머가 머신러닝 학습을 시작하기위한 학습법 소개

오늘은 일본의 유명 개발자용 지식공유 서비스인 Qiita에서 큰 인기를 끌고 있는 “수학을 포기한 직업 프로그래머가 기계학습을 시작하기위한 최단경로数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路“를 번역하여 소개해 보고자 합니다. 번역을 흔쾨히 허락해 주신 단노 류이치だんの りゅういち씨에게 감사의 말씀을 드립니다.
전체적으로는 선형대수에 대해서 쉽게 배우는 방법과 무엇 보다 머신러닝의 필수 과목으로 꼽히는 Andrew Ng교수의 머신러닝 강의에 대한 공략법/내용설명이 주를 이룹니다.
빅데이터나 머신러닝에 대해서 한번 공부는 해 보고 싶었지만 수학에서 좌절하여 문턱을 서성거리는 프로그래머들이 꼭 한번 읽어보면 좋은 내용이라 생각됩니다.



요즘 항간에서는 딥 러닝 같은 단어가 여기저기서 들려는 오는 바람에, 나도 머신러닝인지 뭔지 한번 해 볼까 하고 생각해 오다 용기를 내어 두꺼운 알록달록한 책을 사긴 했는데 좀체 손이 가질 않고 나오는 수식만 봐도 머리가 아파오는분. 그리하여, 그래 어차피 나따위가 머신러닝같은거 할 수 있을리가 없어 라는 한숨 섞인 자조속에 눈이 저절로 감겨오는 분 이라면 잠깐 시간을 내어 이 글을 끝까지 읽어 보시기 바랍니다.

대상

  • 공부에 많은 시간을 투자하기 어려운 직업 프로그래머
  • 슬슬 윗사람이나 고객 에게서 “이런건 머신러닝 이용하면 간단하지 않어?”라는 말을 듣게될것 같은 분
  • 이과에서 수학을 공부하긴 했지만, 미분이라던지 행렬같은거 누가 물어보면 난처해 지는분

이 글에서 다루게 될 것

  • 수학의 기본지식에 익숙해지기 위한, 수학이 처음부터 나오지 않는 프로그래머를 위한 수학입문서의 소개
  • 머신러닝의 초보자에게 알맞은 머신러닝애 대한 온라인강좌(MOOC) 소개

환경

  • 윈도우나 맥,리눅스에서 사용 가능한 MATLAB/Ocatave라는 툴을 사용합니다.
  • 종이와 팬을 준비해두면 이해를 돕는데 편리합니다.

용어와 약어소개

  • PRML = 웹에서 머신러닝으로 검색하면 반드시 등장하는 약어입니다. Pattern Recognition and Machine Learning의 약자로 머신러닝에서는 바이블이라 할 수 있는 책 입니다. 이 글의 서문에서 소개한 알록달록한 책이 바로 이 책입니다.
  • MOOC/MOOCs = Massie Open Online Course(s)의 약자. 인터넷상에서 무료로 수강 가능한 오픈 강좌를 말합니다. 이번에 여러모로 많은 도움을 받고 있습니다.

초보자의 머신러닝학습 흐름

“전혀 머신러닝은 공부한적이 없고, 책을 좀 읽을라치면 수학공식이 나오는 바람에 어디서부터 시작해야 할 지 모르겠습니다” 라는 프로그래머에게 제 자신의 실제 경험을 바탕으로 권해드리는 방법은 다음과 같습니다.
  1. 행렬이라던지 백터를 모른다면 동영상을 봐도 중간에 무슨 소리인지 알 수가 없습니다. 따라서 프로그래머를 위한 수학책을 먼저 읽을 필요가 있습니다.
  2. Coursera라는 온라인 강좌의 회원이 되고, 스텐퍼드 대학의 Andrew NG(앤드류 응)교수의 Machine Learning강의(무료)를 듣습니다.
그럼 이제부터 자세히 살펴보겠습니다.

프로그래머를 위한 수학 책

프로그래머 여러분들은 게이밍라던지 소프트웨어라던지 설명서를 읽기 보다는 어떻게든 일단 프로그램을 짜서 움직이는것을 보면서 생각하자는 식의 사고 회로가 형성되어 있다고 생각합니다.
하지만 이 머신러닝에 대한 공부라는 것은 수학적인 기초가 없는 상태에서 진행하려고 하는것은 게임으로 비교하자면 변변한 무기도 없이 어려운 던전에 들어가는것과 마찬가지라서 금방 벽에 부딧히게 됩니다.
머신러닝에 대한 책은 미분 적분과 선형대수를 알고있다는것을 전제하고 있기 때문에, 갑자기 모르는 수식이 튀어나오는것은 바로 그 부분에 대한 지식이 없는것이 원인입니다.
위에 설명한 코세라의 머신러닝 과정은 그러한 수학 지식이 없어도 들을 수 있게 배려하고 있으며, 중간중간 해설도 해 주는 프로그래머 친화적인 교육 코스입니다.
그래도 최소한 행렬과 백터의 취급에 익숙하지 않으면 중간중간 튀어나오는 행렬조작에 대한 내용들을 이해 못하고 이게 뭔가 라는 상태가 되기 쉽습니다. 그래서 사전에 준비운동 정도로 익혀 두는것이 좋습니다.
프로그래머를 대상으로 추천할만 선형 대수학 강의/책은 여기 입니다.(역자주:원문에서는 일본어로 된 서적:프로그래밍을 위한 선형대수학(히라 카즈유키저)을 소개하고 있어 한국에서 접할 수 있는 선형대수 관련 강의/책으로 대체하여 소개해 봅니다)
  • 칸아카데미 선형대수 강의(한글자막)
    뭐 설명이 필요 없습니다. 마치 어딘가의 광고에 나오는 문구 처럼 씹을 필요도 없이 보기만 하면 머리속에 쏙쏙 들어오는 명 강의입니다.
  • 코딩 더 메트릭스
    파이선을 이용행 여러가지 선영대수의 문제를 풀는 법에 대하여 설명하고 있습니다. 머신러닝에 있어서 많은 예제들이 파이선으로 작성되어 있으므로 파이선이 익숙치 않다면 이번 기회에 다뤄보는것도 좋을듯 합니다. Coursera에서 하는 동명의 강의도 같은 내용을 다루고 있으며 프로그래머를 위한 선형대수를 자세히 다루고 있으므로 추천할만 합니다.
개인적으로는 바로 다음에 소개할 머신러닝 과정을 이해하는데 필요한 최소의 지식이 행렬의 곱이라고 생각합니다. 중요한것은 머리속에서 어떻게 이미지를 그려나가야 하는지를 알아야 하는것 같습니다.
저는 행렬 수식의 어디에 어떻게 주목하지 않으면 안되는 것인지 전혀 이해할 수 없었습니다만 행렬의 진정한 가치는 사이즈의 변환에 있다는것을 알게되었습니다. ( 역자주 : 칸아카데미의 Scaling vector에 나오는 예제들을 충분히 다뤄보시기 바랍니다)

머신러닝 강의를 수강한다

머신러닝 초보자에게 추천하는 것이 지금부터 소개하는 온라인 강좌입니다. 등록 방법은 여기에서 설명하지 않겠습니다만, 여렵지 않게 계정을 만들고 수강신청을 할 수 있습니다.
이 강의를 추천하는 이유는 다음과 같습니다.
  • 공짜다
  • 머신러닝 에서 초심자에게 필요한 지식을 개념을 통해 설명해 줍니다.
  • 어렵지 않은 수준의 영어로 강의가 진행됩니다. (역자주: 2015년 5월 현재 이 강의의 모든 동영상은 일본어 자막 지원하지만 한국어 자막은 소개부분의 일부분만 지원되고 있습니다)
  • 영상 강의 뿐만 아니라 시험도 봅니다. 실제로 프로그램 결과를 제출해야만 합니다. 그래서 자신이 이해하고 있는지 여부를 알기 쉽습니다.
  • 시험은 여러 번 제출을 할 수 있기 때문에 혹시 잘 못하면 어쩌나 라는 생각을 하지 않아도 좋습니다.
  • 기한이 따로 없습니다. 자신의 페이스에 맞춰서 학습을 진행 할 수 있습니다.
  • 동영상 다운로드가 있기 때문에 열차안에서도 보기 쉽습니다.
장점이 많은 강의이지만, 온라인 강의의 특성상 통제 불가능한 부분도 있습니다.
  • 기한도 없고 돈도 내지 않기 때문에 중간에 그만둬 버리기 쉽다
사실, 강좌를 시작하는 사람수에 비해 끝까지 마치는 사람의 비율은 매우 낮다는 데이터가 있다고 합니다. 그래서 마지막으로 필요한 것은 ‘강철의 의지’ 입니다. 혼자 하기 어렵다면 친구나 동료를 모아 함께 배워나가는 것이 좋을지도 모릅니다.
역자주: 그렇습니다. 이 강의는 혼자 듣기가 참 어렵습니다. 일단 18주(무려 4달 반에 해당한다!)에 이르는 양도 양 이지만 연습문제풀이등에서 막히면 혼자 풀어나가기가 참 어렵습니다. 주변의 널널한 프로그래머, 혹은 수학이나 통계학 전공자 들을 꼬득여 온라인 스터디 그룹을 만들고 1주일에 한번씩 서로의 진도를 체크해 주며 격려해 나가는 것도 한가지 좋은 방법이 되리라 생각합니다.

머신러닝 과정의 내용

  • 여러가지 WEB페이지에 같은 내용의 소개가 있습니다만, 시기에 따라 코스수나 조건이 달라지는것 같습니다. 이 글의 내용은 2015년 5월 현재 오픈된 코스를 기준으로 소개합니다.

1. Introduction(소개)

머신러닝이라는게 데체 뭐야? 어디서 쓰는 것인지에 대해서 설명하고 있습니다. 아울러 쓰게되는 툴의 설치 방법을 설명하고 있습니다.
동영상은 물론 자막이 있으며 아직 한국어 자막은 소개 이외엔 제공되고 있지 않습니다만 영어 자막을 켜거나 일본어가 가능하다면 일본어 자막을 선택 할 수 있습니다.
설명은 윈도우즈라면 MATLAB를 설치하는것 부터 시작합니다. (이 과정을 수강하면 무료로 사용할 수 있습니다.) Linux / Mac OS X라면 Octave를 인스톨 합니다.
각 장에서 토론을 할 수 있는 게시판 같은 곳이 있는데, 아무것도 쓰지 않아도 과정을 끝까지 수료하는데엔 아무 문제가 없으므로 인스톨 이외엔 무시하고 넘어갑시다.

2. Linear Regression with One Variable(변수의 선형 회귀)

여기서부터 실전으로 들어갑니다. 머신러닝의 출발은 선형 회귀라는 것을 알 수 있습니다.
또한 이 장에서는 앞 장에서는 없었던 Review라는 이름의 테스트가 있습니다.
테스트는 5 문항 중 4 문항이상을 맞춰야 통과가 되는데, 단순 객관식이 아니라 복수 선택이라던지 계산하여 숫자를 써 넣는식으로 시험이 진행됩니다. 게다가, 어려운것은 매번 출제되는 순서나 내용이 바뀌므로 한번 통과했다 하더라도 다시 시험을 보았을때 떨어지느 경우도 있습니다.
게다가 이 테스트는 꼼수를 막기위해서 3회동안 패스(4문제 이상 정답 제출)하지 못하면 8시간 이내에 시험을 볼 수 없는 패널티가 주어지게 됩니다. (패널티는 이것 뿐입니다.)
패널티를 받게되면 아래 사진처럼 몇 분 내기라는 표시가 뜨게 됩니다.
테스트를 통과하지 못한다 하더라도 다음 진행을 못하는 것은 아니므로 혹시나 패널티를 받게 된다면 그냥 다음 진도를 일단 나가는 것이 좋습니다.

3. Linear Algebra Review(선형 대수학 복습)

선형 대수학을 모르면 앞으로 진행 할수 없다는 것을 잘 알려주는 장 입니다. 기초에 대해 많은 공을 들여 친절하게 시간을 투자하고 있습니다. 머신러닝에 사용되는 행렬이나 벡터에 대한 개념을 이 장에서 잡으셔야 합니다.
이 장의 Review는 좀 달라서, 이 장에서 한두번 치루게 되는 확인시험과 동일한 평가를 Review형식으로 취합니다. 따라서 클리어 한다고 해도 전체 성적에 반영되지는 않습니다. 혼동하지 않도록 주의합시다. 이 후로도 이러한 형태의 시험은 여기 뿐입니다.

4. Linear Regression with Multiple Variables(다변량 선형 회귀)

2장에서는 선형 회귀를 살펴보았으므로, 이번에는 다변량 선형 회귀에 대한 강의입니다. 다변량을 취급하는데 있어서 규모를 맞추거나 매개 변수의 조정에 대한 논의가 있습니다.
또한 이 장에서 프로그램을 직접 짜는 테스트가 추가됩니다. MATLAB/Octave에 익숙하지 않으면 좀 푸는 것이 괴롭습니다. 하지만, MATLAB/Octave에 대해서는 다음장에서 설명을 시작하므로 먼저 5장을 듣고 나서 돌아오는것이 좋습니다.
덧붙여서, 프로그램은 MATLAB/Octave에서 직접 업로드 할 수 있습니다. 업로드 하면 WEB에서 성적을 볼 수 있습니다. 업로드는 몇번이고 가능하므로 부담 갖지 말고 들어보시기 바랍니다.

5. Octave Tutorial(Octave의 설명)

Octave라고 써 있습니다만, MATLAB도 마찬가지입니다. 행렬 처리에 익숙하지 않은 사람은 이 장의 “Vectorization”동영상의 내용을 마스터 하면 for문이 불필요한 계산을 구축 할 수 있게 됩니다. 개인적으로 이 장의 강좌를 들으면서 좋았다고 생각한 순간이었습니다.
역자주: 이 강의에서는 MATLAB/Octabe를 위주로 설명하고 있지만 기업환경에서 머신러닝을 이끌고 있는 대중적인 언어는 파이선/R입니다. 파이선이나 R에 대한 튜토리얼은 아래 링크에서 확인해 보세요.

6. Logistic Regression(로지스틱 회귀)

동영상 내에서도 선생님이 혼자서 마구 달라는 느낌입니다만, 이름은 ‘회귀(Regression)’ 인데 ‘분류(Classification)’에 에 사용되는 로지스틱 회귀를 배우는 장 입니다. 선형 회귀와 비슷한데, 다른 곳을 확인하는것으로 머신러닝에 대한 깊이가 드러나게 됩니다.
또한 여기서도 프로그램의 게시물 테스트가 있는데, 곤란하게도 다음장에 배울 지식이 없으면 풀리지 않는 문제(Regularization:정규화)가 들어 있습니다. 제 경우 결국 풀지 못하고 다음장에 갔다가 다시 돌아와서 풀어야만 했습니다. 설명하지 않아도 풀 수 있을거라고 생각했는지, 암튼 여러가지로 깊이가 있는 챕터입니다.

7. Regularization(정규화)

점점 머신러닝 다워 진다고나 할까, “XX를 향상시키기 위해 이를 수식에 추가”라는 요소 중 하나인 정규화에 대해 배울 수 있는 장 입니다. 장으로는 짧지만, 이 장을 대충 넘기게 되면 나중에 다시보지 않으면 안되는 것이 많아지므로 제대로 이해하는것이 중요합니다.

8. Neural Networks : Representation(신경망:표현)

이번 장은 전반부 최대의 고비인 신경망에 대한 내용입니다. 비교적 복잡하기 때문에 2개의 장으로 나눠져 있습니다. 이 장에서는 먼저 입출력에서 출력까지 어떻게 계산하고 진행해야 하는지를 설명하고 있습니다.

9. Neural Networks: Learning(신경망:학습)

여기가 신경망을 머신러닝에 적용시키는데 중요한 Backpropagation(오차역전파방법)에 대해서 설명하는 장 입니다. 저는 지금까지 다른 책 이라던지 웹에 적힌 내용을 봐도 도통 뉴럴네트워크가 어떻게 학습을 해 나가는지 이해 할 수 없었습니다만, 동영상 및 구현을 보고 마침내 어떤 계산에서 학습하고 있는지를 알겠다는 생각이 들었습니다.

10. Advice for Applying Machine Learning(머신러닝을 적용하기 위한 조언)

머신러닝 이론을 안다고 해도 실제 적용하기 위해서 무엇을 조심하지 않으면 안되는가에 대해서 다루는 대단히 중요한 장 입니다.
언더핏, 오버핏, 학습곡선이 어떻게 되는가 등 머신러닝을 실무에 적용하려 할때 지침이 되는 장 입니다.

11. Machine Learning System Design(머신러닝 시스템 디자인)

이전 장 처럼 이번 장도 머신러닝을 실무에 도입하려고 할 때 발생하는 문제점을 알아보고 해결책을 제시하는 장 입니다.
구체적으로는 99%일어나지 않지만 1%일어날 가능성이 있는 현상에 대해서 머신러닝의 지표는 어떻게 설정해야 하는것인가에 대해서 이야기 하고 있습니다.

12. Support Vector Machines(서포트 벡터 머신(SVM))

분류 알고리즘의 하나인 SVM에 대한 장 입니다. SVM은 인기있는 알고리즘 이므로 잘 배워둬야 한다고 선생님은 말씀하시고 있었습니다.
또한 마지막 동영상은 SVM을 포함해 여러 알고리즘들이 어떤때 사용되는지 이야기 하고 있으므로 잘 기억해 둬야 하는 포인트 입니다.

13. Unsupervised Learning(무감독 학습)

이번장부터 15장 까지가 무감독 학습의 장 입니다. 이 장 에서는 K-Means알고리즘이라 불리우는 인기있는 다운클러스터링 알고리즘에 대해 배웁니다.

14. Dimensionality Reduction(차원감소)

이 장에서는 차원감소에 대해서 배웁니다. 차원감소라는 개념에서 실제로 배우는 알고리즘은 PCA(주성분 분석)라 불리우는 알고리즘 입니다.
저는 100차원이든 1000차원이든 2차원 또는 3차원까지 줄여버리면 그래프 그리기가 가능하다는 것으로 듣고 학습 동기가 생겼습니다.
또한 차원을 감소 시켜 극단적으로 적은 수가 된다면 어떻게 될까 생각했습니다만, 그에 대해서는 제대로 대답이 준비되어 있어 원래의 상태 대비 압축 정도에 따라 어느정도 정보량이 손실되는지를 파악하는 것이 중요하다고 생각했습니다.

15. Anomaly Detection(이상 검출)

이상을 검출하는 알고리즘을 학습하는 장 입니다.
여기서 처음으로 정규분포(상당히 복잡한 수식)이 나오는 것 입니다만, 그 이전에 여러 수식에 익숙해 진 터라, 그렇게까지 흉악해 보이지는 않았습니다.
흥미로왔던 것은 감독 학습과 비정상 검출을 비교하여, 데이터 상태에 따라 어느쪽을 사용해야 할 지와 같은 주제가 앞으로 도움이 될 것이라 합니다.

16. Recommender Systems(추천시스템)

사용자가 평가 한 영화의 평점을 어떻게 처리할 것 인가라는 굉장히 실용적인 주제에 대한 해설을 하는 장 입니다.
처음에는 제한적인 작은 데이터부터 시작하여 마지막에는 비어있는 부분이 있다 하여도 모든 파라메터를 단번에 계산 해 버릴 듯한 이야기의 흐름이 무척 좋았습니다.

17. Large Scale Machine Learning(대규모 머신러닝)

대규모 데이터에대해서 매번 전부다 처리를 하게되면 속도가 느려지는 것에 대해서 어떻게 할 지를 생각해 보는 장 입니다.
여기에서 처음 Map-Reduce개념이 등장 합니다만, 분할해서 처리하니 빠르군요 정도의 뻔한 수준의 이야기 이므로 좀 더 자세하게 알아보고 싶으신 분들은 다른 문헌을 찾아보시는것을 추천합니다.

18. Application Example : Photo OCR(응용 예: 사진에서의 텍스트 추출)

마지막 장은 응용에 대한 예로서 파이프라인을 이용한 머신러닝 로직의 조합으로, 사진에서 텍스트를 추출하는 작업을 수행합니다.
실제 프로그램을 짤 것이라고 생각했는데, 이 장에서는 프로그램을 제출하지 않았습니다.

모든 테스트를 통과하면 무엇이 일어나는가?

기간제 코스의 경우 유료로 수료증 같은 것을 발행해 주는듯 합니다만, 완전 오픈코스인 이 과정은 결과가 코스 상단에 표시됩니다.
역자주: 코세라는 코스 자체는 무료로 제공하고 있으며, 수료증을 유료로 제공하는것을 비즈니스 모델로 하고 있습니다.
실제 전 과정을 패스하자 아래와 같이 표시되어 “Course Passed”부분에 뭔가 링크가 있을까 기대해 봤지만… 아니었습니다.

머신러닝 수강이 끝났다! 이제 뭘 하지?

프로그래머라면 이제 손을 움직여 다양한 것을 구현해 나갑시다. 샘플 코드의 의미도 알게 되었고 어디를 수정하면 어떻게 될까 어쨌든 머리속에 그려 볼 수 있게 된 듯 합니다.
스터디 그룹같은걸 열어서 아직 머신러닝에 경험이 없는 사람을 끌여들여 동료로 늘려 나가는 것도 좋은 방법입니다.
참여자가 늘지 않으면 이 분야는 발전이 없기 때문에 꼭 주변에 퍼트리고 다닙시다.

역자 추가: 머신 러닝 관련 읽을거리들

쉽게 풀어쓴 딥 러닝의 모든것
PredictionIO:오픈소스 머신러닝서버
Getting Started with Microsoft Azure Machine Learning :간편한 인터페이스임에도 강력한 기능을 제공하는 AzureML에 대한 온라인 강좌 입니다.
DL4J: Word2Vec를 비롯 각종 머신러닝 알고리즘을 자바에서 쓸 수 있게 해 주는 오픈소스 프로젝트입니다.