태그 보관물: Andrej Karpathy

Discuss in Arxiv-Sanity

arxiv-sanity

OpenAI의 안드레이 카패시(Andrej Karpathy)가 운영하는 ML 페이퍼 아카이빙 사이트인 Arxiv Sanity Preserver에 댓글 기능이 추가되었습니다. 보통 페이퍼와 관련된 이야기들은 레딧이나 해커뉴스 게시판에서 많이 올라왔습니다. 분위기가 arxiv-sanity 쪽으로 잘 옮겨올지 궁금하네요. 개인적으로는 레딧보다 좀 더 정갈한 댓글을 기대해 봅니다. 🙂

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회가 진행되었으므로 아직 늦지 않았습니다!

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

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

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

계속 읽기

GAN & PixelCNN

뉴럴 네트워크를 사용해 이미지를 생성해 내는 몇가지 방법 중 최근 GAN(Generative Adversarial Networks)와 PixelCNN 에 관한 새로운 페이퍼와 코드가 공개되어서 소개해 드립니다.

GAN 에 관련된 페이퍼로는 이안 굿펠로우(Ian Goodfellow), 요수아 벤지오(Yoshua Bengio) 교수 등이 쓴 Generative Adversarial Networks와 인디코, 페이스북의 서미스 친탈라(Soumith Chintala) 가 쓴 Unsupervised representation learning with deep convolutional generative adversarial networks 등을 시작으로 여러편이 나왔던 것 같습니다. 최근에 버클리 대학의 AI 리서치랩(BAIR)에서 GAN 을 사용하여 이미지 대 이미지 변환을 만드는 pix2pix 의 페이퍼와 토치 코드를 공개하였습니다. 이 코드의 텐서플로우 버전이 나올지 기대됩니다.

pix2pix

출처: pix2pix 페이퍼

PixelCNN 은 딥마인드 팀이 내 놓은 Pixel Recurrent Neural Networks 와 역시 딥마인드 팀이 작성한 Conditional Image Generation with PixelCNN Decoders 가 있습니다. PixelRNN 과 PixelCNN 에 대한 텐서플로우 구현은 김태훈님의 pixel-rnn-tensorflow 레파지토리가 잘 알려져 있습니다. OpenAI 의 안드레이 카패시(Andrej Karpathy) 등이 최근에 PixelCNN 을 보완한 PixelCNN++ 의 페이퍼와 텐서플로우 코드를 공개하였습니다. 이 페이퍼는 ICLR 2017 에 등록되어 있습니다. PixelCNN++ 에 대해 좀 더 자세한 내용이 확인되면 다시 포스팅하겠습니다.

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

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

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

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

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

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

1장: 실수치 회로

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

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

예제: 단일 뉴런

역전파 고수되기

2장: 머신 러닝

이진 분류

전통적인 방법: 손실 함수

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의 다른 사람들도 텐서플로우를 사용한다고 합니다. 텐서플로우와 토치는 장단점이 있지만 간단하고 빠르게 실험을 해보기에는 토치를 추천하고 있습니다. 하지만 텐서플로우가 향후 이 분야의 표준이 될 것으로 보고 있습니다. 무엇보다도 머신러닝과 딥러닝을 배우는 가장 좋은 방법은 직접 알고리즘을 코드로 작성해 보는 것이라고 강조하고 있습니다.

OpenAI and ML Unconference

오늘 OpenAI에서 10월 7~8일에 머신러닝 언컨퍼런스(unconference)를 개최한다고 홈페이지를 통해 공지했습니다. 언컨퍼런스라고 하면 보통 페이퍼를 등록하는 위원회가 없이 참여자들이 자유스럽게 여러가지 주제에 대해 토론하고 발표하는 것을 말합니다. 이렇게 하는 이유는 컨퍼런스에서 페이퍼를 등록하고 준비하는 기간이 수개월이나 소요되어 머신러닝 분야의 발전속도에 따라가지 못하기 때문이라고 합니다. 일반적으로 컨퍼런스의 주요 목적중의 하나인 네트워킹에 중점을 두어 최근 동향과 연구를 다루려고 하는 것 같습니다. 아직 구체적인 스케줄이나 방식은 나오지 않았습니다만 대략 150명의 인원을 대상으로 하며 OpenAI 사무실에서 진행될 예정이라고 합니다. 미리 참여를 확보한 리스트에는 구글 브레인팀을 비롯해 여러 PhD 학생과 연구자들이 있습니다. 온라인으로 누구나 신청할 수 있습니다만 초청 대상이 되는 것은 PhD 학생이나 주요 연구자들이 대상이 될 것으로 보입니다. 혹 초짜라면 다른 컨퍼런스를 알아보라고 하네요. ㅠ.ㅠ

이 발표가 있기 며칠전 OpenAI의 새로운 팀원이 추가된 공지가 올라왔습니다. 새로운 멤버에 대해서 아는 바는 없지만 기술 저술가인 잭 클라크(Jack Clark)가 추가된 것이 독특합니다. 잭은 불룸버그나 비즈니스위크 등에 인공지능 관련 기사에서 종종 볼 수 있는데요. OpenAI가 연구자 이외에 저술가 혹은 정책가로 팀 구성을 확대하는 점이 관심을 끄네요. 특히 그는 ‘Import AI‘라는 인공지능 관련 뉴스레터를 발행하고 있습니다(이름이 재미있습니다. 잭이 파이썬을 얼마나 쓰는지는 모르겠습니다). 이메일을 등록하시면 최근 업계 동향을 받아 볼 수 있습니다.

스탠포드 PhD 학생이면서 OpenAI의 팀원인 안드레이 카패시(Andrej Karpathy)는 최근 트위터를 통해 OpenAI에서 사용하는 주요한 딥 러닝 프레임워크는 텐서플로우라고 밝혔습니다. 하지만 사용하는 사람들이 각각 다른 방법을 쓰고 있어서 어려움을 느끼고 있는 것 같습니다. Slim, PrettyTensor, Keras, TFLean(aka. skflow) 등등. 아마 래퍼 라이브러리를 쓰지 않는 사람까지 고려하면 코드 공유에 약간 장애가 되겠네요. 안드레이는 slim을 쓴다고 합니다. 🙂

케라스의 개발자인 구글의 프랑소와 숄레(François Chollet)가 가끔 트위터에 깃허브의 머신러닝 라이브러리 인기도를 조사해서 올리곤 합니다. 직감으로 알 수 있듯이 텐서플로우가 당연히 1위 입니다. 사실 이런 인기도 조사를 하는게 크게 의미가 있는 것이 아니고 프랑소와가 할만한 일도 아니라고 생각되는데요. 이런 트윗에 영 심기가 불편한 것은 토치를 사용하는 페이스북의 연구자들입니다. 숫자가 너무 차이가 나거든요. ㅠ.ㅠ

Andrej Karpathy’s Paper Notes

구글 리서치에서 위키 피디아의 글을 이용하여 문장을 해석하고 분류하는 작업에 사용할 수 있는 WikiReading 데이터와 관련 페이퍼를 공개했습니다. 이 데이터는 최근에 공개된 스탠포드 대학의 SQuAD와 함께 머신러닝 연구에 요긴한 텍스트 데이터로 사용될 수 있을 것 같습니다.

지난 4월에 구글 딥마인드 팀에서 내 놓은 ‘Matching Networks for One Shot Learning‘ 페이퍼는 아주 적은 양의 데이터를 사용하여 모델을 학습 시킬 수 있는 아이디어를 제시하고 있습니다. 말 그대로 한방(one-shot)에 말이죠.

스탠포드 비전랩의 안드레이 카패시(Andrej Karpathy)가 이 두 페이퍼에 관한 짧은 노트(note)를 깃허브에 올렸습니다. 이 레파지토리를 반기는 이유는 점점 더 많은 노트로 채워질 것이라 기대하기 때문입니다!

(추가) Value Interation Networks(pdf) 에 대한 노트가 추가 되었습니다.

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)를 결정하여 짐 라이브러리에 전달합니다. 게임을 이길 수 있도록 막대의 위치를 제어하는 것이 우리가 풀어야 할 숙제입니다.

계속 읽기

OpenAI Gym 맥북 설치

강화학습 개발 도구인 OpenAI 짐(Gym)을 맥북에 설치하면서 몇가지 얻은 팁을 공유합니다. 짐은 강화학습을 위한 여러가지 환경을 제공합니다. 그 중에 atari, box2d, mujoco, pachi, doom 환경을 지원하기 위해 별도 파이썬 패키지가 설치됩니다. 이 중에 doom-py 가 파이썬3 에서 설치가 되지 않고 문제를 일으키네요. 깃허브 이슈를 쫒아서 이리저리 해 보았지만 성공하지 못했습니다. 짐을 이용하려면 파이썬2를 사용하는 것이 좋을 것 같습니다(짐의 파이썬3 지원은 아직 실험적이라고 합니다).

만일을 대비해서 virtualenv 나 conda 환경을 사용하시길 추천드립니다. 맥북에서 설치할 때 필요한 시스템 패키지는 brew 를 이용하여 설치합니다.

$ brew install cmake boost boost-python sdl2 swig wget

우분투나 다른 리눅스 배포판에서는 조금 다른데요. 짐의 readme 파일을 참고하세요. 짐에 기본적으로 포함되어 있는 환경은 algorithmictoy_textclassic_control 입니다. 그런데 저는 무식하게 짐의 기본 환경외에 다른 환경도 모두 설치했습니다. 만약에 필요한 환경만 골라서 설치하려면 아래 pip 명령에서 ‘gym[atari]’ 처럼 필요한 환경 이름으로 바꾸어 주면 됩니다.

pachi-py 컴파일시 OSX SDK 참조를 찾지 못해 에러가 발생할 수 있습니다. 설치하기 전에 환경변수 MACOSX_DEPLOYMENT_TARGET 와 SDKROOT 를 적절히 셋팅해 주어야 합니다. 저는 OSX 버전이 10.11 이고  SDK 위치는 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk 였습니다.

$ export MACOSX_DEPLOYMENT_TARGET=10.11 
$ export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
$ pip install gym[all]
...

짐을 설치하고 나서 스탠포드 비전랩의 Andrej Karpathy가 올린 강화학습 예제를 돌려 보고 있습니다. 아마 족히 며칠은 걸릴 것으로 예상됩니다. 뭔가 결과가 나오면 다시 포스팅하겠습니다.