월간 보관물: 2016 5월

Unsupervised Learning through Video Prediction

구글 IO 2016 기조 연설에서 선다 피차이(Sundar Pichai) CEO가 스스로 학습하여 물건을 집는 로봇팔 영상을 보여 주었었습니다. 해당 페이퍼는 Ian Goodfellow 와 구글 브레인팀이 작성한 것으로 어제 공개되었습니다. 그리고 테스트 애니메이션은 여기서 확인할 수 있습니다. 애니메이션만 봐서는 잘 감이 오지 않네요. 페이퍼를 읽어보고 싶은데 늘 시간은 부족하네요. ^^

video-prediction

번외로 Ian Goodfellow가 있는 OpenAI에 팀원이 새로 추가되었습니다. 그리고 아마 근시일안에 첫번째 연구결과를 공개할거라는 소문입니다.

DSSTNE is Faster than TensorFlow

12pbkhxz60gfierig1slclg

아마존의 딥러닝 프레임워크 데스트니(DSSTNE)와 텐서플로우의 벤치마크 내용이 공개되었습니다. 이 벤치마크를 위한 코드는 데스트니 깃허브에서 확인하실 수 있습니다. 데스트니가 처음 공개되었을 때 온라인상에서 데스트니 프로젝트의 리더였었다며 여러 의견을 피력했었던 Scott Le Grand가 미디엄에 이번 벤치마킹과 관련된 을 올렸습니다.

AWS g2.8xlarge 인스턴스의 싱글 GPU에서 무비렌즈 20M 데이터셋을 이용하여 오토인코더를 위한 피드 포워드(Feed Forward) 뉴럴네트워크를 훈련시키는데 데스티가 텐서플로우보다 2배정도 빨랐다고 합니다. 위 그림에서 맨 왼쪽(TensorFlow Single GPU)과 왼쪽에서 두번째(DSSTNE Single GPU)의 노란색 막대 그래프입니다. 또한 두 패키지 모두 AWS에 있는 K520 GPU(2012년 출시) 보다 물리 서버에 장착한 M40 GPU(2015년 출시)에서 더 높은 성능을 내었지만 차이가 있었습니다. 텐서플로우는 M40을 사용해서 약 1.4배 정도 빨라 졌지만 데스트니는 3.4배 더 빨라 졌습니다.(푸른색 막대 그래프) 데스트니가 최신의 GPU의 성능을 더 잘 활용하고 있다고 볼 수 있습니다.

이런 성능의 차이가 나는 점은 텐서플로우가 GPU에 데이터를 로드시키는 데 더 많은 시간을 들이고 있기 때문이라고 합니다. 텐서플로우는 데이터를 numpy의 CSR 포맷과 유사한 형태로 관리하고 있고 데스트니는 파스칼 GPU가 제공하는 자동 메모리 관리 기능을 사용하고 있기 때문이라고 합니다. 데스트니의 또 하나의 장점은 모델 병렬화를 자동으로 해주는 것으로 여러개의 GPU에 연산을 자동으로 분배해 줍니다(데스트니 FAQ에서: DSSTNE can automatically distribute each computation across all available GPUs…). Quad GPU에서 데스트니는 Single GPU의 텐서플로우보다 무려 15배나 더 빠르다고 합니다. 텐서플로우에는 자동으로 모델을 병렬화해 주진 않기 때문에 이번 벤치마크에서는 직접 비교는 안되었지만 추후 텐서플로우 팀에서 이에 대응하는 실험을 할 수 있을 것 같습니다. 아마존이 데스트니를 공개한 것이 심심해서는 아니겠지만 생각보다 세게 나오네요.

Scott 는 Nvidia 출신으로 구글에 입사했으나 자기에게 GPU 코딩을 시키지 않아 금새 그만두고 아마존으로 이직했다고 합니다. 구글에 대한 시각이 그리 좋지는 않은 것 같습니다. TPU를 공개할 때 무어의 법칙의 3세대를 앞섰다고한 구글의 발언을 비꼬아 텐서플로우보다 데스트니를 사용하는게 3년은 더 무어의 법칙을 앞설 수 있을거라고 합니다 : )

Fizz Buzz in TensorFlow

Data Science from Scratch‘ 의 저자 Joel Grus가 블로그에 fizz buzz 문제를 다루는 면접 상황에서 엉뚱하게 텐서플로우를 이용해 대답하는 가상의 취업준비생의 이야기를 올렸습니다. 아주 재미있네요 🙂


면접관: 어서오세요. 커피나 다른 거 뭐 드릴까요? 한숨 돌리고 하실래요?

나: 아닙니다. 오늘 커피를 너무 많이 먹었어요.

면접관: 네, 좋습니다. 화이트보드에 코드를 적어야 하는데 괜찮으시죠?

나: 네 전 그렇게만 코딩해 봤어요!

면접관:

나: 농담입니다.

면접관: 좋습니다. 피즈버즈에 대해선 들어 보셨나요?

나:

면접관: 들어본건가요? 아닌가요?

나: 질문하신 내용이 믿기지 않는 쪽입니다.

면접관: 좋아요, 1에서 100까지 숫자를 프린트하는데 3으로 나누어지는 수는 ‘fizz’ 라고 프린트하고 5로 나누어지는 수는 ‘buzz’라고 프린트하고 15로 나누어지는 수는 ‘fizzbuzz’라고 프린트하면 됩니다.

나: 그 문제 압니다.

면접관: 다행이군요. 이걸 제대로 할 수 없는 사람은 회사 업무도 잘 못하더군요.

나:

면접관: 여기 마커랑 지우개가 있어요.

나: [몇분간 생각]

면접관: 어떻게 시작할지 좀 도와드릴까요?

나: 아뇨, 아닙니다. 괜찮아요. 그럼 기본적인 임포트부터 시작하겠습니다.:

import numpy as np
import tensorflow as tf

면접관: 음, 피즈버즈 문제 알고 있는 거 맞죠?

나: 그럼요. 그래서 지금 모델에 대해 말하려구요. 제 생각엔 하나의 히든 레이어를 갖는 간단한 멀티 레이어 퍼셉트론(multi-layer-perceptron)이 어떨까합니다.

면접관: 퍼셉트론요?

나: 아니면 뉴럴 네트워크나 뭐라 불러도 상관은 없어요. 입력은 숫자고 출력은 숫자에 대한 정확한 ‘fizzbuzz’ 표현이 되죠. 특별히 각 입력을 활성화(activation) 벡터로 변경할 필요가 있어요. 간단한 방법은 이진값으로 바꾸는 거죠.

면접관: 이진값이요?

나: 네, 아시겠지만 0 또는 1 이요. 이렇게요:

def binary_encode(i, num_digits):
    return np.array([i >> d & 1 for d in range(num_digits)])

(역주: 이 코드는 숫자의 이진수 표현의 각 자리의 값을 num_digits 크기의 배열로 만듭니다. 즉 3 은 [1, 1, 0, 0, 0, …] 이 됩니다.)

면접관: [몇분동안 화이트보드를 응시한다]

계속 읽기

TensorFlow를 이용한 구글 머신러닝 유투브 강의

지난 3월부터 유투브에 텐서플로우와 파이썬을 이용한 머신러닝 강의를 구글이 만들어서 시리즈로 올리고 있습니다. 현재는 4편까지 올라와 있습니다. 각 영상은 10분 미만으로 짧아서 바쁜 와중에도 잠깐씩 볼 수 있는 수준입니다.

아래는 2,3,4 편 주소입니다.

여하간 머신러닝을 알리기 위한 구글의 노력은 대단합니다. Jeff Dean구글 IO에서 언급한 것에서 느낄 수 있듯이 알고리즘이나 모델은 몇몇 연구자들이 만들더라도 이를 가져다 쓰는 사람은 개발자 저변으로 확대하고 싶은 것이 구글의 목표일 것입니다. 좀 더 체계적인 커리큘럼을 원하시면 유다시티(Udacity)의 딥러닝 강의를 추천해 드립니다.

(업데이트) 추가된 동영상 리스트입니다.

(업데이트) ‘Machine Learning Recipes with Josh Gordon‘ 란 이름으로 플레이 리스트가 만들어졌습니다.

딥러닝 패키지 비교

comparison_of_deep_learning_package

위키피디아에 딥러닝 패키지를 비교하는 페이지가 있어 소개해 드립니다. 현재 비교하고 있는 소프트웨어는 Caffe, CNTK, Deeplearning4j, MXNet, Neural Designer, OpenNN, SINGA, SystemML, TensorFlow, Theano, Torch 입니다. 이외에도 더 많은 패키지들이 있지만 점차 추가되지 않을까 합니다. 대표적인 툴들을 한 눈에 볼수 있어 참고자료로 사용하시면 좋을 것 같습니다.

Deep Q Learning with Gym and TensorFlow

model

텐서플로우와 OpenAI에서 공개한 강화학습 도구인 Gym을 이용한 Q Learning 구현물이 깃허브에 공개되었습니다. 이 코드는 2015년 네이처지에 실린 구글 딥마인드(DeepMind) 팀의 ‘Human-Level Control through Deep Reinforcement Learning‘ 논문을 텐서플로우와 Gym으로 구현한 것입니다. 결과 화면은 흥미롭습니다.

best

원 논문은 구현은 토치로 개발되었습니다. 원 논문의 소스는 여기서 다운받을 수 있습니다.

(추가) 이 코드는 쿠키런 게임을 개발한 데브시스터즈에서 만들었습니다. 강화학습 분야는 역시 게임회사에서 관심이 많은 것 같습니다.

Tensor Processing Unit(TPU)

구글 IO가 시작하자마자 여러 뉴스로 시끌벅적합니다. 그 중에서도 관심을 끄는 것은 바로 Tensor Processing Unit, TPU 입니다. 구글 선다 피차이 CEO는 구글 IO 2016 기조 연설 마지막 부분에서 머신러닝에 관해 발표하면서 최초로 TPU를 공개했습니다.

구글 블로그에 따르면 TPU는 머신러닝 특히 텐서플로우에 최적화된 반도체 칩으로 주문 제작되어 구글 데이터센터에서 일년전부터 사용되고 있다고 합니다. 검색, 스트릿뷰 등 많은 구글 팀에서 뿐만 아니라 알파고와 이세돌의 대국에도 바로 이 칩이 사용되었습니다. 오른쪽 사진이 이세돌과의 대국에 사용된 TPU가 꽂힌 서버랙 입니다. TPU는 서버의 하드드라이브 디스크에 슬롯에 꽂아서 사용할 수 있습니다. 랙 측면에 바둑판 사진이 붙어 있는게 보이네요.

구글이 머신러닝을 위한 칩을 직접 만들어 사용하는 것은 인텔이나 Nvidia에게는 슬픈소식이 될 것 같습니다. 이미 마이크로소프트도 직접 칩을 만든 적이 있고 애플도 오랫동안 아이폰과 아이패드에 직접 만든 칩을 사용해 왔습니다. 범용 GPU를 사용하지 않고 직접 만든 최적화된 칩을 이용해서 딥러닝 모델 학습을 보다 빠르게 하려는 경쟁에 불이 붙을 것 같습니다. 정말 놀랍고 두렵기도 합니다.

구글이 칩에 대한 상세 내용을 발표할 것 같지는 않습니다. 구글이 텐서플로우를 공개하고 개발자들이 열심히 배우게 한다음 세상에서 가장 빠른 딥러닝 칩이 꽂힌, 특히 텐서플로우에 최적화된, 구글 클라우드를 쓰라고 말하는 것 같습니다. 아마존은 계속 GPU를 쓸지 다른 선택을 할지 궁금합니다.

(추가) TPU에 대해 여러 기사가 나왔지만 대부분 구글이 많은 정보를 공개하지 않았기 때문에 구글 블로그에 있는 내용을 크게 벗어나지 못했습니다. 하지만 넥스트플랫폼에서 낸 이 기사는 흥미로운 점 몇가지를 알려주고 있습니다. TPU가 성능을 위해 부동 소숫점 연산의 복잡함을 어느정도 희생할 것이라 예상하는데 16비트 부동소숫점 연산인지 8비트 부동소숫점 연산인지에 대해 설왕설래 했었습니다. 그런데 이 기사에서 TPU는 8비트 정수라고 밝히고 있습니다. 또 TPU가 모델을 학습하는 것과 모델을 이용해 실행하는 곳 모두 사용되는 것으로 추측하고 있으며 정확히 구글의 머신러닝 중 얼만큼이 TPU를 통해 처리되는 지는 밝혀지지 않았다고 합니다. 여러 미디어들이 언급한 것 처럼 TPU의 성능이 명확히 공개되지는 않는 상황에서 이번 발표는 상당부분 마케팅 적인 측면이 있다고 여기고 있습니다. 보통 새로운 칩을 설계하고 제조하는 데에는 수십억에서 많게는 수백억 이상이 든다고 합니다. 그래서인지 구글이 이 칩에 대해 보다 상세한 자료를 공개할 것이라고 기대하지는 않고 있습니다.

awesome-tensorflow 깃허브를 관리하고 있는 Json Toy는 그의 블로그에서 TPU에 관해 저와 유사한 의견을 피력했습니다. 바로 개발자와 연구가들이 구글 클라우드 머신러닝을 쓰게끔 만드려는 것 같다는 겁니다. 그러나 이런 구글의 행보가 아직도 비싼 제품을 생산하는 GPU 시장을 압박하여 보다 저렴하고 전문화된 칩이 나올 것이라는 긍정적인 면에 대해서도 말하고 있습니다.

Deep Learning with Python

deeplearningwithpython-400Keras는 텐서플로우와 Theano를 이용하여 딥러닝 모델을 구축할 수 있는 래퍼(Wrapper) 라이브러리 입니다. Keras, Theano, TensorFlow 를 이용한 딥러닝 책이 새로 출간되었습니다. 이 책의 저자는 machinelearningmastery.com 을 운영하고 있는 Jason Brownlee 입니다.

아마도 이 책은 온라인으로 출간된 ‘First Contact with TensorFlow‘ 다음으로 나온 두번째 텐서플로우 책이 아닌가 싶습니다.

170여 페이지로 구성되어 있으며 PDF 버전으로 구매하실 수 있습니다. 가격은 $37 입니다. 가능하면 조만간 구입하여 읽어보고 리뷰를 올리도록 하겠습니다. 아래는 책에 실린 14개의 레슨과 7개의 프로젝트 목록입니다.

Lessons

Lesson 01: Theano 라이브러리 소개
Lesson 02: TensorFlow 라이브러리 소개
Lesson 03: Keras 라이브러리 소개
Lesson 04: 멀티레이어 퍼셉트론 속성 코스
Lesson 05: Keras를 사용한 첫번째 뉴럴 네트워크
Lesson 06: 딥러닝 모델 성능 평가
Lesson 07: scikit-learn과 함께 Keras 모델 사용하기
Lesson 08: 모델 직렬화(Serialization)
Lesson 09: 훈련과정에서 최적 모델 찾기
Lesson 10: 훈련과정에서 모델 변화 이해하기
Lesson 11: 드롭아웃(Dropout) 정규화(Regularization)로 오퍼피팅 피하기
Lesson 12: 학습속도 스케줄링으로 성능 강화
Lesson 13: 콘볼루션(Convolution) 뉴럴 네트워크 속성 코스
Lesson 14: 이미지 증강(Augmentation)을 이용하여 모델 성능 향상

Projects

Project 01: 클라우드를 사용하여 저렴하게 GPU에서 대규모 모델 개발
Project 02: 꽃의 종(Species)에 대한 다중(Multiclass) 분류
Project 03: 수중음파 탐지 데이터를 이용한 이진 분류
Project 04: 보스톤 주택 가격 회귀분석
Project 05: 손글씨 숫자 인식
Project 06: 사진속의 물체 인식
Project 07: 영화 리뷰를 사용한 감성(Sentiment) 예측

Google IO 2016

io16-social

구글 IO 2016이 19일 02시(이하 한국시간)부터 3일간의 일정으로 미국 캘리포니아 마운틴뷰 쇼라인 앰피씨어터(Shoreline Amphitheatre)에서 열립니다. 이번 구글 IO에서 주연은 안드로이드, VR 그리고 머신러닝 등이 되지 않을까 합니다. 직접 가서 참여하면 좋겠지만 사정상(:-) 그러지 못한 경우에도 라이브 스트림으로 볼 수 있는 머신러닝 세션이 있습니다.

Google’s vision for Machine Learning 으로 21일 1시에 시작하여 한시간동안 진행되며 세명의 발표자 중에는 Jeff Dean 도 있습니다.

토요일 새벽 우리의 뇌를 breakthrough 시키는 인사이트를 얻었으면 좋겠습니다.

(업데이트) 한국시간이 잘못 계산되어 정정하였습니다.

(업데이트) 머신러닝 관련 라이브 세션이 두개가 아니고 하나입니다. 잘못된 부분을 수정했습니다.

(업데이트) Google’s vision for Machine Learning 유투브 동영상입니다.

The Good, Bad & Ugly of TensorFlow

일주일전 데이터 분석 솔루션 전문 회사인 인디코(indico.io)의 Dan Kuster가 자사의 블로그에 텐서플로우의 장단점에 대해 포스팅했습니다.

텐서플로우의 좋은 점은 오픈소스로 누구나 손쉽게 사용할 수 있다는 점입니다. 구글이 발표를 한 것이라 그런지 머신러닝 커뮤니티의 폭발적인 관심을 이끌었고 이런 관심은 더 좋은 결과와 도구들을 만들어내기 때문입니다. 딥마인드가 텐서플로우를 사용한다고 발표하였으니 알파고에서 사용했던 강화학습(reinforcement learning) 버전의 텐서플로우도 기대를 한다고 합니다.

최근 0.8 버전에서는 부족했던 초기 버전의 내용들이 개선되거나 해결되었습니다. 멀티 GPU 지원, 분산 처리, 큐, 그래프 비주얼라이제이션, 로깅, 모델 체크포인트, 성능 개선 등입니다. 여기에 텐서플로우를 사용하기 쉽게 해 주는 메타(meta) 프레임워크들도 등장했습니다. Keras, 텐서플로우 Slim, skflow, PrettyTensor, TFLearn 등입니다.

또 텐서플로우 개발팀은 문서화는 좀 늦어지더라도 새로운 기능을 테스트가 되면 코드에 추가하고 있어서 실험적인 개발자들의 호응을 이끌어 내고 있는 것 같습니다.

단점으로는 RNN(Recurrent Neural Network)이 Theano에 비해 아직 좀 느리다는 점 입니다. 머신러닝 커뮤니티에서도 여러번 유사하게 지적된 바가 있습니다. 그리고 조금 더 메모리 소비가 많습니다. 하지만 이러한 차이는 빠르게 좁혀질 것으로 예상되고 있습니다.

그리고 비정형 데이터를 다루는 예제가 부족하고 특별히 RNN에 대해서는 아주 간단한 예제와 복잡한 예 사이에 갭이 너무 큽니다. 텐서플로우 개발팀에서 RNN에 대해 좀 더 많은 리소스를 투여해야 할 것 같습니다.

텐서플로우는 로드될 때 디폴트로 GPU 메모리를 모두 할당합니다. 하지만 클라우드 환경에서는 빈 메모리 영역을 찾으려 불필요한 트랜잭션이 많이 일어날 수 있습니다. 이를 조절하기 위한 per_process_gpu_memory_fraction 옵션에 대해 설명해 주고 있습니다. 하나 더 안좋은 점은 한 코드에서 Theano와 TensorFlow를 동시에 사용할 수 없다는 것입니다. 결국 GPU 디바이스를 환경변수를 사용해서 라이브러리마다 따로 지정을 해서 사용해야만 한다고 합니다.

그동안 Theano를 사용했던 사람들은 새로운 툴을 익히려면 시간이 좀 걸릴 것이지만 인디코도 그렇고 이런 새로운 프레임워크를 환영하는 분위기입니다. 무엇보다도 텐서플로우가 앞으로 확실히 빠른 속도로 발전할 것이라 기대하기 때문일 것 같습니다.