페이지

2020년 9월 28일 월요일

AI는 데이터가 늘어나면 성능이 증가하기만 할까?

 

쉽지 않은 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) 방식을 사용하여 과대적합 문제를 피해가는 방법을 모색한다.


홈 그라운드와 호주 원정 경기

지금까지 살펴본 내용을 국가 대항 양궁 시합에 비유해 본다면 이럴 것 같다. 양궁 선수들이 실내체육관의 환경에서 과녁에 명중시키는 훈련을 10,000번의 활시위를 당겨 거의 과녁의 중심에 맞추게 되었다면 이는 국내 훈련 환경에 과대적합 되었다고 말할 수 있다. 원정 경기에서는 일정한 방향으로 바람이 불어 한국에서는 정가운데 명중하던 활시위가 호주 원정 경기장에서는 과녁의 우상향에 일정하게 몰려있다면 이는 피할 수 없는 편향이라고 볼 수 있다. 원정 경기장의 소음에 놀라 표적 위아래로 산발적으로 펼쳐서 활시위가 퍼져있다면 이는 국내 연습 대비 편차이다.  원정 경기의 상태가 바람이 심하게 불고 소음도 무척 심한 상태인 것에 대비해서 국내에서 훈련하면서 바람이 불어 대며 소음이 있는 환경을 만들어 훈련에 대비했다면 이는 테스트 세트 평가를 같이 병행하여 데이터 변화에 대비했다고도 볼 수 있다.

  비유가 적절했는지 모르지만, 불특정 다수의 사용자로부터 이미지 입력을 받는 것과 같은 상태의 프로젝트에서는 머신러닝 알고리즘이 훈련한 데이터와, 개발 및 테스트로 나뉜 데이터의 이질성을 염두에 두는 것과 같이 성능 최적화는 여러 변수를 염두에 두고 전략을 생각해 볼 필요가 있다는 점이다.


텐서보드(TensorBoard)
  

통상 모델을 개발하고 훈련 중간에 정확도와 손실률들을 출력하여 학습의 진행과정을 모니터하거나, 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 를 실행하면



화면에 텐서보드가 뜬다.



댓글 없음:

댓글 쓰기