카테고리 보관물: Report

[Review]Introduction to ML with Python

catIntroduction to ML with Python은 사이킷런(scikit-learn) 0.18 버전이 출시된 후 가장 먼저 나온(작년 10월 출간) 파이썬 머신러닝 책입니다. 이전 포스트에서도 잠깐 언급한 적이 있지만 사이킷런 0.18 버전에는 피드포워드(feed-forward) 뉴럴 네트워크 클래스가 추가되었습니다. 그래서 이 책에도 이와 관련된 섹션이 추가되어 있네요. 이 책의 저자 중 한명인 앤디(Andreas C. Muller)는 뉴욕 대학교의 리서치 엔지니어이면서 사이킷런의 핵심 개발자입니다. 머신러닝 PhD로서 머신러닝에 대해서 잘 알고 있을  뿐만 아니라 사이킷런에 대해서 누구보다도 잘 알고 있음은 두말할 필요가 없습니다.

머신러닝의 실용서와 이론서의 측면을 모두 담은 책은 쉽게 보기 힘듭니다. 특히나 여러 종류의 알고리즘에 걸쳐서라면 더욱 그렇습니다. 이 책은 후자 보다는 전자에 무게를 실었습니다. 수식은 과감히 덮고 가능하면 직관적으로 이해할 수 있도록 배려했으며 무엇보다도 상당히 많은 종류의 알고리즘을 설명하고 사이킷런으로 예시를 보여주고 있습니다. 이 책을 번역서로 내기 위해 제가 번역 작업을 진행하고 있고 대략 70% 정도 진척이 되었습니다. 전체 내용을 가늠하실 수 있도록 챕터별 내용을 요약했습니다.

계속 읽기

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

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

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

계속 읽기

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

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

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

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

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

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

1장: 실수치 회로

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

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

예제: 단일 뉴런

역전파 고수되기

2장: 머신 러닝

이진 분류

전통적인 방법: 손실 함수

DNN for YouTube Recommendations

youtube-recomm-1

출처: DNN for YouTube Recomm. 페이퍼

이번달에 열리는 10th ACM Conference on Recommender Systems에 맞춰 구글 리서치에서 사용자에게 유투브 동영상을 추천하는 시스템에 대한 개괄적인 소개를 담은 페이퍼(pdf)를 공개하였습니다. 페이퍼의 내용으로 미루어 보아 유투브의 추천 시스템은 구글 브레인팀에서 텐서플로우를 이용하여 구축한 것 같습니다.

유투브에서는 추천을 위해 수백만개의 동영상을 수백개의 후보로 좁히고 이를 바탕으로 다시 사용자에게 추천할 영상을 고르는 두 단계로 구성되어 있습니다. 두 단계 모두 몇단계의 ReLU(Rectified Linear Unit) 활성화 함수를 가진 완전 연결(fully connected) 레이어로 구성되어 있습니다. 후보자를 생성하는 첫 단계는 소프트맥스 함수를 이용한 분류(Classification) 문제로 변환하여 생각하였습니다. 사용된 훈련 데이터는 전체 유투브 동영상 시청 데이터를 기반으로 하고 있고 갯수는 수천억건에 이릅니다.

youtube-recomm-2

출처: DNN for YouTube Recomm. 페이퍼

학습에 필요한 데이터를 추출할 때 효과적인 학습을 위해 워드 임베딩에서 사용하는 네거티브 샘플링(negative sampling)을 기법을 이용하였고 소수의 유저가 일으키는 대량의 트래픽으로 학습이 오염되지 않게 하기 위해 사용자마다 고정된 양의 샘플을 추출했습니다. 이렇게 유투브 트래픽으로 뉴럴 네트워크를 학습시키면 이 모델은 매트릭스 인수분해(matrix factorization) 부담으로 실제 적용이 어려운 user-user 협업 필터링을 간접적으로 구현하는 효과를 가집니다.

youtube-recomm-3

출처: DNN for YouTube Recomm. 페이퍼

첫번째 네트워크에서 학습된 모델을 사용하여 사용자에게 맞는 후보 영상을 고르기 위해 해싱기법을 사용하는 Nearest Neighbor 근사 알고리즘을 사용하였습니다. 네트워크의 입력은 그림에서 볼 수 있듯이 비디오 시청 데이터, 사용자 검색어, 지역, 영상이 제공된 기간, 성별 등 많은 특성들을 사용하고 있습니다. 특별히 가변 길이의 시청 데이터를 언어 모델링에서 사용하는 임베딩 방법을 사용하여 압축(dense representation)하여 입력으로 사용하였습니다.

이 시스템은 유투부의 홈페이지에 맞춤 동영상 영역에 나타나는 항목을 결정합니다. 사용자는 시리즈를 본다거나 한 종류의 영상을 지속적으로 보는 경향이 있습니다. 예를 들면 지금 ‘테일러 스위프트’를 검색했다고 해서 홈페이지의 추천 영역을 테일러 스위프트와 관련있는 것으로 바꾸어 버리는 것이 A/B 테스트 결과 더 좋지 않았습니다. 따라서 시청이 어느 정도 완료된(hold out) 영상까지의 데이터만 추론에 사용합니다(테일러 스위프트 뮤직비디오를 다 시청하니 바로 맞춤 동영상 영역에 테일러 스위프트의 영상이 추천되었습니다).

이와 비슷한 맥락으로 유투브의 추천 시스템은 ‘좋아요’나 ‘싫어요’ 같은 명확한 사용자의 액션 뿐만 아니라 시청 완료 같은 겉으로 드러나지 않는 사용자의 액션을 함께 사용합니다. 이는 전자의 데이터가 너무 드물기(sparse) 때문입니다.

 

youtube-recomm-4

출처: DNN for YouTube Recomm. 페이퍼

두번째 네트워크는 수백개의 후보 가운데 사용자의 디바이스에 노출할 동영상을 결정하는 모델(ranking model)을 학습시킵니다. 이 모델은 동영상을 클릭할 확률을 예측하는 것이 아니라 동영상의 기대 시청 시간을 예측하는 로지스틱 회귀 분석입니다. 이는 동영상을 시청하지는 않고 클릭만 이리 저리 누르는 사람들이 있기 때문에 시청 시간을 모델링 하는 것이 더 좋은 성과를 냅니다. 두번째 모델도 A/B 테스트를 통해 지속적으로 실시간 튜닝이 됩니다.

두번째 네트워크도 수백개의 입력을 사용하여 완전 연결 ReLU 레이어를 쌓아서 구성하며 주된 학습 재료는 비디오 노출 데이터와 사용자가 시청한 데이터입니다. 이 때 사용자와 비디오 데이터를 적절하게 가공하기 위해 각각 상당한 피처 엔지니어링이 불가피 합니다.

이 페이퍼는 뉴럴 네트워크 뿐만이 아니라 추천 시스템과 동영상 사이트의 특징들을 이해해야 해서 읽기 어려웠던 것 같습니다. 부족한 부분은 댓글로 채워주세요.

Decoupled Neural Interfaces using Synthetic Gradients[1608.05343] Summary

지난 주 딥마인드에서 내놓은 이 페이퍼는 이전 포스트에서 잠깐 언급했듯이 뉴럴 네트워크의 레이어간의 데이터 주입과 그래디언트 업데이트를 비동기적으로 처리하는 방식을 제안하고 있습니다. 이전에 이런 방식과 유사한 연구가 있었는지 배경 지식을 구하기는 힘들었지만 분명한 것은 이 페이퍼가 여러 사람에게 큰 관심을 끌고 있다는 점입니다.

뉴럴 네트워크의 한 레이어에서 데이터를 처리할 때 다른 레이어가 작업을 하지 않은 상태를 멈춰(locking)있다고 표현할 수 있습니다. 특히 레이어간의 연산이 다른 디바이스에 할당되어 있는 경우에는 물리적으로도 멈춰있는 형태가 됩니다. 이렇게 멈춰있게 되는 경우는 에러 그래디언트(gradient)를 역전파시킬 때도 마찬가지 입니다. 체인 룰(chain rule)의 특성상 이전 레이어에서 그래디언트가 전달되지 않으면 하위 레이어는 대기 상태에 있습니다. 이런 레이어간의 동기성은 거대한 뉴럴 네트워크의 학습 속도에 영향을 미치므로 레이어간의 데이터 전달을 비동기적으로 처리하는 모델을 제안하고 있습니다.

여기서 제안하는 방법은 한 레이어에서 데이터가 처리된 후 그 다음 레이어를 통과해 마지막 레이어에서 에러가 계산되어 역전파 되기를 기다리지 않고 데이터가 처리되자 마자 가짜 그래디언트(synthetic gradient)를 업데이트 하는 것입니다. 가짜 그래디언트로 레이어의 파라메타(가중치)가 업데이트 되면 다음 미니배치 데이터를 받아 들일 수 있게 됩니다. 가짜 그래디언트는 진짜 그래디언트가 앞 레이어로 부터 전달되면 이 값을 이용하여 보다 좋은 가짜 그래디언트를 만들기 위해 학습합니다. 즉 가짜 그래디언트를 위한 소규모의 뉴럴 네트워크가 레이어 사이 사이에 위치해 있습니다. 아래 그림은 이런 그래디언트의 비동기적인 업데이트 과정을 잘 보여 주고 있습니다.

계속 읽기

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

계속 읽기

인공지능과 법적쟁점

얼마전 소프트웨어정책연구소 SPRi 에서 ‘인공지능과 법적쟁점‘ 이라는 리포트를 공개했습니다. 이 리포트에서는 인공지능을 활용하여 발생하는 문제가 현행 법적 체계 안에서 수용될 수 있는지를 검토하고 인공지능이 일으킨 사고나 창작물에 대한 법적 쟁점을 다루었습니다.

구체적으로 보면 인공지능 에이전트가 기사를 대신해서 쓰는 경우가 한 예입니다. 이미 해외에서는 간단한 사고, 사건 보도류의 기사를 인공지능 에이전트가 대신하여 작성하는 것으로 알려져 있습니다. 그렇다면 이런 기사의 저작권이 누구(인공지능 에이전트, 언론사, 인공지능 개발사)에게 있으며 어떤 법으로 보호를 해야하는 지 명확하지가 않습니다. 따라서 이런 상황에 대응할 수 있는 가이드라인과 법제도 개선이 필요하다고 언급하고 있습니다.

동물보호법은 동물의 권리를 인정하는 것은 아니고 동물이 받을 수 있는 고통에 대해 사회의 인식이 높아진 것으로 이해해야 합니다. 이렇게 생명에 대한 존중으로서 동물에 대한 사회적 인식이 높아지고 있지만 민법에 의해 동물은 물건에 포함되어 권리의 주체가 아니고 보호받거나 관리되어야 할 대상이라고 합니다.  즉 동물의 소유권은 해당 동물의 소유자에게 귀속됩니다. 인공지능을 물건으로 간주한다면 소유권은 해당 인공지능의 소유자에게 있습니다. 법적 주체는 사람과 법인으로 한정되어 있으므로 인공지능이 일으킨 문제에 대한 책임은 그 소유자에게 돌아갈 가능성이 높습니다.

계속 읽기

TensorFlow White Paper[1603.04467] Summary

텐서플로우 백서(White Paper)라고도 불려진 텐서플로우의 첫번째 페이퍼 ‘TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems‘[1603.04467]를 요약해서 정리해 보았습니다. 아직 읽지 않은 분들에게 도움이 되었으면 합니다. 부족한 부분이 있다면 댓글로 보완해 주세요.

소개

2011년에 구글 브레인 팀이 조직되어 딥 뉴럴 네트워크(deep neural network)에 대한 연구를 시작하였고 딥 뉴럴 네트워크 시스템인 디스트빌리프(DistBelief)를 개발했습니다. 구글은 디스트빌리프를 비감독학습(unsupervised learning), 언어[1, 2], 이미지인식[1, 2], 비디오분류, 음성인식[1, 2, 3], 보행자감지, 바둑, 시퀀스예측, 강화학습(reinforcement learning)과 그외[1, 2] 여러 분야에 사용해왔습니다. 구글 안의 50개가 넘는 팀과 알파벳 자회사들이 디스트빌리프를 이용해 다양한 제품에 딥 뉴럴 네트워크를 적용해왔습니다. 여기에는 검색, 광고, 음성인식시스템[1, 2, 3], 구글포토, 지도, 스트리트뷰, 번역, 유투브 등이 포함됩니다. 이러한 경험을 바탕으로 차세대 대규모 머신러닝 시스템인 텐서플로우(TensorFlow)를 개발했습니다.

텐서플로우는 상태 정보를 가지는 데이터플로우(dataflow) 그래프로 컴퓨터의 계산을 표현합니다. 안드로이드, iOS 같은 모바일 환경에서 추론(inference) 시스템을 만들수도 있고 한개 또는 여러개의 GPU를 가진 단일 서버에서는 중간 규모의 훈련(training)과 추론 시스템을 구축할 수 있습니다. 또는 수천개의 GPU가 탑재된 수백대의 서버에서 운영될 수도 있습니다. 텐서플로우를 이용하면 학습 시스템은 대규모로 하면서 실제 서비스는 소형화하여 운영할 수 있습니다.

텐서플로우는 매우 빠른 성능과 유연한 구조를 가지고 있어 새로운 모델을 빠르게 실험해 볼 수 있고 실제 서비스에도 안정적으로 사용할 수 있습니다. 디스트빌리프와 비교해 볼 때 텐서플로우의 프로그래밍 방식이 더 유연하고 성능은 더 뛰어납니다. 구글 내부의 여러 팀들이 이미 디스트빌리프에서 텐서플로우로 전환했습니다. 텐서플로우는 딥 뉴럴 네트워크를 만드는 데 사용되는 것이 일반적이지만 다른 머신러닝 알고리즘을 적용하거나 수치 계산 용으로도 사용할 수 있어서 다양한 산업 분야에 폭 넓게 활용될 수 있습니다. 텐서플로우는 2015년 11월 아파치 2.0 오픈소스 라이센스로 공개되었고 www.tensorflow.org에서 다운받을 수 있습니다.

계속 읽기

First Contact with TensorFlow

tensorflowbookcover-1024x7122x

‘First Contact with TensorFlow’ Book Cover. 출처: http://www.jorditorres.org

스페인 카탈루냐 공과대학의 Jordi Torres 교수가 텐서플로우를 소개하는 책 ‘First Contack with TensorFlow‘을 공개했습니다. 책의 서두에서도 밝혔지만 이 책은 ‘Fundamental of Deep Learning‘ 같은 책 처럼 머신러닝의 이론적 배경에 무게를 두기 보다는 텐서플로우를 처음 접하는 사람들을 위한 입문서 용도로 쓰여 졌습니다.

이 책은 대략 140여 페이지 정도로 pdf 나 인쇄본으로 구매할 수도 있지만 온라인에서 무료로 읽을 수 있도록 책 전체를 공개하고 있습니다. 부가적으로 Jordi Torres 교수가 강의에 활용했던 슬라이드는 여기에서 다운받으실 수 있습니다.

이 책의 한글 번역본이 출간 되었습니다. 🙂

원 도서의 라이센스(CC BY-NC-SA 3.0)에 따라 전체 내용을 번역하여 공유합니다. 파이썬 3  notebook으로 작성한 이 책의 코드는 여기에서 보실 수 있습니다. 텐서플로우 논문 요약 자료도 함께 참고하세요.

추천사, 서문, 실용적접근

1. 텐서플로우 기본다지기

2. 텐서플로우 선형회귀분석(Linear Regression)

3. 텐서플로우 클러스터링(Clustering)

4. 텐서플로우 단일 레이어 뉴럴 네트워크(Single Layer Neural Network)

5. 텐서플로우 다중 레이어 뉴럴 네트워크(Multi Layer Neural Network)

6. 병렬처리

맺음말

감사의말, 저자, BSC, UPC 그리고 GEMLEB 모임

 

‘Fundamental of Deep Learning’ Preview

rc_lrg

O’Reilly에서 텐서플로우와 관련된 첫 번째 책인 ‘Fundamental of Deep Learning‘이 2016년 말에 출간 예정입니다. 지금은 Early Release 단계로 미리 구입해서 PDF나 이북 리더기로 읽으실 수 있습니다. 이 글은 2016년 4월 8일자 판을 기준으로 처음 작성되었습니다. 책이 업데이트 되면 포스트의 내용을 수정하거나 추가하도록 하겠습니다.

이 전 포스트에서 말씀드린대로 이 책은 원래 Theano를 기반으로 딥러닝을 설명하려고 했으나 구글에서 텐서플로우를 발표하고 나서 Theano대신 텐서플로우를 선택하게 되었습니다. 이런 결정을 하게 된 이유가 무엇인지 두 프레임워크의 차이를 비교하며 설명하고 있습니다.

책의 전체 챕터는 총 12장 이지만 현재 작성된 것은 5장까지 입니다. 아직 절반도 쓰여지지 않았지만 도서의 평점은 매우 좋은 편입니다. 마지막까지 좋은 결과물로 이어지길 기대합니다.

1. The Neural Network
– Building Intelligent Machines
– The Limits of Traditional Computer Programs
– The Mechanics of Machine Learning
– The Neuron
– Expression Linear Perceptrons as Neurons
– Feed-forward Neural Networks
– Linear Neurons and their Limitations
– Sigmoid, Tanh, and ReLU Neurons
– Softmax Output Layers
– Looking Forward

계속 읽기