머신 러닝의 일반적인 워크플로
- 작업 정의 : 문제 영역과 고객의 요청 이면에 있는 비즈니스 로직을 이해한다. 데이터를 수집하고, 데이터가 드러내는 내용을 이해하고, 작업의 성공을 측정하는 방법을 선택한다.
- 모델 개발 : 머신 러닝 모델로 처리할 수 있는 데이터를 준비하고, 모델 평가 방법과 간단한 기준점을 선택하고, 일반화 성능을 가지며 과대적합할 수 있는 첫 번째 몯델을 훈련한다. 그 다음 가능한 최대의 일반화 성능에 도달할 때까지 모델에 규제를 추가하고 튜닝한다.
- 모델 배포 : 작업 결과를 고객에게 제시한다. 모델을 웹 서버, 모바일 앱, 웹 페이지 또는 임베디드 장치에 배포하고 실전에서 모델의 성능을 모니터링한다. 차세대 모델을 구축하기 위해 필요한 데이터 수집을 시작한다.
6.1 작업 정의
6.1.1 문제 정의
머신 러닝 문제를 정의하려면 일반적으로 고객과 많은 세부 논의가 필요하다.
6.1.2 데이터 수집
작업 특성을 이해하고, 입력과 타깃이 무엇인지 알게 되면 데이터를 수집할 차례다. 대부분의 머신 러닝 프로젝트에서 가장 힘들고 시간이 많이 걸리며 비용이 많이 드는 단계이다.
5장에서 모델의 일반화 능력은 거의 모두 훈련되는 데이터의 속성(데이터 포인트 개수, 레이블의 신뢰도, 특성 품질)에서 온다고 했다. 좋은 데이터셋은 관리하고 투자할 가치가 있는 자산이다. 프로젝트에 시간을 더 쓸 수 있다면 모델링 개선점을 찾는 것보다 더 많은 데이터를 수집하는 것이 이 시간을 가장 효과적으로 사용하는 방법다.
애너테이션(annotation) : (이미지 같은) 입력을 수집하고 예측 모델을 훈련할 타깃 (이미지 태그)
ㄴ 음악 추천이나 클릭률 예측 같은 작업에서는 애너테이션을 자동으로 추출할 수 있다. 하지만 많은 경우에 수동으로 데이터에 레이블을 달아야 한다.
데이터 애너테이션 인프라에 투자하기
데이터 애너테이션 과정이 타깃의 품질을 결정하며 결과적으로 모델의 품질을 결정한다.
- 직접 데이터에 애너테이션을 수행해야 하나요?
- 레이블을 모으기 위해 미케니컬 터크(Mechanical Turk) 같은 크라우드소싱(crowdsourcing) 플랫폼을 사용해야 하나요?
- 전문적인 데이터 레이블링 회사의 서비스를 사용해야 하나요?
아웃소싱은 잠재적으로 시간과 비용을 절약할 수 있지만 통제권이 넘어간다. 미케니컬 터크 같은 서비스는 비용이 많이 들지 않고 쉽게 규모를 확장할 수 있지만 애너테이션에 잡음이 꽤 들어갈 수 있다.
최선의 옵션을 고르기 위해 현재 작업의 제약 조건을 고려하세요.
- 데이터에 레이블을 할당할 사람이 해당 분야의 전문가야 하나요? 아니면 아무나 레이블을 달 수 있나요? 고양이와 강아지 이미지를 분류하는 문제의 레이블은 누구나 부여할 수 있지만 강아지 품종을 분류하는 작업에 필요한 레이블은 전문적인 지식이 필요하다. 골절 CT 영상을 위한 애너테이션을 만들려면 의학 학위가 필요하다.
- 데이터 애너테이션에 전문적인 지식이 필요하다면 이를 위해 사람을 훈련시킬 수 있나요? 그렇지 않다면 관련된 전문가를 구할 수 있나요?
- 전문가의 애너테이션 작업을 여러분이 이해하고 있나요? 그렇지 않다면 데이터셋을 블랙박스처럼 다루어야 하므로 수동으로 특성 공학을 수행할 수 없다. 이것이 치명적이지는 않지만 제약이 될 수 있다.
대표성 없는 데이터 주의하기
머신 러닝 모델은 이전에 본 샘플과 비슷한 입력만 이해할 수 있다. 따라서 훈련에 사용하는 데이터가 제품 환경에 있는 데이터를 대표하는 것이 중요하다.
가능하다면 모델이 사용될 환경에서 직접 데이터를 수집하는 것이 좋다. 영화 리뷰 감성 분류 모델은 옐프(Yelp) 음식점 리뷰나 트위터 메시지가 아니라 새로운 IMDB 리뷰에 적용되어야 한다. 트윗의 감성을 평가하고 싶다면 제품에서 기대하는 사용자와 비슷한 사용자들의 실제 트윗 데이터를 수집하고 애너테이션을 만드는 것이 좋다. 제품 환경에서 수집한 데이터로 훈련하는 것이 불가능하다면 훈련 데이터와 실전 데이터 사이의 차이점을 완전히 이해하고, 이런 차이점을 좁히기 위해 적극적으로 노력해야 한다.
개념 이동(concept drift) : 제품 환경에서 데이터의 속성이 시간에 따라 변할 때 일어나는데, 이로인 해 모델의 정확도가 점진적으로 감소된다.
ㄴ 부정한 패턴이 매일 바뀌는 신용 카드 부정 거래 감지와 같은 적대적인 상황에서 특히 심각하다.
ㄴ 빠르게 변하는 개념 이동에 대처하려면 지속적인 데이터 수집, 애너테이션, 모델 재훈련이 필요
6.1.3 데이터 이해
모델 훈련을 시작하기 전에 데이터를 탐색하고 시각화하여 예측 능력을 가진 특성에 대한 통찰을 얻어야 한다. 이를 통해 특성 공학에 대한 정보를 얻고 가능성 있는 문제를 걸러 낼 수 있다.
6.1.4 성공 지표 선택
어떤 것을 제어하려면 관측할 수 있어야 한다. 프로젝트에서 성공하기 위해서는 먼저 성공이 무엇인가를 정의해야 한다.
클래스 분포가 균일한 분류 문제에서는 정확도와 ROC(Receiver Operating Characteristic) 곡선 아래의 면적인 ROC AUC가 일반적인 지표이다. 클래스 분포가 균일하지 않은 문제나 랭킹 문제, 다중 레이블 문제에는 정밀도와 재현율을 사용할 수 있다. 또는 정확도가 ROC AUC의 가중 평균을 사용할 수 있다.
6.2 모델 개발
6.2.1 데이터 준비
이전에 배웠듯이 딥러닝 모델은 일반적으로 원시 데이터를 사용하지 않는다. 데이터 전처리 목적은 주어진 원본 데이터를 신경망에 적용하기 쉽도록 만드는 것이다. 여기에는 벡터화(vectorization), 정규화(normalization), 누락된 값 다루기 등이 포함됩니다.
벡터화
신경망에서 모든 입력과 타깃은 일반적으로 부동 소수점 데이터로 이루어진 텐서(또는 특정 경우에 정수나 문자열로 이루어진 텐서)여야 한다.
데이터 벡터화(data vectorization) : 사운드, 이미지, 텍스트 등 처리해야 할 것이 무엇이든지 먼저 텐서로 변환한다.
ㄴ (4장) 2개의 텍스트 분류 예제에서 텍스트를 (단어 시퀀스를 의미하는) 정수 리스트로 변환했다. 그다음 원-핫 인코딩을 사용하여 float32 타입의 데이터로 이루어진 텐서로 바꿨다. 숫자 이미지 분류와 주택 가격 예측의 예에서는 데이터가 벡터 형태로 주어졌으므로 이 단계를 건너뛰었다.
값 정규화
MNIST 숫자 이미지 분류 예에서 이미지 데이터를 그레이스케일 인코딩인 0~255 사이의 정수로 인코딩했다. 이 데이터를 네트워크에 주입하기 전에 float32 타입으로 변경하고 255로 나누어서 최종적으로 0~1 사이의 부동 소수점 값으로 만들었다.
주택 가격을 예측할 때는 특성들의 범위가 제각각이다. 어떤 특성은 작은 부동 소수점 값이고 다른 특성은 매우 큰 정수 값을 가졌다. 이 데이터를 네트워크에 주입하기 전에 각 특성을 독립적으로 정규화하여 평균이 0이고 표준 편차가 1이 되도록 만들었다.
일반적으로 비교적 큰 값(예를 들어 네트워크의 가중치 초깃값보다 훨씬 큰 여러 자릿수를 가진 정수)이나 균일하지 않은 데이터(예를 들어 한 특성의 범위는 0~1이고 다른 특성은 100~200인 데이터)를 신경망에 주입하는 것은 위험하다. 이렇게 하면 업데이트할 그레디언트가 커져 네트워크가 수렴하는 것을 방해한다. 네트워크를 쉽게 학습시키려면 데이터가 다음 특징을 따라야 한다.
- 작은 값을 취합니다: 일반적으로 대부분의 값이 0~1 사이여야 합니다.
- 균일해야 합니다: 즉, 모든 특성이 대체로 비슷한 범위를 가져야 합니다.
- 각 특성별로 평균이 0이 되도록 정규화합니다.
- 각 특성별로 표준 편차가 1이 되도록 정규화합니다.
누락된 값 처리하기
가끔씩 데이터에 값이 누락된 경우가 있다. 이 특성을 완전히 삭제할 수 있지만 반드시 그럴 필요는 없다.
- 범주형 특성 : ‘누락된 값’이라는 의미의 새로운 범주를 만드는 것이 안전. 모델이 타깃에 대해 이것이 의미하는 바를 자동으로 학습할 것이다.
- 수치형 특성 : ‘0’ 같은 임의의 값을 넣지 않도록 하세요. 특성이 만드는 잠재 공간에 불연속성을 만들어 이런 데이터에서 훈련한 모델이 일반화되기 어려울 수 있기 때문이다. 그 대신 누락된 값을 해당 특성의 평균이나 중간 값으로 대체하는 것이 좋다. 또는 다른 특성 값에서 누락된 특성 값을 예측하는 모델을 훈련할 수도 있다.
6.2.2 평가 방법 선택
모델의 목적은 일반화를 달성하는 것이다. 모델 개발 과정 전반에 걸친 모든 모델링 결정은 일반화 성능을 측정하는 검증 지표에 의해 내려진다.
검증 과정의 목표 : 실전 제품 환경에서 어떤 성공 지표(예를 들어 정확도)를 사용할지 정확하게 추정하는 것
(5장) 세 가지 평가 방법
- 홀드아웃 검증: 데이터가 풍부할 때 사용
- K-겹 교차 검증: 홀드아웃 검증을 사용하기에 샘플 개수가 너무 적을 때 좋은 선택
- 반복 K-겹 교차 검증: 데이터가 적고 매우 정확한 모델 평가가 필요할 때 사용
6.2.3 기준 모델 뛰어넘기
모델을 다루기 시작할 때 초기 목표 : 통계적 검정력(statistical power)을 달성하는 것
ㄴ 즉, 아주 간단한 기준점을 넘을 수 있는 작은 모델 개발
이 단계에서 가장 중요하게 중점을 둘 세 가지
- 특성 공학 : 유용하지 않은 특성을 제외하고(특성 선택), 문제에 대한 지식을 사용하여 유용할 것 같은 새 특성을 개발한다.
- 구조에 대한 올바른 가정 : 어떤 종류의 모델 구조를 사용할 것인가요? 밀집 연결 신경망, 합성곱 신경망, 순환 신경망 또는 트랜스포머를 사용하나요? 딥러닝이 이 작업에 좋은 접근 방법인가요? 또는 다른 방식을 사용해야 하나요?
- 좋은 훈련 옵션 선택 : 어떤 손실 함수를 사용해야 하나요? 배치 크기와 학습률은 얼마로 해야 하나요?
6.2.4 모델 용량 키우기: 과대적합 모델 만들기
통계적 검정력을 가진 모델을 얻었다면 이제 모델이 충분히 성능을 내는지 질문해 보아야 한다. 주어진 문제를 적절히 모델링하기에 충분한 층과 파라미터가 있나요? 예를 들어 로지스틱 회귀 모델이 MNIST 데이터셋에서 통계적 검정력을 가질 수 있지만 문제를 잘 해결하기에는 충분하지 않을 것이다. 머신 러닝은 최적화와 일반화 사이의 줄다리기라는 점을 기억하라. 과소적합과 과대적합 사이, 즉 과소용량과 과대용량의 경계에 있는 모델이 이상적이다. 이 경계가 어디에 놓여 있는지 알기 위해서는 먼저 지나쳐 보아야 한다.
얼마나 큰 모델을 만들어야 하는지 알기 위해서는 과대적합된 모델을 만들어야 합니다.
- 층을 추가한다.
- 층의 크기를 키운다.
- 더 많은 에포크로 훈련한다.
6.2.5 모델 규제와 하이퍼파라미터 튜닝
통계적 검정력을 달성하고 과대적합할 수 있다면 올바른 방향으로 가고 있는 것이다. 이제 목표는 일반화 성능을 최대화하는 것이다. 이 단계가 대부분의 시간을 차지하는데, 반복적으로 모델을 수정하고 훈련하고 검증 데이터에서 평가한다. 그리고 다시 수정하고 가능한 좋은 모델을 얻을 때까지 반복한다. 다음과 같은 것들을 시도해 본다.
- 다른 구조를 시도해 봅니다. 층을 추가하거나 제거해 봅니다.
- 드롭아웃을 추가합니다.
- 모델이 작다면 L1이나 L2 규제를 추가합니다.
- 최적의 설정을 찾기 위해 하이퍼파라미터를 바꾸어 시도해 봅니다(층의 유닛 개수나 옵티마이저의 학습률 등).
- 선택적으로 데이터 큐레이션이나 특성 공학을 시도해 봅니다. 더 많은 데이터를 수집하고, 애너테이션을 만들고, 더 나은 특성을 개발합니다. 또는 유용하지 않을 것 같은 특성을 제거합니다.
케라스 튜너(KerasTuner) 같은 자동화된 하이퍼파라미터 튜닝 소프트웨어를 사용해서 이런 작업의 많은 부분을 자동화할 수 있습니다. (13장에서 다룰 예정)
6.3 모델 배포
6.3.1 고객에게 작업을 설명하고 기대치 설정하기
성공과 고객의 신뢰는 사람들의 기대를 지속적으로 맞추거나 초과하여 얻을 수 있다. 여러분이 제공하는 실제 시스템은 이 그림의 절반에 불과하다. 나머지 절반은 출시 전에 적절한 기대치를 설정하는 일이다.
6.3.2 추론 모델 배치하기
1. 파이썬이 아니라 다른 방식으로 모델을 저장할 수 있다.
- 제품 환경이 파이썬을 지원하지 않을 수 있다. 예를 들어 모바일 앱이나 임베디드 시스템인 경우.
- 애플리케이션이 파이썬으로 작성되지 않았다(자바스크립트, C++ 등). 모델을 위해 파이썬을 사용하면 상당한 오버헤드(overhead)가 발생할 수 있다.
2. 제품 모델은 훈련이 아니라 예측을 만들기 위해서만 사용된다(추론(inference)). 따라서 모델의 속도를 높이고 메모리 사용량을 줄일 수 있는 다양한 최적화를 수행할 여지가 있다.
REST API로 모델 배포하기
ㄴ 모델을 제품으로 바꾸는 가장 보편적인 방법
서버나 클라우드 인스턴스에 텐서플로를 설치하고 REST API로 모델의 예측을 요청한다. 플라스크(Flask)(또는 다른 파이썬 웹 개발 라이브러리)를 사용해서 직접 서빙(serving) 앱을 만들 수 있다. 또는 API 방식의 모델 배포를 위한 텐서플로 자체 라이브러리인 텐서플로 서빙(TensorFlow Serving)(https://www.tensorflow.org/tfx/guide/serving)을 사용할 수 있다. 텐서플로 서빙을 사용하면 몇 분 만에 케라스 모델을 배포할 수 있다.
다음과 같은 경우 이런 배포 방식을 사용해야 한다.
- 모델의 예측을 사용할 애플리케이션이 (확실히) 인터넷에 안정적으로 접속할 수 있다.
- 애플리케이션의 응답 속도에 대한 요구 사항이 엄격하지 않다.
- 추론을 위해 전달되는 입력 데이터가 크게 민감하지 않다.
장치로 모델 배포하기
모델을 애플리케이션이 실행되는 동일한 장치(스마트폰, 로봇에 있는 임베디드 ARM CPU 또는 작은 장치에 있는 마이크로컨트롤러(microcontroller) 등)에서 구동해야 할 필요가 있다.
다음과 같은 경우 이런 방식을 사용해야 한다.
- 모델의 응답 속도에 대한 제약이 엄격하거나 인터넷 연결이 불안정한 환경에서 실행되어야 한다. 몰입형 증강 현실 애플리케이션을 만든다면 원격 서버로 질의하는 것은 가능한 옵션이 아니다.
- 대상 장치의 메모리와 전력 조건에서 실행될 수 있도록 모델을 충분히 작게 만들 수 있다. 텐서플로 모델 최적화 도구(Model Optimization Toolkit)를 사용하면 이렇게 만드는 데 도움이 될 수 있다(https://www.tensorflow.org/model_optimization).
- 가장 높은 정확도를 달성하는 것이 작업에서 크게 중요하지 않다. 실행 효율성과 정확도 사이에는 항상 절충점이 있다. 따라서 메모리와 전력 조건을 고려하여 대용량 GPU에서 구동할 수 있는 최상의 모델보다 낮은 성능의 모델을 배포해야 한다.
- 입력 데이터가 매우 민감하다. 따라서 원격 서버에서 암호화가 해제되어서는 안 된다.
브라우저에 모델 배포하기
딥러닝은 종종 브라우저 또는 데스크톱 기반의 자바스크립트 애플리케이션에서 사용된다. 일반적으로 애플리케이션이 REST API로 원격 모델에 요청을 보낼 수 있지만 사용자 컴퓨터의 브라우저에서 (가능하다면 GPU를 사용해서) 바로 모델을 실행하면 장점이 있다.
다음과 같은 경우 이런 방식을 사용한다.
- 사용자 측에서 계산을 수행하면 서버 비용을 크게 줄일 수 있다.
- 입력 데이터가 사용자의 컴퓨터 또는 핸드폰에 있어야 한다. 예를 들어 스팸 감지 프로젝트에서 (자바스크립트로 작성된 크로스 플랫폼(cross-platform) 앱으로 구현된) 웹이나 데스크톱 버전의 채팅 앱은 모델을 로컬에서 실행해야 한다.
- 애플리케이션의 응답 속도 제약이 엄격하다. 사용자의 노트북이나 스마트폰에서 실행하는 모델은 서버에서 대용량 GPU로 실행하는 모델보다 느리지만 네트워크 요청과 수신에 100ms를 소모할 필요가 없다.
- 모델을 내려받아 저장한 후 인터넷이 연결되지 않은 상태에서 작동하는 앱이 필요하다.
추론 모델 최적화
추론을 위한 모델 최적화는 가용 전력과 메모리에 엄격한 제한이 있는 환경(스마트폰과 임베디드 장치)이나 응답 속도에 대한 요구 사항이 높은 애플리케이션에 모델을 배포할 때 특히 중요하다. 모델을 TensorFlow.js로 임포트하거나 텐서플로 라이트로 내보내기 전에 항상 최적화해야 하다.
널리 사용되는 두 가지 최적화 기법은 다음과 같다.
- 가중치 가지치기(weight pruning): 가중치 텐서의 모든 값이 예측에 동일하게 기여하지 않는다. 가장 큰 값만 남기면 모델 층에 있는 파라미터 개수를 크게 낮출 수 있다. 이를 통해 성능에 약간의 손해를 보는 대신 모델이 사용하는 메모리와 계산 자원을 줄인다. 얼마나 많은 가지치기를 적용할지 결정함으로써 모델 크기와 정확도 사이에 균형을 잡아야 한다.
- 가중치 양자화(weight quantization): 딥러닝 모델은 단정도(single-precision) 부동 소수점(float32) 가중치로 훈련된다. 하지만 가중치를 8비트의 부호 있는 정수(int8)로 압축하는 것이 가능하다. 크기는 1/4이지만 원본 모델의 정확도에 거의 가까운 추론용 모델을 얻을 수 있다.
6.3.3 작동 중 모델 모니터링하기
모델을 배포하고 나면 동작을 계속 모니터링해야 한다. 새로운 데이터에서 성능과 다른 애플리케이션과 상호 작용, 비즈니스 지표에 대한 최종 영향을 감시해야 한다.
- 새로운 음악 추천 시스템을 배포한 후 온라인 라디오 사용자 가입이 늘었나요? 아니면 줄었나요? 새로운 클릭률 예측 모델로 바꾸고 평균 광고 클릭률이 증가했나요? 랜덤한 A/B 테스트를 사용하여 모델의 영향과 다른 변경 사항을 격리해 보세요. 일부 샘플은 새로운 모델을 통과하고 나머지 샘플의 처리는 기존 프로세스를 유지해야 한다. 충분히 많은 샘플을 처리하고 나면 두 결과의 차이는 모델 때문일 가능성이 있다.
- 가능하면 제품 환경에서 모델의 예측을 정기적으로 수동으로 조사하세요. 일반적으로 데이터 애너테이션을 위한 인프라를 동일하게 재사용할 수 있다. 제품 환경의 데이터 중 일부를 전송하고 수동으로 애너테이션 작업을 수행하고 이 애너테이션과 모델 예측과 비교한다. 예를 들어 이미지 검색 엔진과 불량 쿠키 감지 시스템에 대해 이런 작업을 꼭 수행해야 한다.
- 수동 조사가 불가능할 때는 사용자 설문 같은 다른 평가 수단으로 고려해 보세요(스팸 감지 시스템이나 공격적인 콘텐츠 감지 시스템의 경우).
6.3.4 모델 유지 관리
시간이 지남에 따라 제품 환경의 데이터 속성이 변하고 점진적으로 모델의 성능과 타당성이 감소한다. 음악 추천 시스템의 수명은 몇 주, 신용 카드 부정 거래 감지 시스템은 며칠, 이미지 검색 엔진은 최상의 경우 몇 년입니다.
모델이 출시되자마자 이 모델을 대체할 다음 세대 모델의 훈련을 준비해야 합니다.
- 제품 환경의 데이터에 대한 변화를 감시하세요. 새로운 특성을 사용할 수 있나요? 타깃 클래스를 확장하거나 수정해야 하나요?
- 계속 데이터를 수집하고 애너테이션을 수행하세요. 계속 애너테이션 파이프라인을 개선하세요. 특히 현재 모델이 분류하기 어려워 보이는 샘플을 수집하는 데 특별히 관심을 두어야 한다. 이런 샘플은 성능을 향상시키는 데 크게 도움이 될 수 있다.
이것으로 머신 러닝의 일반적인 워크플로에 대한 소개를 마칩니다. 유념해야 할 것이 많습니다. 전문가가 되려면 시간과 경험이 필요하지만 걱정하지 마세요. 앞선 몇 개의 장을 읽기 전보다 이미 많은 지식을 갖추었습니다. 이제 머신 러닝 프로젝트의 전체 스펙트럼을 큰 그림으로 볼 수 있습니다. 책의 대부분은 모델 개발에 초점이 맞추어져 있지만 이는 전체 워크플로의 한 부분에 불과합니다. 항상 큰 그림을 놓치지 마세요!
6.4 요약
'AI 입문 > Deep Learning' 카테고리의 다른 글
8장 - 컴퓨터 비전을 위한 딥러닝 (0) | 2023.01.22 |
---|---|
7장 - 케라스 완전 정복 (0) | 2023.01.15 |
5장 - 머신 러닝의 기본 요소 (1) | 2023.01.11 |
4장 - 신경망 시작하기 (1) | 2023.01.11 |
3장 - 케라스와 텐서플로 소개 (0) | 2022.11.16 |