월간 보관물: 2017 1월

Foundations of ML Workshop

연초에 포스팅했던 머신러닝 부트캠프 워크샵의 동영상이 공개되었습니다. 각 강의 동영상은 머신러닝 부트캠프 스케줄 페이지에 모두 연결되어 있습니다. 이 중에서 눈에 띄이는 것은 애플에 합류한 카네기 멜론 대학의 러슬랜 살라쿠디노프(Ruslan Salakhutdinov)의 딥러닝 튜토리얼 4편과 같은 대학의 엠마 브런스킬(Emma Brunskill)의 강화학습 튜토리얼 2편인 것 같습니다. 이 워크샵은 5월까지 총 4개의 시리즈로 진행됩니다. 1월에는 머신러닝 부트캠프였고 그 다음은 Interactive Learning, Representation Learning, Computational Challenges in Machine Learning 로 이어집니다. 자세한 내용은 워크샵 안내 페이지를 참고하세요.

러슬랜의 슬라이드는 아래 링크에서 다운받을 수 있습니다.

New DL Book: DL with Python

chollet-dlp-meap-hi매닝(manning) 출판사에서 새 딥러닝 책인 “Deep Learning with Python“의 MEAP 버전이 공개되었습니다. 이 책은 케라스(Keras) 개발자 프랑소와 숄레(François Chollet)가 올해 쓰기로 했던 바로 그 책입니다. 1장은 무료로 공개되어 있고 현재 3장까지 쓰여졌습니다. 전체 책은 올 가을 이후에 만날 수 있을 것 같습니다.

PART 1: THE FUNDAMENTALS OF DEEP LEARNING
1 What is Deep Learning?
2 Before we start: the mathematical building blocks of neural networks
3 Getting started with neural networks
4 Fundamentals of machine learning
PART 2: DEEP LEARNING IN PRACTICE
5 Deep learning for computer vision
6 Deep learning for text and sequences
7 Advanced neural network design
8 Generative deep learning
9 Conclusion

TensorFlow 1.0.0-RC0 Release

텐서플로우 1.0의 알파버전이 나온지 2주만에 RC 버전이 드디어 릴리즈되었습니다. 많은 API 변경사항 외에도 마스터 브랜치에 추가되었던 XLA가 RC 버전에 추가된 것이 눈에 띄입니다. 그리고 리눅스는 파이썬 3.6 버전도 나왔네요! 1.0 RC 버전은 아직 PyPI 에 등록되어 있지 않지만 pip에서 패키지를 직접 지정하여 설치할 수 있습니다.

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

# Ubuntu/Linux 64-bit, GPU enabled, Python 2.7
# Requires CUDA toolkit 8.0 and CuDNN v5.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.0.0rc0-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-1.0.0rc0-py2-none-any.whl

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

##### 파이썬 3.x 
# Ubuntu/Linux 64-bit, CPU only, Python 3.3
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.0.0rc0-cp33-cp33m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.3
# Requires CUDA toolkit 8.0 and CuDNN v5.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.0.0rc0-cp33-cp33m-linux_x86_64.whl

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

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.4
# Requires CUDA toolkit 8.0 and CuDNN v5.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.0.0rc0-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-1.0.0rc0-cp35-cp35m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.5
# Requires CUDA toolkit 8.0 and CuDNN v5.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.0.0rc0-cp35-cp35m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.6
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.0.0rc0-cp36-cp36m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.6
# Requires CUDA toolkit 8.0 and CuDNN v5.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.0.0rc0-cp36-cp36m-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-1.0.0rc0-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_gpu-1.0.0rc0-py3-none-any.whl

#### 설치
$ sudo pip install --upgrade $TF_BINARY_URL

윈도우즈 CPU:

C:\> pip install --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.0rc0-cp35-cp35m-win_amd64.whl

윈도우즈 GPU:

C:\> pip install --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.0.0rc0-cp35-cp35m-win_amd64.whl

PyTorch MNIST Example

파이토치(PyTorch)로 텐서플로우 튜토리얼에 있는 MNIST 예제를 재현해 보았습니다. 이 코드는 파이토치의 MNIST 예제를 참고했으며 주피터 노트북으로 작성되어 깃허브에 올려져 있습니다. 당연하지만 분류 결과는 텐서플로우로 만든 예제와 큰 차이가 없습니다.

파이토치는 버전 0.1.6을 사용하였습니다. 파이토치 설치는 이 포스트를 참고하세요. 파이토치는 코어 C 라이브러리를 토치(Torch)와 공유하고 있습니다. 그 외에는 모두 파이썬으로 구현되어 있으며 별도로 C API 가 없습니다. 오직 파이썬을 위해서 구현된 라이브러리이고 또 다이나믹 컴퓨테이션 그래프(Dynamic Computation Graph)를 지원하기 때문에 코드 모습이 일반 프로그래밍처럼 자연스러웠습니다.

파이토치의 예제와 유사하게 torch.nn.Module 클래스를 상속받아 모델 클래스를 만들었습니다.

class MnistModel(nn.Module):
    def __init__(self):
        super(MnistModel, self).__init__()
        # input is 28x28
        # padding=2 for same padding
        self.conv1 = nn.Conv2d(1, 32, 5, padding=2)
        # feature map size is 14*14 by pooling
        # padding=2 for same padding
        self.conv2 = nn.Conv2d(32, 64, 5, padding=2)
        # feature map size is 7*7 by pooling
        self.fc1 = nn.Linear(64*7*7, 1024)
        self.fc2 = nn.Linear(1024, 10)
        
    def forward(self, x):
        x = F.max_pool2d(F.relu(self.conv1(x)), 2)
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = x.view(-1, 64*7*7)   # reshape Variable
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x)
    
model = MnistModel()

Module 를 상속받은 클래스는 뉴럴 네트워크의 정방향 계산을 수행하는 forward() 메소드를 구현해야만 합니다. 이 forward() 메소드는 model 오브젝트를 데이터와 함께 호출하면 자동으로 실행이됩니다.

풀링과 활성화 함수들은 torch.nn.functional 아래에 있고 함수처럼 불러서 사용할 수 있습니다. 이런 함수들은 Conv2d 클래스처럼 유사하게 forward(), backward() 메소드를 가진 클래스를 감싸고 있는 형태입니다. 최종 loss 에서 backward() 함수가 호출되면 거꾸로 짚어가면서 역방향 계산이 연쇄적으로 일어납니다. Conv2d 함수의 파라미터에서 볼 수 있듯이 패딩과 스트라이드를 명시적으로 지정해 주어야 합니다. 콘볼루션의 패딩 계산은 이 포스트를 참고하세요.

Linear 함수는 일반적인 완전연결(fully connected) 레이어를 의미하는 것으로 이것뿐만 아니라 많은 요소들이 토치의 네이밍을 따르고 있는 것 같습니다. 아마도 토치를 썼던 사람은 쉽게 사용할 수 있을 것 같습니다.

model.train()
train_loss = []
train_accu = []
i = 0
for epoch in range(15):
    for data, target in train_loader:
        data, target = Variable(data), Variable(target)
        optimizer.zero_grad()
        output = model(data)
        loss = F.nll_loss(output, target)
        loss.backward()    # calc gradients
        train_loss.append(loss.data[0])
        optimizer.step()   # update gradients
        prediction = output.data.max(1)[1]   # first column has actual prob.
        accuracy = prediction.eq(target.data).sum()/batch_size*100
        train_accu.append(accuracy)
        if i % 1000 == 0:
            print('Train Step: {}\tLoss: {:.3f}\tAccuracy: {:.3f}'.format(i, loss.data[0], accuracy))
        i += 1

모델을 학습시키는 부분도 직관적입니다. Negative Log Likelihood를 의미하는 nll_loss 함수에 출력과 타겟값을 넣고 loss.backward() 를 호출한 다음 optimizer.step() 으로 파라미터를 업데이트 합니다. 여기서 target 은 원-핫-인코딩이 아닌 타겟 레이블을 그대로 넣습니다. loss 와 accuracy 를 리스트에 저장하여 맷플롯립으로 그래프를 그렸습니다.

pytorch-mnist-loss

loss

pytorch-mnist-accuracy

accuracy

모델을 훈련할 땐 model.train() , 테스트할 땐 model.eval() 함수를 호출하면 Module 클래스의 훈련 상태 여부를 바꾸게 되며 이는 dropout 같은 함수가 드롭아웃을 적용할지 안할지를 결정하게 만듭니다.

model.eval()
correct = 0
for data, target in test_loader:
    data, target = Variable(data, volatile=True), Variable(target)
    output = model(data)
    prediction = output.data.max(1)[1]
    correct += prediction.eq(target.data).sum()

print('Test set: Accuracy: {:.2f}%'.format(100. * correct / len(test_loader.dataset)))

최종결과는 99.29%를 얻었습니다. 전체 코드는 깃허브에서 확인할 수 있습니다.

MIT 6.S094: DL for Self-Driving Cars

screen-shot-2017-01-03-at-16-02-05-1024x640

MIT의 새로운 강좌인 ‘Deep Learning for Self-Driving Cars‘ 가 온라인으로 제공되고 있습니다. 슬라이드와 유투브 동영상 뿐만 아니라 코스 페이지에 누구나 가입을 할 수 가 있는데요. 가입을 하게 되면 실제 과제에 참여할 수 있습니다. 과제는 자바스크립트 기반으로 자율 주행 시뮬레이션을 하는 딥트래픽(DeepTraffic) 프로젝트이며 이미 리더보드에 순위가 매겨지기 시작했습니다. 딥트래픽은 OpenAI의 안드레이 카패시(Andrej Karpathy)가 만든 ConvNetJS 라이브러리를 사용합니다. 이런 이유는 이 강좌가 심지어 프로그래머가 아닌 사람들까지도 대상으로 하기 때문입니다. 브라우저와 텍스트 편집기만 있으면 필요한 모든 것이 준비가 된 셈입니다. 실제 핸들 스티어링의 데모인 딥테슬라(DeepTesla)도 볼 수 있습니다. 전체 강좌는 2회가 진행되었으므로 아직 늦지 않았습니다!

Quora Dataset: Question Pairs

quora-question-pairs

질문, 대답 사이트로 유명한 쿠오라(Quora)에서 머신러닝 데이터셋을 공개하였습니다. 이 데이터는 위 이미지에서 볼 수 있듯이 두개의 질문이 같은 질문인지 아닌지를 구분하는 과제입니다. is_duplicate 에 1이면 두 질문은 동일한 것입니다. 왼쪽 열에는 두질문 묶음에 대한 id 와 각 질문별 아이디 qid 가 있습니다. 쿠오라는 사람들이 동일한 질문을 많이 생성하여 정보가 단편화되는 것을 막기 위해 이 문제가 아주 중요하다고 생각합니다. 쿠오라는 동일한 질문을 구분할 수 있는 효과적인 접근 방법을 찾기를 원하고 있습니다. 질문 묶음이 40만개가 넘으며 이 중에서 중복된 질문 묶음은 대략 15만개, 서로 다른 질문은 25만개 정도입니다. 이 파일의 사이즈는 58메가 정도이며 다운로드는 여기에서 받을 수 있습니다.

PyTorch: New Cool DL Library

0120-sdt-github

(업데이트) 파이토치는 토치(Torch)의 코어 C 라이브러리를 공유하고 있으며 대략 2016년 5월 경에 시작된 것으로 추측됩니다. 텐서플로우도 다이나믹 그래프를 위한 시도를 하고 있으나(TensorFlow Fold) 아직 페이퍼외에 코드로 공개된 것은 없습니다.

널리 사용되는 딥러닝 라이브러리 중 하나는 페이스북에서 많이 사용하는 토치(torch)입니다. 하지만 루아 스크립트 인터페이스 때문에 처음 딥러닝을 시작하는 사람들에게 선택되기는 쉽지 않습니다. 그와중에 구글이 파이썬 인터페이스를 전면으로 내세운 텐서플로우로 딥러닝 프레임워크 시장의 선두로 올라섰습니다. 하지만 앞으로 이야기가 조금 달라질 수 있을것 같습니다. 바로 텐서플로우보다 더 파이써닉한 파이토치(PyTorch)가 공개되었기 때문입니다. 이름을 보아서는 토치에 파이썬 인터페이스를 추가한 것으로 오해할 수 있지만, 이 라이브러리는 넘파이(NumPy) 정도를 제외하고는 거의 의존성이 없으며 텐서 연산을 위한 C++ 코드를 제외하고는 거의 모두 파이썬 구현으로 만들어졌습니다. 이는 대부분의 코드가 C++ 로 구현되어 있고 인터페이스를 파이썬으로 가진 텐서플로우를 비롯한 다른 라이브러리들과는 큰 차이가 납니다. 웹사이트에서 주장하는 바 그대로 “Python First” 입니다.

파이토치의 주요 장점은 모든 텐서의 연산에 대해 자동으로 그래디언트를 계산해 주는 Autograd, NumPy/SciPy 등과의 뛰어난 호환성, 깔끔한 코드 등입니다. 하지만 가장 관심을 끄는 것 중 하나는 다이나믹하게 컴퓨테이션 그래프를 만들어 주는 기능입니다. 즉 텐서플로우를 비롯한 다른 라이브러리들처럼 그래프를 정의하고 실행하는 것이 아니고 코딩되는 대로 그래프가 점진적으로 만들어지는 것입니다. 이런 장점을 가진 라이브러리로는 일본에서 만든 체이너(Chainer)가 있고 최근 카네기멜론 대학의 Clab 에서 공개한 DyNet(말 그대로 다이나믹 넷이죠), 그리고 MXNet을 개발하는 DMLC 에서 최근에 공개한 MinPy 등이 있습니다. 실제로 파이토치의 일부 기능은 체이너의 포크에서 시작되었다고 합니다. 이 프로젝트는 페이스북의 서미스 친탈라(Soumith Chintala)와 아담 파스케(Adam Paszke)가 관리하고 있으며 혼돈될 수 있지만 휴 퍼킨스(Hugh Perkins)가 만든 토치 래퍼인 pytorch와는 다릅니다.

기존의 네트워크와 앞으로의 연구가 얼마나 파이토치로 포팅되어 나올지가 궁금합니다. 자세한 파이토치의 기능은 예제를 뜯어 보면서 정리해서 올리겠습니다. 파이토치는 아직 PyPI 에 올라가 있지는 않지만 비교적 쉽게 설치가 가능합니다. 다만 아직 윈도우 버전이 준비되어 있지 않고 맥에서는 GPU 지원이 되지 않습니다.

# conda (linux, osx)
$ conda install pytorch torchvision -c soumith

# pip : linux + python2.7 + cuda7.5
$ pip install https://s3.amazonaws.com/pytorch/whl/cu75/torch-0.1.6.post22-cp27-cp27mu-linux_x86_64.whl 
$ pip install torchvision

# pip : linux + python2.7 + cuda8.0
$ pip install https://s3.amazonaws.com/pytorch/whl/cu80/torch-0.1.6.post22-cp27-cp27mu-linux_x86_64.whl 
$ pip install torchvision

# pip : linux + python3.5 + cuda7.5
$ pip install https://s3.amazonaws.com/pytorch/whl/cu75/torch-0.1.6.post22-cp35-cp35m-linux_x86_64.whl
$ pip install torchvision

# pip : linux + python3.5 + cuda8.0
$ pip install https://s3.amazonaws.com/pytorch/whl/cu80/torch-0.1.6.post22-cp35-cp35m-linux_x86_64.whl
$ pip install torchvision

# pip : osx + python2.7
$ pip install https://s3.amazonaws.com/pytorch/whl/torch-0.1.6.post22-cp27-cp27m-macosx_10_7_x86_64.whl 
$ pip install torchvision 

# pip : osx + python3.5
$ pip install https://s3.amazonaws.com/pytorch/whl/torch-0.1.6.post22-cp35-cp35m-macosx_10_6_x86_64.whl 
$ pip install torchvision

CS294: Deep RL Start!

지난번에 소개했던 버클리 대학의 CS294: Deep Reinforcement Learning의 2017년 봄 강좌가 시작되었습니다. 전 강좌가 녹화될 것이라고 예고했던 대로, 1월 18일 첫강좌가 유투브에 올려졌습니다. 그리고 앞으로의 강의도 모두 차례대로 플레이스 리스트에 추가될 것 같습니다. 또한 강의 시간에 맞추어 라이브로도 제공됩니다! 강의 시간은 매주 월, 수 오전 9시~10시 30분까지로 우리 시각은 화, 목 새벽 2시 부터입니다.

강의 스케줄과 슬라이드 및 과제물 등 더 자세한 내용은 코스 페이지에서 확인할 수 있고 강의와 관련된 포럼은 레딧으로 진행합니다. 동영상과 슬라이드 링크는 강의가 진행되는 대로 이 포스트에 업데이트하겠습니다.

A Course in ML

cover메릴랜드 대학의 조교수인 할 다움 3세(Hal Daumé III)의 ‘A Course in Machine Learning’이 최근 0.99버전으로 업데이트 되었습니다. 이 책은 웹사이트에서 무료로 책 전체를 다운받을 수 있으며 챕터 별로 나누어서 받을 수도 있습니다. 0.99 버전이라 완성도가 매우 높다고 볼 수 있습니다. 아마 정식 책으로 출간되기 보다는 자가 출판 형태로 판매가 되지 않을까 생각됩니다. 이 책은 약 1년전 부터 쓰여지기 시작했으며 깃허브에 책의 내용과 소스 코드를 공개되어 있습니다.

  1. Front Matter
  2. Decision Trees
  3. Limits of Learning
  4. Geometry and Nearest Neighbors
  5. The Perceptron
  6. Practical Issues
  7. Beyond Binary Classification
  8. Linear Models
  9. Bias and Fairness
  10. Probabilistic Modeling
  11. Neural Networks
  12. Kernel Methods
  13. Learning Theory
  14. Ensemble Methods
  15. Efficient Learning
  16. Unsupervised Learning
  17. Expectation Maximization
  18. Structured Prediction
  19. Imitation Learning
  20. Back Matter

Rules of ML: Best Practice for ML from Google

구글 연구원인 Martin Zinkevich 가 만든 ‘Rules of ML: Best Practices for ML Engineering‘ 이 공개되었습니다. 이 파일은 지난 NIPS 2016의 Reliable Machine Learning in the Wild 워크숍에서 발표한 내용을 정리한 것으로 보입니다. 늘상 보아오던 가이드라인이 아니라 실제 구글에서 여러 서비스를 만들면서 얻은 노하우를 사례를 들어가며 설명하고 있습니다. 이번 주말에 보아야할 문서로 안성맞춤입니다! 🙂