매닝Manning 출판사의 텐서플로우 책인 “Machine Learning with TensorFlow“가 거의 원고를 마무리하고 곧 출간될 예정입니다. 이 책의 최신 MEAP 버전을 바탕으로 간략히 리뷰를 작성합니다.
이 책은 텐서플로우를 이용하여 머신 러닝 알고리즘을 작성하는 챕터들로 구성되어 있습니다. 머신 러닝의 관점에서도 텐서플로우의 관점에서도 모두 입문서에 해당합니다. 크게 세가지 파트로 나뉘어져 있으면 첫 번째는 머신 러닝과 텐서플로우의 소개, 두 번째 파트는 회귀, 분류, 군집, 히든 마코브Hidden Markov 모델을 소개합니다. 마지막 세 번째 파트에서는 오토인코더autoencoder, 강화 학습, CNN, RNN을 다룹니다.
1장에서 대부분의 다른 책들 처럼 머신 러닝에 대한 개괄적인 소개를 하고 있습니다. 모델, 파라미터, 학습, 추론(여기서 말하는 추론은 통계의 추론이 아니고 머신 러닝의 예측을 말합니다), 특성 등을 포함합니다. 그리고 L1, L2 노름을 포함하여 일반화된 노름norm에 대해서 잘 설명하고 있습니다. 그리고 세가지의 큰 머신 러닝 분류인 지도 학습, 비지도 학습, 강화 학습을 사례를 들어 차이를 설명합니다. 씨아노Theano, 토치Torch, 카페Caffe에 대해 간략히 소개하고 텐서플로우를 사용하려는 이유와 소개를 합니다. 그런데 scikit-learn이 비교적 저수준(?) 라이브러리이기 때문에 텐서플로우 같은 고수준(?) 라이브러리를 쓴다는 말이 좀 어색하네요. 이 챕터의 마지막에는 책 전체에서 챕터별로 각각 어떤 알고리즘들을 다룰 것인지를 그림과 표로 요약해서 보여주고 있습니다. 이런 정리는 책의 전체 내용을 쉽게 파악하게 도와주므로 아주 좋은 것 같습니다.
2장에서 텐서플로우에 대한 소개를 합니다. 다차원 배열로서의 텐서Tensor를 소개하고 상수 텐서를 만드는 코드를 설명합니다. 다음에 텐서플로우의 연산 API를 소개하고 세션과 인터렉티브 세션에서 실행하는 코드를 설명합니다. 이어서 계산 그래프의 노드와 엣지를 소개하고 주피터 노트북을 설명합니다. 그 다음 텐서플로우에서 중요한 데이터 타입인 변수를 설명합니다. 변수의 저장과 로딩의 예를 보여주고 있으며 플레이스홀더는 간략히 언급하고 넘어갑니다. 마지막으로 SummaryWriter 를 이용하여 텐서보드TensorBoard에서 시각화하는 예를 설명합니다. 2장은 아마도 텐서플로우에 관한 책이라면 공통적으로 포함될만한 내용입니다.
3장은 선형 회귀Linear Regression를 설명합니다. 회귀 알고리즘에 대한 설명을 하면서 과대적합overfitting과 과소적합underfitting을 소개합니다. 예제를 만들기 위해 인공적인 데이터셋을 생성하고 이 데이터에 경사 하강법Gradient Descent으로 선형 회귀의 최적 모델 파라미터를 찾는 코드를 작성합니다. 그 다음엔 다항 회귀Polynomial Regression의 예를 역시 인공적인 데이터셋을 만들어 예제를 구성하였습니다. 하지만 5차 다항식을 적용하기만 할 뿐 어떻게 좋은 차수를 선택할지에 대한(모델 선택) 소개는 없습니다. 이어지는 섹션에서 규제Regularization에 대해 설명하고 L2 규제를 적용한 다항 회귀의 예제를 만듭니다. 모든 예제는 텐서플로우를 이용하여 선형 방정식의 가중치 파라미터를 찾는 그래프를 직접 만듭니다. 끝으로 몇가지 공개 데이터셋 저장소를 소개합니다.
4장은 분류Classification에 대한 챕터입니다. 범주형 변수를 다루기 위한 두가지 방법인 더미 변수dummy variable와 원 핫 인코딩one-hot-encoding에 대해 설명하고 정확도accuracy, 오차 행렬confusion matrix, 정밀도precision, 재현율recall, ROC 커브에 대해 소개하고 있습니다. 다만 회귀에서는 성능 지표에 대한 설명이 없이 분류에서만 자세한 설명이 되어 있고 오차 행렬, 정밀도, 재현율, ROC 커브가 실제로 예제에서 쓰이지 않음에도 설명만 하고 있기 때문에 맥락이 어색한 것 같습니다. 분류 알고리즘은 선형 회귀를 이용한 분류와 로지스틱 회귀를 나누어 설명하고 있습니다. 보통 선형 회귀를 이용한 분류를 로지스틱 회귀로 설명하는 경우가 많습니다만 이 책에서는 시그모이드sigmoid 함수를 적용하기 전과 후를 나누었습니다. 그리고 두개의 특성을 가진 데이터셋을 사용했을 때의 로지스틱 회귀의 예제를 추가로 만듭니다. 멀티 클래스multiclass 데이터셋에 대한 분류 문제를 다루기 전에 one-vs-all 과 one-vs-one 방식을 간단히 소개하고, 소프트맥스softmax 방식으로 로지스틱 회귀를 사용하여 예제를 만듭니다. 멀티 클래스 문제에서 크로스 엔트로피 비용 함수가 바뀐 것에 대한 설명이 없고, 소프트맥스 공식을 제시하지 않고 그냥 텐서플로우의 softmax 함수를 사용한 점이 아쉽습니다.
5장은 군집clustering 알고리즘 중에 k-평균k-means, SOM 모델을 구현합니다. k-평균 알고리즘을 이용해서 여러개의 음원을 군집clustering하는 것과 하나의 긴 음원에서 비슷한 부분을 세그멘트segment하는 두 가지 예를 파이썬의 오디오 패키지인 bregman을 사용하여 구현하고 있습니다. 대표적인 파이썬 오디오 라이브러리인 libROSA를 사용하여 예제를 만들었다면 더 좋지 않았을까 합니다. 5장의 후반부는 SOMself-organizing map 모델을 설명하고 텐서플로우로 인공 데이터셋(색깔)에 대해 예제를 구성하고 있습니다. SOM 모델을 만드는 코드는 비교적 긴 편입니다만 이젠 거의 사용되지 않는 SOM 모델을 실제로 만들어 보는 것이 유용한지 고개를 갸우뚱하게 합니다.
6장은 히든 마코브Hidden Markov 모델에 관한 챕터입니다. 히든 마코브의 예제를 위키피디아 페이지에 있는 히든 마코브의 예제를 사용하고 있고 비터비viterbi 디코딩에 대해 아주 짧은 예를 들고 마무리됩니다. 히든 마코브 모델 설명이 강화 학습 챕터와 이어지지 못한 것이 조금 아쉽습니다. 여기까지가 텐서플로우를 이용하여 회귀, 분류, 군집, 히든 마코브 모델을 만드는 챕터입니다. 하지만 텐서플로우를 사용하는 진짜 목적은 신경망때문일 것입니다. 다음 장에서부터 신경망 모델이 등장합니다.
7장은 오토인코더autoencoder에 관한 챕터입니다. 오토인코더를 설명하기 전에 먼저 짧게 신경망을 소개하고 있습니다. 4개의 숫자로 이루어진 벡터를 랜덤하게 생성해 하나의 숫자로 인코딩을 하고 다시 복원하는 예제를 만들면서 오토인코더의 원리를 설명합니다. 그 다음엔 CIFAR-10 이미지에서 말 이미지를 이용하여 100개의 히든 유닛을 가진 오토인코더를 학습시키고 훈련된 모델을 이용해 다른 이미지를 인코딩하고 디코딩하는 예를 보이고 있습니다. 이 예제의 결과는 깃허브 주피터 노트북에서 확인할 수 있습니다(책에 있는 loss 결과와는 달리 주피터 노트북의 loss는 감소가 썩 좋지 않습니다). 그 외에 Stacked, Denoise, Variational 오토인코더를 짧게 설명하고 챕터를 마칩니다.
8장에서 강화 학습을 소개합니다. 상태, 에이전트agent, 액션action, 정책policy, 환경, 유틸리티utility(reword) 등의 개념을 소개합니다. 강화학습의 예제를 위해 야후 주식 트레이딩 데이터를 사용해 Q러닝을 구현합니다. 액션은 buy, sell, hold 세가지로 정하고 200개의 유닛을 가진 히든 레이어를 사용했습니다. 주식 트레이딩 데이터 보다는 OpenAI Gym을 사용하거나 폴러시 그래디언트Policy Gradient 방식을 설명했더라면 조금 더 좋지 않았을까 생각됩니다.
9장은 콘볼루션convolution 신경망(CNN)입니다. CIFAR-10 이미지 데이터셋을 사용해 예제를 만듭니다. 5×5, 64개 필터를 사용하여 두 개의 콘볼루션을 적용하고 1024개의 완전 연결 레이어를 연결하였습니다. 이 챕터의 콘볼루션 예제는 tf.layers 하위의 API를 사용하지 않고 조금 더 저수준인 tf.nn.* 를 사용합니다. 맥스 풀링max pooling, 스트라이드stride에 대해서는 설명하고 있지만 패딩padding은 설명없이 그냥 텐서플로우의 ‘SAME’ 패딩을 적용하고 있습니다. 이 챕터 즈음이면 앞서 설명을 하지 않은 역전파나 경사 하강법 이면의 알고리즘에 대해 소개할 법한데 주로 사용법에 집중하고 있습니다.
10장은 마지막 챕터로 리커런트recurrent 신경망(RNN) 모델을 설명합니다. RNN 모델의 예제로는 항공사의 고객수 데이터를 이용하여 전형적인 시계열 예측 모델을 만듭니다. 그런데 기본 RNN의 개념을 설명하고 실제로는 텐서플로우의 LSTM 셀을 사용하고 있습니다. LSTM에 대한 설명이 없는 점이 많이 아쉽습니다. 10장 이후에는 도커를 이용한 텐서플로우 설치 부록이 마지막에 위치해 있습니다.
이 책은 깔끔한 일러스트와 함께 코드 라인을 하나씩 짚어가면서 설명을 잘 해주고 있습니다. 개인적으로는 군집과 히든 마코브에 대한 챕터를 빼고 신경망 쪽에 조금 더 힘을 주었으면 어땠을까 합니다. 이 책의 홈페이지는 http://www.tensorflowbook.com 이고 전체 코드는 MIT 라이센스로 깃허브에 주피터 노트북으로 공개되어 있습니다. 최신 코드는 텐서플로우 1.0 버전에서 테스트 되었습니다.
ML with TensorFlow 번역서 기다리고 있는데, 언제 쯤 출간 될까요?
좋아요좋아요
안녕하세요. 이 책의 번역을 제가 하게 될지는 아직 잘 모르겠네요. 어쩌면 다른 분이 번역을 하고 계실지도 모르겠습니다. 한빛미디어 출판사에 문의해 보시면 적절한 대답을 들으실 수 있을 것 같아요. ^^
좋아요좋아요
안녕하세요! SOM 모델은 이제 거의 사용되지 않는다고 적혀있어서요! 그렇다면, 비지도학습에서 클러스터링 쪽으로 보편적으로 잘 사용되는 알고리즘이 어떤게 있는지 추천해 주실 수 있을까요~? k-means와 DBSCAN 이 두개가 많이 나오긴 하지만, 또 다른게 있을까 싶어서 댓글을 남깁니다 ㅎㅎ
좋아요좋아요
안녕하세요. 제가 쓴 글을 다시 보니 조금 오해가 있을 수 있겠네요. 알고리즘은 저마다 장단점이 있습니다. 모든 문제에 보편적으로 잘 맞는 알고리즘은 없습니다. 대표적으로는 kmeans, dbscan, 병합군집 등이 책에 자주 등장하는 알고리즘들 입니다. 다양한 군집 알고리즘은 사이킷런 문서(https://scikit-learn.org/stable/modules/clustering.html)와 위키백과(https://en.wikipedia.org/wiki/Cluster_analysis)를 참고하세요. 🙂
좋아요좋아요