[리뷰] 신경망 교과서



길벗 출판사의 "신경망 교과서(제임스 로이 저/이춘오 역)"를 읽고 작성한 리뷰입니다.

표지


본 도서의 특징을 한 줄로 표현하자면 딥러닝에서 자주 활용하는 기술을 최단 시간내에 가장 쉽게 익힐 수 있는 실전 교과서라고 할 수 있겠다. IT 기술은 백문이 언제나 불여일타이다. 도서의 내용 요약은 잠시 뒤로 미루고 멋진 예제 하나를 집중적으로 분석하여 책의 특징을 빠르게 파악해보겠다.

이 책에는 총 6개의 신경망 예제가 소개되는데 하나하나 특별한 장점들이 숨어있어 어느 파트를 집중적으로 리뷰할지 고민했다. 4장 이미지 분류에서는 CNN의 필터나 Max 풀링을 지금까지 본 어떤 레퍼런스보다 쉽게 설명하고 있고 전이학습이 매력적이다.

5장 오토인코더에서는 노이즈 제거라는 실용적인 예제가 마음에 들었고 나중에 GAN을 학습하는데 도움되는 개념이 많았다. 7장 안면 인식 예제에서는 비교적 새로운 샴 신경망을 소개하고도 싶었고, 6장 역시 RNN, LSTM, 장기의존성 이슈를 시각적 도구를 활용해 쉽게 설명하고 있으며, 2장 당뇨 예측은 간단하여 집중적으로 리뷰를 다루고 싶었다.

모두 다뤄보고 싶지만 리뷰가 너무 길어져 아무도 읽지 않을 것 같아 3장 택시 요금 예측를 집중적으로 리뷰해보려 한다. 이 예제를 선택한 이유는 다음과 같다.

  • 업무 도메인 지식이 필요없다. (택시 요금 내는 것 모르는 사람은 없다.)
  • 데이터 분석의 기본인 Tabular 형태의 데이터 셋이 등장한다. (기본 중의 기본)
  • 히스토그램, 위/경도 점차트나 구글 지도 등의 시각화 자료가 이해를 빠르게 돕는다.
  • 그 외 샴(Siamese) 신경망, 전이학습, CNN, RNN, LSTM 등을 다루는 다른 예제들은 처음 접하시는 분들이 책의 특징을 파악하는데 적합하지 않은 듯 하여 제외했다.

목표는 간단하다. 콜택시를 호출할 때 모바일 앱에서 예상 요금을 가급적 정확하게 알려주는 것이 목표이다. 2009년 ~ 2015년의 총 5,500만회 택시를 운행한 과거 데이터셋이 주어진다. 데이터셋의 컬럼(특징)은 5개로 다음과 같다.

요금, 승차 일시, 승차 위치, 하차 위치, 탑승자 수

먼저 시각화를 통해 EDA 진행한다. 데이터를 친숙하게 이해하는 과정에서 전처리 및 모델 설계를 위한 전략이 수립된다. 데이터셋에서 승, 하차 위치 정보를 알고 있으므로 먼저 아래 그림과 같이 위경도 점차트를 그려본다. 점차트에 대한 이해를 돕기 위해 주변의 주요 랜드마크의 좌표도 함께 찍어본다. 위경도 점좌표

점차트를 통해 어느 지역에서 가장 많이 승하차 하는지 알 수 있다. Manhatten 섬 바깥은 상대적으로 승하차가 적음을 확인할 수 있다.

다음으로 전처리를 진행한다. 전처리 중 일부인 통계 요약 정보 및 히스토그램을 이용하여 이상치 데이터를 탐색하는 과정을 발췌해 보겠다. 아래 그림을 보면 요금이 음수인 경우이거나 500달러가 넘어가는 이상치 자료들이 보인다. 책에서는 Tip으로 히스토그램이 가장 빠르게 직관적으로 이상치를 찾는 방법임과 동시에 통계 요약 정보를 활용할 것을 권장하고 있다. 이상치

전처리는 보통 절차와 코드가 복잡하기에 이를 모듈화하여 헬퍼 함수로 생성할 것을 권장한다. 사실 그동안 주피터노트북 위주로 데이터 분석을 시도하다보니 무한 스크롤 압박 때문에 위 아래 이동하기가 너무 불편했다. 코랩에서는 책갈피 기능을 활용하곤 했는데 이 참에 헬퍼 함수 방식을 습득하고 보니 근본적으로 이 방식이 훨씬 편한 것 같다.

중간중간 아주 유용한 Python 코드들도 숨어있다. 지금이야 다 아는 코드들이지만 예전에 이런 코드들만 명확하게 찝어서 미리 학습할 수 있었다면 얼마나 많은 시행착오를 줄일 수 있었을까 생각이 든다. 리뷰하는 입장에서 군데 군데 숨은 주옥같은 코드들을 잘 익혀두면 쓸데 없는 시간 낭비를 최소화 할 수 있음을 언지하고 싶었다.

이게 무슨 의미냐면 C, Java에 익숙한 연식(?)이 좀 되는 분들은 데이터를 1차원으로 보려는 선입견이 강하다. Python, R, Julia 등은 데이터 분석에 특화된 언어이기 때문에 그동안 다른 언어에서 적응한 사고 방식이 오히려 방해가 된다. ~일찍 태어나서 억울하다. ㅎㅎㅎ~

몇 가지 유용한 코드들을 예로 들면 다음과 같다.

df = df[(df['amount'] >= 100) & (df['amount'] <= 200)] # 요금이 100이상 200이하인 자료만
df = df.drop(['amount'], axis=1) # 요금 컬럼 제거
df['amount' + airport] = func(airports[airport][0]) # 변수의 변수화 
X = df.loc[;, df.columns != 'amount'] # 요금 컬럼만 제외 (물론 loc는 권장하는 방식은 아니다.)

위와 같은 코드들은 처음엔 for문을 돌리면서 컬럼을 하나씩 불러와 복사하는 등의 뻘짓을 많이 했었다. 사고방식이 익숙하지 않아서 그렇지 각 패턴별로 활용할 수 있는 초간단 코드들이 많으니 처음부터 이 책과 같이 좋은 예제로 습관을 들이는 것이 중요하다.

다음으로는 특징공학을 다뤄본다. 특징공학(특성공학, feature engineering)이란 업무 도메인 지식을 활용하여 예측 성능을 높여줄 수 있는 변수(특징)을 만드는 것을 말한다.

본 예제의 데이터셋에는 운행거리가 없으므로 승하차 위치를 활용하여 운행거리를 계산해야 한다. 유클리드 거리를 활용하여 운행거리를 계산한 후 제대로 산출되었는지 검증 목적으로 요금과의 관계를 아래 그림과 같이 시각화한다. 운행거리와 요금

상식적으로 운행거리가 늘어날수록 요금도 증가하는 것이 맞으므로 그림과 같이 비례 관계를 가지는 것이 맞다고 볼 수 있으나 동그라미 친 부분은 거리와 상관없이 요금이 일정하여 의심스럽다. 구글링을 통해 알아보니 공항을 오가는 택시는 추가로 통행료를 더한 요금을 지불해야 함을 알 수 있었다. 즉, 동그라미 친 부분은 공항을 오가는 경우 같은 거리대비 더 많은 요금이 징수됨을 의미한다.

이제 새로운 업무 도메인 지식이 생겼으니 특징공학을 활용하여 공항과 승하차 위치간의 거리를 새로운 특징으로 생성할 수 있으며 이는 예측 성능을 높이는데 도움을 준다.

기타 스케일링 등 전처리를 완료하고 나면 모델을 생성해야 한다. 모델을 생성하는 부분 또한 본 도서의 장점이다. 6개 예제 각기 다른 모델을 사용하므로 모델의 특성에 맞는 레이어를 구성하는 팁이나 손실함수, 활성화함수, 옵티마이저에 대한 옵션 및 하이퍼 파라미터 설정 방법을 안내하여 목적에 맞는 모델에 빠르고 쉽게 적응할 수 있다. 모델링

마지막으로 테스트셋을 활용하여 실제 요금을 예측해본다. 특징공학을 활용한 덕분에 제법 정확하게 요금을 예측하는 것을 확인할 수 있다. 평가


이로써 3장의 택시 요금 예측 예제를 집중적으로 리뷰해 보았다. 그 외 나머지 5개의 예제를 학습하며 인상적이었던 부분을 간략히 요약해보겠다.

  • 당뇨 예측(2장)
    • 다중 레이어 퍼셉트론 및 파마 인디언 부족의 당뇨 데이터셋을 활용하여 새로운 환자에 대한 당뇨 발병 여부를 예측하는 모델을 생성한다.
    • 택시 요금 예측 예제와 거의 동일하나 처음으로 다루는 예제인 만큼 EDA 및 전처리의 기초 지식을 좀 더 상세히 다룬다.
    • 특히, 활성화 함수의 기능과 종류 및 ROC나 혼동 행렬과 같은 평가 방법을 알기 쉽게 설명한 것이 인상적이었다.
  • 이미지 분류(4장)
    • 컨볼루션 신경망을 활용하여 개와 고양이 사진을 분류하는 모델을 만든다.
    • 이미지 분류, 사물 탐지, 이미지 분할을 별도로 소개하여 관련 기술을 상세히 알 수 있었다.
    • 본 장의 백미는 CNN의 필터나 Max풀링에 대한 소개이다. 가장 심플한 예시를 하나 들어 그 과정을 아래와 같은 그림을 통해 정리하기 때문에 이해가 안될 수가 없다. 지금까지 본 어떤 레퍼런스보다 쉽게 설명하고 있는데 이 기조는 뒤의 오토인코더나 RNN, LSTM 등을 설명할때도 계속 이어진다. 추상적이고 복잡한 개념을 알기 쉽게 전달하는 저자의 능력이 돋보였다. CNN
    • VGG16 모델을 전이학습을 통해 성능을 개선한 예제도 인상적이었다.
  • 오토인코더(5장)
    • 오토인코더는 원본 이미지를 잠재표현으로 변환하는 방법을 학습한다. 단순히 압축률로만 보면 JPEG 등의 일반 기술에 비해 훨씬 떨어지며 오히려 원본이미지가 손실되기도한다. 아이러니 하게도 손실 덕분에 이 기술이 가치를 가진다.
    • 손실의 영역만큼 창의성이 개입될 수 있기에 이 장의 예제처럼 커피 자국으로 오염된 문서에서 노이즈를 제거할 수 있다.
    • GAN의 핵심으로 이어지는 유용한 개념이 많았다.
  • 영화 리뷰 분석(6장)
    • LSTM 모델 및 IMDb 데이터셋을 활용하여 영화 리뷰에 대한 감성을 분석하는 모델을 만든다.
    • 흔하고 유명한 예제이지만 4장에서 언급한 장점이 한번 더 발휘되는데 RNN, LSTM, 장기 의존성 이슈를 이렇게 쉽게 설명하는 책은 본 적이 없다.
  • 안면인식(7장)
    • 샴(Siamese) 신경망을 활용하여 안면 인식 모델을 만든다.
    • 속도, 확장성, 적은 데이터셋으로 부터 높은 정확도를 보장하기 위해 CNN 대신 샴 신경망을 이용한다.
    • 샴 신경망은 처음 접해봤는데 가중치가 공유된다는 점, 두 이미지의 유사도 거리를 측정한다는 점, 대조 손실함수를 사용한다는 점에서 흥미로웠다.
    • 바이올라-존스 알고리즘의 하르 특징을 활용하여 실시간으로 얼굴을 탐지할 수 있는데 Open CV로 생각보다 쉽게 구현할 수 있어서 유용했다.

그 외 1, 8장은 이론적인 내용을 다루며 1장에서는 전반적인 머신러닝과 신경망의 기초를, 8장에서는 배운 개념들을 정리해보고 앞으로의 AI 미래에 대해 다룬다.


본 도서는 구성의 완성도 측면에서도 인상적이었다.

각 장의 학습을 마칠때마다 복습 코너가 등장하는데 해당 장에서 배웠던 가장 핵심 개념들을 다시 떠오르게 하는 효과가 있다. 덕분에 기억의 반감기를 연장할 수 있고 애매하게 알았던 부분은 보다 확실하게 깨우치고 넘어갈 수 있게 해준다. 흔히 복습을 반복하는 것은 흥미로운 일은 아니지만 각 문항마다 바로 밑에 친절한 답안이 달려있으므로 크게 부담되지는 않을 것이다.

더불어 각 장의 실습환경 설정 방식도 마음에 들었다. 보통 클라우드에서 많이 활용했던 방법인데 YAML 방식을 활용하여 쉽게 개발 환경을 구축할 수 있다. 대표적인 명령어는 다음과 같다.

$ conda env create -f environment.yml

지금까지 장점만 열거했으니 다소 아쉬운 점도 언급해보겠다.

전체적으로 실전 위주의 내용을 담고 있어 이론이 부족한 편이며, 신경망 자체에 초점을 두다보니 GAN, Reinforcement Learning 등의 기술은 소개 정도로만 다루어 진다. 결론적으로 처음 언급했던 바와 같이 본 도서는 딥러닝에서 자주 활용하는 기술을 최단 시간내에 가장 쉽게 익힐 수 있는 도서이기에 구체적으로 표현하면 교과서라기 보다는 실전 교과서 정도로 표현되면 정확할 것 같다.

파이썬 코딩의 기술(길벗)등의 책에서 강조하는 파이썬 다운 코딩 스타일과 약간 거리있는 코드들이 보이기도 하는데 본 주제도 아닌데다 전체적으로 헬퍼 함수 등 깔끔한 구조를 유지하는 등의 장점도 있어 큰 문제가 되지는 않는다. 더불어 워낙 실전 위주로 구성되어 내심 레이어의 갯수나 하이퍼파라미터를 선정하는 등 본인만의 실전 노하우가 공개되진 않을지 기대했었는데 역시나 그런 부분은 설명이 부족했다.

사실 이 부분들은 일반적인 방법론이 존재하지 않아 상황에 따라 노하우가 다르고, 그 어떤 책이나 커뮤니티에서도 언급을 피하니 본 도서만의 단점이라고 보긴 어렵다.ㅎㅎ

대상 독자로는 초급에서 중급으로 넘어가는 분들에게 가장 유용한 도서라고 생각한다. 깊은 원리에 대한 이해가 다소 부족하더라도 실무의 감을 빠르게 잡기 위한 숲을 보는 안목을 갖게 해준다.

더불어 열의를 가지고 학습하였으나 난이도의 벽에 부딪혀 포기를 고민중인 입문자 분들께도 좋은 솔루션이 되리라 본다. 본 도서는 그동안 이해되지 않았던 미싱링크들이 눈으로 직접 보고 손으로 코딩해 나가는 과정에서 연결되어가는 색다른 경험을 선사할 것이다.







© 2019.04. by theorydb

Powered by theorydb