월간 보관물: 2016 9월

해커가 알려주는 뉴럴 네트워크

이 글은 스탠포드 대학의 Ph.D 학생이었고 현재 OpenAI 연구원인 안드레이 카패시(Andrej Karpathy)가 블로그에 쓴 ‘Hacker’s guide to Neural Networks‘를 저자의 동의하에 번역한 것입니다. 글 서두에 저자가 밝혔듯이 원래 이 글은 좀 더 길게 연재될 예정이었지만 스탠포드 대학의 CS231n 강의를 진행하면서 두개의 챕터만 쓰여진 채 중단된 상태입니다.

이 글은 최대한 이론을 배제하고 머신러닝과 뉴럴 네트워크를 처음 접하는 사람들을 위해 직관적 이해를 돕기 위해 쓰여졌습니다. 그래서인지 단 두 챕터만으로도 많은 사람들에게 크게 환영받고 있는 것 같습니다. 언제 다시 글이 이어질지는 모르겠습니다만 혹시라도 내용이 추가된다면 업데이트 하도록 하겠습니다.

조금 더 전문적이고 폭 넓은 내용을 담고 있는 것은 저자가 추천하는 CS231n 강의 노트입니다. 이 강의 노트의 번역은 AIKorea 블로그에서 읽을 수 있습니다.

아래 글에 포함된 코드의 파이썬 버전은 여기에 있습니다.

해커가 알려주는 뉴럴 네트워크

1장: 실수치 회로

기본적인 구조: 하나의 게이트로 된 회로

중첩된 구조: 여러개의 게이트로 된 회로

예제: 단일 뉴런

역전파 고수되기

2장: 머신 러닝

이진 분류

전통적인 방법: 손실 함수

TensorFlow v0.10 Release

지난 금요일 텐서플로우 0.10 버전이 정식으로 릴리즈 되었습니다. 정식버전은 0.10rc 버전에서 나왔던 버그를 수정한 것으로 rc 버전과 기능상에는 큰 차이가 없는 것 같습니다. 0.10 버전의 자세한 변경사항은 rc 버전을 참고해 주세요.

각 환경별 설치 패키지 목록은 아래와 같습니다.

# Ubuntu/Linux 64-bit, CPU only, Python 2.7
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0-cp27-none-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 2.7
# Requires CUDA toolkit 7.5 and CuDNN v5. For other versions, see "Install from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.10.0-cp27-none-linux_x86_64.whl

# Mac OS X, CPU only, Python 2.7:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.10.0-py2-none-any.whl

# Mac OS X, GPU enabled, Python 2.7:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow-0.10.0-py2-none-any.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.4
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.4
# Requires CUDA toolkit 7.5 and CuDNN v5. For other versions, see "Install from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.10.0-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.5
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0-cp35-cp35m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.5
# Requires CUDA toolkit 7.5 and CuDNN v5. For other versions, see "Install from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.10.0-cp35-cp35m-linux_x86_64.whl

# Mac OS X, CPU only, Python 3.4 or 3.5:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.10.0-py3-none-any.whl

# Mac OS X, GPU enabled, Python 3.4 or 3.5:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow-0.10.0-py3-none-any.whl

pip 명령을 사용하여 설치

# Python 2
$ sudo pip install --upgrade $TF_BINARY_URL

# Python 3
$ sudo pip3 install --upgrade $TF_BINARY_URL

PhD level ML Courses

레딧(Reddit)에 머신러닝 코스 중 난이도가 높은 코스를 리스팅해 놓은 이 올라왔습니다. 좋은 코스들이 정리되어 있는 것 같아 공유합니다.

추가적으로 Edx에서 칼텍의 유명한 머신러닝 강좌인 ‘Learning from Data‘가 9월 18일 부터 시작됩니다!

WaveNet: DeepMind’s New Model for Audio

blogpost-fig1-anim-160908-r01

딥마인드에서 오디오 시그널 모델인 웨이브넷(WaveNet)에 관한 새로운 페이퍼 공개하고 블로그에 글을 올렸습니다. 글자를 음성으로 읽어 주는 TTS(Text To Speech)를 위한 종전의 방법인 parametric TTS, concatenative TTS 와는 다르게 오디오의 웨이브(waveforms) 자체를 모델링하여 음성을 생성하도록 하였습니다. 사용된 TTS 데이터는 구글의 TTS 데이터 셋을 사용했습니다. 결과적으로 기존 TTS 시스템과 사람 사이의 격차를 절반 가량 줄였다고 합니다.

딥마인드의 블로그 페이지에서 실제로 들어보시면 다른 두 방식의 TTS 보다 웨이브넷의 음성이 훨씬 부드럽다는 것을 느끼실 수 있습니다. 샘플 음성은 영어와 중국어입니다. 앞으로 사람과 대화하는 느낌을 가지고 챗봇과 이야기할 날이 멀지 않은 것 같습니다.

웨이브넷의 장점 중 하나는 한번 만든 모델에서 목소리를 바꾸어 오디오를 생성할 수도 있고 음악과 같은 사람의 목소리와는 다른 분야에도 활용이 가능하다는 것도 있습니다. 블로그 페이지 아래 부분에 클래식 피아노 연주를 이용해 학습한 후 생성한 오디오 샘플을 들어 보실 수 있습니다. 악보 노트를 RNN으로 생성하는 방식과는 다르게 훨씬 풍성한 사운드가 만들어졌습니다(마젠타 보고 있나요?).

딥마인드에서 주말이 시작되려니 숙제를 던져주네요. 🙂

(업데이트) 웨이브넷의 인기가 높네요. 일주일도 되기전에 텐서플로우, 케라스(Keras), 씨아노(Theano)로 구현하는 코드가 공개되었습니다.

DNN for YouTube Recommendations

youtube-recomm-1

출처: DNN for YouTube Recomm. 페이퍼

이번달에 열리는 10th ACM Conference on Recommender Systems에 맞춰 구글 리서치에서 사용자에게 유투브 동영상을 추천하는 시스템에 대한 개괄적인 소개를 담은 페이퍼(pdf)를 공개하였습니다. 페이퍼의 내용으로 미루어 보아 유투브의 추천 시스템은 구글 브레인팀에서 텐서플로우를 이용하여 구축한 것 같습니다.

유투브에서는 추천을 위해 수백만개의 동영상을 수백개의 후보로 좁히고 이를 바탕으로 다시 사용자에게 추천할 영상을 고르는 두 단계로 구성되어 있습니다. 두 단계 모두 몇단계의 ReLU(Rectified Linear Unit) 활성화 함수를 가진 완전 연결(fully connected) 레이어로 구성되어 있습니다. 후보자를 생성하는 첫 단계는 소프트맥스 함수를 이용한 분류(Classification) 문제로 변환하여 생각하였습니다. 사용된 훈련 데이터는 전체 유투브 동영상 시청 데이터를 기반으로 하고 있고 갯수는 수천억건에 이릅니다.

youtube-recomm-2

출처: DNN for YouTube Recomm. 페이퍼

학습에 필요한 데이터를 추출할 때 효과적인 학습을 위해 워드 임베딩에서 사용하는 네거티브 샘플링(negative sampling)을 기법을 이용하였고 소수의 유저가 일으키는 대량의 트래픽으로 학습이 오염되지 않게 하기 위해 사용자마다 고정된 양의 샘플을 추출했습니다. 이렇게 유투브 트래픽으로 뉴럴 네트워크를 학습시키면 이 모델은 매트릭스 인수분해(matrix factorization) 부담으로 실제 적용이 어려운 user-user 협업 필터링을 간접적으로 구현하는 효과를 가집니다.

youtube-recomm-3

출처: DNN for YouTube Recomm. 페이퍼

첫번째 네트워크에서 학습된 모델을 사용하여 사용자에게 맞는 후보 영상을 고르기 위해 해싱기법을 사용하는 Nearest Neighbor 근사 알고리즘을 사용하였습니다. 네트워크의 입력은 그림에서 볼 수 있듯이 비디오 시청 데이터, 사용자 검색어, 지역, 영상이 제공된 기간, 성별 등 많은 특성들을 사용하고 있습니다. 특별히 가변 길이의 시청 데이터를 언어 모델링에서 사용하는 임베딩 방법을 사용하여 압축(dense representation)하여 입력으로 사용하였습니다.

이 시스템은 유투부의 홈페이지에 맞춤 동영상 영역에 나타나는 항목을 결정합니다. 사용자는 시리즈를 본다거나 한 종류의 영상을 지속적으로 보는 경향이 있습니다. 예를 들면 지금 ‘테일러 스위프트’를 검색했다고 해서 홈페이지의 추천 영역을 테일러 스위프트와 관련있는 것으로 바꾸어 버리는 것이 A/B 테스트 결과 더 좋지 않았습니다. 따라서 시청이 어느 정도 완료된(hold out) 영상까지의 데이터만 추론에 사용합니다(테일러 스위프트 뮤직비디오를 다 시청하니 바로 맞춤 동영상 영역에 테일러 스위프트의 영상이 추천되었습니다).

이와 비슷한 맥락으로 유투브의 추천 시스템은 ‘좋아요’나 ‘싫어요’ 같은 명확한 사용자의 액션 뿐만 아니라 시청 완료 같은 겉으로 드러나지 않는 사용자의 액션을 함께 사용합니다. 이는 전자의 데이터가 너무 드물기(sparse) 때문입니다.

 

youtube-recomm-4

출처: DNN for YouTube Recomm. 페이퍼

두번째 네트워크는 수백개의 후보 가운데 사용자의 디바이스에 노출할 동영상을 결정하는 모델(ranking model)을 학습시킵니다. 이 모델은 동영상을 클릭할 확률을 예측하는 것이 아니라 동영상의 기대 시청 시간을 예측하는 로지스틱 회귀 분석입니다. 이는 동영상을 시청하지는 않고 클릭만 이리 저리 누르는 사람들이 있기 때문에 시청 시간을 모델링 하는 것이 더 좋은 성과를 냅니다. 두번째 모델도 A/B 테스트를 통해 지속적으로 실시간 튜닝이 됩니다.

두번째 네트워크도 수백개의 입력을 사용하여 완전 연결 ReLU 레이어를 쌓아서 구성하며 주된 학습 재료는 비디오 노출 데이터와 사용자가 시청한 데이터입니다. 이 때 사용자와 비디오 데이터를 적절하게 가공하기 위해 각각 상당한 피처 엔지니어링이 불가피 합니다.

이 페이퍼는 뉴럴 네트워크 뿐만이 아니라 추천 시스템과 동영상 사이트의 특징들을 이해해야 해서 읽기 어려웠던 것 같습니다. 부족한 부분은 댓글로 채워주세요.

토론토 대학의 CSCC11’s Lecture Note

토론토 대학의 강좌인 CSCC11: Introduction to Machine Learning and Data Mining의 2016년 가을 강의 노트가 온라인에 공개되어 있습니다. 아쉽게도 영상이 공개되지는 않습니다만 강의 노트를 볼 수 있어 다행입니다. 이 강의 노트는 모두 합치면 130여 페이지에 달하며 한 파일로 합친 것은 여기에서 다운 받을 수 있습니다.

카이스트 대학의 머신러닝 오픈 코스

kooc-ml

카이스트 대학교에서 만든 온라인 강의 사이트 KOOC에서 문일철 교수의 인공지능 및 기계학습 개론 1, 2 강좌가 시작되었습니다(강좌 페이지의 URL이 RESTful 하지 않아 프레임안의 링크를 연결하여 놓았습니다. 혹 접속에 문제가 될 경우는 kooc.kaist.ac.kr 로 접속하세요). 강의는 차례대로 업로드 되는 것 같습니다. 강의 초반에 확률에 대한 소개를 하고 있어 엔지니어 입장에서는 다소 거리감이 느껴질 수 있습니다(이 강의는 통계적 머신러닝-Statistical Machine Learning-에 가까운 것 같습니다).

머신러닝에 관해 처음 접하는 경우가 아니라면 동시에 1, 2 강좌를 수강해도 좋을 것 같습니다. 전체 강의 목차는 아래와 같습니다.

  1. Motivations and Basics
  2. Fundamentals of Machine Learning
  3. Naïve Bayes Classifier
  4. Logistic Regression
  5. Support Vector Machine
  6. Training/Testing and Regulatization
  7. Bayesian Network
  8. K-Means Clustering and Gaussian Mixture Model
  9. Hidden Markov Model
  10. Sampling Based Inference

국내에서 쉽게 만나기 어려운 좋은 강좌인 것 같습니다. 개인에 따라서는 1.5배속으로 정주행도 가능합니다. 다만 코세라(Coursera)나 Edx 와 비교하기는 아직 어렵습니다.

Andrej Karpathy’s Quora Session

andrej-quora

OpenAI의 안드레이 카패시(Andrej Karpathy)가 쿠오라(Quora) 세션에 참여합니다. 질문은 지금 부터 등록이 가능하며 대답은 태평양 서머타임시간(PDT)으로 다음주 목요일 오후 12시 부터 입니다. 우리시간으로는 금요일 아침 4시가 될 것 같습니다.

(업데이트) 안드레이 카패시가 많은 질문에 응대를 해주진 못했지만 답변한 몇몇 내용을 요약해 보았습니다.

학교에 있을 때는 방해받지 않고 작업할 수 있는 밤 시간을 좋아해서 새벽 5시에 자서 정오에 일어났다고 합니다. OpenAI에 오면서 8시 퇴근 10시 기상을 하고 있습니다. 가끔 해커뉴스, 레딧, 트위터를 보지만 많이 하지는 않습니다. 하루에 한두개의 페이퍼를 읽고 있고 OpenAI에서 매일 오후 3시에 리딩 그룹(아마도 페이퍼를 읽는다는 거겠죠) 모임이 있다고 합니다.

스탠포드의 CS231n이 MOOC로 제공될 수 있는지에 대한 대답은 약간 회의적이네요. MOOC로 제공하기 위해서는 또 다른 많은 노력이 필요하다고 합니다. 강의 노트나 숙제 등이 많이 공개되어 있어서 굳이 그럴 필요가 없을 것 같긴한데 무엇보다도 이제 안드레이는 스탠포드를 떠났기 때문에 이 강의를 MOOC로 공개하는 것은 전적으로 후임인 저스틴 존슨(Justin Johnson)에게 달렸다고 합니다.

구글에 인턴으로 일했었는데 2011년에는 비감독학습(unsupervised learning)이 사람들의 관심사였고 2013년에는 감독학습(supervised learning), 2015년에 방문했을 때는 강화학습이 유행이었다고 합니다. OpenAI에 끌린 이유는 초기 멤버로 참여할 수 있다는 것도 매력적이고 학교와 스타트업의 하이브리드 성격을 가지고 있는 구성이 맘에 들었다고 합니다. 현재 OpenAI에서 진행하고 있는 여러 프로젝트 중에 안드레이를 포함해서 많은 사람들이 참여하고 있는 프로젝트가 있다고 합니다. 아직은 자세히 말할 순 없지만 진일보된 무엇인 것 같습니다. 곧 발표를 한다니 기대가 됩니다.

강화학습에 대한 도서로는 서튼의 책(Reinforcement Learning: An Introduction)을 추천했고 머신러닝에 관한 책으로는 비숍의 책(Pattern Recognition and Machine Learning)을 추천했습니다. 특별히 강화학습은 비교적 최근에 성장하고 있는 분야라 일목요연하게 정리된 자료가 부족하다고 생각하고 있습니다. 이전에는 NLP, 컴퓨터 비전 등 각 분야가 독립적으로 발전되어 하나의 인공지능 에이전트(agent)로 합쳐질 것이라 생각했지만 지금은 모든 문제를 아우르는 에이전트(full-stack agent)로 귀결될 것으로 내다 보고 있습니다.

이 분야의 발전을 위해 필요한 것은 하드웨어, 데이터, 알고리즘, 소프트웨어(인프라스트럭처) 네가지로 꼽았습니다. 이 중에서 지금 하드웨어의 발전은 반복된 실험을 빠르게 할수 있게 도와줄 뿐입니다. 특별히 소프트웨어 인프라스트럭처의 중요성이 과소 평가되었다고 생각합니다. 이러한 면은 최근 OpenAI가 블로그에 올린 ‘Infrastructure for Deep Learning‘에서도 느낄 수 있습니다. 안드레이도 깃, 도커, 쿠버네티스(kubernetes) 등을 배우고 있다고 합니다.

안드레이는 처음엔 매트랩(Matlab)을 썼다가 파이썬과 넘파이(numpy)를 사용했고 그 이후에는 토치(Torch)를 사용했다고 합니다. 지금은 텐서플로우를 사용하고 있고 OpenAI의 다른 사람들도 텐서플로우를 사용한다고 합니다. 텐서플로우와 토치는 장단점이 있지만 간단하고 빠르게 실험을 해보기에는 토치를 추천하고 있습니다. 하지만 텐서플로우가 향후 이 분야의 표준이 될 것으로 보고 있습니다. 무엇보다도 머신러닝과 딥러닝을 배우는 가장 좋은 방법은 직접 알고리즘을 코드로 작성해 보는 것이라고 강조하고 있습니다.

AI100 First Report ‘AI and Life in 2030’

스탠포드 대학의 AI100(One Hundred Year Study on Artificial Intelligence)에서 첫 리포트를 발간했습니다. 리포트의 제목은 ‘AI and Life 2030‘으로 2030년에 AI가 우리 생활에 미칠 영향을 미리 예상해 보는 내용입니다. 이 리포트는 교통, 홈, 건강, 교육, 복지, 안전, 일자리, 대중문화 등 폭넓은 분야에 걸쳐 인공지능의 현재와 미래를 조망하고 있습니다.

큰 글자만 대략 살펴 보면 리포트는 앞으로 근시일안에 자율주행 자동차가 대중화 될 것으로 보고 있고 이로 인해 카 쉐어링(Sharing)이 늘어나고 대중 교통수단이 변모될 것이라고 예상하고 있습니다. 그리고 직업(job)이 바뀌기 보다는 업무(task)가 바뀔 것이라고 합니다. 어떤 직업이 사라질지 예측하는 것은 쉽지만 새로운 직업이 어떤 것이 나타날지는 미리 예상하기 힘들다고 하네요. 연구자들은 2030년에 택배 드론이 우리 머리위를 휙휙 날라다닐 것 같지는 않다고 합니다. 🙂

New ConvNet Model Inception-ResNet-v2

image00

출처: 구글 리서치 블로그

구글이 리서치 블로그를 통해 새 콘볼루션 모델인 Inception-ResNet-v2를 발표했습니다. Inception v3 모델에 ResNet 장점을 흡수시킨 이 모델의 ILSVRC 테스트 결과가 기록을 갱신했다고 합니다. 위 그림은 이 네트워크를 그림으로 표현한 것으로 아래 그림은 중복부분을 간략하게 나타낸 버전입니다. 메모리와 연산 비용은 Inception v3에 비해 거의 두배가량 늘어났다고 합니다. ISLVRC 테스트 결과는 아래와 같습니다.

inception-resnet-v2-result

출처: 구글 리서치 블로그

이 모델에 대한 페이퍼는 여기에서 보실 수 있으며 슬림(Slim)으로 작성된 모델은 텐서플로우 깃허브 마스터 브랜치에 포함되어 있습니다. 텐서플로우로 학습시켜 놓은 체크포인트 파일도 다운로드 받으실 수 있습니다. 체크포인트 파일에 대한 간단한 사용방법은 슬림 안내 문서를 참고해 주세요. 이 정도면 가히 풀 서비스라고 할만 하네요.