‘블록과 함께 하는 파이썬 딥러닝 케라스’ 세미나 2

이번 세미나에서는 ‘2부 딥러닝 개념잡기’의 1장에서 3장까지 다룹니다.

우리는 이미 이전 세미나를 통해 딥러닝에 대한 개념은 잡고 출발했기 때문에 케라스 관련 부분만 주의를 기울이며 빠르게 읽어나가면 됩니다.

 

1장을 읽고, 데이터셋을 훈련셋, 검증셋, 시험셋으로 나누는 이유를 알아 보도록 합니다.

데이터셋을 구분하는 가장 중요한 이유는 오버피팅을 막기 위한 것이라고 생각합니다.

머신러닝의 목적은 일반화된 모델을 얻는 것인데, 이전에 접해 보지 못한 데이터에도 잘 작동해야 합니다. 오버피팅된 모델은 훈련 시에 사용한 데이터에 최적화되어서 새로운 데이터에는 잘 작동하지 않습니다. 모델을 훈련하는 데이터셋(훈련셋)과 모델을 평가하는 데이터셋(시험셋)은 분리해야 합니다.

모델을 훈련하는데에는 학습률과 같이 사용자가 설정해줘야 하는 것(하이퍼 파라미터)이 있습니다. 하이퍼 파라미터는 머신의 학습에 영향을 주기 때문에 머신의 학습 과정을 살펴보면서 설정 값을 조정해 주어야 합니다. 같은 데이터셋을 훈련과 하이퍼 파라미터 설정에 같이 사용할 경우 최적화되어 하이퍼 파라미터 조정의 의미가 없어집니다. 하이퍼 파라미터 설정도 하고 겸사 모델 평가도 하기 위해 검증셋을 도입합니다.

하이퍼 파라미터 결정도 결과적으로 보면 모델 훈련 과정이라고 할 수 있습니다. 가중치와 같은 매개변수를 결정하기 위해 머신이 훈련하고, 하이퍼 파라미터를 결정하기 위해 사용자가 훈련합니다. 훈련된 모델이 새로운 데이터에도 적합한 결과를 내는 일반화된 모델인지가 평가되어야 합니다. 훈련의 과정을 훈련과 검증으로 구분하면, 모델 학습 과정은 훈련, 검증, 시험으로 구분할 수 있습니다.

그런데 조금만 더 생각해보면, 하이퍼 파라미터 설정도 오버피팅 될 수 있음을 알 수 있습니다. 특정 검증셋을 가지고 했으니까요. 이 검증셋에 최적화 되어 새로운 데이터에는 잘 작동하지 않을 수 있습니다. 오버피팅 관점에서도 검증셋과 시험셋을 구분해야 한다는 것입니다.

교차검증 부분의 설명을 읽으면서 ‘특정 검증셋에 오버피팅되는 것을 막기 위해서 교차검증을 사용할 수도 있겠구나’라는 생각이 들었습니다.

이 장을 읽으면서 다음과 같은 의문이 듭니다.

‘검증의 결과와 시험의 결과에 문제가 생기면(훈련의 정확도와 검증의 정확도는 높은데 시험의 정확도가 낮은) 어떻게 하지?’

훈련의 결과와 검증의 결과에 문제가 생길 경우 어떻게 해결해야 하는지는 하이퍼 파라미터 설정과 관련해서 잘 설명이 되어 있습니다. ‘밑바닥부터 시작하는 딥러닝’ p 221 6.5에도 잘 나와 있습니다.  그런데 검증의 결과와 시험의 결과에 문제가 생길 경우에 대한 설명은 거의 못 본것 같습니다. 그래서 검색을 해보았습니다.  저와 같은 의문을 가진 사람들이 몇 있더군요.

같은 의문이 드신 분은 다음을 참조하시면 좋을 것 같습니다.

http://jaejunyoo.blogspot.com/2017/03/kr-nips-2016-tutorial-summary-nuts-and-bolts-of-building-AI-AndrewNg.html

https://www.youtube.com/watch?v=F1ka6a13S9I

 

2장, 3장을 읽고 케라스의 학습과정에 대해서 살펴봅니다.

p43. 케라스에서 만든 모델을 학습할 때는 fit 함수를 사용한다.  주요 인자는 다음과 같다.

x: 입력 데이터, y: 라벨 값, batch_size: 몇 개의 샘플로 가중치를 갱신할 것인지 지정, epochs: 학습 반복 횟수

p47. fit 함수는 히스토리 객체를 반환한다. 이 객체는 다음의 정보를 담고 있다.

매 에포크 마다의

  • 훈련 손실값 (loss)
  • 훈련 정확도 (acc)
  • 검증 손실값 (val_loss)
  • 검증 정확도 (val_acc)

p51~52. 텐서플로어는 텐서보드라는 훌륭한 학습과정 모니터링 툴을 제공하고 있다. 텐서플로우 기반으로 케라스를 구동할 경우 이 텐서보드를 사용할 수 있다.

TensorBoard라는 콜백함수를 생성한 뒤 fit 함수 인자로 넣어주기만 하면 된다. TensorBoard 콜백함수 생성 시 log_dir 인자에 경로를 넣어야 하는데, 이 경로에 텐서보드와 정보를 주고 받을 수 있는 파일이 생성된다.

텐서보드에서 모니터링하기 위해서 새로운 콘솔에서 가상환경을 실행하여 텐서보드를 띄웁니다.

tensorboard –logdir=<경로>

p58. 순환신경망 모델과 같이 기본적으로 제공하는 기능으로 모니터링이 안되는 경우 콜백함수를 직접 정의해서 사용해야 한다.

 

케라스를 처음 접하는 시점에서 p48-49의 소스코드는 좀 부담스럽습니다. 한 번 해 보는 정도로 만족하면 될 것 같습니다. 그래도 그냥 못 넘어가시는 분들을 위해 간단하게 몇 가지만 짚고 넘어가겠습니다.

케라스는 딥러닝 학습을 쉽게 할 수 있도록 몇 가지 데이터셋들을 제공합니다. MNIST는 손글씨 데이터셋으로 60000개의 훈련셋과 10000개의 시험셋을 제공합니다. MNIST를 사용해 딥러닝의 기본을 배우는 것은 프로그래밍 언어 학습에서의 Hello World에 해당합니다.

MNIST 데이터셋은 검증셋을 별도로 구분하지 않고 있기 때문에 훈련셋과 시험셋을 불러온 후, 훈련셋에서 검증셋을 분리합니다. 60000만 개의 훈련셋 중에서 50000개는 훈련셋으로 10000개는 검증셋으로 분리합니다.

처음 로드된 훈련셋은 60000개의 28 * 28 크기의 0~256의 값을 갖는 grayscale 픽셀 이미지들로 구성됩니다. 이것은 (60000, 28, 28) shape의 uint 타입 값(0~255 값 표현)을 갖는 배열로 제공됩니다.

0~255 사이의 uint 값을 0~1 사이의 float32 값으로 정규화합니다. 0~255 사이의 값을 0~1 사이의 값으로 바꾸기 위해서 255로 나누었습니다. 일차원 배열로 입력을 받기 위해서 28 * 28의 shape을 784로 변경합니다. 784는 28 곱하기 28한 것입니다.

실행을 간단히 하기 위해 훈련셋과 검증셋 일부만 랜덤하게 추출해서 사용합니다. 훈련셋 700개, 검증셋 300개를 사용합니다.

출력 값은 소프트맥스 값을 갖는 10개의 노드로 구성됩니다. 이것에 맞도록 훈련셋과 검증셋의 출력 레이블을 원핫인코딩 처리합니다.

케라스에서는 신경망을 레이어들로 구성된 모델로 표현합니다. 순차적으로 쌓아나가는 방식의 모델은 Sequential로 생성합니다. 레이어 중에 완전연결된(fully connected) 레이어를 Dense로 생성합니다. 입력 노드는 784개 이고, 히든 레이어의 노드는 2개, 완전연결되며, 활성화함수로 ReLU를 사용합니다. 출력은 노드는 10개, 완전연결되며, 활성화함수는 Softmax입니다.

손실함수는 Categorical Crossentropy를 사용하며, 확률적 경사 하강법(SGD)로 최적화합니다. 모니터링 지표는 정확도입니다.

배치크기는 10이고 1000 epochs 학습시킵니다.

수행결과를 보면, 검증셋의 손실값은 1.5 밑으로 떨어지지 않고, 정확도도 50% 수준으로 낮게 나타납니다. 이것은 히든 레이어의 노드 갯수를 2개만 사용하고 있고, 훈련셋과 검증셋도 아주 일부만 추출해서 사용하고 있기 때문입니다. 좀 더 만족스러운 결과를 얻으려면 훈련셋과 검증셋 고르기 부분을 주석처리하고, 모델 구성하기의 첫 번째 추가되는 레이어의 units 값을 2에서 512로 바꿉니다. 모델 학습과정 설정하기의 optimizer를 rmsprop로 바꾸고, 모델 학습시키기의 데이터셋의 크기가 늘었으니  batch_size는 128로 바꾸고, 시간이 오래 걸리니 epochs는 5~10정도 값으로 바꿉니다.

 

앞으로 진행을 위해 다음을 참조해서 matplotlib 사용법을 익히는 것이 좋을 듯 합니다.

https://www.slideshare.net/dahlmoon/matplotlib-20160730

p53의 tensorboard –logdir 설정에서 주의할 사항으로 절대경로를 지정하라고 언급하고 있습니다. ‘주의할 사항’과 ‘절대경로’라는 단어로 인해 괜히 주의를 기울이게 되어 약간 혼란스러웠습니다.

해당 프로젝트 하위 경로를 찾을 수 있도록 절대경로든 상대경로든 작성하면 됩니다. 명령창을 실행시키고 바로 절대경로로 작성해도 되고, 해당 프로젝트 폴더로 이동해서 ‘./graph’와 같이 상대경로로 작성해도 됩니다.

About the Author
(주)뉴테크프라임 대표 김현남입니다. 저에 대해 좀 더 알기를 원하시는 분은 아래 링크를 참조하세요. http://www.umlcert.com/kimhn/

Leave a Reply

*