2018년 1월 2일 화요일

2017년 인공지능과 딥러닝 리뷰 (의역 by softgear)

2017년 인공지능과 딥러닝 리뷰 (번역 by softgear)

*저자와 역자는 오역 및 잘못된 정보에 대한 책임을 지지 않습니다
*원문: http://www.wildml.com/2017/12/ai-and-deep-learning-in-2017-a-year-in-review/

2017년 인공지능과 딥러닝 소식을 요약해 봅니다.

**
강화학습(Reinforcement Learning)이 인간을 이기다.


2017년 가장 큰 이슈는 "알파고"였습니다. ( https://storage.googleapis.com/deepmind-media/alphago/AlphaGoNaturePaper.pdf ) 알파고는 바둑에서 이세돌 선수 등 인간 프로 기사들을 물리칩니다. 바둑은 엄청나게 많은 경우의 수를 가지고 있기 때문에 머신러닝 기술로는 힘들것이라는 예측을 깨고 알파고가 바둑을 마스터하게 됩니다. 알파고는 기존의 기보를 기반으로 학습했으나, 그 다음 버전인 "알파고 제로"에서는 아예 스스로 학습을 해버리면서도 성능이 더 좋게 되었습니다. ( https://www.nature.com/articles/nature24270.epdf?author_access_token=VJXbVjaSHxFoctQQ4p2k4tRgN0jAjWel9jnR3ZoTv0PVW4gB86EEpGqTRDtpIz-2rmo8-KG06gqVobU5NSCFeHILHcVFUeMsbvwS-lxjqQGg98faovwjxeTUgZAUMnRQ ) 알파고를 만든 팀인 딥마인드에서는 바둑뿐만 아니라 다른 게임도 할수 있는 알파고 제로의 일반화 버전인 "알파제로"를 발표하기도 하였습니다. ( https://arxiv.org/abs/1712.01815 ) 또한 알파고가 어떻게 바둑을 두는지 알려주는 "알파고 티치" 도 공개하였습니다. ( https://alphagoteach.deepmind.com/ )

바둑 뿐만 아니라 다른 분야에서도 진전이 있었습니다. CMU의 Libratus와 DeepStack은 1:1 포커에서 인간 플레이어를 물리쳐 버렸습니다.

딥마인드는 스타크래프트2에 강화학습을 적용하기 위한 OpenAI를 공개하였고 1:1 경기에서 성공적인 모습을 보여주기도 하였습니다. https://blog.openai.com/dota-2/


**
진화(Evolution) 알고리즘의 귀환


지도학습(Supervised Learning)에서, 그라디언트(Gradient) 기반 역전파(back-propagation)방식은 잘 동작합니다. 이는 조만간에는 거의 바뀌지 않을 것입니다. 그러나, 강화학습 분야에서는, 진화전략(Evolution Strategies)이 다시 돌아오는 것 같습니다. 왜냐하면 데이터들이 iid(independent and identically distributed)하지 않고, 에러 신호(error signals)가 희박(sparser)하고, 탐색의 필요성이 있기 때문에, 그라디언트에 의존하지 않는 알고리즘들이 더 잘 작동할 수 있습니다. 게다가, 진화알고리즘들은 수천 기기에 쉽게 선형적으로 확장(scale)될 수 있어 매우 빠른 병렬 학습이 가능합니다. 이는 고가의 GPU를 요구하지 않고 수천개의 값이 싼 CPU에서 학습될 수 있습니다.
2017년초 OpenAI의 연구원은 진화전략이 표준 Deep Q-Learning에 필적하는 성능을 달성할 수 있음음 입증했습니다. ( https://blog.openai.com/evolution-strategies/ ) 2017년 말에 Uber 팀에서는 유전(Genetic) 알고리즘 및 novelty search의 가능성을 더욱 보여주었습니다. ( https://eng.uber.com/deep-neuroevolution/ ) 그라디언트 정보 없이, 매우 단순한 유전 알고리즘으로 어려운 Atari 게임을 학습하고, Frostbite에서 10500점을 기록하였습니다. DQN, AC3, ES 점수는 1000점 미만이었습니다. ( https://eng.uber.com/wp-content/uploads/2017/12/frostbite_ga_noframeskip.mp4?_=1 )
2018년에도 이러한 방향의 연구가 계속될 것으로 보입니다.


**
WaveNet, CNN, Attention 메커니즘들


구글의 Tacotron 2 TTS(Text-to-Speeach) 시스템은, Google Assistant에 배포된 Autoregression 모델인, WaveNet을 기반으로, 매우 훌륭한 읍성합성 품질과 속도향상을 보여주었습니다. ( https://research.googleblog.com/2017/12/tacotron-2-generating-human-like-speech.html https://deepmind.com/blog/high-fidelity-speech-synthesis-wavenet/ ) WaveNet은 기계 번역에저 적용되어 Recurrent 아키택처 보다 빠른 학습 시간을 보여주었습니다.
기계학습 분야에서 오랜 시간이 걸리는 반복적인 학습이 요구되는 재귀(Recurrent) 아키텍처에서 벗어나려는 추세가 있습니다. "Attention is All you Need"에서, 재귀(recurrent) 및 합성곱(Convolution)을 완전히 없애고, 보다 정교한 attention 메커니즘을 사용하여 학습 비용을 줄이면서 좋은 성능을 보여주었습니다. ( https://arxiv.org/abs/1706.03762 )


**
딥러닝 프레임워크의 해


2017년은 한 문장으로 요약해야 한다면 프레임워크의 해가 될 것 입니다. 페이스북은 PyTorch로 큰 센세이션을 일으켰습니다. ( http://pytorch.org/ ) Chainer가 제공하는 것과 유사한 dynamic graph 구조 덕택에 PyTorch는 자연어 처리 연구자들로부터 많은 사랑을 받았습니다. 그동안 연구자들은 Tensorflow 같은 static graph 프레임워크에 선언하기 힘든, 동적 및 순환 구조를 주기적으로 처리해야만 했었습니다.

TensorFlow은 2017년에 상당한 성과를 거두었습니다. 안정적이고 하위 호환성을 가진 Tensorflow 1.0은 2017년 2월에 출시되었습니다. ( https://github.com/tensorflow/tensorflow/releases/tag/v1.0.0 ) 현재 Tensorflow는 1.4.1 버전입니다. 주요 프레임워크 이외에도, dynamic computation graph를 위한 Tensorflow Fold, 데이터 인풋 파이프라인을 위한 Tensorflow Transform, DeepMind의 상위 Sonnet 등 여러가지 라이브러리가 출시되었습니다. ( https://research.googleblog.com/2017/02/announcing-tensorflow-fold-deep.html https://research.googleblog.com/2017/02/preprocessing-for-machine-learning-with.html https://deepmind.com/blog/open-sourcing-sonnet/ ) Tensorflow 팀은 PyTorch의 동적 계산 그래프와 유사한 새로운 실행모드를 발표했습니다. ( https://research.googleblog.com/2017/10/eager-execution-imperative-define-by.html )

구글과 페이스북 외도 많은 회사들이 머신러닝 프레임워크를 발표했습니다.
애플은 CoreML 이라는 모바일 머신러닝 라이브러리를 발표했습니다. ( https://developer.apple.com/machine-learning/ )
Uber팀은 Pyro 라는 Deep Probabilistic Programming Language를 발표했습니다. ( https://eng.uber.com/pyro/ )
아마존은 MXNet의 상위 API인 Gluon을 발표했습니다. ( https://github.com/gluon-api/gluon-api/ )
Uber팀은 Michelangelo 머신러닝 기반 플랫폼을 발표했습니다. ( https://eng.uber.com/michelangelo/ )

프레임워크의 수가 걷잡을수 없게 되므로, 페이스북과 마이크로소프트는, 프레임워크간 딥러닝 모델을 공유할수 있는, ONNX 오픈 포맷을 발표하였습니다. 예를들어 하나의 프레임워크에서 모델을 학습시킨 다음, 다른 프레임워크에서 프로덕션으로 서비스 동작을 시킬수 있습니다.

범용 딥러닝 프레임워크외에, 다음과 같은 많은 강화학습 프레임워크가 출시되었습니다.
OpenAI Roboschool는 오픈소스 로롯 시뮬레이션 소프트웨어입니다. ( https://blog.openai.com/roboschool/ )
OpenAI Baselines는 강화학습 알고리즘들의 고품질 구현 집합입니다. ( https://github.com/openai/baselines )
Tensorflow Agents는 Tensorflow기반의 강화학습 에이전트를 위한 최적화된 기반구조입니다. ( https://github.com/tensorflow/agents )
Unity ML Agents는 강화학습과 Unity Editor를 사용하여 게임과 시뮬레이션을 만들수 있게 합니다. ( https://github.com/Unity-Technologies/ml-agents )
Nervana Coach는 최신 강화학습 알고리즘을 실험할수 있게 합니다. ( http://coach.nervanasys.com/ )
Facebook’s ELF 는 게임 연구를 위한 플랫폼입니다. ( https://code.facebook.com/posts/132985767285406/introducing-elf-an-extensive-lightweight-and-flexible-platform-for-game-research/ )
DeepMind Pycolab 는 커스터마이징 가능한 grdworld 게임 엔진입니다. ( https://github.com/deepmind/pycolab )
Geek.ai MAgent는 Many-agent 강화학습을 위한 연구 플랫폼입니다. ( https://github.com/geek-ai/MAgent )

Deep Learning을 보다 쉽게 이용할 수 있도록 한, 구굴의 deeplearn.js 및 MIL WebDNN 실행 프레임워크가 있습니다. ( https://deeplearnjs.org/ https://mil-tokyo.github.io/webdnn/ )
그리고, 매우 유명한 프레임워크 하나가 죽었는데, 바로 Theano 입니다. 메일링 리스트 공지에 따르면, 개발자들이 1.0 버전이 최종 릴리즈가 될 것이라고 결정했습니다. ( https://groups.google.com/forum/#!topic/theano-users/7Poq8BZutbY )


**
학습 자료들


딥러닝 및 강화학습이 인기를 얻음에 따라, 2017년에 많은 온라인 강의, 부트캠프, 이벤트가 개최 및 출판되었습니다. 다음은 선별한 것중 일부입니다.
Deep RL Bootcamp 는 OpenAI와 UC Berkeley가 호스트 하며, 강화학습 기본과 최신 기술을 강의합니다. ( https://sites.google.com/view/deep-rl-bootcamp/lectures?authuser=0 )
Spring 2017 버전의 Stanford's Convolutional Neural Networks for Visual Recognition 코스. ( https://www.youtube.com/playlist?list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv http://cs231n.stanford.edu/ )
Winter 2017 버전의 Stanford’s Natural Language Processing with Deep Learning 코스. ( https://www.youtube.com/playlist?list=PL3FW7Lu3i5Jsnh1rnUwq_TcylNr7EkRe6 http://web.stanford.edu/class/cs224n/ )
Stanford’s Theories of Deep Learning 코스. ( https://stats385.github.io/ )
The new Coursera Deep Learning specialization ( https://www.coursera.org/specializations/deep-learning )
The Deep Learning and Reinforcement Summer School in Montreal ( http://videolectures.net/deeplearning2017_montreal/ )
UC Berkeley’s Deep Reinforcement Learning Fall 2017 course. ( http://rll.berkeley.edu/deeprlcourse/ )
The Tensorflow Dev Summit의 딥러닝 기본과 Tensorflow APIs에 대한 이야기. ( https://www.youtube.com/playlist?list=PLOU2XLYxmsIKGc_NBoIhTn2Qhraji53cv )

몇몇 학술대회는 온라인으로 발표하는 새로운 전통을 이어갔습니다. 최첨단 연구를 따라가고 싶다면 NIPS 2017, ICLR 2017 또는 EMNLP 2017을 시청할 수 있습니다. ( https://nips.cc/Conferences/2017/Videos https://www.facebook.com/pg/iclr.cc/videos/ https://ku.cloud.panopto.eu/Panopto/Pages/Sessions/List.aspx )

연구자들은 쉽게 접근할수 있는 arXiv에 tutorial 및 survey 페이퍼를 출판하였습니다. 다음은 몇가지 선별한 것입니다.
Deep Reinforcement Learning: An Overview ( https://arxiv.org/abs/1701.07274 )
A Brief Introduction to Machine Learning for Engineers ( https://arxiv.org/abs/1709.02840 )
Neural Machine Translation ( https://arxiv.org/abs/1709.07809 )
Neural Machine Translation and Sequence-to-sequence Models: A Tutorial ( https://arxiv.org/abs/1703.01619 )


**
응용분야: AI와 의학


2017년에 딥러닝이 인간 전문가를 물리치고 의료문제를 해결할 것라는 많은 주장이 있었습니다. 그러나, 많은 과대광고가 있었고, 의학적 배경이 없는 이가 진실을 제대로 이해 하기에는 어려움이 있었습니다. 포괄적인 검토를 위해, Luke Oakden-Rayner의 "인간 의사의 끝"이라는 블로그 게시물 시리즈를 추천합니다. ( https://lukeoakdenrayner.wordpress.com/2017/04/20/the-end-of-human-doctors-introduction/ ) 여기 몇가지 하이라이트를 정리해봅니다.
2017년의 최고의 뉴스중에 Standford팀은, 피부과 전문의 만큼, 피부암을 잘 확인하는 딥러닝 알고리즘을 발표했습니다.( https://cs.stanford.edu/people/esteva/nature/ https://www.nature.com/articles/nature21056.epdf?author_access_token=8oxIcYWf5UNrNpHsUHd2StRgN0jAjWel9jnR3ZoTv0NXpMHRAJy8Qn10ys2O4tuPakXos4UhQAFZ750CsBNMMsISFHIKinKDMKjShCpHIlYPYUHhNzkn6pSnOCt0Ftf6 ) 또다른 팀은, 부정맥으로 알려진 불규칙한 심장 박동을 진단할 수 있는 모델을 개발했습니다. 이는 심장전문의보다 더 정확하게 단일 ECG 신호로부터 진단을 할수 있다고 합니다.
그러나, 실책이 없지는 않았습니다. DeepMind와 NHS의 딜은 "용서할 수 없는" 실수로 가득 찼습니다. ( http://www.businessinsider.com/deepmind-royal-free-london-nhs-deal-inexcusable-mistakes-2017-3 ) NIH는 흉부 X-레이 데이터셋은 과학자들에게 공개했지만, 정밀조사를 통해 진단 AI 모델을 교육하는데는 적합하기 않음을 발견했습니다. ( https://www.nih.gov/news-events/news-releases/nih-clinical-center-provides-one-largest-publicly-available-chest-x-ray-datasets-scientific-community https://lukeoakdenrayner.wordpress.com/2017/12/18/the-chestxray14-dataset-problems/ )


**
응용분야: 예술과 GAN


올해의 더 많은 주목을 끈 응용은, 이미지, 음악, 스케치, 비디오에 적용된 생성 모델(Generative Model)이었습니다. NIPS 2017 컨퍼런스에서  처음으로 Creative and Design을 위한 머신러닝을 선보였습니다. ( https://nips2017creativity.github.io/ )

가장 인기있는 응용에는 구글의 QuickDraw가 있습니다. ( https://quickdraw.withgoogle.com/ ) QuickDraw는 신경망을 사용하여 손그림(doodles)을 인식합니다. 공개된 데이터셋을 이용하여 기계를 학습하여, 그림을 마무리 하도록 가르칠수 있습니다. ( https://research.googleblog.com/2017/04/teaching-machines-to-draw.html )

GAN(Generative Adversarial Networks)은 2017년에 상당한 발전을 이루었습니다. CycleGAN, DiscoGAN, StarGAN과 같은 새로운 모델은 얼굴 생성과 같은 인상적인 결과를 달성했습니다. ( https://arxiv.org/abs/1703.10593 https://github.com/carpedm20/DiscoGAN-pytorch https://github.com/yunjey/StarGAN ) GAN은 전통적으로 사실적인 고해상도 이미지를 생성하는 데 어려움을 겪었지만, pix2pixHD의 인상적인 결과는 이러한 문제를 해결할 수 있음을 보여주었습니다. 앞으로 GAN이 새로운 붓이 될지도 모르겠습니다. ( https://tcwang0509.github.io/pix2pixHD/ )
https://www.youtube.com/watch?v=3AIpPlzM_qs


**
응용분야: 자율주행 자동차


자율주행차 분야에서 메인 플레이어는, Uber 및 Lyft, 알파벳의 Waymo, Tesla 입니다. Uber는 샌프란시스코에서 자율주행 자동차가 소프트웨어 오류로 신호등의 빨간불 몇개를 놓치는 등의 어려움으로 한해를 시작했습니다. ( http://fortune.com/2017/02/26/uber-self-driving-car-red-lights/ ) 이후 Uber는 내부적으로 사용되는 자동차 시각화 플랫폼에 대한 세부정보를 공유 했으며, 12월에는 자율주행차 프로그램이 2백만 마일을 주행했습니다. ( https://eng.uber.com/atg-dataviz/ https://www.forbes.com/sites/bizcarson/2017/12/22/ubers-self-driving-cars-2-million-miles/#23dc88eaa4fe )
그동안 Waymo의 자율주행차는 4월에는 처음에 사람이 탑승하였으나, 나중에는 애리조나주 피닉스에서 완전히 무인으로 주행하였습니다. Waymo는 테스트 및 시뮬레이션 기술에 대한 세부정보도 게시했습니다. ( https://www.bloomberg.com/news/articles/2017-04-25/alphabet-s-self-driving-cars-to-get-their-first-real-riders https://www.recode.net/2017/11/7/16614780/alphabet-driverless-cars-phoenix-arizona https://www.theatlantic.com/technology/archive/2017/08/inside-waymos-secret-testing-and-simulation-facilities/537648/ )
https://cdn.theatlantic.com/assets/media/img/posts/2017/08/WaymoMovieGIF/a7325709f.gif
Lyft는 자사의 자율주행 하드웨어 및 소프트웨어를 구축중이라고 발표했습니다. 보스톤에서 첫파일럿이 진행중입니다. ( https://www.recode.net/2017/7/21/16005164/lyft-self-driving-cars-autonomous-software-hardware )
Tesla 오토파일럿에 대한 업데이트는 많이 보지 못했습니다. ( https://www.theverge.com/2017/10/24/16504038/tesla-autopilot-self-driving-update-elon-musk )
최근 Apple이 이분야에 새로 들어왔습니다. 팀쿡(Tim Cook)이 애플이 자율운전 소프트웨어를 개발하고 있다고 발표했으며, ArXiv에 관련 논문을 발표했습니다. ( https://www.theverge.com/2017/6/13/15790076/apple-self-driving-cars-autonomous-tim-cook https://arxiv.org/abs/1711.06396 )


**
응용분야: 신선한 연구 프로젝트


많은 흥미로운 프로젝트와 데모가 발표되었으므로 여기에서 모든 것을 언급하는 것은 불가능합니다. 그러나 여기 몇가지를 적어봅니다.
Background removal with Deep Learning. https://towardsdatascience.com/background-removal-with-deep-learning-c4f2104b3157
Creating Anime characters with Deep Learning. http://make.girls.moe/#/
Colorizing B&W Photos with Neural Networks. https://blog.floydhub.com/colorizing-b&w-photos-with-neural-networks/
Mario Kart (SNES) played by a neural network. https://www.polygon.com/2017/11/5/16610012/mario-kart-mariflow-neural-network-video
A Real-time Mario Kart 64 AI. https://github.com/rameshvarun/NeuralKart
Spotting Forgeries using Deep Learning. https://www.technologyreview.com/s/609524/this-ai-can-spot-art-forgeries-by-looking-at-one-brushstroke/
Edges to Cats. https://affinelayer.com/pixsrv/index.html

다음은 좀더 연구스러운 것들입니다.
Unsupervised Sentiment Neuron(비지도 감정 뉴런) - Amazon 리뷰의 텍스트에서 다음 문자를 예측하기 위해서 학습 되었음에도 불구하고 감정표현을 학습하는 시스템 ( https://blog.openai.com/unsupervised-sentiment-neuron/ )
Learning to Communicate - agent들이 자체 언어를 개발하도록 하는 연구( https://blog.openai.com/learning-to-communicate/ )
The Case for Learning Index Structures - 신경망을 이용하여, cache optimized B-tree 보다 최대 70%까지 속도를 높이고 실제 데이터를 저장하는데 메모리 사용량도 줄이는 연구. ( https://arxiv.org/abs/1712.01208 )
Attention is All You Need ( https://arxiv.org/abs/1706.03762 )
Mask R-CNN - 객체 세그멘테이션의 일반 프레임워크 ( https://arxiv.org/abs/1703.06870 )
Deep Image Prior for denoising, superresolution, and inpainting ( https://dmitryulyanov.github.io/deep_image_prior )


**
데이터 세트


지도학습에 사용되는 신경망은 필요한 데이터가 부족한 것으로 유명합니다. 그래서 개방형 데이터 세트는 연구 커뮤니티에 중요한 기여입니다. 다음은 2017년 눈에 띄는 몇가기 데이터 세트입니다.
Youtube Bounding Boxes. https://research.google.com/youtube-bb
Google QuickDraw Data. https://quickdraw.withgoogle.com/data
DeepMind Open Source Datasets. https://deepmind.com/research/open-source/open-source-datasets
Google Speech Commands Dataset. https://research.googleblog.com/2017/08/launching-speech-commands-dataset.html
Atomic Visual Actions. https://research.google.com/ava/
Several updates to the Open Images data set. https://github.com/openimages/dataset
Nsynth dataset of annotated musical notes. https://magenta.tensorflow.org/datasets/nsynth
Quora Question Pairs. https://data.quora.com/First-Quora-Dataset-Release-Question-Pairs


**
딥러닝, 재현성(Reproducibility) 그리고 연금술


몇몇 연구자들은 학술논문 결과의 재현성에 대한 우려를 제기했습니다. 딥러닝 모델은, 발표하기에 충분히 좋은 결과를 내기 위하여, 엄청나게 많은 수의 하이퍼 파라메터에 의존합니다. 이 최적화는 구글이나 페이스북 같은 회사만이 지불할수 있을 정도로 매우 비싸졌습니다. 연구원들은 코드를 항상 릴리즈하지는 않으며, 논문에 중요한 부분을 넣은 것을 잊기도 하며, 약간 다른 평가절차를 사용하거나, 데이터 셋에 과적합한 최적화를 하기도 합니다. 이러한 것은 재현성에 대한 큰 이슈를 만듭니다. "Reinforcement Learning That Matters"에서 연구자들은 동일한 알고리즘을 서로 다른 코드기반에서 가져와서 보면 서로 크게 다른 결과를 얻음을 보여 주었습니다. ( https://arxiv.org/abs/1709.06560 )
http://d3kbpzbmcynnmx.cloudfront.net/wp-content/uploads/2017/12/Screen-Shot-2017-12-31-at-11.09.51-PM-768x729.png

"Are GANs Created Equal? A Large-Scale Study(GAN들이 동일하게 생성하는가?)" 연구에 따르면, 비싼 하이퍼 파라메터들을 사용하는 잘 조율된 GAN이, 우월하다고 주장하는 정교한 접근방식(Sophisticated Approach)을 능가할수 있음을 보여 주었습니다. ( https://arxiv.org/abs/1711.10337 ) 유사하게, "On the State of the Art of Evaluation in Neural Language Models"에서, 연구자들은 간단란 LSTM 아키텍처가 제대로 정규화되고 조정되면 최신 모델보다 우수한 성능을 보일수 있음을 보여 주었습니다. ( https://arxiv.org/abs/1707.05589 )

많은 연구자들이 동감한 NIPS talk에서, Ali Rahimi는 최근 딥러닝 접근법을 연금술에 비교하고 더욱 엄격한 실험 설계를 요구했습니다. 얀 르쿤(Yann LeCun)은 그것을 모욕으로 생각하고 다음달 즉각 대응하기도 하였습니다. ( https://www.youtube.com/watch?v=Qi1Yry33TQE https://www.facebook.com/yann.lecun/posts/10154938130592143 )


**
캐나다와 중국산 인공지능


미국의 이민 정책이 강화되면서 기업들이 캐나다 해외 사무소를 점차 늘리고있는 것으로 보입니다. 구글은 토론토에 새 사무실을 열었고, DeepMind는 캐나다 에드먼턴에 새로운 사무실을 열었고 Facebook AI Research는 몬트리올로도 확장했습니다. ( https://canada.googleblog.com/2017/03/canadas-ai-moment.html https://deepmind.com/blog/deepmind-office-canada-edmonton/ https://newsroom.fb.com/news/2017/09/fair-montreal/ )

중국은 많은 주목을 받고있는 또 하나의 목적지입니다. 많은 자본과 대규모 인재 풀 및 정부 데이터를 즉시 이용할 수 있으므로 AI 개발 및 생산 배치와 관련하여 미국과 머리를 맞대고 경쟁하고 있습니다. 구글은 곧 베이징에서 새로운 실험실을 열 것이라고 발표했습니다. ( https://www.nytimes.com/2017/07/20/business/china-artificial-intelligence.html https://newsroom.fb.com/news/2017/09/fair-montreal/ )


**
하드웨어 전쟁: Nvidia, Intel, Google, Tesla


최신 딥러닝 기술은 최신 모델을 학습하기 위해 비싼 GPU를 필요로 합니다. 지금까지 NVIDIA가 큰 우승자였습니다. 올해 새로운 플래그쉽 Titan V를 발표했습니다. 그건그렇고, 골드 컬러로 나온다고 합니다. https://www.nvidia.com/en-us/titan/titan-v/
그러나 경쟁이 치열해 지고 있습니다. 구글의 TPU는 클라우드 플랫폼에서 사용 가능합니다. ( https://blog.google/topics/google-cloud/google-cloud-offer-tpus-machine-learning/ ) 인텔의 Nervana는 새로운 칩셋을 발표 했습니다.( https://www.theverge.com/circuitbreaker/2017/10/17/16488414/intel-ai-chips-nervana-neural-network-processor-nnp ) 심지어 테슬라는 자체 AI 하드웨어 작업을 하고 있다고 인정했습니다.( https://www.theregister.co.uk/2017/12/08/elon_musk_finally_admits_tesla_is_building_its_own_custom_ai_chips/ ) 중국의 비트코인 마이닝 전문 하드웨어 제조사가 인공지능 시장에 들어가기를 원할수도 있습니다.( https://qz.com/1053799/chinas-bitmain-dominates-bitcoin-mining-now-it-wants-to-cash-in-on-artificial-intelligence/ )


**
과대광고와 실패


큰 광고는 큰 책임을 가져온다. 주류 언론 보도는 연구실이나 생산 시스템에서 실제로 발생한 일과 거의 일치하지 않습니다. IBM Watson은 과장된 마케팅에 의한 전형적인 아이템으로, 그에 부합하는 결과를 얻어내는데는 실패하였습니다. 2017년에 건강진단에서 반복된 실패이후에 모두가 IBM Watson을 싫어하게 되었습니다. ( https://gizmodo.com/why-everyone-is-hating-on-watson-including-the-people-w-1797510888 https://www.statnews.com/2017/09/05/watson-ibm-cancer/ )

가장 과장된 이야기는 페이스북의 "연구원들이 자체언어를 발명한 인공지능을 셧다운 시켰다."는 것이었습니다. 그것은 이미 충분한 피해를 입었으며 그것을 찾아볼수 있습니다. 물론, 그 제목은 진실에서 더 멀어질수는 없었습니다. 사실은 연구자들이 원하는 결과가 나오지 않자 표준 실험을 중단한 것이었습니다.

과장광고에대한 유죄 판결을 받은 것은 언론만은 아닙니다. 연구원들도 실제 실험 결과를 반영하지 않는 논문 제목 또는 초록 사용으로 경계를 넘어서기도 했습니다. ( https://medium.com/@yoav.goldberg/an-adversarial-review-of-adversarial-generation-of-natural-language-409ac3378bd7 http://zacharydavid.com/2017/08/06/fitting-to-noise-or-nothing-at-all-machine-learning-in-markets/ )


**
고능력자 채용과 이탈


머신러닝 MOOC에서 유명한 Coursera의 공동설립자인 Andrew Ng는 2017년 여러차레 뉴스에 나왔습니다. 3월에 Baidu에서 인공지능 그룹을 이끌던  이 Andrew는 Baidu를 떠나, 1억5천만 달러 펀드를 조성하고 제조업계에 초점을 맞춘 새로운 스타트업 landing.ai를 발표 했습니다. ( https://medium.com/@andrewng/opening-a-new-chapter-of-my-work-in-ai-c6a4d1595d7b https://techcrunch.com/2017/08/15/andrew-ng-is-raising-a-150m-ai-fund https://www.landing.ai/ )

Gary Marcus는 Uber의 새로운 인공지능 연구소장으로 임명되었습니다. ( https://www.recode.net/2017/3/8/14863560/uber-ai-gary-marcus-geometric-intelligence )  페이스북은 시리의 자연어 이해 담당 수석을 고용하였습니다. ( https://venturebeat.com/2017/06/14/facebook-hires-siri-natural-language-understanding-chief-from-apple/ )  몇몇 유명연구원은 OpenAI를 떠나 새로운 로봇 회사를 창립했습니다. ( https://www.theverge.com/2017/11/10/16627570/robot-ai-grasping-grabbing-embodied-intelligence-startup )

과학계를 떠나 산업계로 가는 것이 계속되었으며, 대학 연구실은 업계 거인들이 제공하는 급여와 경쟁할 수 없다는 불평을 했습니다. ( https://www.theguardian.com/science/2017/nov/01/cant-compete-universities-losing-best-ai-scientists )


**
스타트업 투자와 인수


이전과 마찬가지로 인공지능 스타트업 생태계는 몇가지 주목할 만한 인수로 호황을 누리고 있습니다.
Microsoft가 딥러닝 스타트업 Maluuba를 인수 ( https://blogs.microsoft.com/blog/2017/01/13/microsoft-acquires-deep-learning-startup-maluuba-ai-pioneer-yoshua-bengio-advisory-role/ )
구글이 Kaggle 인수 ( https://cloudplatform.googleblog.com/2017/03/welcome-Kaggle-to-Google-Cloud.html )
소프트뱅크가 robot maker Boston Dynamics 인수 ( https://www.bloomberg.com/news/articles/2017-06-09/softbank-agrees-to-buy-robot-maker-boston-dynamics )
페이스북이 인공지능 비서 스타트업 Ozlo 인수 ( https://venturebeat.com/2017/07/31/facebook-acquires-ai-assistant-startup-ozlo/ )
삼성이 Fluently 인수하여 Bixby 출시 ( https://techcrunch.com/2017/11/28/samsung-buys-another-ai-company-as-it-continues-to-build-out-bixby/ )

그리고 많은 돈을 모은 새로운 회사들..
Mythic raised $8.8 million to put AI on a chip ( https://venturebeat.com/2017/03/22/mythic-raises-8-8-million-to-put-ai-on-a-chip )
Element AI, a platform for companies to build AI solutions, raised $102M ( https://techcrunch.com/2017/06/14/element-ai-a-platform-for-companies-to-build-ai-solutions-raises-102m/ )
Drive.ai raised $50M and added Andrew Ng to its board ( https://www.forbes.com/sites/alanohnsman/2017/06/27/robot-car-tech-startup-drive-ai-raises-50-million-adds-stanfords-ng-to-board/ )
Graphcore raised $30M ( https://www.graphcore.ai/posts/big-names-in-machine-intelligence-join-graphcores-new-30-million-funding-round )
Appier raised a $33M Series C ( https://techcrunch.com/2017/08/29/ai-startup-appier-gets-33m-series-c-from-investors-including-softbank-group-line-corp-and-naver/ )
Prowler.io raised $13M ( https://techcrunch.com/2017/09/04/prowler-io-nabs-13m-for-its-new-approach-to-decision-making-in-ai/ )
Sophia Genetics raises $30 million to help doctors diagnose using AI and genomic data ( https://venturebeat.com/2017/09/13/sophia-genetics-raises-30-million-to-help-doctors-diagnose-using-ai-and-genomic-data-analysis/ )


EOF

2017년 9월 25일 월요일

fopen()을 써서 랜덤하게 데이터를 fwrite하기

fopen()을 써서 랜덤하게 데이터를 fwrite할때 주의 사항
처음 열때는 "wb+"로 열고, 그다음부터는 "rb+" 로 열어야 한다.
"ab+"로 열면 무조건 파일 끝에만 write가 된다. (fseek이 제대로 동작 하지 않는다)
이미 있는 파일에 "wb+"로 열어버리면 파일 내용이 지워져 버린다.
파일 내용을 편집, 추가 할때는 "rb+"로 해야 한다.

예제)
#include
#include
#include

int main(int argc, char *argv[]) {
        char *filename = "test.bin";
        FILE *fp = NULL;
        int array[]= {9,3,1,2,5,0,6,8,7,4};
        int len = sizeof(array)/sizeof(int);

        for(int i=0; i                if(i==0)
                        fp = fopen(filename, "wb+");
                else
                        fp = fopen(filename, "rb+");

                int offset = array[i];
                unsigned char data = array[i] & 0x0ff;
                int datalen = 1;

                fseek(fp, offset, SEEK_SET);
                fwrite(&data, datalen, 1, fp);

                fseek(fp, 0, SEEK_END);
                fclose(fp);
        }
        return 0;
}

2017년 8월 24일 목요일

Eclipse에 Python 통합개발환경 구축방법 (Linux)

문서는 Ubuntu 14.04 Eclipse Python 플러그인 설치를 통한 Python 통합개발환경(IDE) 구축 방법에 대해 기술함

다음 링크를 참고로 하여 작성함
http://yaraba.tistory.com/173

이클립스(eclipse) 다운로드 설치

-       Linux 환경에 따라 이클립스가 이미 설치되어 있을 수도 있으며, 적절한 버전 (3.8이상) 이미 설치된 경우, 단계를 생략하여도 된다.
-       JRE 또는 JDK가 미리 설치되어 있어야 함
-       이클립스 다운로드 : http://www.eclipse.org/downloads/  에서  (: 리눅스에서 원격 접속시 원격으로 웹브라우저를 띄워야 한다. 쉘에서  google-chrome 실행) Eclipse IDE of Java Developers (Linux, 64bit)를 선택, 다운로드한다.

-          다운로드가 완료되면, 다음과 같이 자기 홈 디렉토리에서 압축을 해제한다. ( tar zxvf 다운로드/eclipse-java-mars-2-linux-gtk-x86_64.tar.gz )
-       eclipse 디렉토리로 들어간 다음, eclipse 실행한다. 처음 실행시 workspace 경로 확인을 물어 있다. 경로를 확인하고 OK 누른다.

-       그러면 eclipse 실행되어 대기 상태가 된다.


PyDev 플러그인 소프트웨어 설치

-        이클립스 상단 메뉴에서 Help > Install New Software를 선택한다.
-        다음 그림과 같이 Work with: http://www.pydev.org/updates 를 입력후 엔터를 누르면 아래에 PyDev PyDev Mylyn Integration 이 나오는데 PyDev 를 선택, 아래의 [Next] 버튼을 누른다
-        경우에 따라 calculating dependency가 오래 걸릴 수도 있다. 계속 기다려야 한다.
-        설치중 라이선스, 보안 등 질문이 있는데 Accept, OK 를 선택한다.
-        설치가 끝나면 이클립스를 다시 시작하도록 한다.

PyDev 플러그인 설정

-        파이션 경로를 설정하여야 한다. 이클립스에서 Windows > Preferences 메뉴를 선택한다.
-        왼쪽의 PyDevInterpreters의 삼각형을 눌러 펼친후, Python Interpreter를 선택한다.
-        우측 상단의 New를 눌러, Interpreter Name과 실행파일 위치(/usr/bin/python2.7)를 선택한다. (python실행파일 위치를 모를 경우 콘솔에서 which python 으로 확인할 수 있다)
-         
-       
-        OK 눌러 설정을 마무리한다.
-         
-        이번에는 이클립스에서 Windows > Perspectvies > Open Perspectives > Other… 을 선택한다. 그리고 PyDev 를 선택한다.
-       
-        이클립스 우측에 PyDev 탭이 보이고, 우측에 PyDev Package 탐색창이 보이면 준비가 것이다.
-         


HelloPython.py 작성 실행

-        왼쪽 PyDev Package에서 우클릭, New > Project… 를 선택하고, PyDev Project 선택한다.
-       
-        프로젝트 이름을 HelloPython 으로 입력한 다음, [Finish] 선택한다.
-       
-        PyDevPackage HelloPython 프로젝트에서 우측 클릭하여 New > File 선택후, 파이션 파일명 (HelloPython.py) 입력후 [Finish] 선택한다.
-        코드를 작성후, Run 실행한다.


TensorFlowEx1.py 작성 실행

- tensorflow 가 잘 설정되어 있어야 함
-  이클립스에서 새로운 Python 프로젝트로 TensorFlowEx1 를 만든다.
- 새로운 파일 TensorFlowEx1.py 만든다.
- 코드를 작성하고, 실행(Run) 한다.


밖에..

- 에디터 창에 물결 밑줄은 bad indentation 경고가 생기는데, Preferences -> PyDev -> Editor -> Code Analysis -> Others -> "indentation problems and mixing of tabs and spaces" Ignore로 설정하면 없앨 수 있다.



-문서끝-

2016년 2월 4일 목요일

NVIDIA GPU TESLA K40 설치방법 (Ubuntu 14.04)

NVIDIA GPU TESLA K40 설치방법 (Ubuntu 14.04)

2016.02.04.

문서는 Ubunt 14.04 GPU 보드인 NVIDIA TESLA K40 설치 방법에 대해 기술함

참고
http://developer.download.nvidia.com/compute/cuda/7.5/Prod/docs/sidebar/CUDA_Quick_Start_Guide.pdf

하드웨어 설치

-       컴퓨터 전원을 완전히 끈다.
-       PCI-E 슬롯에 K40보드를 설치한다.
-       보조 PCI-E 전원 케이블을 옆면에 꽂는다. 8핀만 꽂아도 되지만, 8핀과 6핀 모두 꽂는 것을 권장한다.
-       전원을 연결후 켠다.

하드웨어 정상 설치 확인

-        리눅스에서 다음 명령어로 정상적으로 보드가 인식되었는지 확인한다.
$ lspci  | grep -i nvidia
05:00.0 3D controller: NVIDIA Corporation GK110BGL [Tesla K40c] (rev a1)

CUDA 다운로드

https://developer.nvidia.com/cuda-downloads 에서 “Linux” , “x86_64” 선택, “Ubuntu” “14.04” 선택. 인스톨러 타입은 deb(network)
다운로드 (cuda_repo_ubuntu1404_7.5-18_amd64.deb  : 용량 2.1KB
다음과 같이 인스톨
sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb
sudo apt-get update
sudo su
apt-get install cuda

재부팅한다.

환경변수 설정

.bashrc 또는 /etc/environment 에 환경변수를 설정한다.

sudo vi /etc/environment

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/apache-maven-3.3.9/bin:/usr/local/cuda-7.5/bin"
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-7.5/lib64


샘플 다운로드 시험

다음과 같이 샘플을 다운로드 및  시험해본다.
cd
cuda-install-samples-7.5.sh ~
cd ~/NVIDIA_CUDA-7.5_Samples/5_Simulations/nbody
make
./nbody
마지막에 ./nbody실행은 원격(SSH)으로는 안되고, 직접 컴퓨터에서 해야 한다.



EOF

2016년 1월 13일 수요일

Google TensorFlow 설치 및 사용방법

Google TensorFlow 설치 및 사용방법

2016.1.13.
softgear@etri.re.kr

Google TensorFlow

  • data flow graph를 이용한 computation library
  • 그래프의 Node는 수학적 연산을 의미,
  • 그래프의 Edge는  다차원 데이터 배열 (“tensors”)을 의미
  • CPU, GPU(Linux, CUDNN 6.5 V2) 지원
  • 처음에는 Google’s Brain Team을 위해 개발됨

Tensor 란?


TensorFlow Features

  • Deep Flexibility : 고수준 라이브러리 ~ 저수준 함수까지 Python 또는 C/C++를 이용하여 구성 가능
  • True Portability : 작성한 코드 수정 없이, CPU, GPU, desktop, server, mobile platform 에 적용 가능
  • Connect Research and Production : TensorFlow에 구현한 새 알고리즘을 바로 상용 제품화 가능
  • Auto-Differentiation : 자동 유도-미분
  • Language Options :  Python 기본, C++
  • Maximize Performance : 최대한 CPU core, GPU 사용


Introduction


import tensorflow as tf
import numpy as np

# Create 100 phony x, y data points in NumPy, y = x * 0.1 + 0.3
x_data = np.random.rand(100).astype("float32")
y_data = x_data * 0.1 + 0.3

# Try to find values for W and b that compute y_data = W * x_data + b
# (We know that W should be 0.1 and b 0.3, but Tensorflow will
# figure that out for us.)
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b

# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# Before starting, initialize the variables.  We will 'run' this first.
init = tf.initialize_all_variables()

# Launch the graph.
sess = tf.Session()
sess.run(init)

# Fit the line.
for step in xrange(201):
   sess.run(train)
   if step % 20 == 0:
       print(step, sess.run(W), sess.run(b))

# Learns best fit is W: [0.1], b: [0.3]


Download and Setup

  • gitbhub로 부터 또는 binary package를 이용하여 설치 가능

Requirements


Install Overview

  • Pip install : 시스템에 가상화 없이 설치
  • Virtualenv install : 정해진 디렉토리내에 설치(* 본 문서에서는 이 방법대로 Mac에 설치함. )
  • Docker install : 가상화 설치 (Linux만 가능한 듯)
  • source code로도 가능

Virualenv installation

  1. pip와 Virtualenv 설치, six 업그레이드
$ sudo easy_install pip
$ sudo easy_install -U six
$ sudo pip install --upgrade virtualenv

  1. ~/tensorflow 디렉토리에 Virtualenv 환경 생성
$ virtualenv --system-site-packages ~/tensorflow

  1. Virtualenv 활성화 및 그 안에 TensorFlow 설치
$ source ~/tensorflow/bin/activate
(tensorflow)$

(tensorflow)$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.6.0-py2-none-any.whl

  1. pip3에 대해서도 동일하게 수행
$ source ~/tensorflow/bin/activate  # If using bash
(tensorflow)$

(tensorflow)$ pip3 install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.6.0-py3-none-any.whl
“tensorflow-0.6.0-py3-none-any.whl is not a supported wheel on this platform.” 라는 오류가 나는데, 상관없음 (확인필요)


  1. Virtualenv 비활성화
더이상 가상환경을 안 쓸 경우.
(tensorflow)$ deactivate

imac:~ user$        #원래 프롬프트

설치 확인

가상환경하에서 다음을 실행.

(tensorflow):~ user$ python
Python 2.7.10 (default, Oct 23 2015, 18:05:06)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 8
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 8
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a+b))
42
>>>
>>> quit()


데모 모델 실행하기

데모 모델이 설치된 디렉토리 확인
(tensorflow)imac:~ user$ python -c 'import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))'
/Users/user/tensorflow/lib/python2.7/site-packages/tensorflow
(tensorflow)imac:~ user$

MNIST 문자인식 CNN 모델 실행
(tensorflow)imac:~ user$ python -m tensorflow.models.image.mnist.convolutional
Succesfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Succesfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Succesfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Succesfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
...생략

기본 사용법 (Basic Usage)

TensorFlow를 사용하기 위해서 다음 사항을 하는 방법을 알아야 한다.
  • graph로 computation을 표현
  • Sessions 안의 graph를 실행
  • tensors로서 data를 표현
  • Variables로 상태 관리
  • feeds와 fetches로 데이터를 넣거나 빼기

개요

graph의 Nodes를 “op,ops”(operations)라 한다. 하나의 op는 0개 이상의 “Tensor”를 취하며(입력), 계산을 수행하고, 결과를 0개 이상의 Tensor를 생산한다. Tensor는 typed multi-dimension array (다중차원배열)이다. 예를 들어, [batch, height, width, channels] 차원의 부동소수 4차원 배열로서 이미지의 mini-batch 를 표현할 수 있다.
TensorFlow graph는 계산들을 서술한 것이다. 계산을 위해, graph는  “Session” 내에 띄워져야 (launch) 한다. Session은 graph ops를, CPU나 GPU 같은,  “Devices”에 배치하고, ops를 실행하기 위한 method를 제공한다. 이러한 method는 ops의 결과물인 tensor를 Python의 “numpy ndarray” 객체형태로 리턴한다. 이는 C/C++에서는 tensorflow::Tensor 인스턴스이다.

Computation graph

TensorFlow 프로그램은, construction 단계와 execution 단계로 구성된다. construction 단계는 graph를 조립-연결하며, execution 단계는 graph 내의 ops를 실행하기 위해 session을 사용한다.
TensorFlow는 C,C++,Python으로 사용할 수 있으며, Python이 편리하다.

Building Graph

graph를 만들기 위해서, “Constant”와 같이 어떤 입력도 필요로 하지 않는 ops로 시작하여, 그 출력을 계산을 위한 다른 ops로 넘긴다. Python라이브러리의 ops 생성자는, 생성된 ops의 출력을 의미하는 객체를 리턴한다. 그래서 리턴된 것을 다른 ops 생성자의 입력으로 넘길수 있다.
TensorFlow Python 라이브러리는 ops생성자가 node를 추가할 수 있는 default graph를 가지고 있으며, 많은 응용에서 충분히 사용할 수 있다. 많은 그래프를 명시적으로 다루기 위해서는 Graph class 문서를 참고하라( https://www.tensorflow.org/versions/master/api_docs/python/framework.html#Graph ) .
다음 파이선 코드를 보자. default graph는 3개의 노드를 갖게 된다. 2개는 constant() op이고 1개는 matmul() op이다. 실제로 행렬 곱하기를 수행하여 결과를 얻기 위해서는 graph를 session 안에 띄워야(launch) 한다.

import tensorflow as tf

# Create a Constant op that produces a 1x2 matrix.  The op is
# added as a node to the default graph.
#
# The value returned by the constructor represents the output
# of the Constant op.
matrix1 = tf.constant([[3., 3.]])

# Create another Constant that produces a 2x1 matrix.
matrix2 = tf.constant([[2.],[2.]])

# Create a Matmul op that takes 'matrix1' and 'matrix2' as inputs.
# The returned value, 'product', represents the result of the matrix
# multiplication.
product = tf.matmul(matrix1, matrix2)

Launching the graph in a session : graph를 session에 띄워 실행하기

graph를 session에 띄우려면, Session 객체를 생성한다. Session 생성자에 인수가 없으면 default graph를 띄운다. 자세한 session API는 session class 를 참고한다(  https://www.tensorflow.org/versions/master/api_docs/python/client.html#session-management ).

# Launch the default graph.
sess = tf.Session()

# To run the matmul op we call the session 'run()' method, passing 'product'
# which represents the output of the matmul op.  This indicates to the call
# that we want to get the output of the matmul op back.
#
# All inputs needed by the op are run automatically by the session.  They
# typically are run in parallel.
#
# The call 'run(product)' thus causes the execution of threes ops in the
# graph: the two constants and matmul.
#
# The output of the op is returned in 'result' as a numpy `ndarray` object.
result = sess.run(product)
print(result)
# ==> [[ 12.]]

# Close the Session when we're done.
sess.close()

세션 사용이 끝나면 close()를 해야 한다. 세션을 “with” 블록으로 사용할 수 있는데, 이때는 자동으로 close된다.

with tf.Session() as sess:
 result = sess.run([product])
 print(result)

여러개의 GPU가 있는 경우, 명시적으로  ops에 GPU를 할당하여야 한다. with...Device 구문을 사용한다.  

with tf.Session() as sess:
 with tf.device("/gpu:1"):
   matrix1 = tf.constant([[3., 3.]])
   matrix2 = tf.constant([[2.],[2.]])
   product = tf.matmul(matrix1, matrix2)
   ...
Devices에는 다음 과 같은 것이 가능하다.
  • "/cpu:0": The CPU of your machine.
  • "/gpu:0": The GPU of your machine, if you have one.
  • "/gpu:1": The second GPU of your machine, etc.
TensorFlow의 GPU 에 대한 자세한 정보는 링크를 참고한다(
https://www.tensorflow.org/versions/master/how_tos/using_gpu/index.html ).

Interactive Usage

IPython과 같은 interactive Python환경에서는 InteractiveSession 클래스와 Tensor.eval(), Operation.run() 메소드를 사용한다.

# Enter an interactive TensorFlow Session.
import tensorflow as tf
sess = tf.InteractiveSession()

x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])

# Initialize 'x' using the run() method of its initializer op.
x.initializer.run()

# Add an op to subtract 'a' from 'x'.  Run it and print the result
sub = tf.sub(x, a)
print(sub.eval())
# ==> [-2. -1.]

# Close the Session when we're done.
sess.close()

Tensors

TensorFlow은 모든 데이터를 tensor 데이터 구조 형태로 다루며 computation graph의 연산간에 전달된다. tensor는 n-차원 array 또는 list로 생각하면 된다. 하나의 tensor는 static type 및 rank,  shape을 갖는다. TensorFlow가 어떻게 이러한 개념을 다루는지는 링크를 참고한다( https://www.tensorflow.org/versions/master/resources/dims_types.html ).

Variables

Variables는 graph의 실행간에 상태(state)를 유지한다. 다음 예는 단순 카운터로 동작하는 varible을 보인다. Varible에 대한 자세한 것은 링크를 참고 한다 ( https://www.tensorflow.org/versions/master/how_tos/variables/index.html ).

# Create a Variable, that will be initialized to the scalar value 0.
state = tf.Variable(0, name="counter")

# Create an Op to add one to `state`.

one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

# Variables must be initialized by running an `init` Op after having
# launched the graph.  We first have to add the `init` Op to the graph.
init_op = tf.initialize_all_variables()

# Launch the graph and run the ops.
with tf.Session() as sess:
 # Run the 'init' op
 sess.run(init_op)
 # Print the initial value of 'state'
 print(sess.run(state))
 # Run the op that updates 'state' and print 'state'.
 for _ in range(3):
   sess.run(update)
   print(sess.run(state))

# output:

# 0
# 1
# 2
# 3

이 코드에서 assign() 동작은 add() 동작과 마찬가지로 graph를 기술하는 것이며, run()수행이 되기 전까지는 실제로 어떤 치환 동작을 하는 것은 아니다.
Variables의 집합으로서 통계적 모델의 파라메터를 서술할 수 있다. 예를 들어, 신경망의 weight들을 Variable내에 tensor로서 저장할 수 있다. training동안 이 tensor는 계속 업데이트될 것이다.

Fetches

연산의 출력을 가져오기 위해서는, Session 객체의 run() 호출로 graph를 수행하고, 결과를 가져오기 위해 tensor로 전달한다. 앞의 예에서는 하나의 노드인 state를 fetch 했으며, 여러 개의 tensor를 가져올(fetch) 수 있다.

input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)

with tf.Session() as sess:
 result = sess.run([mul, intermed])
 print(result)

# output:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]
요청된 tensor들의 값을 만들때 필요한 op들은 딱 한번 수행된다. (요청된 tensor별 한번이 아니라)

Feeds

앞의 예제는 Contants와 Varibles에 tensor를 저장하여, computation graph에 tensors이 들어가도록 하였다. TensorFlow는 graph의 어떤 동작(operation)으로 tensor를 직접 적용할 수 있도록 feed 메커니즘을 제공한다.
feed는 동작(operation)의 출력을 tensor 값으로 대치한다. 이는 run()호출시 인수에 feed data를 제공하면 된다. feed는 run 호출에 전달될 때만 사용된다. 보통은 “feed” 동작을 위해서  tf.placeholder() 를 사용한다.

input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)

with tf.Session() as sess:
 print(sess.run([output], feed_dict={input1:[7.], input2:[2.]}))

# output:
# [array([ 14.], dtype=float32)]

더 큰 규모의 feed의 예는 링크를 참고한다( https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html ).









Tutorials


How-To


API Documentation


White Paper


Additional Resources



Apache-2.0 License






















Optimizers

  • Gradient Descent Optimizer
  • AdagradOptimizer : “Adaptive Subgradient Methods for Online Learning and Stochastic Optimization”, http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf
  • Momentum Optimizer
  • Adam Optimizer : “ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION” , http://arxiv.org/pdf/1412.6980v7.pdf
  • FTRL Optimizer : Follow-The-(Proximally)-Regularized Leader, “Ad Click Prediction: a View from the Trenches”, https://www.eecs.tufts.edu/~dsculley/papers/ad-click-prediction.pdf
  • RMSProp Optimizer : Divide the gradient by a running average of its recent magnitude, http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf


Python API hierarchy

  • Buidling Graph
    • Core graph data structures
    • Utility functions
    • Graph collections
    • Defining new operations
    • For libraries building on TensorFlow
  • Constants, Sequences, and Random Values
    • Constants Value Tensors
    • Sequences
    • Random Tensors
    • Examples
  • Variables
    • Variables
    • Variable helper functions
    • Saving and Restoring Variables
    • Sharing Variables
    • Sparse Variable Updates
  • Tensor Transformations
    • Casting
    • Shapes and Shaping
    • Slicing and Joining
  • Math
    • Arithmetic Operations
    • Basic Math Functions
    • Matrix Math Functions
    • Complex Number Functions
    • Reduction
    • Segmentation
    • Sequence Comparision and Indexing
  • Control Flow
    • Control Flow Operations
    • Logical Operators
    • Comparision Operators
    • Debugging Operations
  • Images
    • Encoding and Decoding
    • Resizing
    • Cropping
    • Fliping and Transposing
    • Converting Between Colorspaces
    • Image Adjustments
  • Sparse Tensors
    • Sparse Tensor Representation
    • Sparse to Dense Conversion
    • Manipulation
  • Input and Readers
    • Placeholders
    • Readers
    • Converting
    • Example protocol buffer
    • Queues
    • Dealing with the filesystem
    • Input pipeline
    • Beginning of an input pipeline
    • Batching at the end of an input pipeline
  • Data IO
    • Data IO
    • TFRecords Format Details
  • Neural Network
    • Activation Functions
    • Convolution
    • Pooling
    • Normalization
    • Losses
    • Classification
    • Embeddings
    • Evaluation
    • Candidate Sampling
    • Sampled Loss Functions
    • Candidate Samplers
    • Miscellaneous candidates sampling and utilities
  • Running Graphs
    • Session management
    • Error classes
  • Training
    • Optimizers
    • Usage
    • Processing gradients before applying them
    • Gating Gradients
    • Slots
    • Gradient Computation
    • Gradient Clipping
    • Decaying the learning rate
    • Moving Average
    • Coordinator and QueueRunner
    • Summary Operations
    • Adding Summeries to Event Files
    • Training utilities
    • Other Functions and Classes








-문서끝-