월간 보관물: 2016 12월

Python 3.6 Out!

지난 주에 파이썬 3.6 버전이 릴리즈되었습니다. 아나콘다 패키지들도 대부분 파이썬 3.6에 맞춰져 준비되었으니 파이썬 3.6 버전을 써볼 수 있을 것 같습니다. 다만 텐서플로우나 아나콘다에서 제공하지 않는 라이브러리들은 아직 3.6 버전과 호환되지 않을 수 있습니다. 그러므로 파이썬 3.6 을 테스트하려면 콘다 환경을 따로 만들어서 사용해 보는 것이 좋습니다.

$conda create -n python36 python=3.6
$source activate python36

파이썬 3.6에서 눈에 띠는 변경사항을 정리하였습니다.

1. 포맷 문자열

f 로 시작하는 문자열은 중괄호 안에 대치할 변수 이름을 넣을 수 있습니다. 문자열 평가는 한번만 일어 납니다. 변수 이름뒤에 이전과 동일하게 포맷팅 옵션을 쓸 수 있습니다.

>>> name = "철수"
>>> s = f"내 이름은 {name}입니다."
>>> s
'내 이름은 철수입니다.'
>>> name = "영희"
>>> s
'내 이름은 철수입니다.'
>>> val = 1.23456789
>>> f"{val:.3f}"
'1.235'

2. 숫자 밑줄 표현

가독성을 위해 숫자를 사용할 때 밑줄 문자를 써서 천 단위를 표시할 수 있습니다.

>>> 1_000_000_000
1000000000
>>> 0x_FF_FF_FF
4294967295

3. Path 오브젝트 활용

pathlib.Path 오브젝트를 open 함수에 직접 넣을 수 있고 os 와 os.path 하위의 함수들에서도 사용할 수 있습니다.

>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
... 
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'

4. **kwargs 파라미터 순서 유지

**kwargs 로 넘어온 딕셔너리가 입력 파라메타의 순서대로 소팅됩니다.

>>> def myfunc(a, b, **kwargs):
        print(kwargs)
>>> myfunc(1,2, t=1, y=2, u=3, i=4)
{'t': 1, 'y': 2, 'u': 3, 'i': 4}
>>> myfunc(1,2, i=1, u=2, y=3, t=4)
{'i': 1, 'u': 2, 'y': 3, 't': 4}

5. secrete 모듈 추가

암호 생성에 필요한 난수를 위해 random 이나 os.urandom 대신 권장되는 secrete 모듈이 추가되었습니다.

>>> import secrets
>>> secrets.randbelow(100)
>>> 41
>>> secrets.token_hex(16)
>>> '3d7975470f64cbca981c07209c0cbcc4'
>>> secrets.token_urlsafe(16)
>>> 'ZLIS3TVPH301LwuPzwFEjg'

6. http.client 가 HTTP chunked 인코딩을 지원합니다.

7. json.loads, json.load 함수가 문자열 외에 bytes, bytearray 도 지원합니다.

8. random.choices 함수가 추가 되어 한개 이상의 아이템을 무작위로 선택해 리턴할 수 있습니다.

이외에도 많은 사항이 변경되었습니다. 주목할 만한 내용이 발견되면 업데이트 하겠습니다.

역전파, 직접 짜봐야 하나요?

OpenAI의 안드레이 카패시(Andrej Karpathy)가 얼마전 ‘Yes you should understood backprop‘란 글을 미디엄 사이트에 올렸습니다. 안드레이는 OpenAI에 오기 전에 스탠포드 대학에서 PhD 학생으로 근무했고 CS231n 강의를 진행했습니다. 이 강의는 영상과 강의 노트 모두 인터넷에 공개되어 있어 인공지능에 관심있는 연구자나 학생들에게 인기가 많습니다. 그런데 학생들이 가끔 CS231n 의 숙제에 불평을 하는 경우가 있는 모양입니다. 텐서플로우 같은 라이브러리가 역전파 알고리즘을 모두 자동으로 처리해 주는 데 굳이 numpy 로 정방향(forward pass), 역방향(backward pass, backpropagation) 코드를 직접 구현하는 숙제를 할 필요가 있느냐고 말이죠.

역전파 코드를 직접 만들어 봐야할 이유가 지적 호기심이나 더 나은 역전파 알고리즘을 만들기 위해서가 아니라 역전파를 알아야 뉴럴 네트워크를 만들 때 오류를 범하지 않고 디버깅을 하는데 도움을 주기 때문입니다. 안드레이는 역전파가 불완전한 추상화(leaky abstraction)라고 말하고 있습니다. 불완전한 추상화 또는 누수 추상화는 조엘 스폴스키의 블로그를 통해서 알려졌었습니다. 한마디로 구멍이 많다는거죠!

계속 읽기

Python DS Handbook & ML with TF Repo.

얼마전 소개했던 ‘Python Data Science Handbook‘의 저자 제이크 반더플라스(Jake VanderPlas)가 깃허브에 코드와 텍스트를 포함한 책 전체를 주피터 노트북 형태로 공개하였습니다. 소스는 MIT, 텍스트는 CC BY-NC-ND 3.0 라이센스를 가지고 있습니다.

  1. IPython: Beyond Normal Python
  2. Introduction to NumPy
  3. Data Manipulation with Pandas
  4. Visualization with Matplotlib
  5. Machine Learning

title그리고 매닝(Manning) 출판사에서 MEAP 으로 나온 ‘Machine Learning with TensorFlow‘ 의 예제 소스 코드가 모두 깃허브에 MIT 라이센스로 공개되었습니다. 이 책은 아직 7장까지 밖에 쓰여지지 않았으니 글보다 코드가 먼저 나온 셈입니다.

 

  1. TensorFlow Basics
  2. Regression
  3. Classification
  4. Clustering
  5. Hidden markov models
  6. Autoencoders
  7. Reinforcement learning
  8. Convolutional Neural Networks
  9. Recurrent Neural Network

TensorFlow API Changes

텐서플로우 v0.12 버전이 릴리즈되면서 파이썬 API 가 일부 변경되었습니다. 혼돈을 줄 수 있는 것들을 바로 잡고 또 가능하면 NumPy 와 일관성을 가지게 하려는 것 같습니다. 이런 API 변경은 앞으로도 조금 더 발생할 수 있을 것으로 예상됩니다. 아직 1.0 버전이 언제 나올지 알 수는 없지만 1.0 이후에는 하위 버전 호환성에 대해 더 엄격하게 관리할 것이라 합니다. 관련된 내용은 구글 그룹스에 올린 구글 브레인팀의 애드류 셀(Andrew Selle)의 포스팅과 텐서플로우 깃허브의 릴리즈 노트의 ‘Breaking Changes to the API’ 섹션을 참고하세요.

  • tf.pack / tf.unpack –> tf.stack / tf.unstack
    • v0.12: stack/unstack 추가, pack/unpack 은 stack/unstack 을 단순 wrapping
    • master: pack/unpack 에 deprecated 메세지 추가
  • tf.concat(concat_dim, values) –> tf.concat_v2(values, axis)
    • v0.12: concat_v2 추가
    • master: concat 에 deprecated 메세지 추가
  • tf.split(split_dim, num_splits, value) –> tf.split(value, num_or_size_splits, axis)
    • v0.12: split_v(value, size_splits, split_dim) 추가
    • master: split(value, num_or_size_splits, axis) 로 변경
  • tf.sparse_split(split_dim, num_split, sp_input) –> tf.sparse_split(sp_input, num_split, axis)
    • master: sparse_split(sp_input, num_split, axis) 로 변경
  • tf.reverse(tensor, dims) –> tf.reverse(tensor, axis)
    • v0.12: reverse_v2(tensor, axis) 추가
    • master: reverse 가 바뀌고, v1.0 이후 reverse_v2 가 deprecated 될 예정
  • tf.round –> banker’s rounding
    • v0.12: 파이썬의 banker’s rounding 으로 변경, 짝수로 반올림/내림
  • dimension, dim, ~indices, ~dim, ~axes 키워드 파라미터 –> axis 로 통일
    • v0.12: 기존 파라미터와 axis 모두 유지, 향후 기존 파라미터 삭제 예정
    • tf.argmax: dimension –> axis
      tf.argmin: dimension –> axis
      tf.count_nonzero: reduction_indices –> axis
      tf.expand_dims: dim –> axis
      tf.reduce_all: reduction_indices –> axis
      tf.reduce_any: reduction_indices –> axis
      tf.reduce_join: reduction_indices –> axis
      tf.reduce_logsumexp: reduction_indices –> axis
      tf.reduce_max: reduction_indices –> axis
      tf.reduce_mean: reduction_indices –> axis
      tf.reduce_min: reduction_indices –> axis
      tf.reduce_prod: reduction_indices –> axis
      tf.reduce_sum: reduction_indices –> axis
      tf.reverse_sequence: batch_dim –> batch_axis, seq_dim –> seq_axis
      tf.sparse_concat: concat_dim –> axis
      tf.sparse_reduce_sum: reduction_axes –> axis
      tf.sparse_reduce_sum_sparse: reduction_axes –> axis
      tf.sparse_split: split_dim –> axis
  • tf.listdiff –> tf.setdiff1d
    • v0.12: setdiff1d 추가
    • master: listdiff 에 deprecated 메세지 추가
  • tf.select –> tf.where
    • v0.12: where 추가
    • master: select 삭제
  • tf.inv –> tf.reciprocal
    • v0.12: inv –> reciprocal 이름 변경
  • tf.SparseTensor.shape –> tf.SparseTensor.dense_shape
    • master: shape –> dense_shape 이름변경
  • tf.SparseTensorValue.shape –> tf.SparseTensorValue.dense_shape
    • master: shape –> dense_shape 이름 변경
  • all_variables –> global_variables , initialize_all_variables -> global_variables_initializer , initialize_local_variables -> local_variables_initializer
    • v0.12: 이름 변경 및 deprecated 메세지 추가
  • zeros_initializer –> 함수 리턴으로 변경
    • master: ones_initializer 와 동일한 리턴 형식으로 변경

이 외에도 tf.nn.sparse_softmax_cross_entropy_with_logits, tf.nn.softmax_cross_entropy_with_logits, tf.nn.sigmoid_cross_entropy_with_logits 의 파라미터 순서가 바뀔 예정이라고 합니다.(아마도 널리 통용되는 크로스 엔트로피 공식의 기호와 순서가 반대여서 그런 것 같습니다)

(업데이트)

  • v0.12: TensorFlowEstimator() 가 삭제되었습니다. 대신 Estimator() 가 권장됩니다.

TensorFlow v0.12 Release

(업데이트) 지난 주에 0.12.1 버전이 릴리즈 되었습니다. 이 버전의 수정 내용은 프로토콜버퍼(protobuf)의 요구 버전이 3.1 에서 3.1 이상으로 변경된 것 이외에는 대부분 문서의 내용을 수정한 것입니다.

텐서플로우 0.12 버전이 정식 릴리즈 되었습니다. 0.12 버전부터는 윈도우즈에 대한 지원(Windows 10, Windows 7, and Windows Server 2016 에서 테스트)과 Go 언어 지원, 텐서보드에서 임베딩 시각화 등이 추가되었습니다. 그리고 tf.train.Saver의 체크포인트 파일 포맷이 V2 로 업그레이드 되었습니다. 자세한 내용은 릴리즈 노트를 참고하세요.

텐서플로우 0.12RC1 버전 부터 리눅스, 맥, 윈도우에서 모두 pip 설치를 지원하고 있습니다.

맥, 리눅스, 윈도우즈(아나콘다 권장) CPU 버전

$ pip install tensorflow

맥, 리눅스, 윈도우즈(아나콘다 권장) GPU 버전

$ pip install tensorflow-gpu

다만 현재 0.12 버전은 아직 PyPI 에 등록되지 않았습니다(현재는 PyPI에 등록되어 있어 pip 로 설치할 수 있습니다). 아마 몇일 내로 등록될 것 같지만 당장 0.12 버전으로 업그레이드하시려면 wheel 패키지를 지정해서 설치해야 합니다.

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

# Ubuntu/Linux 64-bit, GPU enabled, Python 2.7
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.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.12.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_gpu-0.12.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.12.0-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.4
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.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.12.0-cp35-cp35m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.5
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.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.12.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_gpu-0.12.0-py3-none-any.whl

pip 명령은 아래와 같습니다.

$ sudo pip install --upgrade $TF_BINARY_URL

윈도우즈는 아래 명령을 참고하세요.

# CPU Only
C:\> pip install --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-0.12.0-cp35-cp35m-win_amd64.whl

# GPU enabled
C:\> pip install --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-0.12.0-cp35-cp35m-win_amd64.whl

OpenNMT: Open Source Neural Machine Translation

simple-attn

하버드 NLP 그룹과 하버드 PhD 학생인 Yoon Kim이 만든 오픈소스 신경망 기계번역 OpenNMT 가 공개되었습니다. OpenNMT 는 토치로 구현되어 깃허브에 공개되어 있으며 개발에 사용된 주요한 페이퍼들이 홈페이지에 자세히 나와 있습니다. 개인이 학습시키기에는 조금 무리가 있을 수 있으나 학습된 모델도 공개할 것이라 하니 기대를 해 봅니다. OpenNMT 개발에 번역 소프트웨어 회사인 SYSTRAN도 많은 참여를 했다고 합니다. OpenNMT의 데모를 SYSTRAN 데모 페이지에서 직접 확인해 볼 수 있습니다. 구글, 네이버 모두 신경망 기계번역을 도입했는데요. 오늘자 CNN 뉴스의 일부를 세 번역기에 모두 적용해 보았습니다. 네이버 번역기 글자수가 제한되어 있어 긴 문장을 적용하진 못했습니다. 결과는 OpenNMT 가 훨씬 자연스러운 번역을 만들어 주었습니다!

OpenNMT
opennmt

Google Translate
google_translate

Naver NMT
naverlabs_nmt

인공지능 무료 공개 강좌

12월 26일(월)에 ‘인공지능시대 어떻게 준비할까?’ 를 주제로 공개 강좌가 열립니다. 인공지능의 소개부터 기술적인 내용까지 그리고 여러 어플리케이션에 대한 소개도 두루 다루고 있어 유익한 시간이 될 것 같습니다. 강좌 시간은 14:00~17:30 분까지 3 세션으로 이루어지며 강남역 근처 한국과학기술회관 대회의실에서 열립니다. 강좌는 무료이며 선착순 신청이므로 관심있으신 분들은 서두르시면 좋을 것 같습니다. 사전 등록 신청은 이메일 gpr at krivet.re.kr, yk281 at krivet.re.kr 로 소속과 이름을 보내면 됩니다. 자세한 강좌 내용은 아래 목차를 참고하세요.

계속 읽기

Repo. for NIPS 2016 papers

NIPS 2016 페이퍼가 구현된 레파지토리를 정리하는 레딧 포스트가 있습니다. 지금까지 13개의 깃허브 레파지토리가 정리되어 있습니다. 추가되는 대로 업데이트 하겠습니다. 혹시 이 외에 다른 레파지토리가 있다면 공유 부탁 드립니다.

  1. Using Fast Weights to Attend to the Recent Past (https://arxiv.org/abs/1610.06258)
    Repo: https://github.com/ajarai/fast-weights
  2. Learning to learn by gradient descent by gradient descent (https://arxiv.org/abs/1606.04474)
    Repo: https://github.com/deepmind/learning-to-learn
  3. R-FCN: Object Detection via Region-based Fully Convolutional Networks (https://arxiv.org/abs/1605.06409)
    Repo: https://github.com/Orpine/py-R-FCN
  4. Fast and Provably Good Seedings for k-Means (https://las.inf.ethz.ch/files/bachem16fast.pdf)
    Repo: https://github.com/obachem/kmc2
  5. How to Train a GAN
    Repo: https://github.com/soumith/ganhacks
  6. Phased LSTM: Accelerating Recurrent Network Training for Long or Event-based Sequences (https://arxiv.org/abs/1610.09513)
    Repo: https://github.com/dannyneil/public_plstm
  7. Generative Adversarial Imitation Learning (https://arxiv.org/abs/1606.03476)
    Repo: https://github.com/openai/imitation
  8. Adversarial Multiclass Classification: A Risk Minimization Perspective (https://www.cs.uic.edu/~rfathony/pdf/fathony2016adversarial.pdf)
    Repo: https://github.com/rizalzaf/adversarial-multiclass
  9. Unsupervised Learning for Physical Interaction through Video Prediction (https://arxiv.org/abs/1605.07157)
    Repo: https://github.com/tensorflow/models/tree/master/video_prediction
  10. Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks (https://arxiv.org/abs/1602.07868)
    Repo: https://github.com/openai/weightnorm
  11. Full-Capacity Unitary Recurrent Neural Networks (https://arxiv.org/abs/1611.00035)
    Repo: https://github.com/stwisdom/urnn
  12. Sequential Neural Models with Stochastic Layers (https://arxiv.org/pdf/1605.07571.pdf)
    Repo: https://github.com/marcofraccaro/srnn
  13. Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering (https://arxiv.org/abs/1606.09375)
    Repo: https://github.com/mdeff/cnn_graph
  14. Interpretable Distribution Features with Maximum Testing Power (https://papers.nips.cc/paper/6148-interpretable-distribution-features-with-maximum-testing-power.pdf)
    Repo: https://github.com/wittawatj/interpretable-test/
  15. Composing graphical models with neural networks for structured representations and fast inference (https://arxiv.org/abs/1603.06277)
    Repo: https://github.com/mattjj/svae
  16. Supervised Learning with Tensor Networks (https://arxiv.org/abs/1605.05775)
    Repo: https://github.com/emstoudenmire/TNML
  17. Fast ε-free Inference of Simulation Models with Bayesian Conditional Density Estimation: (https://arxiv.org/abs/1605.06376)
    Repo: https://github.com/gpapamak/epsilon_free_inference
  18. Bayesian Optimization for Probabilistic Programs (http://www.robots.ox.ac.uk/~twgr/assets/pdf/rainforth2016BOPP.pdf)
    Repo: https://github.com/probprog/bopp
  19. PVANet: Lightweight Deep Neural Networks for Real-time Object Detection (https://arxiv.org/abs/1611.08588)
    Repo: https://github.com/sanghoon/pva-faster-rcnn
  20. Data Programming: Creating Large Training Sets Quickly (https://arxiv.org/abs/1605.07723)
    Repo: https://github.com/HazyResearch/snorkel
  21. Convolutional Neural Fabrics for Architecture Learning (https://arxiv.org/pdf/1606.02492.pdf)
    Repo: https://github.com/shreyassaxena/convolutional-neural-fabrics
  22. Value Iteration Networks in TensorFlow (https://arxiv.org/abs/1602.02867)
    Repo: https://github.com/TheAbhiKumar/tensorflow-value-iteration-networks

TensorFlow v0.12.0 RC1

텐서플로우 v0.12 RC1 버전이 등록되었습니다. 버그 수정이 포함되어 있으므로 RC0 버전을 쓰고 계셨다면 업데이트 하시면 좋을 것 같습니다.

텐서플로우 RC1 버전 부터는 리눅스, 맥, 윈도우의 텐서플로우 CPU, GPU 버전을 모두 pip 로 손쉽게 설치할 수 있습니다.

맥, 리눅스, 윈도우즈(아나콘다 권장) CPU 버전

$ pip install tensorflow

맥, 리눅스, 윈도우즈(아나콘다 권장) GPU 버전

$ pip install tensorflow-gpu

MS Ventures fund Element AI

마이크로소프트가 새로운 벤처 펀드를 운영한다고 발표하였습니다. 특히 이 펀드는 인공지능 분야에 집중될 것으로 알려졌습니다. 첫번째 펀드는 요수아 벤지오(Yoshua Bengio) 교수의 엘리먼트 AI(Element AI) 입니다. 정확한 금액을 알려지지 않았지만 지난달 구글이 엘리먼트 AI에 3백만 US달러 이상을 투자하기로 하였으므로 그에 버금가는 금액이 될 것으로 예상됩니다. 엘리먼트 AI는 수천만달러까지 펀딩을 계속 받을 예정이라고 합니다. 마이크로소프트가 OpenAI 와도 제휴하고 엘리먼트 AI에 투자까지 인공지능 분야에서 계속 잰걸음을 하는 것 같습니다. 마이크로소프트 벤처는 엘리먼트 AI 뿐만 아니라 계속 인공지능 벤처에 투자를 이어갈 예정이라고 합니다.