[리뷰] 머신러닝을 위한 파이썬 한 조각



개요

본 리뷰는 비제이퍼블릭 출판사 "머신러닝을 위한 파이썬 한 조각(박성호 저)"을 읽고 얻은 지식을 정리한 글입니다.

시간이 많지 않은 독자분들을 위하여 (요약소개)


한마디로 표현하자면 이 세상에서 가장 쉽지만 깊이있는 딥러닝 도서이다. 왜 가장 쉬운 딥러닝 책인지 하나씩 살펴보자.

  • 제목에 “한 조각”이라는 표현이 있는데 그래서인지 예제 코드도 한 놈만(?) 팬다. 바로 MNIST. 먼저 수치미분만 활용한 딥러닝 모델을 만들어 정확도 92%를 얻어낸 후 오차역전파, 텐서플로, 마지막으로 CNN을 적용하여 99%까지 단계별로 정확도를 높여나가며 적용한 원리를 깊이있게 살펴본다. 예제가 하나인 관계로 딥러닝의 원리에 더욱 집중할 수 있다.

  • 딥러닝을 학습하며 수학적으로 가장 어려움을 겪는 내용은 아무래도 오차역전파가 아닐까 한다. 이 문제를 해결하기 위해 은닉노드와 출력노드를 단 2개로 한정한 후 12번의 미분 계산과정을 반복한다. 어지간히 머리가 안 좋은사람도 12번 반복해서 읽고도 이해 못하긴 어려울 듯 하다. 반드시 오차역전파를 이해시키고야 말겠다는 저자의 뚝심이 느껴졌다.

  • 책을 읽다보면 설명은 뒤에 있는데 전체 도식도를 확인하기 위해 앞으로 책장을 넘겨야 하는 경우가 있다. 때로는 왔다갔다하기 귀찮아 대충 읽고 넘기는 경우도 있고 심지어는 찾지못해 그냥 읽는 경우가 생길 수 있다. 저자는 같은 그림이 반복되어 지면이 낭비될 지언정 관련 설명 근처에 반드시 도식도를 반복적으로 배치한다. 전달력과 가독성이 훨씬 높아진다.

  • 보통 딥러닝 서적에 Python의 기초 문법이나 Numpy 활용법을 다루면 자칫 지면의 양이 늘어나거나 독자 입장에서는 주객이 전도되어 딥러닝을 포기하고 파이썬에 집중하는 현상이 생길 수 있다. 마치 수학의 정석 집합 부분만 읽고 포기하는 것처럼… 그래서일까? Python과 Numpy에서 혼동하기 쉬운 (예를 들면 reshape함수와 전치행렬의 차이 등) 부분만 설명한다. 전부 다 배우다가 잊혀지기 전에 핵심만 습득할 수 있다.

특히 아무리 학습해도 딥러닝의 기본을 깊이있게 이해하지 못한 분들께 추천드리고 싶다. 보다 관심이 있으시다면 이어지는 챕터를 계속 읽어주시기 바란다.

MNIST, 한놈만 팬다.(수치미분 -> 오차역전파 -> 텐서플로 -> CNN)


제목에 “한 조각”이라는 표현이 있는데 그래서인지 예제 코드도 한 놈만(?) 팬다. 그 한놈은 바로 MNIST. 정확히는 RNN에서 “gohome”이라는 텍스트에서 “gohom”만 제시되었을때 다음에 올 글자로 “e”를 예측하는 예제가 하나 더 있긴하다. 이 예제를 제외하고는 전부 MNIST를 다룬다.

현란한 텐서플로 코딩과 재미있는 다양한 예제를 찾는 분들께는 MNIST의 예제만 다룬다는 사실이 조금은 실망스러울지도 모른다. 하지만 예제가 극도로 간단해서 딥러닝 모델과 미분 등의 수학적 요소가 현미경으로 들여다보듯이 명확해진다.

MNIST를 가지고 딥러닝을 이루는 스킬셋을 하나씩 적용하며 정확도를 높여가게 되는데 예제도 단순한데다 Numpy를 통해 수치미분부터 직접 구현하기 때문에 상세한 딥러닝의 원리를 이해할 수 있다. 구체적으로 아래와 같은 실습 과정을 거친다.

  • 1단계 : 수치미분만 활용한 딥러닝 모델(정확도 92%)
  • 2단계 : 오차역전파 추가 적용(정확도 94%)
  • 3단계 : 텐서플로 구현(정확도 95%)
    • 텐서플로 API 자체의 성능을 확인할 수 있는 계기이다.
    • 내부적으로 텐서플로는 활성화함수로 sigmoid -> relu을, 출력층에 sigmoid -> softmax을 활용하므로 relu, softmax의 장점을 설명하는 부분이라고 봐도 되겠다.
  • 4단계 : CNN 적용(정확도 99%)

딥러닝 서적 중 베스트셀러였던 밑바닥부터 시작하는 딥러닝과 견주어도 손색이 없다. 각각의 장단점이 있겠지만 “밑바닥부터 시작하는 딥러닝”이 거의 모든 구현과정을 아주 상세하게 전부 훑었다면, 본 도서는 정말 필요하고 제일 중요한 숲부분만 추려 깊이있게 다룬다. 두권의 도서와 파이썬 날코딩으로 알고짜는 딥러닝을 포함해서 3권의 도서를 독파한다면 딥러닝의 구현 원리를 확실히 이해하면서 적어도 딥러닝의 구현 및 응용에는 부족함이 없을듯 싶다.

오차역전파, 미분을 12번 반복하여 끝을 본다.


딥러닝을 학습하며 수학적으로 가장 어려움을 겪는 부분은 아무래도 오차역전파가 아닐까 한다. 기껏 어렵게 미분에 대한 기초 개념을 잡아 여기까지 왔는데 시그모이드 함수 미분을 만나면 대부분 좌절을 겪기 때문이다.

이 정도로 끝나면 그래도 견딜만은 한데 은닉층의 완전연결에서 생기는 간선의 수가 많아지고 선형대수 연산법도 알아야하는데 손실함수와 활성화함수의 개념도 잡히지 않은 상황에서 출력층과 은닉층의 각 가중치를 미분하다보면 머리는 하얘지고 결국 포기하기 일수다.

저자는 숭실대학교 교수님으로 그동안 학생들이 딥러닝의 어느 부분을 어려워하는지, 어떻게 한학기에 딥러닝의 기본 지식을 잘 전달할 수 있는지 등 딥러닝 강의를 효율적으로 전달하기 위한 방법에 많은 고민이 있었던 것 같다. 책을 읽다보면 최대한 쉬운 구성과 반복 학습효과를 통해 저자가 전하고자 하는 의도를 느낄 수 있다. 확실히 교수님들이 쓰시는 서적들은 내공의 깊이가 다르다.

딥러닝을 마주하며 겪는 이러한 주화입마를 해결하기 위해 이 책은 예제를 최대한 단순화 한다. 우선 은닉노드와 출력노드를 단 2개로 한정한다. 따라서 가중치(W) 4개와 바이어스(b) 2개만 존재하게 되며 이 6개의 요소를 모두 미분하는 과정을 기술한다.

6개의 미분과정은 대부분 거의 동일하기에 보통 다른 서적에서는 간단한 1개 예제만 집중하고 다음 내용으로 넘어간다. 그런데 6번 전부 다 상세히 계산하고 설명한다. 더 놀라운 것은 은닉층에서 6번을 더 설명한다. 어지간히 머리가 안 좋은사람도 12번 반복해서 읽고도 이해 못하긴 어려울 듯 하다. 반드시 이해시키고야 말겠다는 저자의 뚝심이 느껴지는 대목이었다. 오차역전파 미분

Python과 Numpy는 헷갈리는 것만 최소한으로


보통 딥러닝 서적에 Python의 기초 문법이나 Numpy 활용법을 다루면 자칫 지면의 양이 늘어나 딥러닝 본연에의 집중을 어렵게 할 소지가 있다. 독자 입장에서는 주객이 전도되어 “파이썬을 제대로 익힌 후 다시 도전해야 겠군.”이라는 마음이 들어 마치 수학의 정석 집합만 읽고 포기하는 것과 동일한 현상을 겪을 수 있다.

그래서일까? Python과 Numpy에서 혼동하기 쉬운 (예를 들면, reshape함수와 전치행렬의 결과는 shape은 같지만 결과는 엄연히 다르다.) 부분만 설명한다. 전부 다 배우다가 내용이 너무 많아 중요한 것들이 잊혀지기 전에 핵심만 쏙 먹을 수 있는 장점이 있다. reshape함수와 전치행렬의 결과

본 도서에서 Python과 Numpy의 어떤 부분만 다루는지 간단히 요약해 본다.

  • Python의 혼동하기 쉬운 기능
    • 음수 인덱스(a[-1]) : 리스트 원소를 -1, -2,..등의 음수 인덱스를 활용해 역순으로도 접근가능
    • 슬라이스(c[:-2]) : 인덱스의 범위 지정 기능
    • 튜플(a=(1,2,..)) : 소괄호로 묶는다. 읽기전용.
    • 딕셔너리(score={‘A’:1}) : Key-value구조.
    • mutable : 함수 파라미터의 원본값 변경가능(리스트, 딕셔너리, Numpy) <-> immutable : 숫자, 문자, 튜플
    • list comprehension : list 내부 변수에 for 구문 활용
    • 그 외 in 키워드, range() 활용법, 함수의 복수 return 기능, lamda, Class, self 등
  • Numpy의 혼동하기 쉬운 기능
    • array(배열)과 ndarray(배열, 행렬)의 차이 : shape, ndim, reshape의 -1인자
    • reshape과 전치행렬의 결과 차이
    • Broadcast, Iterator, rand(), argmax(), loadtxt() 함수의 활용법

이와 같이 딥러닝 구현을 위해 반드시 알아야 할 기능 및 혼동하기 쉬운 기능만 집중적으로 다루기에 보다 딥러닝에 집중할 수 있다.

수학은 언제나 정면 돌파, 그리고…


위에서 언급했듯이 오차역전파에서 12번의 미분 풀이를 필두로 본 도서의 매력 중 하나로 수학 정면 돌파를 들고싶다. 절대 공식을 생략하지 않으며 그 대신 한번 공식이 등장하면 절대 혼동이 없도록 최대한 자세한 설명으로 보충한다.

4장에서는 편미분, 체인룰, 수치미분 등 딥러닝에서 활용하는 미분 정도로 범위는 좁히고 쉬운 비유를 들어 최대한 쉽게 설명한다. 미분이 무엇인지 보다 왜 필요하고 딥러닝의 어느 부분에 적용하는지를 명확히 짚고 있어 딥러닝과의 유기 관계가 명확해지며 마지막에 수치 미분 함수를 직접 구현하여 뒷장의 딥러닝 실습에 활용한다.

마찬가지로 MSE 손실함수, 경사하강법, 크로스 엔트로피 등 모든 단계에 수식이 등장하고 최대한 쉽게 해설하며 입력변수가 1개 혹은 2개일때마다 각각에 대한 미분 및 수식 적용과정을 보여주기에 딥러닝의 원리를 전체적으로 조망하기 쉽다. 이토록 자세히 알아봤는데도 각 장마다 유사한 내용이 나올때마다 전 공식과 유도과정을 반복적으로 설명하여 앞부분에서 학습한 내용들의 기억이 반감될 때마다 다시 기억을 살릴 수 있다.

CNN, RNN 등 다른 모델을 다룰기 직전에는 DNN의 핵심원리를 다시한번 소개해줌으로써 DNN을 학습했던 기억력을 지속시키고 CNN, RNN 모델과의 정확한 차이점을 잡을 수 있게 해준다. RNN CNN

덕분에 책의 후반부를 읽다보면 Feed 포워드를 거쳐 출력값 y를 계산한 후, 정답 T와 비교하여 크로스 엔트로피와 같은 손실함수 값을 계산하고, 손실함수 값이 최소가 될때까지 오차 역전파를 이용해 W와 b를 최적화한다는 DNN의 전체 구조가 머리속에 뚜렷한 개념으로 자리잡게 된다. 가중치W 손실함수 미분

그 외 CNN, RNN 역시 모델의 구조적 차이부터 상세한 구현과정 및 텐서플로의 기초를 알기쉽게 전달하고 있으나 리뷰 목적상 이 즈음에서 마칠까 한다.

누가 읽어야 하는가?


  • AI, 머신러닝, 딥러닝 및 데이터 분석에 관심이 있는 모든 분.
  • 오차역전파, 경사하강법, 수치미분 등 딥러닝의 핵심개념의 이해에 실패하신 분.
  • DNN, CNN, RNN의 핵심 구조를 파악하고 싶은 분.
  • 그 외 딥러닝 관련 수학적 기초를 튼튼히 하고 싶은 분.

책의 구성 및 요약


이 책은 크게 두부분으로 구성되며, 각 파트에서 다루는 내용을 아래와 같이 요약해 보았다.

  • 1. 머신러닝, 딥러닝의 기초 (1 ~ 10장)
    • Python 및 Numpy의 핵심, 미분
    • 선형회귀와 분류, XOR문제
    • 딥러닝과 MNIST
    • 텐서플로의 기초
  • 2. 딥러닝 고급 (11 ~ 12장)
    • CNN, RNN

<비제이퍼블릭 출판사>

비제이퍼블릭 출판사 책을 읽으며 지금까지 느꼈던 것은 IT 무림 맹주급 은둔고수의 비기가 담긴 책이 은근 많다는 것입니다. 쌓아온 지식과 경험을 바탕으로 장인 냄새가 나는 책을 자주 출간합니다. 열심히 공부해도 제자리 걸음인 분들은 비제이퍼블릭 출판사의 책 목록에서 해결책을 찾아보시기 바랍니다.

비제이퍼블릭 바로가기




© 2019.04. by theorydb

Powered by theorydb