Deep learning workflow
Updated:
머신러닝의 workflow
이 글에서는 다음의 사항들에 대해 다루도록 한다.
- 머신러닝에 대한 framing step
- working model에 대한 developing step
- 개발과 유지보수
이전 예제들은 이미 라벨화된 데이터셋을 처음부터 가지고 있다고 가정했고 그래서 모델 훈련을 바로 시작할수 있었다.
그러나 이러한 경우는 현실에서 자주 일어나는 일이아니다. 딥러닝은 데이터셋으로부터 시작하는게아니라 문제로부터 시작을한다.
1 작업 정의하기
하려는게 무엇인지에대한 깊은이해가 없이는 좋은 결과를 낼수 없다. 왜 고객은 이 특정한 문제를 풀려할까?
문제로부터 어떤 값을 얻어야하는지, 그리고 고객의 비즈니스 프로세스에 그것이 어떻게 적용되는지
어떤 종류의 데이터가 사용가능하고, 모을수 있는지?
어떤떤 종류의 머신러닝 작업이 비즈니스 문제에 연결될수 있는지? 등을 생각해야한다.
1.1 문제 설계하기
머신러닝 문제를 설계하는것은 일반적으로 관계자들과의 상세한 논의를 포함한다. 여기에 항상 생각해야할 질문들이 있다.
어떤 데이타를 넣을것인지? 무엇을 예측하려는지?
사용가능한 훈련 데이터가 있으면 단지 학습시키는것으로 무언가를 예측할수있다.
신경써야할 특별한 제약사항은 있는가?
문제가 머신러닝 작업을 요구하는지?
binary classification인지? 다중 분류인지?
스칼라 회귀인지 백터회귀인지?
멀티클래스,멀티 라벨 분류인지?
이미지 분할인지? 랭킹인지?
그외에도 클러스팅, 생성, 강화학습인지?
혹은 갖고있는 데이터가 머신러닝이 적합하지 않을수 있도 있다.현재 존재하는 솔루션이 어때보이는지?
현장에 이미 시스템이 있고, 그들이 어떻게 작동하는지를 잘 이해해야한다.
해결해야할 특별한 제약사항이 있진 않은가?
예를들어 만든 스팸감지 앱이 종단간 암호화에 엄격해 스팸탐지가 모델이 사용자의 폰에 내장되어 있어야하며
쿠키 필터링 모델이 지연율 제한문제로 리모트 서버보다는 디바이스에 내장되어 작동해야할수도 있다.
이와 같이하려는 작업에 대해 전체적인 맥락을 이해해야한다.
연구를 끝내면, 무엇을 input해야하고, target은 무엇이 되어야하며 어떤 머신러닝 기법을 사용할지를 알게 될것이다.
생각한 targets이 inputs으로 예측될거라 가정한다. 데이터가 충분히 인풋과 타겟의 관계를 학습하는데 정보를 담고있다고 가정한다.
그러나 이것은 단지 가정일뿐이다. 모든 문제가 머신러닝으로 해결가능한것은 아니다. X가 Y를 예측하는데 충분히 정보를 담고있다고 할수 없다.
예를들어 주식시장에서 과거부터 현재가까지의 주식가를 input한다해도 주식의 동향을 예측하는데 성공하기 쉽지않다. 과거의 주식가가 미래에 관한 정보를 담고있지 않기때문이다.
1.2 데이터 수집
작업의 본질을 이해했다면, 그리고 input과 target은 뭘로할지 정했다면 데이터를 모아야한다.
가장 고되고, 시간이 많이 소요되고, 가장 비용이 많이드는 과정이다.
모델의 일반화 능력은 데이터의 양에서 온다. 얼마나 많은 데이터를 갖고있는지, 라벨이 얼마나 신뢰할만한지, 특성의 질은 어떤지 등이 중요하다.
좋은데이터셋은 충분히 투자할만한 가치있는 자산이다. 만약 프로젝트에 50시간 이상을 쓴다면 모델을 발전시키는것을 조사하는것보다 더 많은 데이터를 모으는것이 효과적이다.
만약 지도학습을 한다면, inputs데이터를 모으고, annotations(데이터 라벨링)이 필요하다 라벨은 모델이 훈련을 통해 예측할 targets이 된다.
가끔 데이터 라벨링은 자동적으로 될수도 있지만 손으로 직접 하는 경우가 많을것이다.
데이터 라벨링 기반 투자
데이터 라벨링 프로세스가 targets의 퀄리티를 결정할것이고 또 모델의 퀄리티를 결정하게 될것이다.
여기에는 다음의 경우들을 생각해봐야한다.
- 스스로 데이터를 주석달아야 하는지?
- 크라우드소싱 플랫폼을 사용해야 하는지?
- 아웃소싱을 해야 하는지?
아웃소싱은 시간과 돈을 절약해주지만, 통제밖에 있다. 크라우드소싱은 비싸지않고, 잘 조절할수 있지만 잡음이 많이섞일수있다.
가장좋은 옵션은 제한사항을 고려해보는것이다.
- 데이터라벨링에 전문지식이 필요한가?
- 전문지식이 필요하다면 사람들에게 라벨링을하도록 훈련시킬수있는가?
- 그런사람에게는 어떻게 접근하는가?
전문가가 주석다는것을 이해할수있는가? 그렇지않다면 데이터셋은 블랙박스와도 같을것이다. 심각한문제는아니나, 제한사항이 될것이다.
데이터라벨링을 직접하기로 했다면 주석을달기위해 어떤 소프트웨어를 사용할것인지 알아야한다. 혹은소프트웨어를 직접 개발해야할수도 있을것이다.
괜찮은 데이터 주석 소프트웨어는 많은 시간을 줄여줄것이고 결과 프로젝트에서 가치있는 투자가 될것이다.
비대표 데이터
머신러닝 모델은 이전에 봤던거에 대해서 잘 작동할수있다. 때문에 훈련에 사용되는 데이터는 대표성을 가지고있어야한다.
예를들어 사진으로부터 음식의 이름을 찾아내는 어플을 개발한다 가정하자.
소셜 네트워크의 유명한 사진들로부터 모델을 훈련시킨다. 앱출시후에 화난 유저의 피드백이 온다 . “이 어플은 오답률이 80%인다. 뭐가 문제냐?”
분명히 테스트셋에대한 정확도는 90%가 넘었다 유저가 올린 데이터를 보니 랜덤한 레스토랑에서 랜덤한 스마트폰으로찍은 랜덤한 음식들 이 전문적인 퀄리티도 없이, 올라와있는것이다.
따라서 전문적인 당신의 트레이닝 데이터는 대표성을 띄고있지 않은것이다.
가능하다면 데이터는 모델이 사용될 곳으로부터 직접 수집해라
영화 리뷰 감정 분류 모델은 IMDB리뷰에서 사용되어야지, Yelp레스토랑이나 트위터의 상태업데이트에서 모으면안된다.
트위터의 감정을 평가하고싶다면 실제 트윗을 수집하고 주석하는거부터 시작해라.
머신러닝은 단지 트레이닝 데이터의 패턴을 기억할뿐인것을 명심해라 미래는 과거로부터 예측할수있을때 머신러닝은 효과를발하지만 흔하지 않다.
NOTE:샘플링 편향 문제
비대표성 데이터의 가장 흔한 문제는 샘플링 편향이다. 샘플링 편향은 예측하려는 것에 맞춰 데이터를 수집할때 일어난다.
1.3 데이터 이해하기
데이터를 잘 모르는상태로 훈련하는것은 매우 좋지않다.
훈려을 시작하기전에 데이터를 탐색하고 시각화해서 어떤게 좋을지에대한 정보를 얻어야한다. 이것을 특성공학이라고도 한다. 그리고 잠재되어있는 이슈들을 걸러낸다.
- 이미지나 자연어 텍스트, 샘플을 직접 살펴보자
- 숫자의 특성을 가지고 있다면, 히스토그램으로 값들을 살펴보는게 좋다.
- 위치정보를 가지고있다면 맵에 표시해봐라, 어떠한 패턴이 보이진 않는가?
- 누락값이 존재하진 않는가? 이때는 데이터에 대해 잘 생각해봐야한다.
- 분류문제라면, 각 클래스의 인스턴스수를 표시해봐라, 동등하게 잘 분배되어있는가?
- 타겟 누출 : 특성중에 타겟에 대한 정보를 주는 특성이 있다면 쓸수없게 된다. 예를들어 미래에 암을걸릴건지 아닌지 예측을하는데, 과거 암진단 이력이 특성에 있다면 타겟 누출이 된것이다.
1.4 성공 측정 지표 선택
프로젝트가 성공했는지 아닌지에 대한 측정 지표를 정해야한다. 정확도, 재현율과 정밀도, 고객유지율, 등이 될수있다.
이러한 성공 지표들은 프로젝트에 관한 기술적인 선택에 가이드라인이 될것이다.
2 모델 개발
일단 측정방법을 정햇으면, 모델 개발을 시작해야한다. 모델 개발은 단지 머신러닝의 하나의 스텝에 불과하다.
가장 힘든것은 앞에나온 데이터준비과정이다.
2.1. 데이터 준비
딥러닝 모델은 일반적으로 원형의 데이터를 소화해내지 않는다.
데이터 프로세싱은 raw data를 뉴럴네트워크에 맞게 직접 수정가능하게 만드는것이다.
- 백터화
뉴럴네트워크 안의 모든 inputs과 targets은 실수-포인트 데이터의 텐서로 되어있다.
일반적으로 데이터가 소리, 그림, 텍스트 그 무엇이든지간에 텐서로 바꿔야한다. 이것을 데이터 백터화라고 한다.
- 정규화
데이터를 뉴럴네트워크에 넣기전에 각각의 특성을 정규화하여 평균값이 0, 표준편차가 1이 나오도록 정규화해줘야한다.
일반적으로 값이 큰 데이터들은 뉴럴네트워크에 좋지 않다. 또는 데이터가 이질적인것은 좋지않다. 따라서 데이터는 다음의 특성을지니고있어야한다.
- 작은 값을취하라
- 같은 범위를 가져라
추가적으로
- 평균이 0인 정규화
- 표준편차가 1인 정규화
이렇게 데이터를 처리해주면 좋다.
- 결측값 처리
데이터에 값이 누락되어있는 경우가있다. 값이 누락되어있는 특성 전체를 버릴수도 있으나, 꼭그러지않아도된다.
특성이 카테고리로 되어있다면 missing 카테고리를 새로 만드는것도 좋다. 모델이 알아서 판단할것이다.
특성이 숫자로되어있다면, 0과같은 갑은 피해라, 왜냐하면 이러한 불연속은 모델의 일반화를 방해하기 때문이다.
대신에 중간값의 평균을 채워넣는것도 괜찮다. 외에도 다른 특성을 가지고 결측치를 예측하는 모데를 만들어도 좋다.
결측치가 없는 데이터를가지고 훈련한 모델은 예측해야할 데이터의 결측값에 대해 무시하는법을 모른다.
이 경우엔 인위적으로 결측값을 가지고 있는 데이터를 만드는것이다. 트레이닝 샘플을 복사해서 결측값이 있을만한곳에 떨어트리는것이다.
2.2. 평가 프로토콜 선택
모델의 목적은 일반화를 하는것이고, 모델 개발을 통한 모든 모델의 평가는 일반화 성능을 측정하는 검증 지표에 의해 이끌어질것이다.
검증 프로토콜의 목적은 실제 제품 데이터에 측정지표가 좋았는지를 정확하게 측정하는것이다.
이 과정은 쓸만한 모델을 만든느데 중요하다.
- 홀드아웃 검증
- k-fold 교차검증
- 반복 k-fold 검증
이중에서 하나를 고르는것이 좋다. 홀드아웃 검증만해도 충분히 자잘될것이다.
2.3 베이스라인
모델 개발을 시작했다면, 처음 목표는 통계적 검증력을 달성하는것이다. 뭔말이냐면 가벼운 베이스라인에 도달할만한 작은모델을 만들라는것이다.
이 단계에서는 , 3가지 중요한 사항이있다.
특성공학, 정보가 들어있지 않은 특성을 필터링하는것, 도움이 될만한 새로운 특성을 만드는것
아키텍쳐를 정하는것. convnet? densely-connected netword? 혹은 딥러닝이 좋은 접근인가?
훈련 구성을 고르는것, 손실함수는 무엇으로할지?
주의 : 올바른 손실함수를 골라라
손실함수는 미니배치의 데이터에 대해 계산이 가능해야하고, 미분이 가능해야한다.
항상 통계적 검증이 가능한것이 아니다. 수많은 합리적인 아키텍쳐를 시도했는데도 베이스라인에 도달할수 없다면 inputs데이터에 정답이 없는거일수도있다.
두가지를 가정하고 있다는것을 기억하라
- inputs데이터로 outputs데이터를 예측할수있다는것을 가정
- 데이터가 충분히 inputs 과 outputs의 관계에 대한 정보를 가지고있다는것을 가정
이런 가정이 실패했다면, 원점에서부터 생각해야할수도 있다.
2.4 과대적합
모델이 통계적 검증력을 가지고 있다면
- 모델이 충분히 쓸만한가?
- 문제를 모델링하기에 충분한 layer와 파라미터들을 가지고있는가?
를 생각해바봐야한다.
또한 머신러닝은 최적화와 일반화 사이에 있다는것을 기억해라 과대적합과, 과소적합사이에서 잘 조절하는것이 중요하다.
일단은, 모델이 얼마나 큰지 알아내기위해 모델을 과대적합시켜야한다.
- 층을 추가하고
- 레이어를 크게 만들고
- 더많은 훈련횟수를 준다.
훈련세트와 검증세트에 대한 평가지표만큼 손실값도 모니터링하라.
검증세트에 대한 성능이 안좋아진다면, 과대적합에 달성한것이다.
2.5규제와 모델튜닝
통계적 검증력에 도달하였고, 과대적합이 가능하다면 제대로 한것이다.
이제 이 시점에서 목표는 일반화성능을 극대화하는것이다.
이 단계에서는 많은 시간이 소요된다. 반복적으로 모델을 수정하고, 훈련하고, 검증세트로 평하고, 다시 수정하고 반복한다.
- 다른 아키텍처를 시도해봐라; 층을 추가하거나 제거
- dropout을 추가해봐라
- 모델이 작다면 l1이나 l2규제를 사용해봐라
- 다른 하이퍼파라미터를 사용해봐라
- 특성공학을 하거나 데이터큐레이션을 반복하는것
KerasTuner과 같은 자동 하이퍼파라미터 튜닝 소프트웨어를 사용해서 자동화가 가능하다.
모델을 튜닝하기위해 validatiopn으로부터 피드백을 받을때마다 검증 데이터가 모델에 노출되는것을 기억해야한다.
한두번이야 괜찮지만 횟수가 많아지기 시작하면 결국 모델의 검증세트에 대한 과대적합이 될것이다.
그리고 validation의 신뢰도가 떨어지게 된다.
만족할만한 모델 구성을 만들었다면, 모델에 데이터를 집어넣고 훈련한뒤, 테스트셋으로 평가를 할수있다.
검증세트에대해서보다 테스트세트에 대해 성능이 안좋다면, 검증 절차가 신뢰성이 없거나 파라미터 튜닝을하다 검증세트에 대해 과대적합을 한것이다.
이러한 경우에는 예로써 k-fold를 사용하면 좋다
3 모델 배포
테스트셋에대하여 최종 평가를 통과했다면 출시할 준비가 어느정도 끝난것이다.
3.1 관계자들에 대하여
AI시스템을 향한 비전문적인 예측은 자주 비현실적이다. 예를들어, 시스템이 그들이 하는것을 “이해한다”라고 기대해버리는것이다. 이때는 실패사례를 보여줘야한다.
그들은 또한 사람수준의 성과를 기대한다. 특히 이전에 직접해왔던 일이라면 더더욱 그렇다.
대부분의 머신러닝모델은 거기까지 도달하긴 힘들다. 왜냐하면 사람이 만든 라벨의 추정값을 훈련하기 때문이다.
따라서 모델의 기대성능을 확실하게 알려야한다.
이 모델은 98%의 정확도를 가지고있습니다 와 같은 추상적인 말보다는
거짓음성과 거짓양성에 대한 얘기를 해야한다.
5%의 거짓음성 비율과 2.5%의 거짓양성비율을 가지고있습니다
이런식으로 이야기를 해야한다.
목표에 맞게 모델의 성능 지표를 명확하게 정해야한다. 또한 핵심 파라미터를 무엇으로 할지 논의해야한다. 이러한 결정은 비즈니스적 상황의 깊은 이해를 가져아할수있다.
3.2 추론 모델 실기
머신러닝프로젝트는 모델을 저장할수있는 코랩노트북에 도달했다고 끝나는게아니다. 제품에 훈련때와 완전히 같은 파이썬 모델이 들어가는 경우는 별로없다.
파이썬보다는 다른 환경에 사용할수 있도록 export를 하고싶을것이다.
왜냐하면 제품 환경이 파이썬을 지원하지 않을수있기 때문이다. ex)모바일 앱 ,임베디드시스템
어플이 파이썬으로 되어있지않다면, 파이썬 모델은 엄청난 오버헤드를 부를것이다.
제품모델이 결과예측을하지 훈련을하는게아니기때문에 많은 최적화를 통해 모델을 더 빠르고, 메모리 소비를 줄일 여유가 있다.
모델 배포 옵션
REST API
모델을 출시하는 일반적인 방법이다.
텐서플로우를 서버나 클라우드에 설치하고, REST API를 통해 결과값을 가져오는것이다.
Flask와 같이 자신만의 어플을 가질수있고 혹은 텐서플로우의 AIP를 모델로 보내주는 라이브러리를 사용할수있다.
이것을 Tensorflow Serving이라 부른다.
여기에서는 다음의 설정을 해야한다.
- 어플리케이션은 모델의 예측을 하는 인터넷에 안정적으로 엑세스할수있어야할것이다.
- 어플리케이션은 미연되면 안된다. 요청, 참조 ,정답 루틴이 500ms안에 이루어져야한다.
- 참조로 보내진 인풋데이터는 그렇게 민감하지 않다 모델에 보여져야하기때문에 데이터는 서버에서암호화된 형태로 사용가능해야한다.
예를들면 이미지 검색엔진 프로젝트, 음악추천시스템, 카드사기감지 프로젝트, 그리고 위성 사진 프로젝트는 REST API가 잘맞는다.
디바이스에서 모델 사용하기
스마트폰이나 임베디드 로봇환경에서 모델을 사용할 필요가 있을것이다.
이때는 다음을 설정해줘야한다.
- 모델은 지연 제한에 엄격하거나 인터넷 접속이 어려운 환경에서 실행되어야 할것이다.
- 모델이 해당 디바이스의 메모리와 전력상황에 맞춰 충분히 작아야한다.
- 가장 놆은 정확도를 보이는게 중요한것이아니다.
실행시간의 효율성과 정확도 ㅅ이를 잘 조절해야한다.
스마트폰이나 임베디드 디바이스에 케라스 모델을 사용한다면 TensorFlow Lite가 자주 사용된다.
브라우저에서 모델사용하기
딥러닝은 브라우저 기반이나 데스크톱 기반의 자바스크립트 어플에 종종 사용된다.
모델이 인터넷에서 동작하는것보다 유저의 컴퓨터에서 사용되게 하고싶을것이다.
이때는 다음의 사항을 고려해볼수있다.
- 서버비용을 절감하기위해 유저에 계산을 시키길 원한다.
- 인풋데이터는 유저의 폰이나 컴퓨터에 있어야한다.
- 지연율에 제한이걸리게된다.
왜냐면 고성능 GPU에 돌리는게아니라 스마트폰이나 개인 PC에서 계산하기 때문이다.
- 모델이 다운로드되면 인터넷 연결없이 어플이 동작하는것을 원할것이다.
물론 모델이 충분히 작아야 이것이 문제가 없을것이다.
자바스크립트로 하기위해선 TensorFlow.js를 사용해라
모델 최적화 추론
추론을 통해 모델을 최적화하는것은 전력과 메모리가 제한되는 상황 혹은 낮은지연율이 요구되는 상황에서 매우 중요하다.
TensorFlow.js를 import하거나 TensorFlwo Lite를 export하기전에 모델을 최적화해야한다.
가중치 제거 모든 가중치 텐서가 예측에 효과적인것은 아니다. 이러한 것들을 제거하여 레이어의 파라미터 수를 낮추는것은 메모리를 절약하고 계산을 빠르게할수있다.
가중치양자화 : 데이터를 비트로 표현해도 좋다.
3.3 모델 모니터링
추론 모델을 export하였고, 어플에 넣었고, 제품 데이터에 대해 시험운용을 마쳤다. 모델이 기대한대로 작동했다. 그렇다면 이제 제품출시를 할대이다.
근데 이것이 끝이아니다. 모델을 개발하면 모니터링을 통해 새로운데이터와 어플리케이션의 상호작용을 보고, 비지니스 지표에의 영향을 확인해야한다.
- 랜덤 A/B테스팅을 통해 모델의 독립변수를 고려해봐라
- 가능하다면 프로덕션 데이터에 대한 모델 예측의 정규적인 심사를 진행하라.
- 2번이 불가능하다면, 유저 설문조사와같은 방법을 사용하라
3.4 모델 유지보수
마지막으로 어떠한 모델도 영구적이지 않다. 제품의 데이터는 바뀔것이고, 점점 성능이 안좋아질것이다.
모델을 출시하자마자, 그것을 대체할 다음을 준비해야한다.
- 프로덕션데이터에 대해 주의하라
새로운 특성이 이용가능한가? 라벨 세트를 바꿔야하는가?
- 데이터를 계속 수집하고, 주석을 달고, 계속해서 업데이트를하라
현재의 모델로 분류가 어려울거같은 데이터에 주의를 특히나 기울여야한다.
Leave a comment