14 January 2018

길벗출판사의 개발자 리뷰어 이벤트를 통해 작성된 리뷰입니다.

index_image index_image

최근 케라스에 관심을 갖게 된건 캐글 경진대회에서 상위권에 든 사람들이 케라스를 사용한 것을 보고 부터다. 하지만 케라스로 출판된 책이 많지 않아 책으로 정리 된 내용을 학습하고 싶었는데 최근 케라스 책이 몇 권 출판 되었다. 이 책도 그 중 하나로 딥러닝에 대한 이론 소개와 함께 칼텍의 데이터셋을 통해 사물인식을 해볼 수 있는 예제와 삼목게임을 통한 강화학습으로 이루어져 있다. 케라스는 공식문서의 튜토리얼에서 30초만에 시작할 수 있다고 소개하는 만큼 쉽게 시작할 수 있다고 한다. 이 책은 케라스를 통해 딥러닝을 실험해 볼 수 있도록 어려운 수식보다는 코드를 통해 이해할 수 있도록 구성되어 있다. 4장은 이 책에서 가장 많은 비중을 차지하고 있으며 공통 데이터를 구축하고 9층, 16층, 152층의 네트워크로 학습과 예측을 하여 예측 정확도를 비교한다. 2단계 일반화와 자기 학습을 실행해서 모델 평균의 정답률을 올려본다. 그리고 6장에서는 딥러닝을 이용한 강화학습도 다루고 있다. 딥러닝을 시작한지 얼마 되지 않은 초보자로서 딥러닝 내부의 이론과 논문 자료들은 아직도 이해하기 어렵고 복잡하다. 방대한 딥러닝 이론을 깊이있게 알지는 못하더라도 코드를 통해 직접 딥러닝으로 이미지를 판별하고 예측해 볼 수 있다. 모델의 층을 늘려가면서 정답률을 올려볼 수 있는 예제를 돌려보면 케라스의 활용방법에 대해서는 어느정도 이해할 수 있는 책이다. 예제의 소스코드는 파이썬2로 작성되어 있으며 백엔드로는 Theano를 사용한다. 또 GPU를 통해 학습한다는 것을 전제로 하고 있기 때문에 CPU환경에서 돌리려면 성능을 비롯한 제약이 있다. 케라스를 학습하는 것 뿐만 아니라 케라스를 통해 무언가를 구현하고 직접 실험해 보고자 하는 목적에 충실한 책이다.

index_image index_image

그리고 아래는 책을 읽으며 정리한 내용이다.

1장

1장에서는 딥러닝의 성과로 시작한다. 음성인식의 경우 딥러닝을 사용함으로 과거에 비해 오답률이 20~30% 낮아졌다고 한다. 이 책에서는 이미지의 클래스 분류, 물체 검출, 강화학습을 다룬다. 이미지처리에서는 사진 속에 있는 사물을 검출하는 물체 검출을 다루며 엑스레이에서 암세포의 위치와 형태를 예측하는 것도 할 수 있다. 데이터를 다룰 때 예측의 정확도를 높이는 데이터의 확장, 전처리에 대한 사전처리 기법을 다룬다. 그리고 이 책에서 다루는 데이터셋은 칼텍에서 제공하는 머신러닝 이미지 Caltech 101을 사용한다. 그리고 이 이미지들은 101개의 카테고리로 분류하여 각각의 레이블을 붙여놓았다.

케라스는 Theano, 텐서플로우용 라이브러리로 간단하게 딥러닝을 실행할 수 있다.

그리고 GPU를 활용할 수 있는 방법에 대한 안내도 있다. GPU는 3차원 그래픽 계산을 처리하는 프로세서이지만 딥러닝의 방대한 행렬연산을 수행할 때 학습과 예측에 걸리는 시간을 10배 이상 줄여줄 수 있다. 여기에서는 게임용PC를 딥러닝용으로 셋팅하는 방법에 대해서도 소개하는데 우분투설치와 셋팅 방법까지 소개하고 있다.

2장 네트워크의 구성

chapter02

chapter02

chapter02

2장은 네트워크 구성으로 이미지 인식 분야에서 이용되는 네트워크와 층의 기본 구조를 설명한다. FFNN, FNN, CNN을 합성곱 이미지와 함께 설명해 준다.

3장

3장은 기본 용어로 과학습을 제어하여 예측정확도를 높이는 방법을 설명한다.

chapter03

chapter03

1) 딥러닝에는 입력데이터와 그 입력데이터의 지도학습 데이터가 있으며 예측 된 출력 데이터와 지도 학습 데이터의 오차를 이용하여 각 층의 가중치를 업데이트 해서 최적의 가중치를 구한다.

2) 활성화 함수는 뇌의 시냅스가 어떤 임계값을 초과하면 활성화하는 것처럼 움직임을 모방하기 때문에 활성화 함수(전달 함수 또는 출력 함수)라고도 한다.

chapter03

3) 손실문제는 예측한 출력 데이터와 지도 학습 데이터를 비교하여 오차를 계산하는 함수다. 여기에서는 평균 제곱 오차(mean squared error), 크로스 엔트로피(cross-entropy)는 클래스를 분류하는 오차함수를 소개한다.

chapter03

4) 확률적 경사 하강법(Stochastic Gradient Descent, SGD)은 가중치w에 대한 오차 E의 경사를 구해 경사가 양의 부호이면 w를 음의 방향으로 업데이트 하고 반대로 경사가 음의 부호면 w를 양의 방향으로 업데이트 한다. 모멘텀은 가중치의 업데이트양(벡터)이 이전 가중치의 업데이트양(벡터)과 방향이 크게 변하지 않게 하는 기능이다. 예를 들어 자동차의 핸들을 급하게 크게 틀어도 타이어의 각도는 서서히 변하는 것과 같은 이치다.

chapter03

5) 오차역전파법(back propagation) 출력층에서 역방향으로 진행해서 오차 신호를 입력층 쪽으로 점차 전파하여 가는 산출방법이다.

6) 트레이닝 데이터셋에 특화 된 파라미터가 나오는 것을 과잉 적합 또는 과학습이라 한다. 이를 통제하기 위해 K분할 교차 검증, 홀드아웃 검증을 사용한다.

  • 정규화 : 딥러닝 네트워크에는 많은 가중치(파라미터)가 있다. 학습할 때 이 파라미터 값에 제약을 주어서 과학습을 억제하는 방법을 정규화라고 한다. 정규화 중 하나로 가중치 감쇠 방법이 있는데 기존 손실 함수에 가중치의 제곱합을 더한 것을 새로운 손실 함으로 한다. 손실 함수의 값이 작을 수록 가중치를 업데이트하는데 가중치를 업데이트 할 때 각 가중치의 값이 극단적으로 큰 값 또는 작은 값을 갖지 않도록 파라미터에 제약을 가하는 방법이다.
  • 드롭아웃 : 층의 유닛을 드롭아웃하면서 학습하는 것으로 과학습을 억제하는 방법이다.

7) 데이터 확장과 전처리 데이터 확장은 트레이닝 데이터셋을 기초로 변형된 데이터셋을 만들어 데이터의 양을 증가시키다. 트레이닝 데이터셋과 테스트 데이터셋이 한쪽으로 치우쳐져 있다면 전처리를 해서 보정할 수 있다. 트레이닝 데이터셋에서 하는 전처리는 테스트 데이터셋에서도 해야 한다.

chapter03

8) 사전 학습된 모델 사전 학습된 모델을 이용하는 바법을 전이 학습이라고 한다. 파인튜닝은 사전 학습된 모델의 가중치를 신경망 가중치의 초깃값으로 설정하고, 새로운 트레이닝 데이터셋을 사용하여 재학습하는 방법이다. 파인튜닝을 하면 작은 에폭 수로도 높은 성능을 얻을 수 있다.

9) 학습 계수 조정

  • AdaGrad
  • RMSProp
  • Adam

4장 이미지 클래스의 분류

chapter04

chapter04

chapter04

이 책에서 가장 많은 비중을 차지하고 있는 챕터로 실제 딥러닝PC를 사용해 학습과 예측을 하는 것을 설명한다. 공통 데이터를 구축한 후 9층, 16층, 152층의 네트워크로 학습과 예측을 실행하여 예측의 정확도를 비교한다. CUDA환경에서 실행해 보는 것을 가정하고 있기 때문에 환경이 다르면 성능에 제약이 있고 사소하지만 가상환경 설정 내용이 pip freeze 되어 있으면 구성이 좀 더 편할 거 같다. 그리고 imagemagicK 같은 일부 라이브러리에 대한 설치 안내가 좀 부족한 편이다. 백엔드로 돌아가는 텐서플로우와 Theano에 대한 버전도 맞춰주어야 하는 데 환경설정에 관련 된 부분이 좀 더 친절했으면 하는 아쉬움이 있다.

5장 물체 검출 : 26층의 네트워크

chapter05

chapter06

Yolo(You only look once) : 물체의 의치, 크기, 종류 예측에 사용되며 동영상에서 실시간으로 물체를 검출하는 기능도 있지만 이 책에서는 정지 이미지에 물체를 검출하는 기능을 사용한다. 신경망을 이용하는 물체 검출에는 R-CNN과 Fast R-CNN이 있다. Yolo처럼 물체 검출 성능이 있고 R-CNN의 1000배, Fast R-CNN의 100배 정도 고속으로 처리할 수 있다고 알려져 있다.

6장 강화 학습 : 삼목 게임에 강한 컴퓨터 키우기

강화 학습은 이세돌과 알파고의 바둑대결에서 영국의 구글 딥마인드가 개발한 컴퓨터 바둑 프로그램으로 강화 학습 방법으로 만들었다.

  • Q러닝 : 강화학습에는 각 행동에 지도 학습 데이터가 붙어있지 않다. 지도 학습 데이터 대신에 각 행동에 Q값의 지표를 예측하여 부여한다. 바둑과 장기에서 도중에 한 수는 좋은지 나쁜지 알 수 없지만, 최후에 승리하면 그때까지 둔 일련의 수가 좋다고 생각하게 되는게 강화 학습의 특성이며 지도 학습 데이터를 단순하게 구현할 수 없는 복잡한 행동에서도 학습이 가능하다.

  • DQN : Q러닝에서 모든 상태, 행동을 망라할 수는 없지만 딥러닝을 이용하여 근사적인 Q값을 구한 것으로 보상받을 가능성이 높은 다음 한 수를 예상하는 것은 가능하다. Q러닝과 딥러닝을 이용한 모델을 DQN이라 한다.

정리

케라스에 대한 책이 많지 않아 정리 된 내용을 보고 싶었는데 최근에 출간 된 책으로 케라스를 학습할 수 있었다. 아직 케라스를 많이 사용해 보지는 않았지만 백엔드를 Theano나 텐서플로우를 사용하고 다른 딥러닝 알고리즘에 비해쉽게 사용할 수 있기 때문에 앞으로도 케라스를 계속 사용해 볼 예정이다. 이 책을 통해 케라스의 기본 개념과 딥러닝 이론에 대해 정리할 수 있었다.