레이블이 BigData인 게시물을 표시합니다. 모든 게시물 표시
레이블이 BigData인 게시물을 표시합니다. 모든 게시물 표시

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를 비롯 각종 머신러닝 알고리즘을 자바에서 쓸 수 있게 해 주는 오픈소스 프로젝트입니다.

2014년 12월 10일 수요일

자연어 처리의 고속실행을 위한 미들웨어 RaSC 소개

 형태소 분석이나 음성 인식 엔진과 같이 대용량의 사전 데이터나 메타 데이터를 이용하는 처리 들은 프로그램 기동시에 상당한 시간이 걸릴 뿐더러 처리 자체에도 시간이 많이 소요된다.

 오늘 소개하는 RaSC (Rapid Service Connector)는 이러한 무거운 처리 들을 고속으로 처리하기 위해 만들어진 병렬 실행 미들웨어로 독일의 Information Analysis Laboratory at the National Institute of Information and Communications Technology (NICT)에서 개발된 오픈소스 소프트웨어이다.

 아래의 내용은 일본어판영문판 RaSC소개 페이지의 내용을 정리한 것이다.

RaSC개요

 RaSC은 기존의 형태소 분석기 및 음성 분석기 등의 프로그램을 대량의 Web 페이지에 빠르게 적용하는 것을 염두에 두고 개발 되었다. 다양한 사용자 프로그램을 복수 인스턴스로 기동 시킨 후 서로를 연결하여 분산 병렬 처리를 실행 시키기 위한 미들웨어이다.

 처리의 예로는 하나의 파일이나 스트림에 있는 복수의 입력에 대해 사용자 프로그램을 멀티 인스턴스 기동시키고  멀티 코어 CPU를 활용하여 병렬 실행하거나 여러 머신상에서 분산 수행하는 것이 용이 하다. 또한 대용량 데이터를 분할하여 다른 컴퓨터에 저장하고 각각에 대응하는 다양한 어플리케이션을 여러 인스턴스에서 분할 된 데이터를 각각 처리하여 대규모 데이터의 고속 처리가 가능하게 된다.

RaSC는 자연 언어 처리를 염두에 두고 개발 되었지만, 지원하는 프로그램은 자연 언어 처리 프로그램에 한정되지 않고 다양한 프로그램에 적용 가능하다. 표준 입력이나 파일에서 입력을 받고 표준 출력 또는 파일에 결과를 출력하는 프로그램이라면 대부분의 경우 작은 변경 만으로도 RaSC에서 분산 수행 할 수 있다.

 RaSC에서 실행되는 어플리케이션 프로세스는 한 번 시작되면 컴퓨터에 상주한다. 따라서 사전 파일을 로드하는 언어 처리 프로그램처럼 거대한 파일의 로드 등으로 기동 시간이 길어지는 프로그램도 효율적으로 실행할 수 있다. 또한 웹어플리케이션과 같이 복수의 요청에 대해서도 처리 인스턴스를 복수의 기기/코어에 병렬 · 분산 실행하여 고속화 시킨다.

 다음은 구문 분석 시스템 KNP 을 RaSC에서 실행 한 예 이다.  500 라인의 문서 입력에 대해, 그것을 여러 실행 프로세스에 할당함으로써 멀티 코어 CPU에 의한 병렬 처리 (Intel Xeon X5675 * 2에서 8 병렬 실행)에서 5 배 정도의 처리 속도 개선이 이루어지고 있는 것을 볼 수 있다. 또한 원래의 입력 파일 (INPUT_TXT)의 입력 순서는 출력 파일 (OUTPUT_TXT)에도 저장된다.

$ time cat INPUT_TXT | juman | knp > OUTPUT_TXT  # Directly run a user program without RaSC
real    2m28.456s   # Without parallelization
user    2m17.557s
sys     0m1.011s
$ ./server.sh KNPService 19999 start # Start a RaSC service that runs KNP
$ time cat INPUT_TXT | java -cp ./lib/*: RaSCClient localhost 19999 > OUTPUT_TXT   # Other computer nodes can be accessed by changing the host and port.
real    0m29.402s   # Parallelization with RaSC (8 parallel processes on two Intel Xeon X5675)
user    0m0.566s
sys     0m0.045s

라이센스

 RaSC은 LGPL v2.1 로 배포되고 있기는 하지만 마이크로서비스 형태의 독립 웹 인터페이스로 다른 프로그램들과 연동 가능하므로 다른 LGPL오픈소스 DB와 마찬가지로 라이센스의 제약에서도 자유롭게 시스템 구성이 가능하다.

RaSC 서비스 화 가능한 프로그램 

RaSC 서비스화 하는 프로그램은 다음과 같은 조건을 충족해야 한다.


  • 표준 입출력을 통한 입출력 지원: 1 개의 입력이 주어지면 해당 결과를 출력하고 종료하지 않고 다음 입력을 기다린다.


  • 입력과 출력에 명시 적 종결 자 문자열을 출력: 형태소 분석 프로그램 MeCab 구문 분석 프로그램 J.DepP 등은 이러한 조건을 충족합니다. 개행을 종단하는 입력 1 개를 받으면 문자열 "EOS"를 종료 문자열로 결과를 출력한 후에 그 다음 입력을 기다린다.


이러한 조건을 충족하지 못하는 프로그램은 RaSC 서비스하려면 약간의 수정이 필요하다. 소스 코드가 있으면, 많은 경우 수정 그리 어려운 일이 아니라 SVM Perf , CRF ++ 등의 프로그램에 대해서는 RaSC사이트에서 RaSC 서비스에 대한 패치를 다운로드 할 수 있다.

현재 RaSC에서 작동이 확인된 프로그램들은 다음과 같다.
User programService definition XMLRemarks
Morphological analyzer MeCabService definition XML,
Service definition XML
(with 8-parallel processes)
Morphological analyzer JumanService definition XML,
Service definition XML
(with 8-parallel processes)
Dependency parser J.DepPService definition XML,
Service definition XML
(with 8-parallel processes)
A shell script is required to connect with MeCab through a pipe (refer to How to connect multiple user programs through a pipe)
Dependency parser KNPService definition XML,
Service definition XML
(with 8-parallel processes)
A shell script is required to connect with Juman through a pipe (refer to How to connect multiple user programs through a pipe)
Dependency parser EnjuService definition XML,
Service definition XML
(with 8-parallel processes)
GENIA taggerService definition XML,
Service definition XML
(with 8-parallel processes)
Speech recognition engine Julius-Refer to the article by Yuki Igarashi, at Tohoku University (in Japanese).
SVM PerfService definition XMLApply a patch to the SVM Perf (refer to Use SVM Perf)
CRF++Service definition XMLApply patch to the CRF++ (refer to Use CRF++)
TinySVMService definition XMLApply a patch to the TinySVM (refer to Use TinySVM)

Links


2014년 11월 19일 수요일

자연어 기계학습의 혁명적 진화 - Word2Vec에 대하여

 기계학습의 여러 분야중에서도 자연언어 처리는 가장 흥미진진하고 응용분야가 넓다. 하지만 이 분야의 연구 진행은 토론토 대학의 교수이자 구글에서 인공지능을 연구하고 있는 인공지능 분야의 거장인 Geoff Hinton이 reddit에서 진행된 질의답변 이벤트에서 지적한 바와 같이 반세기 가까이 벨 연구에서 진행된 연구들의 재탕에 지나지 않는 답보 상태에 있는 실정이다.
 여기에 최근 주목할만한 한가지 흐름이 나타났기에 이번 포스팅에서 소개해 보고자 한다.

출처 deeplearning4j

Word2Vec


 Word2Vec는 구글의 연구원인 Tomas Mikolov와 Kai Chen, Greg Corrado, Jeffrey Dean에 의해 쓰여진 논문인 "Efficient Estimation of Word Representations in
Vector Space(백터공간상에서 단어 의미의 효율적인 추정)"에서 제안된 방법을 구현한 알고리즘으로 기존의 알고리즘에 비해 자연언어 처리 분야에서 비약적인 정밀도 향상을 가능하게 하고 있다.

그렇다. 논문 저자의 한 명은 바로 그 Jeff Dean이다.

 Word2Vedc는 이름이 나타내는 바와 같이 단어의 의미를 벡터형태로 표현하는 계량기법으로,  각 단어를 200차원 정도의 공간에서 벡터로 표현하고 있다. 단어에 대한 벡터 표현 생성 연구는 이전에도 있었지만, 그들과의 차이는 그 벡터가 단순한 수학적 존재 이상의 복잡한 개념 표현을 넘어 추론까지도 손쉽게 구현이  가능하다는 점 이다.

Word2Vec를 나타낸 그림.
두 단어간의 거리는 관계성을. 방향은 문맥상의 의미를 내포하게 된다.
출처: insightdatascience.com


 Word2Vec의 가능성을 실감할 수 있는 예를 한가지 살펴보자.

Insight Data Science의 데이터 과학자인 Christopher Moody는 Word2Vec를 이용해 검색엔진 형태의 질의 응답 사이트를 만들었다.


 (이 글을 포스팅하는 시점인 2014년11월19일에는 접속이 안 되고 있음)

France - Paris + Seoul  = Korea

 위의 수식에서 프랑스France는 파리Paris와 연결되어  문맥 상 그 도시를 수도로 하는 국가를 나타내고 여기에 서울Seoul이 더해짐으로서 대한민국Korea이라는 결론이 도출된다.

 비슷하게 "왕 - 남자 + 여자 = 여왕"이라는 계산이나 "농구 - 마이클 조던 + 골프 = 타이거 우즈"와 같은 추론도 가능하다. 즉, 두 단어를 이은 방향이 문맥적 의미를 표현하게 되며  Word2Vec는 이러한 과정을 간단하게 처리하면서도 높은 정확도를 자랑한다.

 재미있는 예를 좀 더 살펴보자.

메트릭스의 생각없는 버전 = 블레이드2


이쯤되면 한국어 학습도 시켜보고 싶어진다.
넣어 보고 싶은 이름들이 많다.


 이와 같이, 문맥상의 의미를 정량화된 벡터로서 표현하는 것이 가능해지게 되는 것이다.
 논문이 발표되고 불과 1년 사이에 Tomas Mikolov 본인을 포함해 많은 연구자들이 어마어마한 양의 관련 논문들을 쏟아내고 있으며  딥 러닝을 통한 추론의 정밀도를 비약적으로 향상시킬 수 있다는 사실도 입증이 되었다.

Word2Vec는 어떻게 동작하는가?


 Word2Vec는 원래 인공 신경망 연구에서 태어났으며 같은 맥락을 지닌 단어는 가까운 의미를 지니고 있다는 전제에서 출발한다. Word2Vec는 텍스트 문서를 통해 학습을 진행하며 한 단어에 대해 근처(전후 5-10단어 정도)에 출현하는 다른 단어들을 관련 단어로서 인공 신경망에 학습 시킨다. 연관된 의미의 단어들은 문서상에서 가까운 곳에 출현할 가능성이 높기 때문에 학습을 반복해 나가는 과정에서 두 단어는 점차 가까운 벡터를 지니게 되는 것이다.

 원래 이러한 문제는 엄청난 계산을 필요로 하지만, Mikolov는 논문에서 계산 효율도 크게 향상 시켰고(논문의 저자 중 한 사람은 구글 최적화의 신으로 불리는 바로 그 Jeff Dean이다!), 그 결과 현재 C, Python, Java, Go, Scala등 다양한 언어로 구현이 진행되고 있다. 뿐만 아니라 Apache Spark등의 빅데이터 처리엔진도 이미 Word2Vec을 지원하고 있다.

Apache Spark MLlib Word2Vec 문서

물론 학습에 사용되는 문서의 양에 따라 학습에는 다소 시간이 필요하지만 텍스트 문장을 읽어 들이는 것 만으로도 동작 시키는 것 이 가능하기 때문에 매우 기초적인 프로그래밍 기술만 있으면 누구나 쉽게 사용이 가능하다.

 Word2Vec의 덕분에 자연어 기계학습 분야가 개발자들 사이에서 빠른 속도로 일반화 되어가고 있으며 연구자들로 부터도 막대한 논문들과 관련 오픈소스 라이브러리들이 쏟아져 나오고 있다. 그런데 정작 아이러니한 것은 Word2Vec의 계산 결과들이 어떻게 문맥적 의미들을 내포하게 되었는지 제대로 설명이 되지 않고 있다는 점 이다. 

무궁무진한 활용도

  Word2Vec는 간단한 사용법에 비해 터무니 없는 정확도를 제공함으로서 무궁무진한 활용이 기대되고 있다. 현재 많은 연구자들이 단어중심에서 문장이나, 영상, 이미지간의 백터 처리법으로 영역을 점차 확대시켜 나가고 있으며 이를 통해 분석결과의 정확도를 비약적으로 향상시켜 나갈 수 있을것으로 기대되고 있다.
 특히 문맥에 의한 의미파악이라는 특성은 지금까지도 상당한 난제로 손꼽히는 언어간 번역의 정확도를 높이는데 크게 기여할 수 있을것으로 예상된다. 

 모쪼록 이 글을 통해 보다 많은 개발자 들이 흥미를 가지고 한국어에 대한 의미있는 연구 결과들이 나오길 기대해 본다.

최신정보

Word2Vec 개발에 주도적인 역할을 담당한 Mikolov는 지난 8월 구글을 퇴사하고 페이스북으로 이적한 것으로 추정되며, 벡터 해석을 단어에서 구문까지 확장시킨 Paragraph2Vec의 구현에 주력하고 있다고 한다. Paragraph2Vec에 대한 논문은 현재 스텐포드 대학을 통해 공개되어 있으며 아래 URL에서 열람이 가능하다.



참고문헌




2014년 10월 13일 월요일

MapReduce를 대체할 구글의 새로운 빅데이터 분석서비스 - Google Cloud Dataflow

이번 포스팅에서는 발표된지 시간이 조금 지나긴 했지만 국내에는 아직 제대로 소개가 안된 Google Cloud Dataflow(이하 GCD)에 대해서 살펴보는 시간을 가져보고자 한다. GCD는 지난 6월 25일 열렸던 연례 개발자회의 'Google I/O 2014'에서 처음 공개가 된 구글의 새로운 빅데이터 분석서비스이다.

GCD는 이름에서 알 수 있듯이 구글의 클라우드 플래폼과 연동되어 사용 가능한 빅데이터 분석 서비스로,  "배치 모드"와 "스트리밍 모드"의 두가지 형태로 대량의 데이터를 처리 할 수 있다. GCP는 MapReduce의 후계로서 구글이 자사 서비스를 위해 독자적으로 개발한 병렬 처리용 잡바 프레임워크인 FlumeJava와 고속 데이터 프로세싱 어플리케이션 구축용 프레임워크인 MillWheel을 기반으로 개발되었다.

이제 GCD가 어떠한 것인지 구체적으로 살펴보자.
이하 사진들은 모두 Youtube에 공개된 키노트 세션 동영상에서 발췌하였다.

GCD의 기본적인 컨셉은 빅데이터를 다루는데 있어서 최적화, 배포, 스케줄링, 모니터링과 같은 주변 기능들을 모두 GCD가 담당해 주어 사용자는 빅데이터 분석 어플리케이션에 집중 할 수 있게 한다는 것 이다.

데이터 추출을 위한 코드의 예제. 트위터에서 실시간으로 발생하는 데이터를 파이프라인으로 연결하고 있는데, 현 시점에서 공개된 샘플은 자바 뿐이다.

읽어들인 원시데이터를 변환하는 코드.

파이프라인을 사용하여 JSON형식의 데이터 스트림을 생성하여 일괄 처리할 데이터를 축척한 후에 다양한 형식으로 변환하고 있다. 

GCD는 처리 과정에 대한 실시간 모니터링 툴을 제공하고 있다.

GCD는 웹 콘솔로 클라우드 플랫폼 위에서 동작하는 자바 코드를 디버깅 할 수 있는 툴을 제공하고 있다. 이 툴은 프로덕션 환경에 영향을 주지 않으면서도 디버깅이 가능하다.
  GCD는 현재 상용서비스중인 BigQuery가 적은 학습비용에도 막강한 성능을 제공하는 빅데이터 분석 프로토 타이핑에 특화되어 있다고 한다면, 이에 비해 보다 다양하고 강력한 프로덕션 환경을 제공해 줄 것으로 기대된다.