Dive into Deep Learning
Dive into Deep Learning

서문

불과 몇 년전만 해도, 주요 기업과 스타트업에서 지능형 제품과 서비스를 개발하는 다수의 딥러닝 과학자들은 존재하지 않았습니다. 우리 중 막내 (저자)가 현장에 들어갔을 때는 머신 러닝은 일간지의 헤드라인을 장식하지도 않았습니다. 우리의 부모님들은 머신 러닝이 무엇인지 전혀 몰랐습니다. 왜 우리가 의학이나 법률 분야의 직업보다 그것을 선호하는지 말할 필요도 없었습니다. 머신 러닝은 실제 응용의 좁은 분야에 해당하는 미래지향 적인 분야 였습니다. 그리고 음성 인식 및 컴퓨터 비전과 같은 응용들은 많은 도메인 지식을 필요로 했기 때문에, 머신 러닝은 종종 별도로 분리된 하나의 작은 컴포넌트로 간주 되었습니다. 이 책에서 다루고 있는, 딥러닝의 선행 모델인 뉴럴 네트워크는 구식 도구로 간주되었습니다.

지난 5년간 딥러닝은 컴퓨터 비전, 자연어 처리, 자동 음성 인식, 강화 학습, 통계 모델링 등 다양한 분야의 급속한 발전을 이룩하여 세상을 놀라게 했습니다. 이러한 진보를 통해 우리는 이제 (자율성이 증가하면서) 스스로를 운전하는 자동차, 평범한 응답을 예상하는 스마트 응답 시스템, 사람들이 이메일의 산에서 발굴하도록 돕고, 바둑을 세계에서 제일 잘 두는 사람보다 우월한 소프트웨어 에이전트, 수십 년의 노력이 필요한 기술들을 만들 수 있습니다. 이미 이러한 도구들은 영화 제작 방식, 질병 진단 방식, 천체 물리학에서 생물학 등까지 기초 과학에서 점점 더 많은 역할을 하고 있습니다. 이 책은 딥러닝을 친숙하게, 개념, 문맥 및 코드를 이해 시키려는 우리의 노력입니다.

코드, 수학, HTML이 모두 하나로 구성됨

컴퓨팅 기술이 완전히 영향을 미치려면, 잘 이해하고, 잘 문서화되며, 잘 관리되고 완성된 도구를 통해 지원되어야 합니다. 핵심 아이디어를 명확하게 뽑아내어, 새로운 실무자를 최신 상태로 유지해야 데 필요한 온보딩 시간을 최소화해야 합니다. 성숙한 라이브러리는 일반적인 작업을 자동화해야하며, 예제 코드는 실무자가 필요에 맞게 공통 응용 프로그램을 쉽게 수정, 적용 및 확장 할 수 있도록 해야 합니다. 동적 웹 응용 프로그램을 예로 들어 보겠습니다. Amazon과 같은 많은 수의 회사들이, 1990년대에 데이터베이스 기반 웹 애플리케이션을 성공적으로 개발했음에도 불구하고, 창조적 기업가를 돕기위한 이러한 기술의 완전한 가능성은 강력하고, 잘 문서화된 프레임워크의 개발로 겨우 지난 10년간 현실화 되었습니다.

딥러닝의 실현은, 모든 어플리케이션은 다양한 분야의 통합을 가져왔기 때문에, 고유한 과제를 제시합니다. 딥러닝을 적용하기 위해서는, (i) 특정 방식으로 문제제기를 위한 동기, (ii) 주어진 모델링 접근을 위한 수학, (iii) 모델을 데이터에 맞추기 위한 최적화 알고리즘 (iv) 모델을 효율적으로 훈련하는데 필요한 엔지니어링들을 이해하고 수치 연산의 위험(Pitfalls)을 탐색하고 가용한 하드웨어의 최대한 활용하세요. 문제를 수식으로 만들기 위한 비판적 사고 기술, 그것을 풀 수 있는 수학, 그리고 이러한 솔루션들을 모두 구현하기 위한 소프트웨어 도구, 이 모두를 한 곳에서 가리치는 것은 매우 어려운 과제 입니다. 이 책에서 우리의 목표는 독자들이 최대한 빠르게 실무자가 될 수 있도록, 통합된 자원을 제시하는 것입니다.

우리는 MXNet의 새로운 Gluon 인터페이스를 사용자에게 설명해야 했던, 2017년 7월에 이 책 프로젝트를 시작했습니다. 동시에 당시에는, (1) 최신 상태이고, (2) 기술적 깊이와 유사한 것으로 현대의 머신 러닝의 전체 폭을 다루고 (3) 실행가능한 코드가 있는 교재부터 활발한 튜토리얼 같은 것들이 없었습니다. 우리는 딥러닝과 관련된 프레임워크를 사용하는 방법 (예: TensorFlow에서 행렬을 사용하여 기본 수치 계산을 수행하는 방법) 또는 특정 기술 (예: LeNet, AlexNet, ResNet 등의 코드 일부들)을 구현해 내는 방법 혹은 예제 코드들을 블로그 게시물 형태 또는 GitHub에서 많이 발견했습니다. 그러나 이 예제는 일반적으로 주어진 접근 방식을 구현하는 방법 에 초점을 맞추었지만, 그런 특정 알고리즘이 선택되었는지에 대한 논의를 생략했습니다. 웹 사이트 Distill 또는 개인 블로그와 같은 곳에서 산발적인 주제들이 논의 되는 동안, 딥러닝에서 선택한 주제만을 다루거나, 종종 관련된 코드가 부족한 경우가 많았습니다. 다른 한편으로는, 딥러닝의 개념에 대한 훌륭한 자료를 제공하는 Goodfellow, Bengio and Courville, 2016에 여러 교과서가 등장하지만 이러한 자료는 설명과 코드로 그 개념을 실현하는 방법을 잘 녹아내지 못했습니다. 결국 독자들은 그것을 구현하기위한 단서들을 스스로 찾도록 방치되었습니다. 또한 너무 많은 자료가 유료 교육과정 제공 업체에 숨겨져 있습니다.

우리는 그래서 자료를 만들기 시작했습니다. 이 자료는

  1. 모든 사람이 자유롭게 이용할 수 있고,
  2. 실제로 응용 머신 러닝 과학자가 될때 필요한, 충분한 기술적 깊이를 제공하고,
  3. 실행 가능한 코드를 포함시키고, 실제로 문제를 해결하는 방법 을 독자에게 보여 주며,
  4. 우리뿐만 아니라 많은 커뮤니티에 의해 신속하게 업데이트 할 수 있으며,
  5. 기술 세부 사항에 대한 상호 토론과 질문에 답하기 위해 forum 를 이용하여 보완됩니다.

이러한 목표는 종종 충돌했습니다. 방정식, 이론 및 인용식은 LaTeX에서 가장 잘 관리되고 배치됩니다. 코드는 파이썬을 이용하야 가장 잘 설명 됩니다. 그리고 웹페이지들은 기본적으로 HTML과 Javascript로 구성됩니다. 더 나아가, 우리는 코드가 물리적인 책, 다운로드 가능한 PDF, 인터넷 웹페이지로 모두 접근 가능하지만 동시에 실행 가능하 길 바랍니다. 현재 이러한 이러한 요구에 완벽하게 부합하는 도구나 워크 플로우가 존재하지 않으므로 직접 만들어야 했습니다. 우리는 우리의 접근 방식을 부록에 상세하게 기록하였습니다. 우리는 이를 위해, 소스를 공유하고 편집을 허용하기 위해 Github를, 다양한 코드, 방적식과 문장들을 다루기위한 Jupyter 노트북, 다양한 출력을 생산하기 위한 렌더링 엔진으로 Sphinx, 포럼을 위해 Discourse를 각각 설정하였습니다. 아직 우리의 시스템이 완벽하지는 않지만, 이러한 선택은 경쟁적인 상황에서 좋은 절충안을 제공합니다. 우리는 이러한 통합 워크 플로우를 사용하여 출판된 첫 번째 책이 될 거라고 생각합니다.

구성

기본적인 수학적 배경에 대한 특별 과정을 제공하는 몇 가지 예비 노트북을 제외하고, 각각의 후속 노트북은 합리적인 수의 새로운 개념을 소개하고 실제 데이터셋을 사용하여 하나의 독립적인 작업 예제를 제공합니다. 이것은 구조적인 과제를 제시한다. 일부 모델은 논리적으로 단일 노트북으로 그룹화될 수 있습니다. 그리고 어떤 아이디어들은 여러 모델을 연속적으로 실행하여 가장 잘 가르쳐 질 수 있습니다. 반면에 1 작업 예제, 1 노트북 의 정책을 준수하면 큰 이점이 있습니다. 이렇게 하면 우리의 코드를 활용하여 여러분의 연구 프로젝트를 가능한 한 쉽게 시작할 수 있습니다. 단지 단일 노트북을 복사하고 수정하기만 하면 됩니다.

우리는 필요에 따라 실행 가능한 코드를 배경 자료와 함께 배치합니다. 일반적으로, 우리는 종종 일반적으로 우리는 도구를 완전히 설명하기 전에 사용할 수 있도록 만드는 측면에서 종종 오류를 겪을 것입니다 (나중에 배경을 설명하여 후속 조치를 취합니다). 예를 들어, 왜 유용한지 또는 왜 작동하는지 완전히 설명하기 전에 확률적 경사 하강법(Stochastic Gradient Descent) 을 사용할 수 있습니다. 이것은 실무자에게 문제를 신속하게 해결하는 데 필요한 정보를 제공하는 데 도움이되며, 이를 위해 독자가 적어도 단기적으로, 몇 가지 결정에 있어서는 우리를 신뢰해야 합니다.

전반적으로 MXNet 라이브러리로 작업하게 될 것입니다. MXNet 라이브러리는 연구하기에 충분히 유연하면서도 완성품 만들기에 있어서도 충분히 빠르다는 드문 특성을 가지고 있습니다. 이 책은 딥러닝 개념을 처음부터 가르칠 것입니다. 때때로, 우리는 Gluon의 고급 기능에 의해 사용자로부터 숨겨진 모델에 대한 세부 사항을 탐구 하고자 합니다. 이것은 특히 기본 튜토리얼에서 나옵니다. 여기서는 주어진 층에서 일어나는 모든 것을 이해하기를 원합니다. 이 경우, 우리는 일반적으로 두 가지 버전의 예제를 제시합니다. 하나는 처음부터 모든 것을 구현하고 NDArray 와 자동미분(automatic differentitation)에만 의존하고 다른 하나는 Gluon을 사용하여 간결하게 수행하는 방법을 보여줍니다. 한번만 층(layer)이 어떻게 동작하는지 가르쳐 주면, 후속 자습서에서 Gluon 버전을 사용할 수 있습니다.

직접 하면서 배우기

많은 교과서는 일련의 주제들을 각각 철저히 상세하게 가르칩니다. 예를 들어, Chris Bishop의 훌륭한 교과서 Pattern Recognition and Machine Learning는 각 주제를 철저히 가르쳐 줍니다. 선형 회귀 분석의 장에 들어가려면 작지 않은 양의 작업이 필요합니다. 전문가들은 이 책을 철저하기 때문에 좋아하지만, 초보자에게는 이 점이 소개 텍스트로써의 유용함을 감소시킵니다.

이 책에서는 대부분의 개념을 딱 그시점(Just in time) 에 가르쳐 드리겠습니다. 즉, 실제 목적을 달성하기 위해 필요한 바로 그 순간에 개념을 배우게 될 것입니다. 선형대수학이나 확률과 같은 기본적인 사항을 가르치기 위해 처음에는 약간의 시간이 걸리지만, 좀 더 색다른 확률 분포에 대해 걱정하기 전에, 첫 번째 모델을 훈련하는 만족감을 느끼기를 바랍니다.

감사의 글

우리는 영어와 중국 초안 모두에 대한 수백 명의 기여자에게 빚을 지고 있습니다. 그들은 콘텐츠를 개선하는 데 도움이 귀중한 피드백을 제공했습니다. 특히, 우리는 모두를 위해 더 나은 버전을 만들기 위해 힘써준 영어 초안의 모든 기여자에게 감사드립니다. 그들의 Github ID와 이름 (제공된 경우)은 : bowen0701, ChaiBapChya (Chaitanya Prakash Bapat), kirk86, MLWhiz (Rahul Agarwal), mstewart141, muelleme (Mike Müller), sfermigier, sundeepteki, vishaalkapoor, YaYaB. 더해서, 아마존 웹서비시즈에 감사 드리며, 특히 Swami Sivasubramanian, Raju Gulabani, Charlie Bell, and Andrew Jassy에게 이 책을 쓰도록 충분히 지원해 주신 대해 감사드립니다. 사용 가능한 시간, 자원, 동료와의 토론, 지속적인 격려 덕분에 책이 만들어 질 수 있었습니다.