케라스 창시자에게 배우는 딥러닝 - 6장 일반적인 머신 러닝 워크플로
Dobby-HJ
·2023. 8. 1. 17:48
1. 작업 정의
무엇을 하는지 자세히 이해하지 못하면 좋은 결과를 만들 수 없습니다. 고객이 이 특정 문제를 해결하려는 이유는 무엇인가요? 고객이 솔루션에서 어떤 가치를 얻을 수 있나요? 모델이 어떻게 사용되며 고객의 비즈니스 프로세스에 얼마나 잘 맞나요?
1.1 문제 정의
머신 러닝 문제를 정의하려면 일반적으로 고객과 많은 세부 논의가 필요합니다. 다음은 가장 우선 순위가 높아야 할 질문들입니다.
- 입력데이터는 무엇인가요? 어떤 것을 예측하려고 하나요?
- 가용한 훈련 데이터가 있어야 어떤 것을 예측하도록 학습할 수 있습니다. 예를 들어 영화 리뷰와 감성 레이블이 태깅되어 있어야 영화 리뷰의 감성 분류를 학습할 수 있습니다.
- 당면한 문제가 어떤 종류인가요? 이진 분류인가요? 다중 분류인가요? 스칼라 회귀인가요? 벡터 회귀인가요? 다중 레이블 다중 분류인가요? 이미지 분할 ? 랭킹? 아니면 군집, 생성 또는 강화 학습 같은 문제인가요? 어떤 경우에는 머신 러닝이 데이터를 이해하는 최선의 방법이 아니고 통계 분석이 더 도움이 될 수 있습니다.
- 사진 검색 엔진 프로젝트는 다중 레이블 다중 분류 작업입니다.
- 스팸 감지 프로젝트는 이진 분류 작업입니다.
- 음악 추천 엔진은 딥러닝보다 행렬 분해(matrix factorization)(협업 필터링(collaborative filtering))로 처리하는 것이 더 좋습니다.
- 기존 솔루션은 어떤 것이 있나요?
- 고려해야할 특별한 제약이 있나요?
1.2 데이터 수집
작업 특성을 이해하고, 입력과 타깃이 무엇인지 알게 되면 데이터를 수집할 차례입니다. 대부분의 머신 러닝 프로젝트에서 가장 힘들고 시간이 많이 걸리며 비용이 많이 드는 단계입니다.
5장에서 모델의 일반화 능력은 거의 모두 훈련되는 데이터의 속성(데이터 포인트 개수, 레이블의 신뢰도, 특성 품질)에서 온다는 것을 배웠습니다. 좋은 데이터셋은 관리하고 투자할 가치가 있는 자산입니다. 프로젝트에 50시간을 더 쓸 수 있다면 모델링 개선점을 찾는 것보다 더 많은 데이터를 수집하는 것이 이 시간을 가장 효과적으로 사용하는 방법입니다.
알고리즘보다 데이터가 더 중요하다는 점은 2009년 구글 연구자들의 논문 “The Unreasonable Effectiveness of Data”로 가장 잘 알려져 있습니다.“The Unreasonable Effectiveness of mathematics in the Natural Sciences”라는 글에서 따왔습니다.
데이터 Annotator Infra에 투자하기
- 직접 데이터에 annotation 과정을 수행해야 하나오?
- 레이블을 모으기 위해 미케니털 터크(Mechanical Turk) 같은 크라우드 소싱(crowdsourcing) 플랫폼을 사용해야 하나요?
- 전문적인 데이터 레이블링 회사의 서비스를 사용해야 하나요?
각각의 장단점이 있습니다. 최선의 옵션을 고르기 위해 현재 작업의 제약 조건을 고려하세요.
- 데이터에 레이블을 할당할 사람이 해당 분야의 전문가여야 하나요?
- 데이터 Annotating을 위해 전문적인 지식이 필요하다면 이를 위해 사람에게 해당 지식을 가르칠 수 있나요? 그렇지 않다면 관련된 전문가를 구할 수 있나요?
- 전문가가 Annotation 하는 과정을 여러분이 이해하고 있나요?
대표성 없는 데이터 주의하기
머신 러닝 모델은 이전에 본 샘플과 비슷한 입력만 이해할 수 있습니다. 따라서 훈련에 사용하는 데이터가 제품 환경에 있는 데이터를 대표하는 것이 중요합니다. → 매니폴드로써 해석해도 좋음.
제품 환경에서 수집한 데이터로 훈련하는 것이 불가능하다면 훈련 데이터와 실전 데이터 사이의 차이점을 완전히 이해하고, 이런 차이점을 좁히기 위해 적극적으로 노력해야합니다.
이와 관련된 현상으로 개념 이동(Concept drift)을 알고 있어야 합니다. 거의 모든 실전 문제에서 개념 이동을 만나게 됩니다. 특히 사용자가 직접 생성(만든) 데이터를 사용하는 경우입니다.
1.3 데이터 이해
데이터셋을 블랙박스처럼 다루는 것은 상당히 나쁜 방법입니다. 모델 훈련을 시작하기 전에 데이터를 탐색하고 시각화하여 예측 능력을 가진 특성에 대한 통찰을 얻어야 합니다.
- 데이터가 이미지나 자연어 텍스트를 포함하고 있다면 몇 개의 샘플(그리고 레이블)을 직접 확인해보세요.
- 데이터가 수치 특성을 포함하고 있다면 특성 값의 히스토그램을 그려서 값의 범위나 빈도를 파악하는 것이 좋습니다.
- 데이터가 위치 정보를 포함하고 있다면, 지도에 그려보세요. 뚜렷한 패턴이 나오나요
- 작업이 분류 문제라면 각 클래스의 샘플 개수를 출력해보세요. 클래스 갯수에 불균형이 있나요?
- 타깃 누출(target leaking)을 확인하세요. 데이터에 타깃에 관한 정보를 제공하는 특성이 있는지 확인합니다.
1.4 성공 지표 선택
클래스 분포가 균일한 분류 문제에서는 정확도와 ORC(Receiver Operating Characteristic) 곡선 아래의 면적인 ORC AUC가 일반적인 지표입니다. 클래스 분포가 균일하지 않은 문제나 랭킹 문제, 다중 레이블 문제에는 정밀도와 재현율을 사용할 수 있습니다.
2. 모델 개발
진행 과정을 측정할 방법을 찾았다면 모델 개발을 시작할 수 있습니다. 대부분의 튜토리얼과 연구 프로젝트는 이 단계만 수행합니다. 즉, 문제 정의와 데이터 수집은 이미 완료되었다고 가정하고, 모델 배포와 유지 관리는 다른 사람이 처리한다고 가정하고 건너뜁니다.
2.1 데이터 준비
이전에 배웠듯이 딥러닝 모델은 일반적으로 원시 데이터를 사용하지 안흣ㅂ니다. 데이터 전처리 목적은 주어진 원본 데이터를 신경망에 적용하기 쉽도록 만드는 것입니다. 여기에는 벡터화(Vectorization), 정규화(normalization), 누락된 값 다루기 등이 포함됩니다. 많은 전처리 기법은 도메인에 특화되어 있습니다.
벡터화
신경망에서 모든 입력과 타깃은 일반적으로 부동 소수점 데이터로 이루어진 텐서여야 합니다. 사운드, 이미지, 텍스트 등 처리해야 할 것이 무엇이든지 먼저 텐서로 변환해야 합니다. 이 단계를 데이터 벡터화(Data vectorization)라고 합니다.
값 정규화
- 작은 값을 취합니다 : 일반적으로 대부분의 값이 0 ~ 1 사이여야 합니다.
- 균일해야 합니다. 즉, 모든 특성이 대체로 비슷한 범위를 가져야 합니다.
추가적으로 다음에 나오는 조금 더 엄격한 정규화 방법이 많이 사용되고 도움이 될 수 있지만 항상 필요하지는 않습니다.
- 각 특성별로 평균이 0이 되도록 정규화 합니다.
- 각 특성별로 표준 편차가 1이 되도록 정규화합니다.
누락된 값 처리하기
2.2 평가 방법 선택
- 홀드아웃 검증
- K-Fold Cross Validation
- Repeated K-Fold Cross Validation
2.3 기준 모델 뛰어넘기
초기 목표는 통계적 검정력(statistical power)을 달성하는 것입니다. 즉, 아주 간단한 기준점을 넘을 수 있는 작은 모델을 개발합니다. 이 단계에서 가장 중요하게 중점을 둘 세 가지는 다음과 같습니다.
- 특성 공학 : 유용하지 않은 특성을 제외하고(특성 선택), 문제에 대한 지식을 사용하여 유용할 것 같은 새 특성을 개발합니다.
- 구조에 대한 올바른 가정
- 좋은 훈련 옵션 선택
올바른 손실 함수 선택하기
주어진 문제의 성공 지표를 직접 최적화하는 것이 가능하지 않은 경우가 많습니다. 때로는 이 지표를 손실 함수로 쉽게 바꿀 수 있는 방법이 없습니다. 무엇보다도 손실 함수는 미니 배치 데이터에서 계산 가능해야하고(이상적으로는 손실 함수는 하나의 데이터 포인트에서도 계산 가능해야 합니다). 미분 가능해야 합니다.(그렇지 않으면 역전파 알고리즘을 사용하여 네트워크를 훈련시킬 수 없습니다.) 예를 들어 널리 사용되는 분류 지표인 ROC AUC는 직접 최적화될 수 없습니다. 그래서 분류 작업에서는 Cross Entropy처럼 ROC AUC를 대신할 지표를 최적화하는 것이 보통입니다.
- 이진 분류 : sigmoid, binary_crossentropy
- 단일 레이블 다중 분류 : softmax, categorical_crossentropy
- 다중 레이블 다중 분류 : sigmoid, binary_crossentropy
2.4 모델 용량 키우기 : 과대적합 모델 만들기
지속적으로 모델의 크기를 키워나가며, 최적화와 일반화를 개선하면서 모델을 키워나가 overfitting이 관측되는 모델을 만들어야 합니다.
2.5 모델 규제와 하이퍼파라미터 튜닝
통꼐적 검정력을 달성하고 과대적합할 수 있다면, 올바른 방향으로 현재 모델이 학습 중인 것을 확인할 수 있고, 이제 바뀐 목표는 일반화 성능을 최대화하는 것입니다.
- 다른 구조를 시도해 봅니다. 층을 추가하거나 제거해 봅니다.
- 드롭아웃을 추가합니다.
- 모델이 작다면 L1이나 L2규제를 추가합니다
- 최적의 설정을 찾기 위해 하이퍼파라미터를 바꾸어 시도해 봅니다.(층의 유닛 개수나 옵티마이저의 학습률 등)
- 선택적으로 데이터 큐레이션이나 특성 공학을 시도해 봅니다. 더 많은 데이터를 수집하고, 애너테이션을 만들고, 더 나은 특성을 개발합니다. 또는 유용하지 않을 것 같은 특성을 제거합니다.
케라스 튜너(KerasTuner) 같은 자동화된 하이퍼파라미터 튜닝 소프트웨어를 사용해서 이런 작업의 많은 부분을 자동화할 수 있습니다.
3. 모델 배포
3.1 고객에게 작업을 설명하고 기대치 설정하기
3.2 추론 모델 배치하기
RESET API로 모델 배포하기
Flask와 같은 파이썬 웹 개발 라이브러리를 사용해서 서버나 클라우드 인스턴스에 설치된 Tensorflow에 REST API로 예측을 요청하는 형태로 만들 수 있습니다. 또는 API 방식의 모델 배포를 위한 텐서플로 자체 라이브러리인 텐서플로 서빙을 사용할 수도 있습니다.
- 모델의 예측을 사용할 애플리케이션이 인터넷에 안정적으로 접속할 수 있어야 합니다.
- 애플리케이션의 응답 속도에 대한 요구 사항이 엄격하지 않습니다. 일반적으로 요청, 추론 응답의 과정에 500ms가 걸립니다.
- 추론을 위해 전달되는 입력 데이터가 크게 민감하지 않습니다. 모델이 데이터를 읽을 수 있어야 하기 때문에 서버에서는 암호화되지 않은형태의 데이터를 사용할 수 있어야 합니다.(HTTP요청과 응답을 위해 SSL 암호화를 사용해야 합니다.)
장치로 모델 배포하기
브라우저에 모델 배포하기
추론 모델 최적화
- 가중치 가지치기(weight pruning)
- 가중치 양자화(quantization)
3.3 작동 중 모델 모니터링하기
3.4 모델 유지 관리
4. 요약
- 새로운 머신 러닝 프로젝트를 시작할 때 먼저 문제를 정의합니다.
- 문제를 이해하고 적절할 데이터셋이 있다면 모델을 개발합니다.
- 모델이 준비되고 테스트 세트에서 좋은 성능을 내면 배포할 차례입니다.
- 추론을 위해 최종 모델을 최적화하고, 배포 환경을 선ㅌ택하여 모델을 배치합니다.
- 제품 환경에서 모델 성능을 모니터링하고 차세대 모델을 개발할 수 있도록 계속 데이터를 모읍니다.
'DeepLearning > Tensorflow' 카테고리의 다른 글
케라스 창시자에게 배우는 딥러닝 - 9장 컴퓨터 비전을 위한 고급 딥러닝 (0) | 2023.08.05 |
---|---|
케라스 창시자에게 배우는 딥러닝 - 8장 컴퓨터 비전을 위한 딥러닝 (0) | 2023.08.04 |
케라스 창시자에게 배우는 딥러닝 - 5. 머신 러닝의 기본 요소 (0) | 2023.08.01 |
케라스 창시자에게 배우는 딥러닝 - 4. 신경망 시작하기 : 분류와 회귀 (0) | 2023.07.28 |
케라스 창시자에게 배우는 딥러닝 - 3장 케라스와 텐서플로 소개 (0) | 2023.07.28 |