brunch

You can make anything
by writing

C.S.Lewis

by 서진호 May 14. 2020

머신러닝의 바이블, 핸즈온 머신러닝 2판을 읽고

인공지능 개발자 도서 소개 (1)

1년 전, 영문 IT 도서만 전자책으로 서비스하는  오라일사 온라인(O'Reilly Online)에서 오렐리앙 제롱(Aurélien Géron)이 책이 두 번째 판으로 출판된다는 소식을 접하게 되었습니다. 그때  초기 버전(Early Release)을 무료로 다운로드할 수 있도록 제공했는데, 책 서문을 읽자 그 당시 한국 사람으로 추정되는 분의 성함을 접하고 "주모!"를 부르지 않을 수가 없었습니다.


[그림 1] 원본 저자가 역자인 해선님께 감사 서문

바로 Google Developers Experts for Machine Learning 부문으로 활동하고 있고 핸즈온 머신러닝 제1 판을 번역한 박해선 님이었습니다. 원저자인 오렐리앙 제롱은 박해선 님에 대해 단순한 국내 번역자가 아니라 제1 판에 대해 다양한 피드백을 주었다고 말했습니다. 그런 피드백을 반영한 제2판 책이 올해 이번 달에 드디어 한글본으로 번역이 되어 나왔습니다.


그러므로 인공지능 개발자 도서 첫 순서로 국내 제목은 "핸즈온 머신러닝 2판: 사이킷런, 케라스, 텐서플로2를 활용한 머신러닝, 딥러닝 완벽 실무"으로, 영문 원제는 "Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition"인 책을 저 나름대로 본 소감을 공유 하겠습니다.

 

이 책을 어떻게 보면 좋은가? 


먼저 이 책을 접하게 되면 어떻게 보면 좋을까? 순간 여러분은 고민하게 될 것입니다. 왜냐하면, 지난 제1판도 내용이 많았지만 개정하다 보니 무려 952 쪽이나 되도록 늘어났습니다. 물론 실본을 본다면, 그렇게까지 뚜겁지 않다는 것을 확인하게 될 것입니다.


[그림 2] 제 1 판과 제 2판의 책 두께 확인할 수 있음(박해선 님의 페이스북 타임라인 사진 발췌)

책 저자에 의하면, 이 책은 머신러닝에 대해 아무것도 모른다고 가정하고 적었기 인공지능 개발을 처음 접하는 분들이나 이미 머신러닝에 대해 어느 정도 이해하고 있는 중급자들이라도 스터디를 할 수 있도록 타깃으로 하고 있습니다. 이 책은 크게 두 부분은 나누고 있는데,  제1 부에서는 머신 러닝의 기초와 개념 등을 다루며, 주로 사이킷런(Scikit-Learn) 프레임워크를 사용하여 소스 코드를 예제 보여주고 있습니다. 제2 부에서는 뉴럴 네트워크 및 딥러닝에 대해 텐서플로우 2.1로 최신 업데이트된 프레임워크를 사용하여 케라스 인터페이스로 연결하는 방법과 생산적 적대 신경망(GAN), 합성곱 신경망(CNN) 등과 더불어 배포하는 방법까지 배울 수 있다고 합니다.  


물론 이 책을 보기 전에 파이썬(python)이라는 컴퓨터 언어로 프로그래밍 경험이 익숙하며 파이썬의 다양한 과학 라이브러리, 이를 테면, 최소 파이썬 문법 외에 Numpy, Pandas, Matplotlib 라이브러리 정도는 다루어 보았다면, 예제 소스 코드를 보는데 어렵지 않을 것 입니다. 만일 파이썬 조차도 공부한 적이 없다면, 한글용은 생활코딩의 파이썬 편을, 영문용은 러닝 파이썬( http://learnpython.org/)을 보시면 문법이나 파이썬을 어떻게 사용하는지 도움을 얻게 될 것입니다.


가능하다면 처음 파이썬 프로그래밍을 배우시는 분들이라면, 지금 현재 시점에서는 파이썬 2.7 보다 파이썬 3.X, 3.5 버전으로 시작하시기 바랍니다. 이유는 현업에서 파이썬 3.X 를 더 많이 사용하고 있습니다. (물론 레거시 코드는 언제나 존재하기 마련입니다만)  


또한 고등학교 수준 혹은 대학교 수준의 집합, 미적분, 선형 대수, 확률 및 통계에 대한 지식을 가지고 있다면, 인공지능 알고리즘과 수식을 보는 데 도움이 될 것입니다. 책에 나와 있는 예제 소스 코드를 편집하는 데 이 책은 Jupyter(이전에는 IPython Notebook 이라고 부름)라는 도구를 사용하고 있습니다. 제 2 장에서는 버추얼 환경에서 설치 방법을 설명하는 데, Jupyter 외에 여러분들이 선호하는 아나콘다(Anaconda), 파이참(PyCharm) 이나 비주얼 스튜디오 코드(Visual Studio Code)를 통해서도 동일하게 예제 코드 등을 편집하고 컴파일할 수 있습니다. 물론 책에서는 설명되어 있지 않지만 중급자들은 구글 검색하면 쉽게 사용할 수 있습니다.     


이 책의 내용에 대하여  


그렇다면 좀 더 자세히 책의 목차에 대해 알아보도록 하겠습니다. 제 1 부에서 사용되는 사이킷런(Scikit-Learn)은 데이빗 쿠나퓨(David Cournapeau)에 2007년 구글 써머 프로젝트로 머신러닝 알고리즘을 매우 쉽게 접근할 수 있도록 사이킷런 프레임워크를 만들었습니다. 현재 그는 프랑스 컴퓨터 과학 및 자동화 연구소 (Inria)의 연구팀이 이끌고 있습니다.

[그림 3] 핸즈온 머신러닝 제 2 판 번역본

제1 장부터 제 9 장 까지 예제 소스 코드가 사이킷런으로 구성되어 있습니다. 첫 장에서는  머신러닝의 정의, 해결하려는 문제, 시스템의 주요 범주 및 머신러닝 기본 개념에 대해 소개합니다. 또한 지도학습과 비지도 하급이 어떠한 차이가 있는 지 그것들에 종속된 개념, 예를 들어, 분류(classification), 회귀(regression), 픽처(feature), 예측치(predictor), 군집화(clustering), 시각화(visualization) 등등 용어에 대해 쉽게 설명합니다.


2장은 캘리포니아의 집값 데이터셋과 같은 실제의 데이터를 가지고 일반적인 머신러닝 프로젝트의 단계에 대해서 배웁니다. 그리고 지도 학습(supervised learning)에서 데이터 처리, 청소 및 전처리 파이프라인, 픽처 엔지니어링 과정에 대해서도 배울 수 있습니다. 또한 성능 측정에 필요한 RSME 나 MAE에 대한 개념, 데이터 비주얼제이션으로 데이터 인사이트를 얻는 방법에 대해서도 배울 수 있습니다.


3장과 4장에서는 모델을 직접 데이터에 피팅하여 학습하는 방법에 대해 배우고, 비용 함수(cost function) 최적화 및 교차 검증(cross-validation)을 사용하여 모델 선택 및 하이퍼파라미터(hyperparameter) 튜닝, 그리고 머신러닝의 과제인 언더피팅(underfitting) 및 오버피팅(overfitting) 과 편향(bias)과 분산 트레이드오프(distributed trade-off) 등과 같은 모델링 전반적인 과정을 배우게 될 것입니다.


제5장에서 9장에서는 이번 개정판이 되면서 더 추가된 내용인데, 가장 일반적인 머신러닝의 학습 알고리즘이 추가되었습니다. 예를 들어, 선형 및 다항식 회귀 분석, 로지스틱 회귀 분석, k-nearst 이웃, 지원 벡터 머신(SVM), 의사 결정 트리, 랜덤 포리스트(Random Forest) 및 앙상블 메서드(Ensemble method) 등을 배울 수 있습니다.


특히, 제8 장에서는 일명 “차원의 저주(curse of dimensionality)”라고 불리는 문제가 발생합니다. 한마디로 말하자면, 데이터 용량적 차원에서 축적되는 데이터의 크기와 그 데이터 안에서 독립적으로 취급할 수 있는 샘플이 많을수록 학습 모델이 더 강력해집니다. 반대로 말하면 용량이 커지더라도 샘플 수가 적으면 모델을 학습시키기 어렵습니다. 그렇다면 샘플이 적음에도 불구하고 용량이 큰 경우, 결국 각 샘플에 할애되는 정보량, 즉 차원이 많아지는 데, 데이터에서 모델을 학습할 때 독립적 샘플이 많을수록 학습이 잘 되는 반면 차원이 커질수록 학습이 어려워지고 더 많은 데이터를 필요로 하는 문제가 발생하는 데 이를 차원의 저주라고 합니다. 따라서 이러 차원을 축소(dimensionality Reduction) 시키는 방안에 대해 배울 수 있습니다. 아울러 제9 장에서는 레이블이 없는 비지도 학습(Unsupervised Learning)에서 군집화(clustering), 밀도 추정(density estimation) 및 이상 탐지(anomaly dection)에 대해서도 배웁니다.


사실 기본적인 머신러닝에 대해 알고 있는 분들이라면, 제1 부부터 배울 필요 없이 텐서플로우 2.X 코드로 뉴럴 네트워크를 이용한 딥러닝(Deep Learning)을 어떻게 표현하는지 바로 학습할 수 있도록 제2 부에서 제공하고 있습니다. 제10 장에서는 뉴럴 넷이 무엇인지와 그것들이 어떤 분석 때 사용하면 좋은지를 쉽게 설명합니다. 또한 텐서플로우( TensorFlow) 및 케라스(Keras)를 사용하여 인텔리전트 뉴럴 네트워크(ANN, Artificial neural network)를 구축하고 훈련시키는 방법에 대해 훈련합니다.


제11 장에서는 딥 뉴럴 네트워크에 대해 상세한 과정을 배웁니다. 텐서 플로우의 고급 API인 tf.keras를 사용하여 경사 하강법에서 기울기 사라는지는 문제(Vanishing gradients)와 기울기가 증가하여 폭발하는 문제(exploding gradients)를 어떻게 해결책을 찾는지에 대해 배웁니다. 또한 활성화 함수(Actionvation)를 활용하는 방법 및 Keras를 이용하여 배치 정규화를 구현하는 방법, 그리고 먼저 훈련된 레이어들을 이용한 방법인 전이 학습(transfer learning)과 Keras를 통해 구현하는 방법 등과, 퍼셉트론(perceptron)부터 역전파(backpropagation) 까지 경사 하강법의 원리에 대해 차근차근 설명하고, 그 경사 하강법의 최적화를 하기 위한 다양한 알고리즘인 AdaGrad, RMSProp, Adam/Nadam 등등에서도 배웁니다.


제12 장에서는 딥 뉴럴 네트워크 아키텍처에서 텐서 플로우의 하위 레벨 API에 대해 다룹니다. 특히, 사용자 정의 손실 함수(loss function), 사용자 정의 메트릭, 레이어, 모델, 초기화(initializer), 정규화(regularizer), 가중치 제약 조건(weight constraints) 등을 작성하는 방법을 배웁니다. 또한 가장 중요한 아키텍처인 표형식의(tabular) 데이터를 위한 피드 포워드(feed-fordward) 신경망과 텐서 플로우 2.0의 가장 큰 변화인 자동 그래프 생성 기능을 사용하여 사용자 지정 모델 및 훈련 알고리즘을 향상하는 방법도 살펴봅니다.


제13 장에서는 텐서 플로우 2.X 때부터 새롭게 데이터를 불러오고 저장하는 방법을 배웁니다. 대용량 데이터들을 스트림 방식으로 불러오기 때문에 I/O 성능을 크게 향상합니다. 이를 위해 TFDS(TF DataSet)의 다양한 방법의 Data API와 TF Function API와 통합하기 전에 훈련 데이터셋을 전처리하는 TF Transform(tf.Transform)를 사용하는 방법에 대해서도 배웁니다.


제14 장 컴퓨터 비전을 위한 합성곱 신경망(CNN, Convolution Neural Network), 제15장에서의 순차적 신경망(Recurrent Neural Networks, RNN)와 합성곱 신경망에서 시퀀스 처리하는 방법으로 LSTM (Long Short-Term Memory)을 사용하는 방법을 배웁니다. 또한 제15 장에서는 좀 더 심화 학습으로 자연 언어 처리(NLP)를 위한 인코더/디코더 모델 및 최신 방법인 트랜스포머(transformer), 제17장에서는 Augoencoders 및 적대적 생성 신경망(GAN, Generative Adversarial Network) 학습 등을 배웁니다.   


제18 장에서는 강화 학습(RL, Reinforcement Learning)이라는 새로운 머신러닝 학습 알고리즘을 사용하여 보상(reward)과 시행착오를 통해 좋은 전략을 배울 수 있는 에이전트(예: 게임의 봇)를 구축하는 방법에 대해서도 배웁니다.  


제19 장에서는 머신러닝을 서비스를 확장하여 자체 하드웨어 인프라나 Google Cloud AI Platform과 같은 클라우드 서비스를 통해 TF Serving을 사용하여 모델을 배포하고 규모가 큰 모델을 확장하는 방법을 배웁니다. 또한  모바일 앱 , 임베디드 장치(Tensor Flow Lite) 및 웹 앱(Tensor Flow.js)에 모델을 배포하는 방법을 간략하게 소개하고, GPU를 사용하여 계산 속도를 높이는 방법과 Distribution Strategies API를 사용하여 여러 장치 및 서버에서 모델을 훈련하는 방법에 대해 설명합니다. 요즘 유행하는 MLOps에 대한 전반적인 프로세스를 배웁니다.  

 

개정판의 변경 또는 추가된 것은?   

이미 제 1 판도 아마존 베스트 셀러였고, 작년 9월에 나와자마자 아마존 베스트 셀러로

제1 판과 개정판(제2판)의 가장 큰 차이점은 텐서플로우 1.X 예제 소스 코드가 텐서플로우 2.X 코드로 바뀐 점이 아닐까 싶습니다. 그야말로 최신 텐서플로우 2.X의 새로운 특징들이 모두 수록되어 있습니다.


그러나 이 책의 한 가지 아쉬운 점은 텐서플로우 1.X 에서 2.X로 변환하는 방법에 대해서는 자세히 기술되어 있지 않습니다. 그리고 머신러닝 주제에 포커스 했기 때문에 수학의 확률과 통계 부분을 표현할 수 있는 텐서플로우 확률(TF Probability)가 빠져 있습니다. 아마 이 두 부분들이 추가되었다면 제2 판도 더 늦게 출시되었을 것입니다. 이러한 내용은 Tensorflow.org에 가면 자습서들이 있으니 그것을 참조하시면 될 것입니다.  


이 책의 내용에 대하여 섹션에 서술했듯이, 추가적인 머신러닝 내용들이 많이 수록되었습니다. 첫째, 뉴럴 네트워크(셀프 정규화된 네트워크 포함)를 훈련과 같은 지도 학습의 다양한 내용을 업데이트시켰을 뿐만 아니라 비지도 학습 기술인 클러스터링, 이상 감지, 밀도 추정 및 혼합 모델 포함했습니다.


둘째, 컴퓨터 비전 기술(Xception, SENet, YOLO)로 물체 감지 및 R-CNN을 사용한 의미론적 분할 포함하고 있으며, 합성곱 신경망(CWN, 음성 인식을 위한 WaveNet 포함)를 사용한 시퀀스 처리 및 순환적 신경망(RNN, Recurrent Neural Network) 및 트랜스포머(Transformer)를 사용한 자연어 처리와 적대적 생성 신경망(GAN) 등이 추가 되었습니다.  


셋째, 텐서플로우 2.X의 다양한 API들과 API (Keras, DataAPI, 강화 학습을 위한 TF 에이전트) 및 배포 전략 API, TF-Serving 및 Google Cloud AI 플랫폼을 사용하여 대규모로 TF 모델을 교육 및 배포합니다. TF Transform, TFLite, TF Add-ons/Seq2Seq 및 TensorFlow.js 까지 언급했습니다. 더 자세한 변경 사항은 여기를 눌러보시면 제1 판과 비교할 수 있습니다.


번역본은 무엇이 다른가?

우선 번역본을 받아보면 책이 컬러판에 놀라게 될 것입니다. 요즘 국내 IT 책들의 트렌드 중 하나가 컬러판으로 되어 있어서 시각적으로 보기에 좋습니다. 특히, 인공지능의 수식 부분이 킨들(Kindle)과 같은 온라인 도서에서는 잘 표시 되지 않아 보기에 불편합니다. 그러한 문제를 오프라인 도서에서는 컬러를 사용하여 수식 부분과 예제 코드, 시각화 부분, 설명 등이 각각 잘 분류되어 도서를 구매하는 데 비용이 아깝지 않을 것 입니다.

[그림 3] 핸즈 온 머신러닝 제 2판 책 일부 발췌

영어를 잘하시는 분들은 원서 그대로 보시는 것도 좋으나, 역자인 해선님이 몇 개월 동안 고뇌(?)하여 번역해 놓았습니다. 해선님은 단순히 글을 번역가 아니라 직접 예제 코드를 실행해 보고 머신러닝에 대해서도 해박한 지식을 적용시켰습니다.


저도 구글의 여러 가지 인공지능 리서치를 영한 번역할 때 용어 선정이 꽤 까다롭다는 것을 잘 알고 있습니다. 기존 학회에서 정해져 있다면 쉽지만 머신러닝 분야는 지금도 계속해서 논문 발표로 인하여 새로운 개념과 용어가 나오기 때문에 이를 우리나라 말로 적당히 표현하고자 하는 데 고민이 되지 않을 수 없습니다. 그러한 부분까지도 해선님이 매끄럽게 다듬어 놓았습니다.


또한 원저자도 수많은 머신러닝 개발자 커뮤니티 멤버들과 인공지능 연구자, 데이터 과학자들에게 도움을 받고 피드백을 많이 받았는데, 이 번역본도 국내 저명한 분들도부터 초보자들까지 한빛미디어 출판사에서 베타 리딩까지 해 가면서 완성도를 높였습니다.


끝으로 저의 후기 소감을 밝히자면, 머신러닝의 바이블이라고 불릴 만큼 머신러닝의 모든 개념과 알고리즘, 방법 등을 수록해 놓았습니다. 또한 예제 소스 코드로 실행해 볼 수 있는 실용적인 도서로서 수학적인 수식도 복잡하지 않게 필요한 부분만 조화롭게 수록해 놓았습니다. 그러므로 이 책으로 스터디할 때  반드시 예제 소스 코드를 Jupyter를 통해 손수 코딩해서 실행해서 원하는 결과가 나오는 지를 보시기 바랍니다.


그리고 한 번 보시고 이해가 되지 않는 부분은 있다면, 역자가 직접 운영하는 머신러닝 Q&A 에 글을 올려주시면 역자나 전문가들이 답변을 주실 것 입니다. 또한  필요하다면 친구들이나 동료, 스터디 멤버들과 모여서 스터디 그룹을 리드해서 이끌어 보시는 것도 스터디하는 데 매우 도움이 될 것입니다.


https://youtu.be/kpuRasV_Q9k


핸즈온 머신러닝(2판) 번역서: https://m.hanbit.co.kr/store/books/book_view.html?p_code=B7033438574
이 책의 예제 소스 코드: https://github.com/ageron/handson-ml2
박해선님의 블로그 및 핸즈온 머신러닝 2/E 번역후기: https://tensorflow.blog/
Hands-on Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition 원서 : https://www.oreilly.com/library/view/hands-on-machine-learning/9781492032632/
Anaconda 설치법: https://docs.anaconda.com/anaconda/install/

Working with Jupyter Notebooks in Visual Studio Code 블로그: https://code.visualstudio.com/docs/python/jupyter-support

A Fast Learning Algorithm for Deep Belief Nets 제프린 힌톤 딥러닝 공동 저작의 논문: http://www.cs.toronto.edu/~fritz/absps/ncfast.pdf

Object Recognition with Gradient-Based Learning 얀 르쿤 CNN 공동 저작의 논문: http://yann.lecun.com/exdb/publis/pdf/lecun-99.pdf
Migrate your TensorFlow 1 code to TensorFlow 2 : https://www.tensorflow.org/guide/migrate
텐서플로우 생태계: 머신러닝 개발부터 배포까지 : https://brunch.co.kr/@synabreu/53

        




브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari