월간 보관물: 2016 7월

Layer Normalization

layer-normlization

출처: 레이어 노말라이제이션 페이퍼

토론토 대학의 제프리 힌튼 교수 팀에서 공개한 페이퍼 ‘Layer Normalization‘이 금주에 나온 가장 핫(hot)한 페이퍼 중 하나가 아닐까 합니다. 배치 노말라이제이션을 변형하여 입력 데이터의 평균과 분산을 이용해 레이어 노말라이제이션을 적용했다고 합니다. 이 페이퍼는 몬트리올 대학교의 애런 코빌(Aaron Courville)팀에서 지난 3월 발표한 ‘Recurrent Batch Normalization‘을 개선한 것으로 볼 수 있습니다. 당연히 결과가 좋으니 관심이 높은 거겠죠?

씨아노와 토치로 된 코드는 여기에서 확인할 수 있습니다. 관심을 반영하듯 불과 하루만에 케라스(Keras)로 작성된 GRU 리커런트 뉴럴 네트워크용 코드가 나왔습니다. 물론 이런 빠른 속도에 불평이 없는 것은 아닙니다. 🙂

* 페이퍼 마지막 Supplementary Material의 22번 공식 아래에 \alpha_i가 0으로(vector of zeros) 초기화된다고 쓰여진 것은 오타로 1로 초기화 되어야 한다고 합니다.

(업데이트) 주말에 누군가가 텐서플로우로 구현하지 않을까 생각했는데 역시나 지구 한편에서 누군가가 작업을 하고 있었습니다. 이전에 소개했던 ‘TensorFlow with The Latest Papers‘ 레파지토리에서 레이어 노말라이제이션을 텐서플로우로 구현한 코드를 조금 전에 추가했습니다.

New ML book & scikit-learn v0.18

rc_cat오라일리에서 새로운 파이썬 머신러닝 책인 ‘Introduction to Machine Learning with Python‘이 곧 출시될 예정입니다. 전체 챕터가 거의 다 써졌고 eBook 형태로 미리 구입해서 볼 수 있습니다. 이 책은 넘파이(numpy), 판다스(pandas), 사이킷런(sckit-learn)을 사용하며 최대한 수식은 줄인(아마 하나도 없는 것 같습니다) 실용서라고 볼 수 있습니다.

저자 중 한명인 안드리아스 뮐러(Andreas C. Mueller)는 뉴욕 대학교 리서치 엔지니어로 사이킷런의 코어 개발자 중 한명입니다. 누구보다도 사이킷런에 대해 잘 설명했으리라 생각됩니다. 그런데 이 책에서는 사이킷런의 안정버전인 0.17.x을 사용하지 않고 아직 개발버전인 0.18dev0을 선택했습니다. 혹시나 0.18 버전이 곧 릴리즈 되는건가 하는 생각에 저자에게 직접 물어 보았습니다. 역시나 이 책이 페이퍼백으로 출시될 때와 비슷한 시점인 대략 몇달 후에 0.18 버전이 릴리즈 될 것 같다고 합니다. 아마 늦어도 연내에는 0.18 버전이 나올 것으로 보입니다.

0.18 버전에 관심이 있는 것은 여러가지 기능 개선과 성능에 향상도 있겠지만 무엇보다도 뉴럴 네트워크 부분에 멀티레이어 퍼셉트론이 지원되기 때문입니다. MLPClassifier 와 MLPRegressor 클래스이며 사이킷런 개발버전 문서에서 확인할 수 있습니다.

주요 특징을 보면 활성화 함수로는 시그모이드, 하이퍼볼릭탄젠트, 렐루가 있고 최적화 옵션으로는 l-bfgs, SGD(Stochastic Gradient Descent), 아담(ADAM)이 있습니다. 모멘텀(Momentum)과 네스테로프 모멘텀(Nesterovs Momentum)을 설정할 수 있는 옵션도 보입니다. 옵션의 기본값을 보면 사람들이 어떤 것들을 선호하고 있는지를 미루어 짐작할 수 있는데요. 활성화함수는 렐루가 기본값이고 최적화는 아담입니다. 모멘텀과 네스테로프 모멘텀은 SGD와 함께 쓸 수 있는데 네스테로프 모멘텀의 기본값이 True로 되어 있습니다.

즉 사이킷런의 API는 렐루와 함께 아담이나 SGD+네스테로프 모멘텀을 사용하는 것이 기본으로 되어 있습니다. 올해 초에 작성되기 시작한 ‘Fundamental of Deep Learning‘ 책에서는 저자가 네스테로프 모멘텀에 대해 약간 보수적인 의견을 피력했었는데 사이킷런은 좀 더 적극적으로 적용하는 것 같습니다. 텐서플로우 0.9 버전에는 아직 네스테로프 모멘텀을 지원하지 않지만 바로 얼마전에 마스터 브랜치에 네스테로프 모멘텀을 지원하는 코드가 추가되었습니다! 아마 다음 릴리즈에서는 정식으로 포함되어 사용할 수 있을 것 같습니다. 현재 텐서플로우에 있는 네스테로프 모멘텀 옵션의 기본값은 False입니다.

사이킷런은 현재 GPU를 지원하지는 않습니다만 사이킷런의 장기 목표에는 GPU 지원도 포함되어 있는 것 같습니다. 사이킷런의 뉴럴 네트워크 사용에 관한 보다 자세한 설명은 가이드 문서를 참고하세요.

최성준님의 dl tutorials

약 두달전 쯤에 서울대 최성준님이 만드신 딥러닝 튜토리얼과 텐서플로우 예제에 대해 소개해 드린 적이 있습니다. 이번에 딥러닝 튜토리얼 2차본이 깃허브에 올라왔습니다. 무려 46개의 파워포인트로 이번의 자료는 MIT 라이센스로 올려 주셔서 냉큼 받았습니다. 다만 직접 강의를 들을 수 없어서 요약된 파워포인트만으로는 이해하기 어려운 부분도 많을 것 같습니다. 그래도 자료를 공유해 주신 최성준님에게 감사드립니다.

첫번째 슬라이드에 이 블로그가 언급되어 있는데요. 아마도 칭찬은 아닐 듯.. 빼주세요.. ㅠ.ㅠ

TensorFlow with The Latest Papers

최근에 나온 뉴럴 네트워크 페이퍼들을 텐서플로우로 구현한 깃허브 레파지토리를 소개해 드립니다. 특히 RNN과 NLP에 관련된 페이퍼들인데 7월에 나온 페이퍼도 포함되어 있습니다. 아파치 2.0 라이센스이고 앞으로도 구현이 추가될 수 있을 것으로 기대해 봅니다. 아래는 이 레파지토리에서 텐서플로우로 구현한 페이퍼 리스트입니다.

(업데이트)

바흐가 900개의 뉴런만 가지고 있었다면..

bach_ai

뉴럴 네트워크로 피아노 곡을 만든 소스가 깃허브에 올라왔습니다. 파이브레인(PyBrain)을 사용하여 개발되었고 트레이닝 데이터로는 바흐의 음악 수백곡을 사용했다고 합니다. 구성된 LSTM 리커런트 뉴럴 네트워크는 30개의 레이어에 각각 30개의 뉴런을 사용했다고 합니다. 만든 노래는 이곳에서 직접 들어 볼 수 있습니다. 읽을 것도 볼 것도 많지만 여력이 된다면 텐서플로우로 쫓아가 보도록 하겠습니다.

Distributed TensorFlow – Design Patterns and Best Practices

텐서플로우 커미터인 패브리지오 마일로(Fabrizio Milo)가 하카랩에서 발표한 ‘Distributed TensorFlow – Design Patterns and Best Practices’ 영상입니다. 패브리지오는 텐서플로우를 이용한 딥 러닝 컨설팅을 전문으로 하고 있으며 H2O 오픈투어 뉴욕(7월 19~20일)에도 참여할 예정이라고 합니다.

(업데이트) H2O 오픈투어에서 발표한 패브리지오 마일로의 영상이 공개되었습니다.

SciPy 2016 & Free eBooks

텍사스 오스틴에서 열린 SciPy2016의 스케줄이 끝나기가 무섭게 컨퍼런스와 튜토리얼 영상이 유투브에 올라왔습니다. 정말 놀라운 속도 입니다. 머신 러닝 관련 세션도 여러개가 눈에 띄입니다.

SciPy2016에 맞추어 오라일리에서 몇몇 신간 도서들을 무료로 배포하고 있습니다. 회원가입 하시고 http://www.oreilly.com/pub/get/scipy 에서 원하는 책을 선택하시면 이메일로 다운받을 수 있는 링크를 보내 줍니다. 다만 바로 메일을 보내 주지 않고 2일 정도 걸린다고 하네요. 😦

그래도 무료로 주는 게 어딘가요. 이 이벤트는 8월 9일까지 진행한다고 합니다.

scipy-free-ebook

(업데이트) 여러권을 신청했는데 메일이 와서 보니 마지막에 신청했던 것이 제공되네요. 결국 이틀에 한권씩 신청하라는 거죠. 귀찮지만 기간은 충분하니 원하는 책들은 다 받아 볼 수 있겠습니다.

(업데이트) 이상훈님이 댓글로 알려주신 것과 같이 한 계정당 한권만 보내 주네요. 저는 더 받으려고 계정을 추가로 만들었습니다. 🙂

Benchmarks for popular CNN models

스탠포드 비전랩의 저스틴 존슨(Justin Johnson)이 콘볼루션 뉴럴 네트워크의 잘 알려진 모델들을 비교 벤치마크한 자료를 깃허브에 공개하였습니다. 이 벤치마크는 토치로 수행되었으며 메모리 부족으로 ResNet-200을 GTX 1080에서 돌리지 못한 것을 제외하고는 모든 모델을 Titan X와 GTX 1080에서 직접 비교할 수 있도록 테스트했습니다. 결과로는 GTX 1080이 모든 모델에 대해 조금 더 빨랐으며 ResNet-50이 VGG-16보다 빠르고 에러도 작았고 ResNet-101은 VGG-16과 비슷한 속도에서 VGG-19보다 훨씬 에러가 작았습니다.

Network Layers Top-1 error Top-5 error Speed (ms) Citation
AlexNet 8 42.90 19.80 23.18 [1]
VGG-16 16 25.60 8.10 232.55 [2]
VGG-19 19 25.50 8.00 281.69 [2]
ResNet-18 18 30.43 10.76 47.07 [3]
ResNet-34 34 26.73 8.74 79.70 [3]
ResNet-50 50 24.01 7.02 153.90 [3]
ResNet-101 101 22.44 6.21 235.33 [3]
ResNet-152 152 22.16 6.16 328.90 [3]
ResNet-200 200 21.66 5.79 [4]

Music, Art and Machine Intelligence Workshop 2016

지난 달에 Artists and Machine Intelligence 그룹과 마젠타(Magenta) 팀이 샌프란시스코에서 함께 진행한 컨퍼런스 ‘Music, Art and Machine Intelligence(MAMI) Workshop 2016’ 의 동영상이 공개되었습니다. 이 분야에서는 연구자들끼리 뿐만 아니라 아티스트들과의 콜라보레이션도 더욱 가속화될 것 같습니다.

Reinforce Pong at Gym

한달 전에 스탠포드 비전 랩의 안드레이 카패시(Andrej Karpathy)가 블로그에 강화학습에 대한 글인 ‘Deep Reinforcement Learning: Pong from Pixels‘를 올렸었습니다. 조금 늦었지만 블로그의 글을 따라가 보려고 합니다. 안드레이는 스탠포드 뿐만이 아니라 구글과 OpenAI에서도 여러 프로젝트에 참여했고 강화학습과 관련된 여러 도서를 읽고 관련 강의도 들었다고 합니다. 강화학습을 쉽게 소개하기 위해 글을 썼다고 하는데 말처럼 쉽지는 않은 것 같습니다.

OpenAI 짐(Gym)은 강화학습 알고리즘을 훈련시키고 평가할 수 있는 프레임워크입니다. 짐에 포함된 퐁(Pong) 게임은 아타리(Atari) 2600에 포함된 간단한 컴퓨터 게임의 시뮬레이션 버전입니다. 두사람이 오른쪽과 왼쪽에 있는 자기 막대를 움직여 공을 받아 넘겨야 하고 상대방이 놓쳐서 화면 옆으로 사라지면 점수를 1점 얻게 됩니다(이를 편의상 한 판이라고 부르겠습니다). 이렇게 점수를 획득하여 가장 먼저 21점을 얻는 쪽이 이기는 게임입니다. 짐에서는 화면의 왼쪽 편이 하드 코딩되어 있는 컴퓨터 에이전트이고 오른쪽 편이 강화학습을 통해 우리가 학습시켜야할 에이전트입니다.

짐 라이브러리에서는 공이 위치가 이동되었을 때를 한 스텝(step)이라고 표현합니다. 게임 화면에서 공이 이동할 때 마다 스크린샷을 찍는다고 생각하면 비슷합니다. 매 스텝마다 짐은 우리에게 리워드(reward)를 줍니다. 이겼을 때는 1, 졌을 때는 -1, 이도저도 아닌 공이 게임 판 위를 여전히 돌아다니고 있는 중간에는 0을 리턴합니다. 우리는 매 스텝마다 막대의 위치를 위로 올릴 것인지(UP), 아래로 내릴 것인지(DOWN)를 결정하여 짐 라이브러리에 전달합니다. 게임을 이길 수 있도록 막대의 위치를 제어하는 것이 우리가 풀어야 할 숙제입니다.

계속 읽기