IT/머신러닝 시스템 설계

[머신러닝 시스템 설계] Ch.6 모델 개발과 오프라인 평가

vulter3653 2023. 8. 4. 03:32

<머신러닝 시스템 설계>의 'ch.6 모델 개발과 오프라인 평가'의 내용을 요약 및 정리한 내용입니다.

 

https://product.kyobobook.co.kr/detail/S000201212403

 

머신러닝 시스템 설계 | 칩 후옌 - 교보문고

머신러닝 시스템 설계 | 프로덕션 환경에서 머신러닝을 다룰 때무수히 생겨나는 물음표를 해결해줄 MLOps 지침서머신러닝 시스템 개발은 선형이 아닌 순환 프로세스다. 모델을 개발해 배포하고

product.kyobobook.co.kr


0. 개요

앞서 모델 훈련 데이터를 생성하는 방법을, 그리고 훈련데이터로부터 피처 엔지니어링을 수행하는 방법을 배웠습니다.

 

이번에는 초기 단계의 피처 집합을 사용하는 ML 시스템의 ML 알고리즘 부분을 다룹니다.

 

해당 단계는 다양한 알고리즘과 기법을 사용하여 데이터와 피처 엔지니어링에 들인 노력이 출력값을 제공하는 시스템으로 결실을 맺는 첫 번째 단계입니다. 이 출력값을 통해 노력이 성공으로 이어지는지 평가해 볼 수 있습니다.

 

ML 모델 개발에 앞서 먼저 개발할 ML 모델을 선택해야 합니다. 최근 다양한 ML 알고리즘이 활발하게 연구 및 개발되고 있습니다. 

 

1. 가장 작업에 적합한 알고리즘을 선택할 때 유용한 여섯 가지 팁을 살펴봅니다.

 

2. 디버깅, 실험 추적과 버전관리, 분산 학습, 오토 ML 같은 모델 개발의 다양한 측면을 알아봅니다.

 

3. 모델 개발은 반복 프로세스 입니다. 반복이 끝날 때마다 모델 성능을 비교해봐야 합니다. 이번 반복 단계 결과물의 성능이 이전 반복 단계와 비교해서 프로덕션 환경에 얼마나 적합할지 평가합니다.

 

4. 마지막에는 모델을 프로덕션 환경에 배포하기 전에 평가하는 방법을 알아봅니다. 여기에는 교란 테스트, 불변성, 테스트, 모델 보정, 슬라이스 기반 평가 등 다양한 기법이 있습니다.

 

1. 모델 훈련과 개발 

여기서는 모델을 개발하고 훈련하는 데 필요한 여러 측면을 살펴봅니다. 주어진 문제에 대해 다양한 ML 모델을 평가하는 방법, 모델 앙상블 생성, 실험 추적과 버전 관리, 오늘날 모델이 일반적으로 훈련되는 규모에서 필요한 기술인 분산훈련을 살펴보고, 마지막에는 보다 심화 주제인 오토 ML에 대해 알아봅니다.

 

1.1 머신러닝 모델 평가

문제가 주어졌을 때 시도해볼수 있는 해결안은 다양합니다. 그중 ML을 사용하기로 결정했다면 작업에 어떤 ML 알고리즘을 사용해야 가장 좋을지 막막하기도 합니다.

 

이 경우, 시간과 연산 능력에 제한이 없다면 가능한 해결안을 모두 시도해보고 최적의 방안을 선택하는 편이 합리적입니다. 하지만 시간과 연산 능력은 한정되어 있습니다.

 

따라서 어떤 모델을 선택할지 전략적으로 접근해야 합니다.

 

ML 알고리즘이라 하면 많은 사람들이 고전적인 ML 알고리즘 대 신경망의 구도를 떠올립니다. 신경망, 특히 딥러닝을 많은 주목을 받았고 언론에서도 활발하게 다뤄졌기에 딥러닝이 기존 ML 알고리즘을 대체하고 있다는 인상을 받기 쉽습니다.

 

하지만 신경망이 배포된 애플리케이션에도 여전히 고전적인 ML 알고리즘이 함께 사용되며, 기존 ML 알고리즘 역시 큰 비중을 차지하고 있습니다.

 

문제에 대한 모델을 선택할 때는 가용한 모델 전체가 아니라 문제에 일반적으로 적합한 모델 집합에 집중해야 합니다.

 

예를 들어, 이상 거래 탐지 시스템을 개발한다고 가정해보겠습니다. 이는 전형적인 이상 탐지 문제로, 이상 거래는 탐지하고자 하는 이상치입니다. 이런 문제에는 흔히 k-최근접 이웃, 이이솔레이션 포레스트, 클러스터링, 신경망 등 다양한 알고리즘이 사용됩니다.

 

이처럼 주어진 문제에 사용한 모델을 선택하려면 일반적인 ML 작업 유형과 이를 해결하기 위한 접근법에 대한 지식이 필요합니다.

 

알고리즘 유형이 다양한 만큼 연산량과 필요한 레이블 개수 또한 천차만별입니다.

 

어떤 알고리즘을 다른 것에 비해 훈련 시간이 훨씬 긴 반면 어떤 알고리즘은 예측 시간이 훨씬 길기도 합니다. 신경망 계열이 아닌 알고리즘은 신경망보다 모델의 작동 과정과 그 결괏값을 설명하기에 좀 더 편리한 특징이 있습니다.

 

다양한 알고리즘을 이해하고 싶다면 ML 기본 지식을 탄탄히 다진 뒤 관심 있는 알고리즘으로 끊임없이 실험해는 것이 좋습니다. 또한 새로운 ML 기법과 모델을 학습하는 것도 놓쳐서는 안됩니다.

 

이어서 모델 선택 시 활용할 수 있는 팁을 살펴보겠습니다.

 

다음 여섯 가지 팁은 수많은 알고리즘을 일일이 상세히 검토하지 않아도 다음에 작업할 ML 알고리즘을 빠르게 결정하는 데 큰 도움을 줍니다. 

 

1. 최첨단만 추종하는 함정에 빠지지 않기

 

많은 사람들이 최첨단 모델이 문제에 대한 최적이 솔루션이라고 믿습니다.

 

그렇기에 신규 솔루션이 이전보다 좋다고 확신하기에 굳이 이전 솔루션을 시도할려고 하지 않습니다.

 

많은 비즈니스 리더는 비즈니스를 최신식으로 포장하기 위해 최첨단 모델을 적용하고 싶어하고, 개발자는 낡은 기술에 갇혀 지내기 항상 새로운 것을 만져보고 싶어 합니다.

 

그렇지만 학문적인 맥락에서와 비즈니스 환경은 다릅니다.

 

연구원의 경우, 모델을 학문적인 맥락에서 평가합니다. 즉, 최첨단 모델이 의미하는 바는 '일부 정적 데이터셋에서 기존 모델모다 성능이 더 좋다'는 뜻입니다. 또한 모델이 구현 측면에서 충분히 빠르거나 비용이 낮다는 뜻이 아니며, 모델이 비즈니스 환경의 데이터에서 다른 모델보다 성능이 월등하다는 뜻 또한 아닙니다.

 

최신 기술을 사용하는 일도 매우 중요하고 비즈니스 평가에 큰 도움이 되지만 문제 해결에서 가장 중요한 것은 해결 방안을 찾아내는 일입니다. 최첨단 모델보다 훨씬 저렴하고 문제를 단순하게 해결한 방안이 있다면 그것을 사용하는 편이 좋습니다.

 

2. 가장 단순한 모델부터 시작하기

 

ML에서 단순함은 아래와 같은 세 가지 측면에서 유용합니다.

 

  1. 단순한 모델을 배포하기 쉽습니다. 이는 예측 파이프라인을 훈련 파이프라인과 빠르게 비교, 확인하는데 도움을 줍니다.
  2. 단순한 것에서 시작해 복잡한 구성 요소를 단계별로 추가하는 편이 모델을 이해하고 디버깅하기 더 쉽습니다.
  3. 가장 단순한 모델은 보다 복잡한 모델의 비교 대상으로서 베이스라인 역할을 수행합니다.

다만, 가장 단순한 모델이 항상 노력이 최소한으로 드는 모델이 아니라는 점은 유의해야 합니다.

 

3. 모델을 선택할 때 사람의 편향을 주의하기

여러분의 팀은 그래디언트 부스트 트리와 사전 훈련된 BERT 모델 중 어느 모델이 문제에 적합한지 평가하는 작업을 배정받았습니다.

 

한 엔지니어는 그래디언트 부스트 트리가 최적 BERT 모델이 최적 그래디언트 부스트 트리보다 성능이 좋다고 주장하고, 또 다른 한 엔지니어는 최적 그래디언트 부스트 트리가 최적 BERT 모델보다 성능이 좋다고 주장합니다. 어떻게 된 일일까요?

 

모델 평가 과정에는 사람의 편향이 들어갈 수밖에 없습니다.

 

ML 아키텍처를 평가하는 프로세스 중 일부는 특정 아키텍처에 대한 최적 모델을 찾기 위해 다양한 피처와 하이퍼파라미터 집합을 실험해 봅니다. 엔지니어가 특정 아키텍처에 관심이 크다면 실험하는데 훨씬 더 많은 시간을 들일 테고 그 아키텍처에 대해 더 성능이 좋은 모델을 만들어낼 가능성이 높습니다.

 

서로 다른 아키텍처를 비교할 때는 비교 가능한 설정 아래에서 비교하는 것이 중요합니다. 어떤 아키텍처에 실험을 100회 수행했는데 비교 대상인 아키텍처는 실험을 단지 몇 회만 돌려본다면 공정하지 않습니다. 비교하는 아키텍처에도 실험을 100회 수행해야 합니다.

 

또한 모델 아키텍처 성능은 평가 맥락, 예컨대 작업, 훈련 데이터, 테스트 데이터, 하이퍼파라미터 등에 크게 좌우되므로 특정 모델 아키텍처가 다른 아키텍처보다 낫다고 단언하기도 어렵습니다. 따라 상황에 따라 더 나을 수도, 아닐 수도 있습니다.

 

4. 현재 성과와 미래 성과를 비교 평가하기

 

현재 최적인 모델이 두 달 후에도 최적은 아닐 수 있습니다. 예를 들어, 데이터가 많지 않을 때는 트리 기반 모델이 좋지만 두 달 후 훈련데이터가 두 배로 늘어난다면 신경망 성능이 훨씬 더 좋아질 겁니다.

 

그렇기에 학습 곡선을 통해 데이터가 늘어남에 따라 모델 성능이 어떻게 변할지 가늠하는 것은 중요합니다.

 

모델의 학습 곡선은 사용하는 훈련 샘플 개수에 따른 모델 성능의 플룻입니다 (예 : 훈련 손실, 훈련 정확도, 검증 정확도). 훈련 데이터 증가에 따라 성능이 정확히 얼마나 향상될지 추정하는 데는 도움이 안 되지만 성능상 이점이 있을지는 대략 알 수 있습니다.

 

아래의 그림은 니바브 베이즈와 SVM 모델의 학습 곡선입니다. 둘 모두 훈련데이터가 증가함에 따라 성능이 증가하는 모습을 보여줍니다.

 

나이브 베이즈와 SVM 모델의 학습 곡선 (출처 : 사이킷런)

 

모델을 평가할 때는 이렇게 가까운 미래에 개선 가능한 잠재력과 개선 작업의 난이도를 고려하는 것이 필요합니다.

 

5. 트레이드오프를 평가하기

 

모델을 선택할 때는 수많은 트레이드오프를 고려해야 합니다.

 

ML 시스템의 성능을 결정하는 요소 중 무엇이 더 중요한지 이해하면 가장 적합한 모델을 선택하는 데 도움이 됩니다.

 

예 1 : 위양성과 위음성 간의 트레이드오프

  • 위양성 수를 줄이면 보통 위음성 수가 늘어나고, 반대로 위음성 수를 줄이면 위양성 수가 늘어납니다.
  • 예를 들어, 지문 잠금 해제 같이 위음성보다 위양성이 더 위험한 작업에서는 위양성이 적은 모델이 선호됩니다.
  • 또 다른 예로, 코로나 19선별 검사같이 위양성보다 위음성이 더 위험한 작업에서는 위음성이 적은 모델이 선호됩니다.

 

예 2:  연산량 요구 사항과 정확도 간의 트레이드오프

  • 복잡한 모델은 정확도가 높지만 추론 시 수용가능한 레이턴시로 예측값을 생성하려면 CPU 대신 GPU를 사용하는 등 보다 강력한 시스템이 필요합니다.

 

예 3 : 해석 가능성과 성능 간의 트레이드오프

  • 복잡한 모델은 성능이 좋지만 결과를 해석하기는 어렵습니다.

 

6. 모델의 가정을 이해하기

 

통계학지 조지 박스는 1976년 "모든 모델을 잘못됐지만 일부는 유용하다"라고 이야기했습니다. 현실은 엄청나게 복잡하므로 모델은 가정을 통해 어느 정도 근사를 해낼 뿐입니다.

 

모든 단일 모델은 자신만의 가정이 있으며, 모델이 무엇을 가정하며 데이터가 그 가정을 실제로 충족하는지 이해한다면 유스 케이스에 가장 적합한 모델이 무엇인지 평가할 수 있습니다.

 

다음은 흔히 사용하는 가정 중 일부의 예시입니다.

 

1. 예측가정(Preduction assumption)

  • 입력 X에서 출력 Y를 예측하는 것이 목표인 모델은 X를 기반으로 Y를 예측할 수 있다고 가정합니다.

 

2. IID(Independent and Identically Distributed)

  • 신경망은 각각의 데이터 포인트가 독립적이고 분포가 동일하다고 가정합니다. 이는 모든 데이터 포인트가 동일한 결합 분포에서 독립적으로 추출됐다는 의미입니다.

 

3. 매끄러움(Smoothness)

  • 모든 머신러닝 지도 학습 방법은 입력을 출력으로 변환하는 함수 집합을 가정합니다. 이때 유사한 입력값은 유사한 출력값으로 변환됩니다. 입력 X가 출력 Y를 생성한다면 X에 가까운 입력값은 비례적으로 Y에 가까운 출력값을 생성합니다.

 

4. 계산 가능성 (Tractability)

  • X는 입력이고 Z는 X의 잠재 표현이라고 할 때 생성 모델은 확률 P(Z|X)를 계산할 수 있다고 가정합니다.

 

5. 경계(Boundaries)

  • 선형 분류기는 결정 경계가 선형이라고 가정합니다.

 

6. 조건부 독립(Conditional independence)

  • 나이브 베이즈 분류기는 정해진 클래스에 대해 속성값들이 상호 독립이라고 가정합니다.

 

7. 정규 분포(Noramlly distributed)

  • 많은 통계적 방법론은 데이터가 정규 분포를 따른다고 가정합니다.

 

1.2 앙상블

 

문제에 어떤 ML 솔루션을 사용할지 처음 고민하는 단계에는 모델을 단 하나만 포함하는 시스템으로 시작하게 되나, 단일 모델을 개발한 뒤에는 성능을 지속적으로 향상하기 위한 방법을 고민하게 됩니다.

 

이 경우, 한 가지 방법은 개별 모델이 아니라 여러 모델의 앙상블을 사용해 예측하는 것입니다.

 

이때 앙상블 내의 각 모델을 기본 학습기 라고 합니다. 이메일의 스팸 여부를 예측하는 작업을 예로 들어봅시다. 세 가지 모델이 있을 때 최종 예측은 세 모델의 다수결 투표로 정합니다. 즉, 기본 학습기 두 개 이상이 스팸이라고 출력한다면 이메일은 스팸으로 분류됩니다.

 

2023년 8월 기준, 스탠퍼드 질의응답 데이터셋인 SQuAD 2.0의 상위 솔루션 10개가 모두 앙상블입니다.

 

앙상블은 배포가 복잡하고 유지 관리가 어려워 프로덕션 환경에서는 선호되지 않지만 광고 클릭률 예측처럼 성능이 조금만 향상돼도 금전적 이득이 큰 경우 자주 사용되기도 합니다.

2023년 8월 기준. SQuAD 의 상위 10개 솔루션 모두 앙상블입니다.

 

앙상블 작동원리는 아래와 같습니다.

 

세가지 모델의 출력 확률 잉상블의 출력
3개 모두 맞음 0.7 * 0.7 * 0.7 = 0.343 맞음
2개 맞음 (0.7 * 0.7 * 0.3) * 3 = 0.441 맞음
1개 맞음 (0.3 * 0.3 * 0.7) * 3 = 0.189 틀림
3개 모두 틀림 0.3 * 0.3 * 0.3 = 0.027 틀림

 

이메일 스팸 분류기 3개가 있고 각각 정확도가 70%라고 가정합니다. 각 분류기가 예측을 올바르게 수행할 확률은 모두 동일하고, 세 분류기 간에 상관관계가 없다면 셋의 다수결 투표를 통해 78.4%의 정확도를 얻습니다.

 

어떤 이메일에 대해 각 분류기의 결과가 올바를 확률은 70%입니다. 두 개 이상의 분류기 결과가 올바르다면 앙상블 또한 올바른 결과를 내놓습니다. 따라 위의 표는 특정 이메일에 대해 얻을 수 있는 앙상블의 출력 결과와 그 확률을 보여줍니다. 예시 앙상블의 정확도는 0.784 (0.343+0441) 혹은 78.4%입니다.

 

다만 위의 계산은 앙상블의 분류기 간에 상관관계가 없을 때만 유효합니다.

 

모든 분류기가 서로 1의 상관계수를 갖는다면, 즉 세 개 모두 각 이메일에 대해 동일한 예측을 수행한다면 앙상블의 정확도는 개별 분류기와 동일합니다. 앙상블 성능은 기본 학습기 간의 상관관계가 낮을수록 좋아집니다. 따라서 앙상블을 구성 할 때는 일반적으로 유형이 서로 상당히 다른 모델을 선택하게 됩니다.

 

앙상블을 만드는 방법은 배깅, 부스팅 스태킹 등 세 가지 입니다. 세 가지 방법을 차례로 살펴보겠습니다.

 

1.2.1 배깅 

 

배깅은 부트스트랩 집계의 줄임말로, ML 알고리즘의 훈련 안정성과 정확도를 모두 개선하도록 설계됐습니다. 분산을 줄이고 과적합을 방지하는데 효과적입니다.

 

데이터 셋이 주어지면 전체 데이터 셋으로 하나의 분류기를 훈련하는 대신 복원 추출을 수행해 여러 데이터셋을 생성합니다. 각 데이터셋을 부트스트랩이라고 하며, 각 부트스트랩으로 분류 또는 회귀 모델을 훈련합니다. 복원 추출이므로 각 부트 스트랩은 서로 독립적으로 생성됩니다.

 

배깅 (출처 : https://www.simplilearn.com/tutorials/machine-learning-tutorial/bagging-in-machine-learning)

 

 

 

이러한 배깅은 일반적으로 신경망 분류 및 회귀 트리나 선형 회귀의 변수 하위 집합 등의 불안정성이 높은 기법의 성능을 개선합니다. 하지만 K-최근접 이웃처럼 안정적인 기법의 성능은 다소 저하시키기도 합니다.

 

1.2.2 부스팅

 

부스팅은 약한 학습기를 강한 학습기로 바꾸는 반복 앙상블 알고리즘의 일종입니다. 앙상블을 구성하는 각 학습기는 동일한 샘플 집합으로 학습하지만 반복마다 각 샘플에 가중치를 다르게 줍니다. 결과적으로 나중에 더해지는 약한 학습기는 이전의 약한 학습기들이 잘못 분류한 데이터 포인트에 더욱 집중하게 됩니다.

 

부스팅 (출처 : https://en.wikipedia.org/wiki/Boosting_(machine_learning)#/media/File:Ensemble_Boosting.svg)

부스팅의 각 단계는 다음과 같습니다.

  1. 원래 데이터셋으로 첫 번째 약한 분류기를 훈련합니다.
  2. 샘플마다 첫 번 째 분류기에서 얼마나 잘 분류되는지에 따라 가중치가 부여됩니다. 잘못 분류된 샘플에는 더 높은 가중치가 부여됩니다.
  3. 가중치가 부여된 데이터셋으로 두 번째 분류기를 훈련합니다. 앙상블은 첫 번째와 두 번째 분류기를 구성합니다.
  4. 샘플마다 앙상블에서 얼마나 잘 분류되는지에 따라 가중치가 재부여 됩니다.
  5. 가중치가 재부여된 데이터셋으로 세 번째 분류기를 훈련합니다. 앙상블에 세 번째 분류기를 추가합니다.
  6. 필요한 만큼 반복합니다.
  7. 최종적으로 기존 분류기의 가중치 조합으로 강한 분류기를 구성합니다. 분류기의 훈련 오차가 적을수록 가중치가 높습니다.

 

1.2.3 스태킹

 

스태킹은 훈련 데이터로 기본 학습기를 훈련하고, 기본 학습기의 출력을 결합해 최종 예측을 수행하는 메타 학습기를 만듭니다.  메타 학습기는 단순한 휴리스틱일 수도 있습니다. 즉, 모든 기본 학습기에 대해 다수결 투표 혹은 평균 투표를 수행합니다. 따라 기본 학습기로는 로지스틱 회귀모델이나 선형 회귀 모델 등 서로 다른 종류의 모델 집합을 사용할 수 있습니다.

 

 

스태킹 (출처 : https://www.analyticsvidhya.com/blog/2021/08/ensemble-stacking-for-machine-learning-and-deep-learning/)

 

1.3 실험 추적과 버전 관리

 

모델 개발 프로세스에서, 문제에 가장 적합한 모델을 선택하려면 다양한 아키텍처와 모델을 실험해봐야 합니다.

 

어떤 모델들은 서로 비슷해 보여도 성능이 극단적으로 다릅니다.

 

그렇기에 실험 및 관련 아티팩트를 재현하는데 필요한 정의를 모두 추적하는 것이 중요합니다. 아티팩트는 실험 중에 생성되는 파일을 의미합니다. 아티팩트의 예로 손실 곡선, 평가 손실 그래프, 로그, 훈련 프로세스 전반에 걸쳐 생성되는 모델 중간 결과 파일 등이 있습니다.

 

다양한 실험을 비교하며 작은 변화가 모델 성능에 얼마나 영향을 미치는지 파악할 수 있으며, 결과적으로 모델 작동 방식에 대한 가시성이 높아집니다.

 

실험 진행 상황과 결과를 추적하는 과정실험 추적이라고 하며,

나중에 재현하거나 다른 실험과 비교할 목적으로 실험의 모델 세부 정보를 기록하는 프로세스버전 관리라고 합니다.

 

실험 추적과 버전 관리에 대해 알아보겠습니다.

 

1.3.1 실험 추적

 

ML 모델을 훈련할 때, 훈련 과정에서 다양한 문제가 발생합니다.

 

그렇기에 문제를 감지하고 해결하여 모델이 유용한 정보를 제대로 학습하고 있는지 평가할려면, 훈련 중 발생하는 상황을 계속 추적하는 일이 중요합니다.

 

다음은 훈련 과정에서 각 실험에 대해 고려할 만한 추적 지표의 예시입니다.

 

1. 손실 곡선

  • 훈련 데이터셋과 각 평가 데이터셋에서 측정한 손실 곡선

 

2. 모델 성능 지표

  • 정확도, F1, 퍼플렉서티 등 테스트를 제외한 데이터셋에서 주로 측정하는 모델 성능 지표

 

3. 샘플, 예측값, 그라운드 트루스 레이블 쌍에 대한 로그

  • 임시로 빠르게 살펴보는 분석과 새너티 체크에 유용합니다.

 

4. 모델훈련 속도

  • 초당 처리되는 단계 수로 평가하거나, 데이터가 텍스트일 때는 초당 처리되는 토큰 수로 평가합니다.

 

5. 시스템 성능 지표

  • 메모리 사용량 , CPU/GPU 사용률 등으로, 병목 현상을 식별하고 시스템 자원 낭비를 방지하는데 매우 중요합니다.

 

6. 매개변수와 하이퍼파라미터

  • 변경 시 모델 성능에 영향을 미치는 매개 변수와 하이퍼 파라미터의 시간에 따른 값 (예 : 학습률, 가중치 등)

 

이러한 추적 가능한 지표들은 어떤 문제가 발생하면 항목들 중 하나 이상이 모델을 이해하고 디버깅 하기 위한 실마리를 제공하는 역할을 합니다.

 

그렇기에 이론상 추적 가능한 지표를 모두 추적하는 것도 나쁜 생각은 아닙니다.

 

하지만 보통 대부분은 살펴보지 않아도 되는 것들이며, 도구의 한계로 인해 너무 많은 항목을 추적하는 일은 큰 부담이 되기도 합니다. 또한 중요도가 떨어지는 것들을 추적하다 보면 정말 중요한 것을 놓칠수도 있습니다.

 

그렇기에 어떤 요소가 모델 성능에 어떤 영향을 미치는지 관찰해 그 요소의 역할을 파악하는 것이 중요합니다.

 

1.3.2 버전 관리

 

ML 실험 버전을 관리하면 코드 및 데이터를 변경 후, 다시 되돌리는 것이 필요한 상황에서 못되돌리는 문제를 피할 수 있습니다.

 

ML 시스템의 일부는 코드이고 일부는 데이터이므로 코드뿐 아니라 데이터도 버전을 지정해야 합니다.

 

따라 코드 버전 관리는 이제 어느 정도 업계의 표준이 됐지만 데이터 버전 관리의 경우에는 아직 미흡합니다.

 

하지만 데이터 버전 관리가 어려운 데는 몇가지 이유가 있습니다.

 

  1. 데이터가 종종 코드보다 훨씬 크기 때문에 보통은 코드 버전 관리 전략을 데이터 버전 관리에 동일하게 사용하기가 어렵기 때문입니다.
  2.  변경사항을 어떻게 정의할지 명확하지 않고 의견이 분분하기 때문입니다.
    • 데이터 저장소 내 파일 내용변경, 즉 diff는 파일이 제거되거나 추가된 경우를 의미해야 할까요. 혹은 전체 저장소의 체크섬이 변경됭 경우를 의미해야 할까요? 2021년 기준 DVC 같은 데이터 버넌 관리 도구는 전체 디렉터리의 체크섬이 변경되고 파일이 제거되거나 추가됐을 때만 diff를 등록합니다.
    • 또 다른 논쟁점은 병합 충돌을 해결할 방법입니다. 개발자 1이 데이터 버전 X를 사용해 모델 A를 학습하고 개발자 2가 데이터 버전 Y를 사용해 모델 B를 학습한다면, 데이터 버전 X와 Y를 병합해 Z를 만드는 행위는 아무런 의미가 없습니다. Z에 해당하는 모델이 없기 때문입니다.
  3. 데이터 버전 관리가 어려운 세 번째 이유는 규정 때문입니다.
    • 사용자 데이터로 모델을 훈련한다면 일반 데이터 보호 규정 (GDPR) 등으로 해당 데이터의 버전 관리가 복잡해집니다.  예를 들어, 규정상 사용자가 데이터 삭제를 요청하면 해당 사용자의 데이터를 즉각 삭제해야 하므로 이전 버전의 데이터를 복구하는 일이 법적으로 불가능해집니다.

꼼꼼한 실험 추적과 버전 관리는 재현성에 도움이 되지만 재현성을 완전히 보장하지는 않는다는 점은 유의해야 합니다. 사용하는 프레임워크와 하드웨어는 종종 실험 결과에 비결정론적 성질을 주입하므로 실험이 실행되는 환경에 대한 모든 것을 알지 못한다면 실험 결과를 복제하는 일 자체가 불가능하게 됩니다.

 

1.4 분산 훈련

 

모델 훈련에 메모리 크기보다 큰 데이터를 사용하는 일은 드물지 않습니다. 데이터가 메모리 크기보다 크다면 데이터 전처리, 셔플링, 데이터 배치 분할 처리를 수행하는 알고리즘 작업을 아웃 오브 코어 형태 그리고 병렬로 처리해야 합니다.

 

1.4.1 데이터 병렬 처리

 

여러 머신에서 ML 모델을 훈련하는 일이 일상이 돼가고 있습니다. 최신 ML 프레임워크에서 지원하는 병렬화 기법 중 가장 보편적인 것인 데이터 병렬화입니다. 여러 머신에 데이터를 분할하고, 각 머신에 모델을 훈련하고 그래디언트를 합산합니다.

 

다만 아래와 같은 문제점들에 대해 유의해야 합니다.

 

  1. 가장 까다로운 문제는 서로 다른 머신에서 계산한 그래디언트를 어떻게 정확하고 효과적으로 합산할 것인지 입니다.
    • 머신마다 각자 그래디언트를 생성하므로 모델이 모든 실행이 완료되기를 기다린다면, 즉 동기식 확률적 경사 하강법(SGD)을 사용한다면 작업속도가 느린 머신 하나가 전체 시스템의 속도를 늦추고 시간과 자원을 낭비하게 됩니다. 이러한 낙오자 문제는 머신 대수가 늘어날수록 심각해집니다. 작업자가 많을수록 특정 반복에서 비정상적으로 느리게 실행되는 작업자가 적어도 한 대 이상일 확률이 높아지게 됩니다.
    • 모델이 각 머신의 그래디언트를 새용해 개별적으로 가중치를 업데이트한다면, 즉 비동기식 SGD를 사용한다면 한 머신의 그래디언트가 다른 머신의 그래디언트를 입수하기 전에 가중치를 바꿔버리므로 최신이 아닌 그래디언트를 적용하면서 생기는, 그래디언트 부패 문제가 발생할 수 있습니다.
  2. 모델을 여러 머신에 복제하면 배치가 매우 커지는 문제가 발생합니다.
    • 머신 한 대가 1,000개 짜리 배치를 처리하면, 머신 1,000대는 100만 개짜리 배치를 처리합니다. 계산을 단순화해서 머신 한 대에서 에폭 하나를 훈련하는데 100만회 반복해야 한다면 머신 1,000대에서는 1,000회만 반복하면 됩니다. 단순한 해결책으로 반복마다 더 많이 학습하도록 학습률을 높이는 방법이 떠오르기도 합니다. 하지만 이는 수렴이 불안정해지는 상황을 종종 야기하므로 학습률을 너무 크게 만들 수는 없는 노릇입니다. 실제로 배치 크기를 늘리다가 특정 지점을 넘어서면 이득이 되레 감소합니다.
  3. 모델 설정을 동일하게 가져가면서 주 작업자가 다른 작업자보다 자원을 더 많이 사용하는 문제가 종종 발생합니다.
    • 모든 머신을 최대한 활용하려면 각 머신 간의 워크로드가 균형을 이뤄야 합니다. 효과적이진 않지만 가장 쉬운 방법은 주 작업자에 좀 더 작은 배치 크기를 설정하고 다른 작업자에 좀 더 큰 배치 크기를 설정하는 것입니다.

 

1.4.2 모델 병렬 처리

 

데이터 병렬 처리 기법에서는 각 작업자가 모델 전체를 복제해와서 그것고 관련된 모든 계산을 수행합니다. 반면에 모델 병렬 처리는 모델의 각기 다른 구성 요소를 서로 다른 머신에서 훈련합니다. 

 

모델 병렬 처리 ( 출처 : https://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/model-parallel-intro.html)

 

다만 모델 병렬 처리는 병렬 처리라고 부르기는 하지만 어떨 때는 서로 다른 머신에 있는 모델의 서로 다른 부분이 동시에 병렬로 실행되지 않기도 합니다.

 

1.4.3 파이프라인 병렬 처리

 

이는 서로 다른 머신에 있는 모델의 서로 다른 구성 요소들이 좀 더 병렬화해 처리되도록 고안한 기법입니다. 다양한 변형이 있지만 핵심은 각 머신의 계산을 여러 부분으로 잘게 나누는 것입니다.

 

머신 1의 계산의 첫 번째 부분을 완료하면 그 결과를 머신 2에 전달하고 두 번째 부분으로 넘어가는 식입니다. 머신 2는 첫 번째 부분에 계산을 실행하고 머신 1은 두 번째 부분에 계산을 실행하게 됩니다.

 

예를 들어, 서로다른 머신 4대가 있고 첫 번째, 두 번째, 세번째, 네 번째 레이어를 각각 머신 1, 2, 3, 4가 들고 있다고 가정해보겠습니다. 파이프라인 병렬 처리의 경우 각 미니 배치는 마이크로 배치 4개로 나뉩니다. 머신 1은 첫 번째 마이크로 배치에서 첫 번째 레이어를 계산하고, 머신 2개 머신 1의 결과로 두 번째 레어를 계산하는 동안 머신 1은 다시 두 번째 마이크로 배치에서 첫 번째 레이어를 계산합니다. 아래의 그림은 머신 4대에서 파이프라인 병렬 처리가 어떻게 이뤄지는지를 나타냅니다. 각 머신은 신경망의 특정 구성 요소에 대해 순방향 패스와 역방향 패스를 모두 처리합니다.

 

파이프라인 병렬처리의 예 ( 출처 : https://pytorch.org/docs/stable/pipeline.html)

 

모델 병렬 처리와 데이터 병렬 처리는 상호 베타적이지 않습니다. 많은 회사에서 하드 웨어 활용도를 높이기 위해 두 방법 모두를 사용하지만, 엔지니어링에 상당한 시간과 노력이 듭니다.

 

1.5 오토 ML

 

1.5.1 소프트 오토 ML : 하이퍼파리미터 조정

 

오토 ML이란 실제 문제를 풀기 위해 ML 알고리즘 탐색 프로세스를 자동화 하는 것을 말합니다.

 

단순하면서 프로덕션 환경에서 가장 인기있는 형태의 오토 ML은 하이퍼파라미터 조정 프로세스입니다.

 

하이퍼파라미터는 사용자가 제공하는 매개변수로 학습 과정을 제어하는데 사용하는 값을 의미합니다.

 

2018년 논문 'On th State of the Art of Evaluation in Neural Language Models'에서는 구식 모델에 하이퍼파라미터가 잘 조정돼 있으면 더 강력한 첨단 모델보다 성능이 우수할 수 있음을 보인만큼, 하이퍼파라미터 조정은 매우 중요합니다.

 

하이퍼파라미터 조정의 목표는 검증 세트에 대한 각 하이퍼파라미터 집합의 성능을 평가해 탐색 공간 안에서 주어진 모델에 대한 최적의 집합을 찾아내는 것입니다.

 

그럼에도 많은 사람이 이런 중요성은 알면서도 수동의 직관적인 접근법을 선호하며 하이퍼파라미터 조정에 대한 체계적인 접근법을 여전히 무시하는 경향을 보입니다. 

 

하지만 점점 많은 사람이 하이퍼차라미터 조정 단계를 표준 파이프라인의 일부로 포함시키고 있으며, 인기 있는 ML 프레임워크는 하이퍼파라미터 조정을 위한 유틸리티를 내장하거나 타사 유틸리티를 포함하기도 합니다.

 

다만, 모델 성능은 여러 개의 하이퍼파라미터보다 특정 하이퍼파라미터 변경에 더 민감하게 바뀔 수 있으므로 민감한 하이퍼파라미터는 더 신중하게 조정해야 하는 유의점이 있습니다.

 

1.5.2 하드 오토 ML: 아키텍처 탐색과 학습된 옵티마이저

 

모델의 서로 다른 구성 요소 혹은 모델 전체를 하이퍼파리미터로 간주하면 어떨까요? 합성곱 레이어 크기가 스킵 레이어 유무 등을 하이퍼파라미터의 일종으로 생각하는 겁니다. 수작업으로 합성곱 레이어 다음에 풀링 레이어를 배치하거나 선형 다음에 ReLU(정형 선형 단위)를 배치하는 대신 알고리즘에 이러한 구성 단위들을 제공하고 결합한 방법을 알아내게끔 합니다.

 

이러한 연구 분야를 신경망 아키텍처 탐색(NAS)이라고 하는데, 최적의 모델 아키텍처를 탐색한다는 의미입니다.

 

NAS 설정에는 세 가지 구성 요소가 있습니다.

 

1. 탐색 공간

 

  • 가능한 모델 아미텍처의 범위를 정의합니다. 즉, 선택 가능한 구성 단위와 이를 결합하는 방법에 대한 제약 조건을 정의합니다.

 

2. 성능 추정 전략

 

  • 각 아키텍처 후보를 밑바닥부터 수렴할 때까지 훈련할 필요 없이 성능을 평가할 수 있어야 합니다. 아키텍처 후보가 매우 많을 때 (예컨대 1,000개) 모두 수렴할 때까지 훈련해야 한다면 엄청난 비용이 듭니다.

 

3. 탐색 전략

 

  • 탐색 공간을 탐험합니다. 단순한 접근법으로는 가능한 모든 설정 값을 무작위로 선택하는 무작위 탐색 방법이 있습니다. 하지만 NAS에서조차 엄청난 비용을 야기하므로 인기가 없습니다. 보다 일반적인 접근법으로는 강화학습과 진화가 있습니다.

 

NAS의 경우 탐색 공간이 이산 형태이므로 구성 단위의 집합을 NAS에 제공해줘야 합니다.

 

일반적인 구성 단위는 다양한 크기와 여러 종류의 합성곱, 선형, 여러 종류의 활성화, 풀링, 항등, 0 레이어 등입니다. 구성 단위의 집합은 기본 아키텍처, 예컨대 합성곱 신경망이나 트랜스포머 여부에 따라 달라집니다.


일반적인 ML 훈련 프로세스에서는 모델과 학습 절차, 즉 데이터셋에 대해 목적 함수를 최적화하면서 모델 매개변수의 집합을 찾아내는 알고리즘을 갖춰야 합니다. 이때 오늘날 신경망에 가장 보편적으로 사용하는 학습절차는 옵티마이저를 활용해 주어진 그래디언트 업데이트로부터 모델 가중치를 업데이트하는 방법 즉 경사 하강법이 있으며, 그 외 인기 잇는 옵티마이저로 애덤, 모멘텀, SGD 등이 있습니다.

 

이론상으로는 옵티마이저를 NAS의 구성 단위에 포함시켜 가장 잘 잘동하는 것을 탐색하면 되지만, 옵티마이저는 하이퍼파라미터 설정에 민감하고 기본 하이퍼파라미터가 아키텍처 후보 전체에서 두루 잘 동작하지 않으므로 실제로 해당 방법을 적용하긴 어렵습니다.

 

이는 연구를 흥미로운 방향으로 이끕니다.

 

업데이트 규칙을 정하는 함수를 신경망으로 대체하면 어떻게 될까요?

이 신경망은 모델 가중치를 얼마나 업데이트할지 계산해냅니다. 이러한 접근법을 사용하면 수작업으로 설계한 옵티마이저와 달리 학습된 옵티마이저가 생성됩니다. 학습된 옵티마이저 역시 신경망이므로 훈련이 필요합니다. 학습된 옵티마이저는 나머지 신경망과 동일한 데이터 셋에서 훈련할 수 있지만 이렇게 하면 작업할 때마다 옵티마이저를 새로 훈련해야 합니다.

 

또 다른 접근법은 기존 작업 집합으로 옵티마이저를 한번 더 학습시켜서 새로운 작업마다 사용하는 것입니다.

그 옵티마이저를 학습 시킬 때는 기존 작업의 합산 손실을 손실 함수로, 수작업으로 만든 옵티마이저를 학습 규칙으로 사용합니다.

 

예를 들어, 논문 'Tasks, stability, architecture, and compute: Training more effective learned optimizers, and using them to train themselves'에서는 학습된 옵티마이저를 훈련하기 위해 수천 개 작업 집합을 구성했으며, 학습된 옵티마이저를 새로운 아키텍처뿐 아니라 새로운 데이터셋과 도메인에도 일반화할 수 있었습니다. 이 접근법의 장점은 학습된 옵티마이저를 자체 개선하는식으로 더 좋은 옵티마이저를 훈련하는데 사용할 수 있다는 점입니다.

 


아키텍처 탐색이든 메타 러닝 학습 규칙이든, 선행 훈련 비용은 전 세계 몇몇 회사만 감당할 수 있을 정도로 매우 비쌉니다. 하지만 프로덕션 환경의 ML에 관심이 있다면 오토 ML 진행 상황을 눈여겨봐야 하는데, 그 두 가지 이유는 아래와 같습니다.

 

  1. 결과로 나온 아키텍처와 학습된 옵티마이저는 ML 알고리즘이 다양한 실제 작업에서 즉각 동작하도록 하며 훈련과 추론 단계의 생산 시간과 비용을 줄여줍니다.
  2. 오토 ML은 기존 아키텍처와 옵티마이저만으로는 불가능했던 다양한 실제 작업을 해결할 수 있습니다.

 

2. 모델 오프라인 평가

이번에는 모델 배포 전에 성능을 평가하는 방법을 알아봅니다.

 

다만 만들어진 ML 모델이 좋은지 나쁜지 결정하는 것은 상당히 어렵다는 것은 유의해야 합니다.

 

먼저 모델 평가를 위한 베이스라인을 논의하고, 모델을 평가하는 일반적인 방법들에 대해 알아보겠습니다.

 

2.1 베이스라인

 

만약 누군가가 만든 새로운 생성 모델이 이미지넷에서 FID 점수 10.3을 달성했습니다. 이 숫자가 무엇을 의미하는 걸까요?

 

또 다른 누군가가 만든 모델이 F1 점수 0.90을 달성했습니다. 이 경우 사실 양성 클래스가 레이블의 90%를 차지하므로 모델이 예측 시도 중 90% 확률로 무작위로 양성 클래스를 찍는다면 어떨까요? 무작위 예측의 F1 점수는 모델과 동일한 0.90으로 무작위 예측으로도 달성 가능한 수준의 모델일 것입니다.

 

위 경우 처럼 평가 지표는 그 자체로는 큰 의미가 없습니다. 모델을 평가할 때는 평가 기준을 정확히 알아야 합니다.

 

정확한 베이스라인은 유스 케이스마다 다르지만 대부분의 경우에 유용한 베이스라인은 아래와 같습니다.

 

1. 무작위 베이스 라인

 

  • 모델이 무작위로 예측한다면 기대 성능은 얼마일까요? 이때 예측은 균등 분포나 작업의 레이블 분포 등 특정 분포에 따라 무작위로 생성됩니다.
  • 레이블이 두 개인 작업을 가정해 보겠습니다. 예컨대 90% 빈도로 나타나는 음성 클래스와 10% 빈도로 나타나는 양성 클래스가 있습니다. 아래의 표는 무작위로 예측하는 베이스 라인 모델의 F1 점수와 정확도를 나타냅니다. 이러한 값을 직관적으로 이해하기 어려울 겁니다. 표를 보기 전에 연습 삼아 지표를 암산해보는 것이 좋습니다.

 

무작위 분포 의미 F1 정확도
균등 무작위 각 레이블을 동일한 확률 (50%)로 예측합니다. 0.167 0.5
작업의 레이블 분포 90%는 음성, 10%는 양성으로 예측합니다. 0.1 0.82

 

2. 단순 휴리스틱

 

  • 단순 휴리스틱 기반으로 예측하면 성능이 얼마만큼 나올까요?
  • 예를 들어, 사용자가 뉴스 피드에 머무는 시간을 늘리기 위해 뉴스 피드 항목에 순위를 매기는 시스템을 구축한다고 가정합시다. 이때 순위를 역시간순으로 매겨 최신 항목을 가장 먼저 보여준다면 사용자 체류시간이 얼마나 될까요?

 

3. 0 규칙 베이스 라인

 

  • 0 규칙 베이스라인은 단순 휴리스틱 베이스라인의 특수한 경우로, 베이스라인 모델이 항상 가장 흔한 클래스로 예측합니다.
  • 예를 들어, 사용자가 휴대 전화에서 다음 차례에 사용할 확률이 가장 높은 앱을 추천한다면 단순한 모델은 가장 자주 사용하는 앱을 추천하는 것입니다. 이 단순한 휴리스틱이 70% 확률로 다음 차례의 앱을 정확히 예측한다면 여러분이 개발하는 모델은 복잡도가 커지는 대신 베이스라인 모델 성능을 크게 능가해야 합니다.

 

4. 인간에 의한 베이스라인

 

  • ML은 인간이 수행하는 작업을 자동화하는 것을 목표로 할 때가 많습니다. 따라서 전문가와 비교했을 때 모델 성능이 어떤지 파악하면 좋습니다.
  • 예컨대 자율 주행 시스템은 인간 운전자와 비교해 진척도를 측정해야 합니다. 그렇지 않으면 사용자가 시스템을 신뢰하도록 설득하기가 어렵습니다. 목적이 전문가를 대체하려는 것이 아닌 생산성을 향상하는 것이더라도 해당 시스템이 어떤 시나리오에서 인간에게 유용한지 아는 것은 여전히 중요합니다.

 

5. 기존 솔루션

 

  • 많은 경우 ML 시스템을 다수의 if/else 문 또는 서드 파티 솔루션을 적용한 기존 비즈니스 로직 솔루션을 대체하도록 설계됩니다. 새 모델을 기존 솔루션과 비교해보는 일이 중요합니다. ML 모델이 반드시 기존 솔루션보다 좋아야만 유용한 것은 아닙니다. 성능이 다소 떨어지더라도 사용하기가 훨씬 쉽거나 저렴하다면 유용한 것입니다.

 

모델을 평가할 때 ' 좋은 시스템'과 '유용한 시스템'을 구별하는 것이 중요합니다.

 

좋은 시스템이 반드시 유용한 것은 아니며 나쁜 시스템이 반드시 유용하지 않은 것도 아닙니다.

 

예컨대 자율 주행 자동차는 이전 자율 주행 시스템보다 크게 개선된다면 좋은 것이지만, 최소한 사람 운전자만큼 성능이 안 나온다면 유용하지 않은 것입니다.

 

경우에 따라 ML 시스템 성능이 사람의 평균치보다 높더라도 사람들이 이를 신뢰하지 않아 유용하지 않기도 합니다.

 

한편 사용자가 휴대 전화에서 다음에 입력한 단어를 예측하는 시스템이 해당 언어를 사용하는 사람의 예측보다 성능이 훨씬 낮다면 나쁜 것으로 간주될 수 있습니다. 다만 예측이 때로 사용자가 더 빠르게 입력하는데 도움을 준다면 여전히 유용한 것입니다.

 

2.2 평가방법

 

학문의 맥락에서 ML 모델을 평가할 때는 주로 성능 지표가 중심이 됩니다. 하지만 프로덕션 환경에서는 모델이 강건하고, 공정하고, 잘 보정되고, 개연성 있는 결과를 내놓기를 원합니다.

 

모델의 이러한 특성을 측정하는데 유용한 몇 가지 평가 방법에 대해 알아보겠습니다.

 

2.2.1 교란 테스트

 

이상적으로는 모델 개발에 사용하는 입력값이 프로덕션 환경에서 다뤄야 하는 입력값과 유사해야 하지만 이는 대부분 현실적으로 어렵습니다. 데이터 수집이 어렵거나 비용이 높고, 훈련용으로 접근 가능한 데이터가 최상의 조건임에도 실제 데이터와는 크게 다른 경우 특히 그렇습니다.

 

모델이 프로덕션 환경에서 다뤄야하는 입력값은 개발 환경의 입력값 대비 잡음이 많습니다. 훈련데이터에서 가장 잘 작동하는 모델과 잡음이 있는 데이터에서 가장 잘 작동하는 모델이 항상 같지는 않습니다.

 

데이터에 잡음이 있을 때 모델이 얼마나 잘 작동하는지 알아보는 방법으로, 테스트 분할에 약간 변화를 줘서 모델 성능에 어떤 영향을 미치는지 측정합니다.

 

그리고 이를 통해 깨끗한 데이터 아니라 교란된 데이터에서 가장 잘 작동하는 모델을 선택합니다.

 

모델이 잡음에 민감할수록 유지 관리가 더 어려워집니다. 사용자 행동이 조금만 변해도 모델 성능이 크게 저하되기 때문입니다. 게다가 모델이 적대적 공격에 취약해지기도 합니다.

 

2.2.2 불변성 테스트

 

입력에 특정 변경을 적용했을 때 출력이 변해서는 안 됩니다. 만약 특정 변경을 적용했을 때 출력이 변하는 일이 발생한다면 모델 편향이 존재하는 것이므로 이는 성능이 아무리 좋아도 사용해서는 안됩니다.

 

편향을 피할 해결책으로 나머지 입력은 동일하게 유지하고 민감 정보만 변경해 출력이 바뀌는지 확인하는 것이 있습니다. 다른 방법은 모델 훈련에 사용한 피처에서 민감 정보를 최우선으로 제외하는 것도 하나의 방법입니다.

 

2.2.3 방향 예상 테스트

 

입력에 특정 변경을 적용했을 때 출력이 예측 가능한 방향으로 변해야 합니다. 만약 출력이 예상과 반대로 움직인다면 모델 학습이 올바르게 이뤄지지 못했을 수 있으므로 배포 전에 좀 더 조사해봐야 합니다.

 

2.2.4 모델 보정

 

모델 보정은 미묘하지만 중요한 개념 중 하나입니다.

 

어떤 사건이 70% 확률로 발생하리라 예측했다고 가정해봅시다. 이 예측이 의미하는 바는 예측 대상이 되는 현실을 무한히 반복했을 때 예측 결과가 실제 결과와 70% 확률로 일치한다는 것입니다. 모델이 A팀과 B팀을 70% 확률로 이길 거라고 예측했는데 1,000회 대결중 A팀이 60%만 이긴다면 이 모델은 보정되지 않은 것입니다. 잘 보정된 모델은 A팀이 60%의 확률로 승리할 거라고 예측해야 합니다.

 

모델 모정은 ML 실무에서 간과되는 경우가 많지만 모든 예측 시스템에서 매우 중요한 속성입니다.

 

아래는 모델 보정이 중요한 이유에 따른 두 가지 예시입니다.

 

  1. 사용자가 다음으로 볼 가능성이 높은 영화를 추천하는 시스템을 개발한다고 가정해봅시다. 사용자 A는 로맨스 영화를 80%, 코미디 영화를 20% 봅니다. A가 볼 가능성이 가장 높은 영화를 정확도 높게 노출하고자 한다면 추천 시스템은 추천 항목을 로맨스 영화로만 구성해야 합니다. A는 다른 장르보다 로맨스를 볼 가능성이 높기 때문이죠. 한편 보다 보정된 시스템을 원한다면, 즉 추천 항목에 사용자의 실제 시청 습관이 드러나게 하려면 로맨스 80%, 코미디 20%로 구성해야 합니다.
  2. 사용자가 특정 광고를 클릭할 가능성을 예측하는 모델을 개발한다고 가정해봅시다. 광고 A와 B가 있고, 모델은 어떤 사용자가 10% 확률로 광고 A를 클릭하고 8% 확률로 광고 B를 클릭하리라고 예측합니다. A의 순위를 B보다 높게 지정하고자 한다면 모델을 보정할 필요는 없습니다. 하지만 광고에서 얻을 수 있는 클릭 수를 예측하려면 모델을 보정해야 합니다. 모델에서 사용자가 10% 확률로 A를 클릭하리라고 예측했지만 실제로는 5% 만 클릭한다면 예상 클릭 수는 실제와 크게 달라지게 됩니다. 순위는 동일하게 제공하지만 더 잘 보정된 모델이 있다면 해당 모델을 사용하는 편이 좋습니다.

 

보정된 정도를 간단히 측정하려면 모델이 확률 X를 출력한 횟수와 예측이 맞는 빈도 Y를 세어보고 Y에 대한 X를 플롯해보는 것입니다. 모델이 완벽하게 보정됐다면 그래프상 모든 데이터 포인트에서 X와 Y가 동일하게 나오게 될 것입니다.

 

소규모 가상 작업에 대한 다양한 모델의 보정 곡선 ( 출처 : https://scikit-learn.org/stable/modules/calibration.html#calibration)

 

2.2.5 신뢰도 측정

 

신뢰도 측정은 개별 예측의 유용성에 대한 임계값을 생각해보는 방식입니다.

 

사용자에게 모든 모델의 예측 내용을 무분별하게, 심지어 확실하지 않은 것까지 보여주면 사용자는 짜증이 날 것입니다.

 

예컨대 스마트 워치의 활동 감지 시스템에서 빠른 걸음을 달리기로 판단한다면 사용자아게는 시스템에 대한 신뢰를 잃게 됩니다. 최악의 경우 예측 치안 알고리즘이 무고한 사람을 잠재적 범죄자로 표시하는 등 치명적인 결과를 초래할 수 있습니다.

 

확실한 모델 예측 내용만 보여주고자 할 때, 그 확실한 정도는 어떻게 측정할까요?

예측을 보여주기로 결정하는 확실성의 임곗값은 얼마일가요?

예측이 임곗값 미만으로 나온다면 무엇을 해볼 수 있을까요?

예측을 폐기하거나, 사람의 피드백으로 재학습하거나, 사용자에게 추가 정보를 요청하면 될까요?

 

신뢰도 측정은 개별 샘플에 대한 지표로, 다른 지표들이 시스템의 평균 성능을 측정하는 것과 다릅니다. 시스템 수준의 측정은 전체 성능을 파악하는데 유용하지만 각 샘플에 대한 시스템 성능을 고려한다면 샘플 수준의 지표가 중요합니다.

 

2.2.6 슬라이스 기반 평가

 

슬라이싱은 데이터를 하위 집합으로 불리하고 각 하위 집합마다 모델의 개별 성능을 확인하는 것을 의미합니다.

 

많은 사람들이 흔히 실수하는 점은, 전반적인 F1이나 전체 데이터에 대한 정확도 같은 지표에는 너무 집중하는 반면 슬라이스 기반 지표에는 충분히 주의를 기울이지 않는다는 점입니다. 이는 아래와 같은 두 가지 문제를 야기합니다.

 

첫 번째 문제는 모델이 서로 다른 데이터 슬라이스에서 동일하게 수행돼야 할 때 다르게 수행된다는 점입니다.

 

예를 들어, 데이터에 하위 집단 두 개, 즉 다수와 소수가 있을 때 다수에 속하는 하위 집단이 데이터의 90%를 차지합니다.

  • 모델 A는 다수의 하위 집단에서 98% 정확도를 달성하지만 소수의 하위 집단에서는 80%만 달성합니다. 따라서 전체 정확도는 96.2% 입니다. 
  • 모델 B는 다수에서 95% 소수에서 95% 정확도를 달성합니다. 따라서 전체 정확도는 95%입니다.

 

위 모델 A,B의 다수 및 소수의 하위 집단에 대한 성능을 정리한 표는 아래와 같습니다.

 

  다수에 대한 정확도  소수에 대한 정확도 전체 정확도
모델 A 98% 80% 96.2%
모델 B 95% 95% 95%

 

 

회사가 전체 지표에 초점을 맞춘다면 모델 A를 선택할 것입니다. 처음에는 높은 정확도에 매우 만족할 테지만, 곧 최종 사용자는 소수의 하위 집단이 과소 대표된 인구 통계 집단이므로 모델에 소수 하위 집단에 대한 편향이 존재한다는 사실을 발견하게 됩니다. 전반적인 성능에만 초점을 맞추면 대중이 반발한 가능성뿐 아니라 회사가 모델 개선 가능성을 놓칠 수도 있어 해롭습니다.

 

회사에서 두 모델의 슬라이스 기반 성능을 본다면 다른 전략을 수행할 겁니다. 예컨대 소수의 하위 집단에 대해 모델 A의 성능을 개선한다면, 이는 해당 모델의 성능을 전반적으로 개선하는 결과로 이어집니다. 두 모델을 똑같이 유지하더라고 더 많은 정보를 기반으로 배포할 모델을 결정할 수 있어 더 현명한 의사 결정을 내리게 됩니다.

 

두 번째 문제는 모델이 서로 다른 데이터 슬라이스에서 다르게 수행될 때도 동일하게 수행된다는 점입니다.

 

데이터에서 일부 하위 집합은 다른 것보다 더 중요합니다. 예를 들어, 사용자 이탈 예측 모델, 즉 사용자가 구독이나 서비스 구입을 취소할지 예측하는 모델을 개발할 때 유료 사용자는 무료 사용자보다 훨씬 더 중요합니다. 모델의 전체 성능에 초점을 맞추면 이러한 중요 슬라이스에서 성능이 저하되더라고 모르고 넘어갈 수 있습니다.


슬라이스 기반 평가가 중요한 이유는 흥미롭지만 직관에 반하는 심슨의 역설 때문입니다. 이는 어떤 추세가 어러 데이터 집단에 나타나지만 집답을 결합하면 사라지거나 반전되는 현상을 말합니다.

 

즉, 모든 데이터를 함께 놓고 보면 모델 B가 모델 A보다 더 잘 작동하지만 각 부분 집단별로 개별적으로 놓고 보면 모델 A가 모델 B보다 더 잘 동작합니다.  아래의 예시는 집단 A와 집단 B에 대한 모델 A와 모델 B의 성능을 나타냅니다. 집단 A와 B 모두에서 모델 A가 모델 B를 능가하지만 결합하면 모델 B가 모델 A를 능가합니다.

 

  집단 A 집단 B 전체
모델 A 93% (81 / 87) 73% (192 / 263) 78% (273 / 350)
모델 B 87% (234 / 270) 69% (55 / 80) 83% (289 / 350)

 

심슨의 역설은 생각보다 흔합니다. 1973년 버클리 대학원 통계에 따르면 남성의 입학률이 여성보다 훨씬 높았습니다. 사람들은 여성에 대한 편견이 작용했을 거라고 의심했지만 개별 학과마다 자세히 살펴보면 6개 학과 중 4개 학과에서 여성의 입학률이 남성보다 높았습니다.

 

이 역설을 실제로 접하게 될지는 모르겠지만 요점은 집계가 실제 상황을 은폐하고 모순되게 할 수 있다는 점입니다.

 

정보에 입각해서 어떤 모델을 선택할지 결정 내릴 때는 전체 데이터뿐 아니라 개별 슬라이스에 대한 성능도 고려해야 합니다. 슬라이스 기반 평가가 주는 통찰을 전체 및 중요 데이터에서 모델 성능을 개선하고 잠재적인 평향을 감지하는 데 도움이 됩니다. 심지어 ML과 상관없는 문제가 존재한다는 사실을 밝혀내는데도 도움이 될 수도 있습니다. 


슬라이스 평가가 별문제 아닌 경우에도 모델이 동작하는 방식을 세분화해 이해한다면 상사, 고객 등 이해관계자가 ML 모델을 신뢰하도록 설득할 수 있는, 모델에 대한 확신을 얻게 됩니다.

 

중요한 슬라이스에서 모델의 성능을 추적하기에 앞서 중요한 슬라이스가 무엇인지 알아야 합니다.

 

다음은 데이터에서 중요한 슬라이스를 찾는 방법 세 가지 주요 접근법입니다.

 

1. 휴리스틱 기반

 

  • 데이터와 작업에 대한 도메인 지식을 사용합니다.
  • 예를 들어, 웹 트래픽 관련 작업에서는 모바일 대 데스크톱, 브라우저 유형과 사용자 위치와 같은 차원에 따라 데이터를 슬라이싱합니다. 모바일 사용자는 데스크톱 사용자와 매우 다르게 행동합니다. 마찬가지로, 인터넷 사용자의 지리적 위치에 따라서도 웹사이트 디자인에 대해 다른 기호를 가질 수 있습니다.

 

2. 오류 분석

 

  • 잘못 분류된 데이터 포인트를 수작업으로 분석하고 거기에서 패턴을 찾습니다.

 

3. 슬라이스 파인더

 

  • 논문 'Slice Finder : Automated data slicing for model validation'과 'Subgroup Discovery Algorithms: A survey and empirical evaluation'을 비롯해 슬라이스 탐색 프로세스를 체계화하는 연구가 수행되고 있습니다.
  • 이런 프로세스는 일반적으로 빔 검색, 클러스터링, 의사 결정 같은 알고리즘으로 슬라이스 후보를 생성한 다음 명백히 나쁜 후보를 걸려내고 남은 후보의 순위를 지정하는 식입니다.

 

중요한 슬라이스를 찾았다면, 평가를 위해 슬라이스마다 올바르게 레이블링 된 데이터가 충분히 필요함을 명심해야 합니다. 평가 품질은 평가 데이터의 품질에 좌우됩니다.