쉽지 않은 AI 성능 최적화
만약에 스마트폰에서 찍은 사진을 웹사이트에 전송하면 고양이인지 아닌지를 머신러닝으로 판별해주는 프로젝트를 시작한다고 하자. 훈련 및 테스트 데이터는 웹사이트의 고양이 사진을 사용한다고 할 때, 실제 프로젝트의 성능은 기대에 못 미칠 확률이 높다. 사용자의 스마트폰에서 업로드 되는 사진은 웹사이트의 고양이 사진에 비해 조명이나 선명도, 해상도 등이 다르다. 이 경우에 성능을 높인다고 웹사이트의 고양이 사진을 다운로드 받아 만든 훈련 세트를 늘리면 성능은 높아질까?
데이터, 모델의 크기와 성능과의 상관관계
일반적으로 알고리즘의 성능을 높이는 보다 신뢰할 수 있는 방법으로, 심층신경망의 규모를 늘리거나, 데이터를 늘리는 방법이 거론되고 있다. 그러나 위와 같은 실제 프로젝트에서는 고려해야 할 사항이 좀 더 복잡하다.
이 경우, 훈련 데이터와 다르게 개발/테스트 세트 데이터로 분리하고, 가능하면 동일한 분포 데이터에서 개발 및 테스트 세트를 취득하고, 이와 더불어 단일 측정 지표를 가지는 등의 일이 필요하다. 예를 들어 정확도 혹은 F1 score 같은 하나의 지표말이다. 이것을 가지고 분류기 A와 분류기 B의 개발 세트에서의 지표를 비교하며 경우의 수를 판별해야 0.1%의 성능 향상이 어디에서 언제 일어났는지 혹은 개발 테스트 세트에서 과대적합(overfitting)이 일어났는지 등의 평가를 할 수 있다. 이와 더불어 주기적으로 테스트 세트 평가를 같이 병행하는 것이 필요하다.
편향과 편차
만약 알고리즘의 성능이 훈련 세트 오류 1%(99% 정확도), 개발 세트 오류 11%(89% 정확도)라고 하자. 이 경우 편향(bias)은 1% 그리고 편차(variance)는 10%( = 11% - 1%) 이다. 즉 편향은 훈련 세트 알고리즘의 오류율이다. 이는 분류기가 훈련 세트에서는 매우 작은 오류를 갖지만, 개발 세트에 적용하기에는 오류가 높은 것이다. 즉 범용적으로 일반화 하기에는 부적합한 상태, 우리는 이것을 과대적합(ovefitting)이라고 부른다.
또 다른 예를 살펴보자.
만약 알고리즘의 성능이 훈련 세트 오류 15%(85% 정확도), 개발 세트 오류 16%(84% 정확도)라고 하자. 이 경우 앞에서 배운 바와 같이 편향(bias)는 15% 그리고 편차(variance)는 1%(= 16% - 15%)이다. 이 경우 분류기가 훈련 세트에는 15% 오류로 썩 좋지 않은 성능이고 개발 세트에서의 오류율은 훈련 세트 오류율보다 약간 높다. 이 분류기는 높은 편향과 낮은 편차이다. 우리는 이 알고리즘이 과소적합(underfitting) 되었다고 한다.
이론적으로는, 편차(variance)는 대용량의 훈련 세트를 훈련함으로써 줄일 수 있다. 그리고 편향(bias)은 심층신경망의 층(layer)과 뉴론(unit)을 증가시키는 것과 같은 모델의 크기 증가를 통해 줄일 수 있다. 그러나 이는 또한 편차를 증가시켜 과대적합의 위험을 불러온다. 이런 경우, 잘 설계된 정규화(regularization) 방식을 사용하여 과대적합 문제를 피해가는 방법을 모색한다.
텐서보드
통상 모델을 개발하고 훈련 중간에 정확도와 손실률들을 출력하여 학습의 진행과정을 모니터하거나, matplot 시각화 도구 등을 통해서 정확도와 손실률을 훈련이 끝나고 난 후에 시각화하여 보곤 한다. 모델을 이해하고 디버깅 및 최적화를 돕기위해 시각화 도구인 텐서보드(Tensorboard)가 제공됨을 알고 있을 것이다. Pytorch를 사용하시는 분들은 Torch.utils.tensorboard 라이브러리를 사용하여 텐서보드를 사용할 수 있다.
주위에 보면 텐서보드를 잘 쓰는 분들도 있지만 노트북 프로그램안에 몇가지 추가하는 내용이 불편해서인지 사용하지 않는 분들도 많은 것 같다. 만약 훈련 손실률과 정확도 그리고 개발용 손실률과 정확도를 비교한다면 텐서보드가 무척 깔끔하게 처리된 시각화 화면을 제공한다. 즉 여러 시도들을 비교하여 epoch 증가에 따른 변화를 관측하기에 편리하다.
예를 들어, 텐서플로우 2.0 버전이 지원되는 이미지/커널환경에서는 엔쓰리엔클라우드의 Cheetah Notebook Extension 을 이용하여 별도의 어려운 처리 과정없이 쥬피터 노트북내에서 바로 임포트하여 사용할 수 있다.
간편한 텐서보드 실행
텐서보드를 시작하기 위하여 쥬피터 노트북이나 랩에서 Cheetah Notebook Extension을 로드하고
만약 Keras를 사용하는 프로그램의 경우 model compile 다음에 로그 지정 디렉토리와 tensorboard_callback을 지정하고
model.fit 에서 callbacks=[tesorboard_callback]) 을 정의한다.
그리고 아래와 같이 tensorboard를 실행하면
화면에 tensorboard가 뜬다.