이번 장은 케창딥 6장으로 일반적인 머신러닝 워크플로에 대해 소개해준다.
머신러닝 프로젝트를 위해 전체 스펙트럼을 큰 그림을 볼 필요가 있다.
따라서 전반적인 머신러닝 워크플로에 대해 알아보고 그 흐름에 대해 이해해보자!
새로운 머신러닝 프로젝트를 시작할 때, 어떻게 준비해야 하고 제품화시켜 사용자들에게 전달할 수 있을까?
모든 프로젝트가 그렇듯, 머신러닝 프로젝트의 시작도 문제를 정의하는 것에서 출발한다.
이후 문제를 이해하고 적절한 데이터 셋을 구성하여 모델을 개발한다.
이렇게 만들어진 모델을 테스트하여 좋은 성능을 내도록 develop하여 최종 모델을 최적화하면,
배포 환경을 선택하여 모델을 배치한다.
제품 환경에서 모델 성능을 모니터링하고 차세대 모델을 개발할 수 있도록 데이터를 계속해서 쌓아 학습한다.
이런 방식으로 워크 플로가 돌아간다.
크게 보면 1. 작업 정의, 2. 모델 개발, 3. 모델 배포의 순서로 진행된다.
이러한 과정이 어떻게 진행되는지 보다 자세하게 살펴보자.
1. 작업 정의
우리가 딥러닝 모델을 통해 고객에게 어떠한 가치를 제공할 지 파악하는 것이 중요하다. 따라서 고객과의 잦은 소통과 세부 논의가 필요하다.
이를 토대로 우리가 점검해야할 것은 다음과 같다고 한다.
1.1 문제 정의
- 입력데이터는 무엇인지. 어떤 것을 예측하고자 하는지.
예측하고자 하는 것에 맞도록 가용 데이터를 준비하자. (데이터 수집 + 레이블 부여 등등..)
- 풀고자 하는 문제의 종류를 파악하기. 이진 분류? 다중 분류? 이미지 분할? 강화 학습?
문제의 종류에 따라 머신 러닝이 데이터를 이해하도록 하는 것에 최적이 될 수도 있지만 일반적인 통계 분석과 같은 방법이 좋을 때도 있다.
가령 사진 검색 엔진 프로젝트는 다중 레이블 다중 분류 작업에 속하여 머신러닝에 학습시킬 수 있지만,
음악 추천 시스템은 딥러닝 보다는 행렬 분해(협업 필터링)으로 처리하는 것이 더 좋은 성능을 보인다.
- 기존의 솔루션을 파악하기
스팸 필터링을 이해 중첩된 많은 if문으로 구성된 수동의 알고리즘이 있다면,
이 프로세스를 모니터링하고 수동으로 처리하는 사람이 있을 것이다.
이를 발전시키거나 대체하기 위해서는 우리가 해결하고자 하는 문제에 솔루션을 제공하는 것이
어떤 시스템으로 어떻게 일하고 있는지를 파악하고 이해해야 한다.
1.2 데이터 수집
문제를 정의하고 작업의 특성을 이해했다면, 데이터를 수집할 차례이다.
대부분의 머신 러닝 프로젝트에서 시간적, 금전적 비용이 많이 드는 단계이다.
우리의 프로젝트가 해결하려는 문제에 맞도록 데이터를 수집하는 것이 중요하기 때문에,
입력과 출력 사이의 관계를 학습하는 데 충분한 정보가 있도록 하는 데이터를 수집하는 것이 중요하다.
예를 들어보면, 사진 검색 엔진 프로젝트를 구상했다면, 먼저 분류하려는 일련이 레이블을 선택해야 한다. (ex) 강아지, 고양이, 사람 ..등등)
이렇게 이미지 카테고리를 지정하면 이 레이블 집합을 사용해서 사용자가 업로드한 수십만 개의 이미지를 수동으로 태깅하여 데이터 셋을 추가할 수 있다.
모델의 일반화 능력은 훈련되는 데이터의 속성에서 온다. 즉, 좋은 데이터 셋을 보유하고 관리할 수 있다면
모델링 개선점을 찾는 것 보다 더욱 좋은 솔루션을 제공할 수 있다는 것을 의미한다.
지도 학습의 경우에는 다음과 같은 추가적인 작업이 필요하다.
1. 데이터 annotation 인프라에 투자하기
annotation은 label을 설명하는 추가적인 데이터 즉, 메타 데이터로 파악할 수 있다.
(데이터 어노테이션: https://cordingdiary.tistory.com/86)
이 때, 데이터의 label을 할당할 사람이 해당 분야의 전문가여야 하는 지, 일반이이여도 할 수있는지를 파악하는 것도 중요하다.
2. 대표성 없는 데이터 주의하기
머신 러닝, 딥러닝 모델은 이전에 본 샘플과 비슷한 입력만 이해할 수 있다.
따라서 훈련에 사용되는 데이터가 제품 환경에 있는 데이터를 대표해야 한다.
이 말인 즉슨, 우리가 훈련 및 테스트 할 데이터가 실제 사용자가 입력할 데이터를 대표할 수 있어야 한다는 의미이다.
음식 사진을 올리면 요리 이름을 매칭해주는 앱을 개발한다고 한다면, 우리가 훈련할 데이터는 어떻게 이뤄져야 하는지 생각해보자.
쿠킹북이나 홍보용으로 만든 음식 사진으로 모델을 학습시키는 것과
실제 사용자들이 찍은 사진(구도, 색감 등등의 관점에서)으로 모델을 학습시키는 것 중에
무엇이 실제 제품 환경을 대표할 수 있을지 생각해보면 답이 나온다.
1.3 데이터 이해
모델 훈련을 시작하기 전에 데이터를 탐색하고 시각화 하여 데이터에 대한 인사이트를 도출하고
어떠한 예측 능력을 가진 특성이 있는지 파악하는 것도 매우 중요하다.
이를 EDA(exploratory data analysis), 탐색적 데이터 분석이라고 부른다.
주로 파악해야 하는 것들은 다음과 같다.
1. 데이터 샘플 직접 확인하기
2. 특성 값의 히스토그램 그리기
3. 위치 정보에 대해 시각화 하여 패턴을 파악하기
4. 샘플에 대해 누락된 값 처리하기
5. 각 클래스별 샘플 개수 파악하기 -> 불균형 파악
6. 타겟 누출 확인하기: 타겟에 관한 정보를 제공하는 특성이 있는 지 확인
2. 모델 개발
모델 개발을 시작하기 위해서는 앞선 단계가 선행되어야 한다. 즉, 문제를 정의하고 데이터를 수집해야 한다는 의미이다.
2.1 데이터 준비
여기서 데이터 준비는 수집의 의미가 아니다. 딥러닝 모델이 학습하기 용이한 형태의 데이터로 만들어주는 과정을 의미한다.
일반적으로 원시의 데이터를 사용하지 않기 때문에, 데이터 전처리 과정을 통해 원본 데이터가
신경망에 적용하기 쉽도록 하는 것이다.
다양하고 많은 전처리 기법이 있지만 이는 특정 도메인에 따라 특화되어 있기에 이는 따로 다루는 것이 좋다.
이를 배제하고 가장 공통이 되는 기본적인 전처리 사항에 대해 알아보자!
1. 벡터화
입력 데이터가 무엇이든(사운드, 이미지, 텍스트 등등) 먼저 텐서로 변환이 되어야 한다.
이를 데이터 벡터화 라고 한다.
2. 값 정규화
입력 데이터가 신경망 네트워크에 주입되기 전에 각 특성을 독립적으로 정규화 하여
평균이 0이고 표준 편차가 1이 되도록 만드는 것이 필요하다.
3. 누락된 값 처리하기
일반적으로는 삭제할 수 있다. 하지만 삭제를 안한다면 다음과 같이 조치를 취해보자.
범주형: '누락된 값'이라는 새로운 범주를 만들어 적용하기
수치형: '0'이 아닌 중간 값 혹은 평균으로 대체하기 / 특성 값을 예측하여 넣기
2.2 평가 방법 선택
모델의 목적은 일반화의 달성이다. 즉, 새로운 데이터에 대한 예측 정확도가 높은 것을 의미한다.
이를 측정하는 것은 검증 지표에 의해 파악된다. 검증 과정은 어떤 성공 지표를 사용할지 정확하게
추정하는 것이기 때문에 이 과정의 신뢰성을 높여 유용한 모델을 만드는 것이 중요하다!
ex) k-fold cross validation
2.3 기준 모델 뛰어넘기
딥러닝 모델의 초기 목표는 통계적 검정력을 달성하는 것이다.
즉, 내가 정한 간단한 기준점을 넘을 수 있는 작은 모델을 개발하는 것이다.
mnist dataset으로 손글씨 숫자 분류를 한다고 하면,
랜덤 분류기의 성능인 약 11%보다 높은 정확도를 보이는 분류기를 만드는 것이하나의 예시가 될 수 있다.
이 단계에서 중요하게 생각할 점은 다음과 같다.
- 특성 공학 : 문제에 대한 사전 지식으로 유용할 특성을 추출하거나 만들어 내자.
- 구조에 대한 올바른 가정: 어떤 종류의 모델 구조를 사용할까? cnn? rnn?
- 좋은 훈련 옵션 선택: 어떤 손실함수를 사용하며, 배치크기와 학습률은 얼마로 할까?
2.4 모델 용량 키우기: 과대 적합 모델 만들기
통계적 검정력을 가진 모델을 얻었다면 모델의 성능을 극대화 하는 것이 필요하다.
문제를 적절히 모델링하기 위해 충분한 층과 파라미터를 쌓았는지를 파악하자.
일반화의 목표를 달성하기 위해서는 우선 과대적합된 모델을 조금씩 과소적합 되는 방향으로 나아가는게 필요하다고 보는 것 같다.
과대 적합을 위해 우리가 할 수 있는 것은 다음과 같다.
1. 층을 추가
2. 크기를 키우기
3. 에포크 늘리기
2.5 모델 규제와 하이퍼 파라미터 튜닝
과적합된 모델을 만들었다면 모델을 수정하고 훈련하면서 좋은 모델을 얻을 때 까지 반복을 해야하면서(검증 셋을 활용)
일반화 성능을 끌어올리는 것이 필요하다.
이 때, 모델 규제와 하이퍼 파라미터 튜닝의 개념이 등장하는 시점이다.
- 모델 규제: 드롭아웃, L1/L2 규제
- 하이퍼 파라미터 튜닝: 층의 유닛 개수, 옵티마이저의 학습률 등등..
- 데이터 큐레이션 혹은 특성 공학을 시도하기
3.모델 배포
3.1 추론 모델 배치하기
실제로 많은 경우에 훈련에 사용했던 Python 모델 객체와 똑같은 객체를 제품에 넣는 경우는 드물다고 한다.
따라서 파이썬이 아닌 다른 방식으로 모델을 저장할 수 있어야 한다.
- 제품 환경이 파이썬을 지원하지 않는 경우 / 에플리케이션이 파이썬으로 작성되지 않은 경우
또한 제품 모델은 훈련을 하는 것이 아닌 예측을 만들기 위해서만 동작해야 한다.(추론 inference만 수행)
따라서 모델의 속도를 높이고 메모리 사용량을 줄일 수 있는 다양한 최적화를 수행하는 것이 필요하다.
위의 과정을 고려했을 때, 추론 모델을 배치하기 위해 배포하는 방법을 간단히 소개해주고 있다.
나는 개인적으로 무슨 말인지 몰라 요약하기 어려웠다.. 따라서 어떤 것들이 있는지만 언급해봤다!
- Rest API로 모델 배포
- 장치로 모델 배포
- 브라우저에 모델 배포
3.2 모델 모니터링하기
추론 모델을 애플리케이션에 통합하고 제품 환경의 데이터로 최종 테스트 했다면 추가적으로 수행해야하는 것은 다음과 같다.
'단위 테스트, 로깅, 상태 모니터링'
새로운 데이터에 대한 성능과 다른 애플리케이션과의 상호작용 등의 영향을 모니터링 할 필요가 있다.
3.3 모델 유지 및 관리
한 번 배포된 모델은 영원히 같은 도메인의 문제를 해결할 것이라고 생각하는 것은 큰 오산이다.
시간이 지남에 따라 제품 환경의 데이터 속성이 변하게 될 것이고, 이것이 모델의 성능을 점진적으로 감소시킬 것이기 떄문이다.
따라서 우리가 할 일은 모델을 출시하면 이 모델을 대체할 다음 세대의 모델의 훈련을 준비하는 것이다.
이러한 큰 그림을 알면, 우리가 현재 직면한 문제점이 무엇이고 이를 해결하기 위해 어떠한 관점에서 task를 수행해야 하는지 직관적으로 파악할 수 있을 것 같다!
references
data annotation - https://cordingdiary.tistory.com/86
'Book Review > [케라스 창시자에게 배우는 딥러닝] 리뷰' 카테고리의 다른 글
컴퓨터 비전을 위한 고급 딥러닝 (2) | 2023.03.24 |
---|---|
CNN 훈련하기: cat / dog (3) | 2023.02.21 |
합성곱 연산: Convnet / CNN 이해하기 (2) | 2023.02.07 |
다양하게 케라스 딥러닝 모델 구축하기 (2) | 2023.01.26 |
머신러닝의 목표: 일반화 (2) | 2023.01.11 |