케라스 창시자에게 배우는 딥러닝 CH6

jkky98·2023년 1월 17일
0

DataScience

목록 보기
4/26
post-thumbnail

Chaper6. 일반적인 머신 러닝 워크플로
keras.datasets에서 원하는 데이터를 추출하여 딥러닝 모델을 훈련할 수 있다면 매우 편리하겠지만, 실전에서는 이러한 편리한 툴은 존재하지 않는다. 일반적인 머신러닝 워크플로는 크게 세 부분으로 구성된다.

  1. 작업정의 : 문제 영역과 고객의 요청 이면에 있는 비즈니스 로직을 이해한다. 이에 따라 데이터를 수집하고, 데이터가 드러내는 내용을 이해하고 작업의 성공을 측정하는 방법을 선택한다.
  2. 모델개발 : 머신러닝 모델로 처리 가능하게끔 데이터를 변환하고 모델 평가방법과 평가에 대한 기준점을 선택하고, 일반화 성능을 가지며 과대적합가능한 첫 모델을 훈련한다. 그 후 가능한 최대의 일반화 성능에 도달할 때 까지 모델을 튜닝한다.
  3. 모델배포 : 작업 결과를 고객에게 제시한 후 모델을 웹 서버, 모바일 앱, 웹 페이지 또는 임베디드 장치에 배포하여 실전에서 모델의 성능을 모니터링한다.

작업정의

문제 정의
머신 러닝 문제를 정의하려면 고객과의 세부 논의와 도메인에 대한 지식들이 필요합니다. 입력 데이터가 무엇인지, 어떤 것을 예측하고 싶은지, 현재 당면한 문제가 무엇인지, 어떤 문제로 분류해야할 지, 기존의 솔루션은 어떤 것이 있는지, 고려해야할 제약이 있는지 등을 문제정의 단계에서 고려해야한다.

데이터 수집
대부분의 머신 러닝 프로젝트에서 가장 힘들고 시간이 많이 걸리며 비용이 많이 드는 단계이다. 5장에서 모델의 일반화 능력은 데이터의 속성(데이터 수, 레이블의 신뢰도, 특성 품질)에 의해 좌지우지 된다는 것을 배웠다. 좋은 데이터셋은 머신러닝 프로젝트의 성공의 핵심 키이며, 만약 프로젝트에 시간을 더 투여할 수 있다면, 모델의 개선점을 찾는 것보다 더 많은 데이터를 수집하는 것이 시간을 효과적으로 사용하는 방법일 확률이 높다.
"The Unreasonable Effectiveness of Data".2009 논문에서 알고리즘보다 데이터가 더 중요하다는 점이 나타나있다.

데이터 에너테이션(annotation) : 데이터셋에 메타데이터를 추가하는 것으로, 위의 예시를 보면 간편하게 이해가능하다. 사진이라는 데이터 안에 객체들이 라벨링되어있다. 한국에서는 주로 데이터 에너테이션이 데이터 라벨링으로 쓰이는 경우가 많다.(비전이 유행하기 때문?) 데이터 안에 데이터가 또 있는 것으로 머신러닝 모델은 해당 메타데이터들을 이용할 수 있게 된다.

개념 이동(concept drift) : 사용자가 생성한 데이터를 다룰 때 많이 만나게 된다. 제품환경에서 데이터의 속성이 시간에 따라 변할 때 일어난다. 이로 인해 모델의 정확도가 점진적으로 감소된다. 11년도에 수집한 IMDB 데이터셋으로 훈련한 모델은 12년 리뷰에 비해 20년 리뷰에서 성능이 좋지 않을 것이다. 어휘, 표현, 영화 장르가 시간에 따라 변화하기 때문이다. 빠르게 변하는 개념 이동에 대처하려면 지속적인 데이터 수집과 애너테이션, 모델 재훈련이 필요하다.

퀀트 트레이딩에서의 개념이동
일반적으로 퀀트 트레이딩에서 헤지펀드의 규모가 아니라 개인의 영역에서 머신러닝으로 매매법을 만드는 경우는 극히 드물다. 개인 퀀트 플레이어들은 최대한 일반화된 로직을 테스트하고 연구하여, 실전에 적용한다. 만약 과거 1년 데이터에 대해서만 테스트를 진행할 경우 그렇게 적용된 알고리즘의 대부분은 금방 알파효과가 소실된다.


모델 개발

이전장에서 학습하였듯이 딥러닝 모델은 일반적으로 원시 데이터를 사용하지 않고, 데이터 전처리과정이 필요하다. 여기에는 벡터화, 정규화, 누락값 다루기 등이 포함된다. 많은 전처리 기법들은 도메인에 특화되어 있다. 일반적으로 모든 데이터 분야에 적용되는 공통된 기본사항은 다음과 같다.

  • 벡터화 : 신경망에서 모든 입력과 타깃은 일반적으로 부동 소수점 데이터로 이루어진 텐서여야 한다. 사운드, 이미지등 무엇이든지 텐서로 변환시켜야한다. 이를 데이터 벡터화라고 한다.
  • 값 정규화 : MNIST의 경우 데이터들이 0~255 사이의 정수로 인코딩 되어있었다. 이 데이터를 모델에 주입하기 전에 float32타입으로 변경하고 255로 나누어 최종적으로 0~1 사이의 부동 소수점 값으로 만들었다.
  • 누락 값 처리 : 범주형 특성이라면 "누락된 값"이라는 의미의 새로운 범주를 만드는 것이 안전하며, 수치형 특성이라면 임의의 값을 넣는 것이 아닌 해당 특성의 평균이나 중간값으로 대체하는 것을 고려해볼 수 있다.

평가 방법 선택
5장에서 알아 보았던 평가 방법 세가지 검증방법

  • 홀드아웃 검증 : 데이터가 풍부할 때
  • K-Fold 교차검증 : 샘플 개수가 너무 적을 때
  • 반복 K-Fold 교차검증 : 데이터가 적고 매우 정확한 모델 평가가 필요할 때

More than original model
모델을 설계할 때 초기 목표는 아주 간단한 기준점을 넘을 수 있는 작은 모델을 개발하는 것이다. 그러고 난 후 특성공학을 통해 유용하지 않은 특성을 제외, 도메인 지식등을 사용하여 새 특성을 만든다. 올바른 구조선택 또한 중요하다. 우리는 어떤 신경망을 사용할지 결정해야하며, 또한 딥러닝 툴자체가 좋은 접근 방법인지도 고려해야한다. 또한 좋은 훈련 옵션선택 또한 중요하다. 어떤 손실함수와 배치크기, 학습률을 사용할지이다.

모델의 최적화와 일반화
우리는 5장에서 배웠듯 우선 모델을 과최적화시켜 충분히 과하게 두어 검증점수의 진행상황을 보며 일반화 지점을 찾아 재학습 시켰다. 그러한 과최적화를 위해 층을 추가, 층의 크기를 추가, 더 많은 에포크에서 훈련등을 이용할 수 있고 모델 규제와 하이퍼 파라미터 튜닝을 통해 일반화 성능을 확보한다. 반복적으로 모델을 수정하고 검증 데이터에서 평가한다.

  • 케라스 튜너(KerasTuner)를 이용하면 자동화된 튜닝이 가능하다(13장)
  • 주의점 : 검증 과정에서 얻은 피드백을 사용하여 모델을 튜닝할 때마다 정보누설이 심해진다는 것을 유념하자.

모델 배포

모델을 배포하기 전에 고객에게 작업을 설명해야한다. 고객들은 때때로 사람 수준의 성능을 기대할 수 있다. 머신 러닝 모델은 사람이 사람이 생성한 레이블을 근사하기 위해 훈련되기 때문에 대부분 레이블을 완벽하게 예측해내지 못한다. 우리는 성능의 설명을 위해 추상적인 문장으로써 모델이 98% 정확도를 달성했다는 말보다는 FN, FP에 대해 이야기하는 것이 좋다.

우리가 파이썬으로 제작한 모델 객체는 그대로 제품에 배포되는 경우는 드물다. 파이썬이 아닌 다른 방식으로 모델을 저장가능하며, 제품 환경이 파이썬을 지원하지 않을 수 있고, 애플리케이션이 파이썬으로 작성되지 않을 수 있다. 제품 모델은 훈련이 아니라 예측을 만들기 위해서만 사용된다.(이 단계를 추론이라고 한다.)

여러가지 모델 배포방법

  • 서버나 클라우드 인스턴스에 텐서플로를 설치하고 REST API로 모델의 예측을 요청하는 경우, 모델의 예측을 사용할 애플리케이션이 인터넷에 안정적으로 접속할 수 있어야 하며, 일반적으로 요청, 추론, 응답의 과정에서 500ms가 걸리며, 서버에서는 암호화되지 않은 형태의 데이터를 사용할 수 있어야 한다.
  • 모델이 애플리케이션이 실행되는 동일한 장치에서 구동해야할 경우, 모델의 응답속도에 대한 제약이 엄격하거나, 인터넷 연결이 불안정할 수 있으며, 대상 장치의 메모리와 전력 조건에서 실행될 수 있도록 모델을 작게 만들어야하며, 실행 효율성과 정확도 사이에서의 절충점을 찾아야한다. 보통 특정 디바이스이므로 입력 데이터에 매우 민감한 정보가 포함되어 원격 서버에서 암호화가 해제되어서는 안된다.
  • 브라우저또는 desktop기반의 JS 어플리케이션에서 사용되는 경우, 입력 데이터가 사용자의 컴퓨터 또는 핸드폰에 있어야하고, 응답 속도 제약이 엄격하며, 인터넷이 연결되지 않은 상태에서 작동하는 앱이 필요하다. Tensorflow.js로 임포트하여 브라우저 기반의 js앱의 일부로 사용가능하다.
profile
자바집사의 거북이 수련법

0개의 댓글