가장 적합한 ML 을 선택하는 방법

ML 모델을 선택하는 기준:

  • 데이터의 특성:
    • 소량의 데이터에는 복잡한 딥러닝 모델보다 간단한 결정 트리나 서포트 벡터 머신이 더 적합할 수 있음.
  • 문제에 적합한 모델을 선택하는 것:
    • 예를 들어, 분류 문제에는 랜덤 포레스트나 신경망이 자주 사용되고, 회귀 문제에는 선형 회귀나 부스팅 모델이 좋을 수 있음.
    • 텍스트 분류 문제:
      • 나이브 베이즈, 로지스틱 회귀, 순환 신경망, 트랜스포머 기반 모델
    • 이상 거래 탐지 시스템:
      • K-최근접 이웃, 아이솔레이션 포레스트, 클러스터링, 신경망
  • 학습 시간과 추론 시간:
    • 모델의 학습에 걸리는 시간과 예측을 수행하는 데 필요한 시간도 중요한 고려 사항임.
    • 단순한 로지스틱 회귀 모델은 신경망 모델들보다 예측 시간이 더 빠름.
    • 더 나은 레이턴시를 원한다면 CPU 대신 GPU 를 선택하긴 해야함.
  • 해석 가능성:
    • 일부 프로젝트에서는 모델의 결정을 이해하고 설명할 수 있는 능력이 중요할 수 있음. 결정 트리나 선형 회귀 같은 모델은 비교적 해석하기 쉬움.
    • 그에 반해 신경망 모델들은 해석 가능성이 낮음.
  • 자원의 제약:
    • 가능한 하드웨어 자원도 고려해야 합니다. 강력한 GPU 없이는 대규모 딥러닝 모델을 효율적으로 학습 시키기 어려움.
  • 최첨단 모델이라고 막 고르지 않기:
    • 최첨단 모델의 특징은 같은 데이터 셋이라고 할 때 더 나은 성능을 보여준다는 점임.
    • 그러나 우리가 가진 데이터에서는 그렇게 큰 성능 차이가 나지 않을 수도 있음.
    • 그리고 모델에 어울리지도 않을 수도 있음.
    • 중요한 건 우리가 풀고자 하는 문제가 어떤 건지 파악하고 해당 문제에 적합한 모델을 선택하는 것. (복잡한 문제가 아니라 단순한 문제일 수 있음.)
  • 시작은 단순한 모델이 나음:
    • ML 은 디버깅이 어렵기 떄문임.
    • 시작은 단순한 모델로해서 점점 성능을 끌어올리는 방식이 나을 수 있다.
    • 그리고 이런 단순한 모델로하면 성능 비교도 할 수 있음.
  • 미래에는 모델이 변경될 수 있음:
    • 데이터가 쌓이면 딥러닝 신경망 모델을 이용할 수 있으니까.
  • 모델을 선택할 때 트레이드오프를 고려해야한다.
    • 대부분의 경우 위양성을 높이면, 위음성이 낮아질 거임. 그러므로 어떤 문제가 더 중요한지 고려해서 선택해야함.
      • 위양성 문제를 해결한다면 양성에 대해 더 보수적으로 접근을 할거임. 그러면 자연스럽게 음성이 높아지는 거니까 위음성 문제가 발생하게 된다.
  • 모델의 가정을 이해해야한다:
    • 모델의 가정에 맞는 데이터를 학습시키는게 결정적으로 중요함.

 

 

Q) 텍스트 분류만해도 여러가지 모델을 사용할 수 있는 것 같은데 각각의 차이는 뭔가?

  • 나이브 베이즈:
    • 모델은 각 특성이 독립적이라는 가정 하에 조건부 확률을 사용하여 분류를 수행함.
    • 간단하고, 소량의 데이터로도 높은 성능을 낼 수 있어 텍스트 분류 초기 단계에서 매우 유용하다.
  • 로지스틱 회귀:
    • 모델은 특성과 카테고리 간의 선형 관계를 모델링하여 확률적 분류를 제공한다.
    • 데이터가 선형 관계로 나눠지지 않으면 이 방법은 적합하지 않을거임.
  • 순환 신경망 (RNN):
    • 텍스트의 순차적인 특성을 모델링할 수 있는 능력 때문에 많이 사용함.
    • 문맥을 고려하여 각 단어가 전체 문장의 의미에 어떻게 기여하는지 학습할 수 있음.
  • 트랜스포머 기반 모델:
    • 최근 가장 강력한 텍스트 처리 모델 중 하나로, 광범위한 문맥을 포착하는 자기 주의(self-attention) 메커니즘을 사용
    • 대규모 데이터셋에서 뛰어난 성능을 보임.

 

 

딥러닝 모델이 일반적인 ML 모델보다 훨씬 성능이 좋은데 왜 아직까지 ML 모델을 사용하고 있는가?

  • 데이터 요구량:
    • 딥러닝 모델은 대량의 데이터를 필요로 하기 때문.
    • 그래서 딥러닝 모델과 전통 ML 모델을 같이 쓰는 경우도 있다. 데이터를 획득하기 전에는 ML 모델을 사용하다가, 데이터가 충분히 쌓인 시점 이후에는 딥러닝 모델을 사용하는 것.
  • 계산 비용:
    • 딥러닝 모델은 종종 복잡한 구조로 인해 학습과 추론에 많은 컴퓨팅 자원과 시간을 필요로 함.
  • 해석 가능성:
    • 전통적인 머신러닝 모델들은 결과를 해석하기 쉬워, 왜 특정 결정이나 예측이 이루어졌는지를 이해할 수 있게 해줌 .
  • 적합성:
    • 간단하거나 규칙 기반의 작업에는 종종 더 간단한 전통적 모델이 더 잘 작동할 수 있음.

 

 

학습 알고리즘 편향이 크면 학습 데이터를 더 많이 확보해도 큰 도움이 되지 않는다는 이유는?

"편향"이 크다는 것은 모델이 갖는 가정이 데이터의 복잡성이나 패턴을 충분히 반영하지 못하는 상황을 의미함.

  • 모델이 학습을 했는데도 예측 결과가 너무 안나온다면 그 모델을 사용하면 안됨.
  • 편향이 높다는 것:
    • 편향-분산 트레이드오프에서의 "편향(Bias)"은 모델이 학습 데이터의 실제 관계를 얼마나 잘 나타내지 못하는지를 측정합니다. 즉, 편향이 높다는 것은 모델이 데이터의 복잡성이나 패턴을 제대로 포착하지 못하고 있음을 의미함.
    • 이는 주로 다음과 같은 상황에서 발생한다:
      • 과도하게 단순화된 모델: 모델이 너무 단순해서 데이터의 기본 구조를 잘 표현하지 못하는 경우임. 예를 들어, 실제로는 비선형 관계를 가지는 데이터를 선형 모델로 처리하려고 할 때 편향이 높아질 수 있다.
      • 중요 변수의 누락: 모델이 데이터를 설명하는 데 필요한 중요한 변수들을 포함하지 않았거나, 중요한 정보를 누락시키는 경우 편향이 발생할 수 있다.
    • 편향이 높은 모델은 일반적으로 학습 데이터에 대해서도 낮은 정확도를 보이며, 새로운 데이터에 대한 예측에서도 좋은 성능을 기대하기 어려움.

 

 

Q) 모델마다 가정을 가진다는 게 무슨 의미인가?

 

모델이 이런 가정을 가지고 예측을 할거에요. 말하는거임.

 

모델의 가정에 부합하는 데이터를 학습시키는 것은 모델의 예측 정확도를 높이는 데 결정적으로 중요하다.

 

모델의 가정과 데이터 구조가 잘 맞지 않는 경우, 모델은 잘못된 패턴을 학습하거나 중요한 패턴을 놓칠 수 있으며, 이는 예측의 정확성을 저하시킬 수 있음.

 

각 모델의 가정은 다음과 같음:

  • 선형 회귀: 데이터의특성 간에는 선형 관계가 있다는 가정 함.
  • 로지스틱 회귀: 선형 회귀를 확장한 것으로, 종속 변수가 특정 카테고리(보통 0 또는 1)에 속할 확률을 예측하는 데 사용됨. 여기서도 독립 변수와 로그 오즈(log-odds) 사이에 선형 관계가 있다는 가정함.
  • 나이브 베이즈: 각 특성이 서로 독립적이라는 강력한 가정을 바탕으로 함.
  • k-최근접 이웃 (k-NN): 이 모델은 비슷한 데이터 포인트가 비슷한 출력 값을 가질 것이라는 가정함. 즉, 공간적으로 가까운 데이터 포인트는 유사한 특성을 가진다고 보는 것.

그러니까 선형 모델은 비선형 패턴을 갖는 데이터를 처리하기에 적합하지 않다는 논리임.

 

 

학습 알고리즘의 분산이 높다면 데이터를 더 확보하면 도움이 된다는 이유는?

학습 알고리즘에서 "분산"이 높다는 것은 모델이 학습 데이터의 작은 변화에도 예측이 크게 달라질 수 있음을 의미한다.

 

즉, 모델이 특정 학습 데이터에 과적합(overfitting) 되어 있고, 이로 인해 새로운 데이터에 대한 일반화 능력이 저하된 상태임.

 

분산이 높은 모델은 데이터의 작은 변화에도 예측이 크게 달라질 수 있기 때문에, 이 문제를 해결하기 위해 데이터를 더 확보하는 것이 도움이 됨.

  • 더 많은 데이터를 사용하면 모델이 단순히 학습 데이터를 암기하는 대신 실제로 유용한 패턴을 학습하는데 집중하게 됨.
  • 데이터 세트가 클수록 모델이 학습하는 패턴은 더 일반적이고 대표적인 특성을 반영하게 됨.

 

 

모델 앙상블 방법

예측을 위해 하나의 단일 모델을 사용하는게 아니라 여러 모델들을 조합해서 사용하는 방법을 말함.

 

 

모델 앙상블에서 주의할 점은?

여러 모델들을 앙상블해서 사용할 땐 상관관계를 잘 고려해야한다.

 

극단적으로 말하면 같은 모델 두 개를 앙상블로 쓰지는 않을 것. 각 모델마다 서로 상관관계가 다를 수록 유의미하다.

 

예시로 서로 상관관계가 없는 모델들이 있다고 하고, 모델이 70% 확률로 예측을 성공한다고 했을 때 단일 모델만 쓰는 것과 모델 3개를 앙상블해서 쓰는 것의 성능 차이를 비교하면 단일 모델은 70% 의 성능이 나오겠지만 앙상블은 78%의 확률로 예측을 성공할 것

  • 계산해보면 다음과 같다:
    • 3개 모두 맞음: 0.7 * 0.7 * 0.7 = 0.343
    • 2개만 맞음: (0.7 * 0.7 * 0.3) * 3 = 0.441

 

 

Q) 모델의 상관관계를 평가하는 방법은?

 

모델이 같은 데이터에서 같이 예측을 성공 하는지, 같이 예측이 틀리는지를 평가해보면 된다.

 

이를 평가하는 Q-statistic 라는 통계적인 지표도 있다.

 

Q-statistic:

  • Q-statistic은 두 분류기의 예측이 얼마나 자주 일치하는지(둘 다 정확하게 예측하거나, 둘 다 잘못 예측하는 경우)와 얼마나 자주 불일치하는지(하나는 맞고 하나는 틀린 경우)를 측정한다.

  • Q 값이 1에 가까울 경우: 두 모델이 매우 유사하게 작동하며, 자주 동일한 예측을 한다는 뜻이다.
  • Q 값이 0에 가까울 경우: 두 모델의 예측은 서로 독립적이라는 뜻이다.
  • Q 값이 -1에 가까울 경우: 두 모델이 서로 상반되게 예측한다는 뜻이다. 즉 하나가 정확할 때 다른 하나는 오류를 범한다.

 

 

앙상블을 만드는 기법은?

크게 3가지가 있다:

  • 배깅(Bagging)
  • 부스팅(Boosting)
  • 스태킹

 

배깅 (Bagging)

배깅:

  • 배깅은 특히 고분산(high variance) 문제를 가진 모델에서 과대적합을 줄이는 데 유용하다.

배깅의 기본 원리:

  • 부트스트랩 샘플링: 원본 훈련 데이터셋에서 복원 추출(즉, 같은 데이터를 여러 번 선택할 수 있음)을 사용하여 여러 개의 다른 훈련 데이터셋을 생성한다. 각 데이터셋은 원본 데이터셋과 동일한 크기를 가지지만, 일부 데이터는 포함되지 않고 일부는 중복될 수 있다.
  • 독립적 모델 훈련: 이렇게 생성된 각각의 훈련 데이터셋에 대해 독립적으로 모델(일반적으로는 결정 트리)을 훈련시킨다. 각 모델은 부트스트랩 데이터셋의 특성을 반영하여 조금씩 다른 학습 경험을 갖게 된다. 각 모델마다 독립성을 주는거임.
  • 결과의 집계: 모든 개별 모델의 예측을 집계하여 최종 예측을 결정한다. 회귀 문제의 경우 평균을 사용하고, 분류 문제의 경우는 투표(가장 많이 선택된 클래스)를 통해 결정한다.

배깅의 장점:

  • 과대적합 감소: 각 모델이 부분적으로 다른 데이터셋에서 훈련되기 때문에, 모델이 특정한 샘플에 지나치게 최적화되는 것을 방지하고 결과적으로 과대적합이 줄어든다.
  • 분산 감소: 여러 모델의 예측을 평균화함으로써 예측의 분산이 감소되어, 더 안정적인 예측이 가능해진다.
  • 병렬 처리 가능: 각 모델은 독립적으로 훈련될 수 있으므로, 계산 리소스가 허락하는 한 병렬 처리를 통해 훈련 속도를 높일 수 있다.

배깅의 한계:

  • 편향 감소에는 제한적: 배깅은 주로 모델의 분산을 줄이는 데 효과적이다. 즉, 과대적합을 방지하고 모델의 일반화 능력을 향상시키지만, 모델의 편향을 감소시키는 데는 한계가 있을 수 있다. 그러니까 모델이 데이터의 복잡성을 충분히 표현하지 못하는 경우(과소적합), 배깅이 효과적이지 않을 수 있다.
    • 편향(Bias)은 기계학습에서 모델이 훈련 데이터에 대해 너무 단순화되어 있다 보니 실제 데이터의 중요한 패턴이나 관계를 잘 표현하지 못하는 경향을 말한다.
  • 편향 유발: 배깅은 서로 다른 데이터 조합을 바탕으로 학습하게 되고, 이는 모델 간의 독립성을 증가시키며 전체 모델의 분산을 줄이는 데 기여한다. 그러나 이 방법은 일부 데이터가 빠지면서 특정 패턴이나 정보가 학습 과정에서 누락될 수 있는 가능성이 있을 수 있기 때문에 편향을 유발하지 않도록 충분히 많은 수의 서브셋과 모델을 사용해야함.
  • 데이터의 다양성 부족: 배깅은 데이터의 재표본화(re-sampling)에 의존한다. 각 모델은 원본 데이터셋에서 무작위로 추출한 부트스트랩 샘플을 사용하여 훈련되는데 이 과정에서 일부 데이터는 여러 번 선택될 수 있고, 일부 데이터는 선택되지 않을 수 있다. 이로 인해 모델이 전체 데이터의 특성을 충분히 학습하지 못할 수 있으며, 특히 데이터가 적을 경우 이러한 문제가 더욱 심각해질 수 있다.
  • 모델 해석의 어려움: 배깅을 통해 생성된 모델은 개별 모델들의 결합으로 이루어지기 때문에, 개별 모델보다 해석하기가 더 어렵다. 예를 들어, 랜덤 포레스트는 수백 개의 결정 트리로 구성될 수 있으며, 이러한 대규모의 트리 조합을 해석하는 것은 매우 복잡할 수 있다.

 

부스팅 (Boosting)

부스팅:

  • 여러 약한 학습자(weak learners)를 순차적으로 훈련시켜 강한 학습자(strong learner)를 만드는 방법이다.
  • 부스팅의 주요 목적은 여러 약한 모델의 예측을 결합하여 전체 성능을 향상시키는 것이다. 이 방식은 주로 분류와 회귀 문제에 적용되며, 과소적합된 모델들의 성능을 개선하는 데 효과적이라고 한다.

부스팅의 기본 원리:

  • 초기화: 처음에는 모든 훈련 데이터에 동일한 가중치를 부여합니다. 첫 번째 약한 모델이 훈련 데이터에 대해 학습을 진행한다.
  • 반복적 학습: 각 단계에서 모델은 전 단계에서 잘못 예측된 데이터 포인트에 더 높은 가중치를 부여받는다. 이를 통해 모델은 오류를 줄이는 방향으로 학습을 진행한다.
  • 가중치 업데이트: 모델이 데이터 포인트를 잘못 분류하면, 그 데이터 포인트의 가중치가 증가한다. 이렇게 해서 다음 모델은 이전 모델이 잘못 분류한 데이터 포인트를 더 잘 분류할 수 있도록 조정된다.
  • 모델 결합: 모든 모델이 훈련을 마친 후, 각 모델의 예측은 그 성능에 따라 가중치를 받아 최종 예측을 결정한다. 일반적으로는 오류를 더 적게 내는 모델에 더 큰 가중치가 부여된다.

부스팅의 대표적인 알고리즘:

  • AdaBoost (Adaptive Boosting): 가장 널리 사용되는 부스팅 알고리즘 중 하나이다. AdaBoost는 연속적인 학습자가 이전 학습자가 잘못 분류한 케이스에 더 집중하도록 설계되어 있다. 각 학습자의 성공에 따라 가중치가 조정되고, 모든 학습자의 예측이 가중 평균을 통해 결합된다.
  • Gradient Boosting: 손실 함수의 기울기(gradient)를 사용하여 모델을 학습한다. 이 방법은 특히 회귀와 분류 문제에 효과적으로 사용되는데 Gradient Boosting은 예측 오류의 기울기를 최소화하는 방향으로 모델을 순차적으로 수정해 나간다. (여러 모델들 간의 학습에서 경사하강법을 사용하는 거네. 그러니까 각 데이터 포인트에 대한 손실 함수의 기울기를 계산하고 이 기울기는 다음에 추가할 모델이 최소화해야 할 값인거임.)
  • XGBoost (eXtreme Gradient Boosting): Gradient Boosting을 기반으로 하며, 성능과 속도를 최적화하여 대규모 데이터셋에서도 빠르게 실행될 수 있도록 설계된 고급 버전이다. 많은 기계 학습 대회와 실제 애플리케이션에서 선호되는 알고리즘이기도하다.

부스팅의 장점:

  • 강력한 성능: 잘 설계된 부스팅 알고리즘은 매우 높은 정확도를 달성할 수 있다.
  • 과소적합 방지: 약한 학습자를 적절히 결합함으로써 과소적합을 방지하고, 복잡한 패턴을 잘 포착할 수 있다.

부스팅의 한계:

  • 과대적합 위험: 부스팅은 특히 노이즈가 많은 데이터셋에서 과대적합의 위험이 있다. 이는 부스팅이 데이터의 작은 특징까지 캐치하려고 하기 때문에 발생할 수 있는 것이다.
  • 계산 비용: 부스팅은 순차적으로 모델을 학습시키기 때문에, 특히 대규모 데이터셋을 다룰 때는 계산 비용이 높을 수 있다. 그리고 병렬 처리가 어려운 구조로 인해 시간이 오래 걸릴 수 있다.
  • 파라미터 조정: 부스팅 알고리즘은 여러 파라미터(학습률, 트리의 깊이, 트리의 수 등)에 민감하게 반응할 수 있으므로, 이러한 파라미터를 적절히 조정하는 것이 중요하다.

 

스태킹 (Stacking)

스태킹:

  • 다양한 모델(일컫는 '베이스 모델')의 예측을 입력으로 사용하여 새로운 모델(일컫는 '메타 모델' 또는 '스태커')을 훈련시키는 과정을 포함하는 것.
  • 이렇게 함으로써, 각각의 모델의 예측력을 결합하여 최종 예측의 정확도를 높이는 것이 목표임.

스태킹의 기본 원리:

  • 베이스 모델 훈련: 다양한 알고리즘(예: 결정 트리, 로지스틱 회귀, SVM 등)을 사용하여 여러 베이스 모델을 훈련시킨다. 각 모델은 전체 훈련 데이터셋 또는 데이터의 서브셋을 사용하여 독립적으로 학습된다.
  • 베이스 모델의 예측 생성: 각 베이스 모델은 훈련 데이터셋에 대한 예측을 생성하며, 이 예측은 메타 모델의 입력으로 사용된다. 때때로, 베이스 모델의 예측은 교차 검증을 통해 수행되어 과대적합을 방지하고 각 모델의 일반화 능력을 향상시키기도 한다.
  • 메타 모델 훈련: 베이스 모델들의 예측 결과를 새로운 피처 세트로 사용하여 메타 모델을 훈련시킨다. 이 메타 모델은 베이스 모델들의 예측을 바탕으로 최종 예측을 만들어내는 데 사용된다.
  • 최종 예측 생성: 메타 모델은 베이스 모델의 예측을 결합하여 최종 예측을 생성한다. 이 과정을 통해 각 베이스 모델의 강점을 활용하고 약점을 보완할 수 있다.

스태킹의 장점:

  • 성능 향상: 스태킹은 다양한 모델의 예측을 결합함으로써 각 모델이 가지는 정보와 강점을 최대한 활용할 수 있다.
  • 오버피팅 감소: 베이스 모델의 예측을 메타 모델의 입력으로 사용함으로써, 메타 모델은 더 많은 정보를 바탕으로 결정을 내릴 수 있다. 이는 전체 모델의 과대적합 가능성을 줄여준다.
  • 유연성: 스태킹은 다양한 유형의 모델을 조합할 수 있는 유연성을 제공한다. 예측 문제에 따라 최적의 베이스 모델과 메타 모델을 선택할 수 있다.

스태킹의 한계:

  • 구현 복잡성: 스태킹은 구현하기가 비교적 복잡하며, 올바른 데이터 분리와 메타 모델 선택에 신중해야한다. 그리고 교차 검증을 올바르게 구현하고, 데이터 누수를 방지하는 것이 중요하다.
  • 계산 비용: 스태킹은 여러 모델을 훈련시키고, 그 예측 결과를 이용해 추가 모델을 훈련시키는 과정을 필요로 한다. 이는 계산 자원을 상당히 많이 소모할 수 있으며, 큰 데이터셋에서는 시간이 많이 걸릴 수 있따.
  • 과적합 위험: 메타 모델이 베이스 모델의 예측에 너무 의존하는 경우, 데이터의 특정 특성에 과적합될 위험이 있다. 이를 피하기 위해 메타 모델을 적절히 정규화하고, 모델의 복잡도를 조절하는 것이 중요하다.

 

 

모델의 실험 추적과 버전 관리

이들은 개발 과정에서 모델의 성능을 지속적으로 평가하고 최적화하는 데 필수적인 역할을 한다.

 

대표적인 도구로는 MLflow 가 있다.

 

 

모델의 실험 추적

실험 추적은 머신러닝 모델을 개발하면서 다양한 실험 설정과 결과를 체계적으로 기록하는 과정이다.

 

ML 개발은 반복적인 프로세스이기 때문에 실험 추적은 필요함.

 

추적 요소들은 다음과 같다:

  • 모델 구성:
    • 알고리즘 종류: 사용한 머신러닝 알고리즘의 종류
    • 하이퍼파라미터: 모델 훈련에 사용된 모든 하이퍼파라미터 값. 이는 나중에 모델 성능의 차이를 이해하는 데 사용된다.
  • 데이터 관리:
    • 데이터셋: 모델을 훈련시키는 데 사용된 데이터셋의 세부 사항을 기록. 이는 데이터 소스, 버전, 데이터 전처리 단계 등을 포함한다.
    • 분할 방식: 훈련 데이터, 검증 데이터, 테스트 데이터 분할 방식을 기록한다. 데이터 분할의 일관성은 실험의 재현성을 보장하기 위해 사용된다.
  • 성능 메트릭:
    • 훈련 성능: 에포크별 손실, 정확도 등의 훈련 과정 메트릭을 기록.
    • 검증 성능: 검증 데이터셋에 대한 모델의 성능을 정기적으로 기록.
    • 테스트 성능: 최종적으로 테스트 데이터셋에서의 모델 성능을 기록.
  • 실험 결과:
    • 예측 결과: 모델의 출력, 예측값 및 실제값을 비교하여 기록.
    • 에러 분석: 잘못된 예측의 원인을 분석하고 문제가 되는 데이터 포인트를 기록
    • 버전 관리:
      • 코드 버전: 모델을 개발한 코드의 버전을 기록. Git 커밋 해시와 같은 식별자를 사용할 수 있다.
      • 모델 버전: 각 모델 버전을 구분하고 변경 사항을 문서화한다.
    • 학습 자원 사용:
      • 계산 자원: 모델을 훈련하는 데 사용된 하드웨어 사양과 리소스 사용량을 기록한다.
      • 학습 시간: 모델을 학습시키는 데 걸린 시간을 기록한다.

 

 

Q) MLflow 를 사용해서 실험 추적하는 에시가 궁금하다

 

다음은 MLflow를 사용하여 선형 회귀 모델의 실험을 추적하는 간단한 예시이다.

 

여기서는 scikit-learn의 데이터셋을 사용하고, MLflow를 통해 파라미터, 메트릭, 모델을 로깅한다.

import mlflow
import mlflow.sklearn
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 실험 이름 설정
mlflow.set_experiment('diabetes_linear_regression')

# MLflow 실험 시작
with mlflow.start_run():
    # 데이터 로드
    diabetes = load_diabetes()
    X = diabetes.data
    y = diabetes.target

    # 데이터 분할
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    # 모델 생성 및 훈련
    model = LinearRegression()
    model.fit(X_train, y_train)

    # 예측 및 메트릭 계산
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)

    # 파라미터와 메트릭 로깅
    mlflow.log_param("random_state", 42)
    mlflow.log_metric("MSE", mse)

    # 모델 로깅
    mlflow.sklearn.log_model(model, "model")

    # 실험 종료
    print("Model training and logging completed. Run ID:", mlflow.active_run().info.run_id)

# MLflow UI 실행
# 커맨드 라인에서 'mlflow ui'를 실행하여 로컬에서 실험 결과를 확인할 수 있습니다.

 

이 스크립트를 실행하면 MLflow 는 모든 실험 상세(파라미터, 메트릭, 모델)를 로깅하고, MLflow의 웹 기반 사용자 인터페이스를 통해 이러한 정보에 접근할 수 있게 된다.

 

사용자는 mlflow ui 명령을 통해 로컬 서버에서 MLflow 대시보드를 실행할 수 있으며, 이를 통해 실험의 모든 측면을 검토할 수 있다.

 

MLflow 는 실험의 추적 정보를 로컬 파일 시스템에 저장할 수 있으며, 필요에 따라 AWS S3, Azure Blob Storage, Google Cloud Storage와 같은 원격 저장소를 설정할 수도 있다.

 

 

모델의 버전 관리

버전 관리는 머신러닝 모델의 개발 과정에서 생성되는 모든 코드, 데이터셋, 모델 파라미터, 설정 등을 체계적으로 관리하는 프로세스이다.

코드 버전 관리는 업계 표준이 되어서 큰 무리가 없지만 데이터를 관리하는 건 다소 어렵다.

 

데이터 버전 관리:

  • 데이터셋 스냅샷: 특정 시점의 데이터셋 상태를 기록.
  • 데이터 변경 기록: 데이터의 추가, 수정, 삭제 사항을 추적.
  • 데이터 출처 및 준비 과정 기록: 데이터가 어디에서 왔는지, 어떻게 처리되었는지에 대한 정보를 기록.

 

데이터 버전 관리가 어려운 이유는?

  • 데이터 셋이 크고, 이진 타입일 수 있어서:
    • 대규모 데이터셋의 경우, 전체 데이터셋의 사본을 저장하는 대신 초기 버전의 데이터셋을 저장하고, 이후의 모든 변경사항을 차이점(delta) 형태로 기록할 수 도 있다. 이 방법은 저장 공간을 절약할 수 있으며, 데이터 변경의 추적이 용이해진다. 그러나 모든 데이터 유형에서 이 방법이 효율적인 것은 아니며, 특히 바이너리 데이터에서는 적용이 어려울 수 있다.
    • 실제 데이터 파일의 버전 관리뿐만 아니라, 파일에 대한 메타데이터(출처, 생성 날짜, 버전 설명 등)의 버전 관리도 중요할 수 있다. 이 방법은 데이터의 변경사항을 더 잘 이해하고 필요한 버전을 신속하게 검색하는 데 도움을 줄 수 있다.
    • 데이터의 내용을 해시하여 그 해시를 데이터의 식별자로 사용하는 방법도 있다. 데이터가 변경되면 해시 값도 변경되기 때문에, 변경 사항을 쉽게 파악할 수 있습니다. Git Large File Storage(Git LFS)와 같은 시스템에서는 이러한 방식을 사용하여 큰 파일의 버전을 효율적으로 관리한다.
  • 개인 정보에 민감하기 떄문에:
    • 개인정보를 포함하는 데이터셋의 경우, 데이터 보안과 개인정보 보호 규정을 준수하면서 데이터 버전을 관리해야한다.
  • 데이터 병합 충돌이 일어날 수 있기 때문에:
    • 두 명의 개발자가 원천 데이터를 수정해서 모델을 각각 개발했다고 하자. 이 둘의 데이터는 병합할 수 없다. 데이터는 모델을 위한건데 병합된 데이터를 나타내는 모델이 없으니까.

 

 

Q) 데이터 버전 관리 도구로는 뭐가 있는가?

 

DVC(Data Version Control) 라는게 있음:

 

Git과 유사한 인터페이스를 제공하여 데이터 파일과 모델 파일을 Git 리포지토리처럼 관리할 수 있다. DVC 는 데이터 파일의 메타데이터를 추적하고, 실제 데이터 파일은 클라우드 스토리지 등의 외부 저장소에 저장할 수 있다

 

 

ML 모델 디버깅이 어려운 이유는?

1) ML 모델은 에러를 내면서 실패하는게 아니라 조용히 틀린 예측을 하면서 실패할 수 있기 떄문에 문제가 있는지 파악하기도 어려움.

 

2) 전통적인 소프트웨어는 버그가 있으면 이를 고치고 해결해서 배포하면 되는데 ML 모델은 다시 학습해야하는 경우가 발생하기 때문에 더 오래걸림

 

3) ML 모델의 버그는 다양한 구성요소에서 발생할 수 있음. 데이터, 레이블, 피처, ML 알고리즘, 코드, 인프라 등등

 

일반적인 ML 모델의 실패 원인:

  • 모델에 대한 가정 실패:
    • 모델 알고리즘의 가정과 그것에 해당하는 데이터와 피처가 매칭되지 않는다면 예측을 제대로 못할거임
  • 잘못된 모델 구현:
    • 평가나 테스트 중에서 경사하강법이 되도록 설정해서 데이터 누수가 발생하는 경우
  • 잘못된 하이퍼파라미터 선택:
    • 같은 모델이라도 하이퍼파라미터에 따라서 결과가 천차만별임.
  • 데이터 문제:
    • 데이터 수집과 전처리에서 발생한 문제 때문. 레이블이 잘못 연결되거나, 잡음이 있거나 등
  • 잘못된 피처 선택:
    • 불필요한 피처를 선택하면 이상한 피처로 학습을 하게 될 수 있다. 그래서 너무 많은 피처를 사용하는 건 적합하지 않음.
    • 반대로 피처가 너무 적게 선택하면 모델이 복잡한 패턴을 파악할 수 없게 될 수도 있음.

 

 

모델 개발 가이드

1) 단순하게 시작하고 점진적으로 구성 요소를 추가해라

  • 전통적인 소프트웨어와 같은 방법임.

2) 단일 배치에 과적합 시키기

  • 단일 소량의 데이터에 과적합이 안된다면 문제가 있는거임. 이걸로 정상적인지 확인해볼 수 있음.
  • 기본적으로, 모델이 제대로 작동하고 있다면, 매우 소량의 데이터 포인트에 대해서는 완벽하게 학습(즉, 과적합)할 수 있어야 한다.
  • 이 방법은 모델이 기본적인 학습 능력을 가지고 있는지를 테스트하는 빠른 방벙이다.

3) 무작위 시드 값을 고정하기

  • 모델을 개발할 때 무작위로 설정 할 수 있는 값은 많다. 하이퍼파라미터인 가중치 초기화, 드롭아웃, 데이터 셔플링 등등. 이런 무작위성이 있으면 모델의 성능이 이것 때문이라고 판단할 수도 있으므로 이런 무작위성은 고정시켜야한다.
    • 가중치 초기화 (Weight Initialization): 신경망에서 가중치 초기화는 매우 중요한 하이퍼파라미터이다. 잘못된 초기화는 학습 속도를 느리게 하거나, 신경망이 전혀 학습되지 않게 만들 수 있다. 반면 너무 큰 초기 가중치는 그라디언트 폭발을 일으킬 수도 있다.
    • 드롭아웃 (Dropout): 드롭아웃은 과적합을 방지하는 데 도움을 주는 기법이다. 학습 과정 중에 무작위로 일부 뉴런을 학습에서 제외(즉, 활성화를 0으로 설정)시켜, 네트워크의 일부분에 과도하게 의존하는 것을 방지한다.
    • 데이터 셔플링 (Data Shuffling): 데이터를 무작위로 섞는 것은 모델이 데이터의 순서에 의존하지 않게 하여, 모델의 일반화 능력을 향상시키는 데 중요하다. 특히 시계열 데이터를 제외한 많은 학습 과정에서 적용된다.
    • 배치 크기 (Batch Size): 배치 크기는 각 학습 반복에서 네트워크를 통해 전파되는 데이터 샘플의 수를 정의한다. 메모리 사용량과 학습 속도에 영향을 미치며, 너무 크거나 작은 배치 크기는 학습 과정에 부정적인 영향을 미칠 수 있다. 큰 배치 크기는 보통 더 빠른 계산 속도를 제공하지만, 일반화 성능이 떨어질 수 있다. 반면 작은 배치 크기는 더 나은 일반화와 네트워크 안정성을 제공할 수 있지만, 학습 시간이 길어질 수 있다.
    • 에포크 수 (Number of Epochs): 에포크 수는 전체 훈련 데이터셋이 네트워크를 통과하는 횟수를 의미한다. 적절한 에포크 수는 모델이 훈련 데이터를 충분히 학습할 수 있도록 하면서도 과적합을 피하는 데 중요하다.
    • 활성화 함수 (Activation Function): 신경망의 각 뉴런에서 사용되는 비선형 함수를 말한다. ReLU, Sigmoid, Tanh 등이 일반적이다. 각 함수는 특정 경우에 장점과 단점을 가지고 있다.
    • 최적화 알고리즘 (Optimizer): 모델의 손실 함수를 최소화하는 방식을 결정한다. 일반적인 최적화 알고리즘에는 SGD, Adam, RMSprop 등이 있다.

 

 

Q) 하이퍼파라미터를 직접 튜닝하는 것과 AutoML 을 사용해서 튜닝 하는 것에도 큰 차이가 있어?

 

수동으로 튜닝하는 건 직관을 쓰는 거임. 그래서 ML 엔지니어의 실력에 크게 좌지우지된다.

 

대부분은 이런 실력은 없기 때문에 GSD(Graduate Student Descent) 라는 용어가 농담처럼 사용됨.

  • GSD 는 졸업생(대학원생)의 수동적인 노력을 통해 문제를 해결하는 방법을 말함.

 

AutoML 의 장점:

  • 효율성: AutoML 도구는 하이퍼파라미터의 최적 조합을 자동으로 탐색하며, 사용자는 그 과정에 적은 시간을 할애하면 된다.
  • 접근성: 비전문가도 고급 모델을 개발하고 튜닝할 수 있게 해준다. 복잡한 머신러닝 모델에 대한 깊은 이해 없이도 사용할 수 있다.

AutoML 의 단점:

  • 블랙 박스 문제: 일부 AutoML 도구는 내부적으로 어떤 작업을 수행하는지 투명하지 않을 수 있으며, 모델의 예측이 어떻게 결정되는지 파악하기 어려울 수 있다.
  • 비용: 자원 집약적인 탐색 알고리즘을 사용할 때 컴퓨팅 비용이 많이 들 수 있다.
  • 일반화 문제: AutoML이 최적의 결과를 제공하긴 하지만, 특정 문제에 대한 맞춤형 조정이 부족할 수 있다.

그래서 나라면 AutoML 을 먼저 쓰고 이후에 수동으로 튜닝하면서 더 개선해볼듯.

 

그리고 최근 ML 프레임워크는 하이퍼파라미터를 자동으로 조정해주는 기능이 있다고도 함:

  • Scikit-learn: 파이썬의 주요 머신러닝 라이브러리 중 하나로, GridSearchCV 와 RandomizedSearchCV 와 같은 도구를 제공하여 하이퍼파라미터 튜닝을 자동화한다.
  • TensorFlow: TensorFlow는 머신러닝 모델을 개발하기 위한 포괄적인 플랫폼이다. TensorFlow 자체적으로는 직접적인 AutoML 기능을 제공하지 않지만, TensorFlow Extended(TFX)와 같은 확장 도구가 AutoML 기능을 지원한다.

 

분산 훈련

분산 훈련은 머신러닝 모델을 훈련시키는 과정에서 여러 대의 컴퓨터나 GPU를 활용하여 훈련 데이터를 분할하고, 연산 작업을 병렬로 처리하는 방법이다.

 

이 접근법은 대규모 데이터셋과 복잡한 모델의 훈련 시간을 단축시키는 데 효과적이며, 더 큰 모델을 구축할 수 있는 환경을 제공한다.

 

분산 훈련은 크게 두 가지 주요 방법으로 구현될 수 있다:

  • 데이터 병렬 처리 (Data Parallelism):
    • 데이터 병렬 처리는 훈련 데이터셋을 여러 부분으로 나누어 각각의 컴퓨팅 유닛(예: GPU)에 할당한다. 각 컴퓨팅 유닛은 모델의 복사본을 가지고 있으며, 할당된 데이터 부분에 대해 독립적으로 학습을 수행한다.
    • 학습 과정에서 각 유닛은 그라디언트(가중치의 변경량)를 계산하고, 이를 모든 유닛이 공유한다. 주로 그라디언트를 집계하여 모델의 가중치를 업데이트하는 과정이 필요하며, 이를 위해 All-reduce 알고리즘 같은 통신 프로토콜이 사용된다.
  • 모델 병렬 처리 (Model Parallelism):
    • 모델 병렬 처리는 큰 모델을 여러 컴퓨팅 유닛 (서버, GPU) 에 걸쳐 분할하는 방법이다. 이는 주로 네트워크의 각 레이어나 모듈을 다른 유닛에 할당하는 형태로 이루어진다.
    • 이 방법은 각 유닛이 모델의 일부분만을 담당하므로, 매우 큰 모델을 메모리 제한 내에서 효과적으로 훈련할 수 있게 한다. 하지만, 유닛 간의 통신 오버헤드가 크고 복잡성이 증가할 수 있다.

 

 

Q) 모델 병렬 처리는 하나의 거대한 모델을 여러대의 서버로 나누고, 각 서버들이 통신하면서 학습하는거지?

 

맞다.

 

 

Q) 데이터 병렬 처리는 하나의 모델을 여러 대의 서버가 복사해서 가지고 있고 각각 데이터 샘플에 따라서 학습을 하는거지? 그리고 하나의 서버에서 데이터 샘플에 대한 학습이 끝나면 다른 서버에 있는 모델들은 동기화가 되서 작업을 하는거고?

 

맞다.

 

각 서버는 모델의 전체 복사본을 가지고 있으며, 전체 데이터셋을 여러 부분으로 나누어 각 서버에 분배해서 처리한다.

 

여기서 각 서버는 할당받은 데이터 샘플로 독립적으로 학습을 수행한다.

 

각 서버에서 학습이 끝나면 계산된 그라디언트는 중앙 서버나 특정 통신 프로토콜을 통해 집계된다. 이 집계된 그라디언트는 모델의 가중치를 업데이트하는 데 사용된다.

 

집계된 그라디언트를 사용하여 가중치를 업데이트한 후, 업데이트된 모델의 가중치를 다시 모든 서버에 전파하여 동기화한다.

이를 통해 모든 서버에서 학습이 동일한 출발점에서 계속될 수 있도록 조정한다.

 

 

Q) 데이터가 메모리보다 크다면 데이터 전처리, 셔플링, 데이터 배치 분할 처리를 수행하는 알고리즘 작업을 아웃 오브 코어 형태 그리고 병렬로 처리해야한다는게 무슨 말이야?

 

데이터가 메모리보다 클 경우, 즉 데이터가 시스템의 RAM 용량을 초과하는 경우 "아웃 오브 코어"(out-of-core) 또는 "외부 메모리" 처리 방식을 사용해야한다.

 

이는 모든 데이터를 한 번에 메모리에 로드할 수 없기 때문에 필요한 처리 방식으로 데이터를 부분적으로 로딩하고, 처리한 다음, 다음 부분을 계속해서 로딩하고 처리하는 순환 작업을 수행하는 걸 말한다.

 

아웃 오브 코어 처리의 주요 단계:

  • 데이터 분할: 전체 데이터셋을 작은 "청크"나 "배치"로 나뉜다. 이 크기는 시스템의 메모리에 맞게 조정될 수 있으며, 각 청크는 독립적으로 로드되어 처리된다. 그러니까 메모리에 올라갈 데이터와 디스크에 저장될 데이터가 나눠지는 거다.
  • 순차적 처리: 각 데이터 청크는 순차적으로 로드되어 전처리, 피처 추출, 모델 학습 등의 작업이 수행된다. 이 과정에서 한 번에 하나의 청크만 메모리에 있으므로 메모리 문제를 피할 수 있다.
  • 셔플링: 데이터 셔플링은 모델이 데이터의 특정 순서에 의존하지 않도록 하는 과정이다. 아웃 오브 코어 환경에서 셔플링은 데이터 청크 간에 레코드를 재분배하는 것을 포함할 수 있으며, 이는 복잡한 로직을 요구할 수 있.
  • 병렬 처리: 데이터 처리 작업을 여러 프로세스나 스레드에서 동시에 수행하여 처리 속도를 향상시킬 수 있다. 각 프로세스는 다른 데이터 청크를 독립적으로 처리할 수 있으며, 이를 통해 전체 처리 성능을 높일 수 있다.

 

Q) 셔플링을 하는 이유는 뭔데?

 

모델이 데이터가 들어오는 순서를 가지고 패턴을 만들어서 학습할 수도 있어서 그럼.

 

데이터의 순서가 실제로 의미가 없거나 관련성이 없는 경우에 순서에 기반한 패턴을 학습하게 되면 모델의 일반화 능력이 크게 저하될 수 있음.

 

이는 특히 데이터의 순서가 우연이거나, 오해의 소지가 있는 상관관계(spurious correlations)에 기반할 때 발생한다.

 

예시: 코로나19 검출 시스템

  • 코로나19 검출 시스템에서 이름이나 성과 같은 비생물학적 요인이 코로나 바이러스 감염과 연관되어 있지 않다는 것은 명백하다.
  • 그러나 데이터에서 A 라는 성을 가진 사람이 코로나 일 때 B 라는 사람의 성을 가진 사람은 코로나가 아니다라는 데이터가 순서대로 계속 온다면 모델은 이를 패턴으로 인식하게 될거임.
  • 이 경우에는 일반화 능려이 크게 떨어지게 될 것.

 

Q) 데이터 샘플에 종속성이 있는 경우 그러니까 고객의 구매 데이터에서 연속된 구매 데이터를 학습에 이용해서 고객이 구매할 상품을 추천하는 경우에는 데이터 순서에서 특정 패턴을 학습하게 되곘네? 이 경우에는 이게 유용한거지?

 

맞다.

 

데이터 샘플 간의 종속성이 중요한 역할을 하는 많은 시나리오에서, 특히 추천 시스템이나 시계열 예측과 같은 애플리케이션에서는 데이터의 순서에서 패턴을 학습하는 것이 유용하다고 함.

 

고객의 구매 데이터를 사용한 추천 시스템에서는 고객이 과거에 구매한 아이템의 순서가 다음에 구매할 아이템을 예측하는 데 중요한 정보가 될 수 있다.

 

예를 들어, 고객이 특정 제품을 구매한 후 종종 구매하는 다른 제품이 있을 수 있다. 이러한 패턴을 학습하여 추천 시스템은 고객에게 다음 구매로 적합할 수 있는 제품을 추천할 수 있게된다.

 

 

Q) 데이터 샘플 크기가 크다면, 머신 한대로 한 번에 처리 가능한 샘플 수가 적도록 작은 배치로 연산을 수행해야하는데, 이렇게하면 경사 하강법 기반 최적화 작업이 불안정해진다는 건 무슨 뜻이야?

 

큰 배치와 작은 배치일 경우에 경사 하강법이 어떻게 되는지부터 살펴보자:

  • 큰 배치:
    • 큰 배치에서는 한 번의 업데이트에 많은 데이터 포인트를 사용하여 그라디언트를 계산한다. 이는 전체 데이터셋의 그라디언트 추정이 더 정확하게 이루어진다는 장점이 있다. 그 결과, 그라디언트의 방향이 매우 일관되며, 손실 함수의 감소 경로를 안정적으로 따라갈 수 있다는 장점이 있다. 하지만 이 일관된 그라디언트 방향은 종종 모델을 보다 깊은 최소값으로 이끌기보다는, 지역 최소값에 빠지게 만드는 경향이 발생한다. 이는 손실 표면의 주요 경사만을 따라가고, 작은 경사나 다른 잠재적 경로는 탐색하지 않기 때문임.
  • 작은 배치:
    • 작은 배치 크기는 그라디언트 추정에 노이즈가 많다. 이 노이즈가 모델이 지역 최소값에서 쉽게 벗어나도록 도울 수 있으며, 더 다양한 경로를 탐색하게 만든다. 이러한 불규칙적인 탐색은 때로는 손실 표면에서 벗어나서 전역 최소점(global minimum)으로 이어지게 만들 수 있다. 하지만 작은 배치의 경우 그라디언트 업데이트가 매우 불규칙하고 예측할 수 없게 변할 수 있다. 작은 배치는 전체 데이터셋을 대표하는 통계적 특성을 완벽하게 캡처하지 못한다. 따라서 각 배치로부터 계산된 그라디언트는 전체 데이터셋에 대한 그라디언트의 정확한 추정치보다 훨씬 더 많은 변동성을 가질 수 있다. 이는 각 업데이트 단계에서 모델의 가중치가 크게 흔들릴 수 있음을 의미하며, 이러한 불규칙한 업데이트는 학습 과정을 불안정하게 만들 수 있다.

지역 최소값 문제:

  • 손실 함수의 지역 최소값은 전역 최소값(global minimum)보다 덜 최적화된 상태를 말한다.

전역 최소점(Global Minimum):

  • 전역 최소점은 손실 함수에서 가능한 가장 낮은 지점으로, 모든 가능한 파라미터 값 중에서 손실을 최소화하는 점이다.

 

 

Q) 작은 배치라도 결국에는 전역 최소점으로 수렴하게 되는거면 불안정이 아닌거 아니야?

 

작은 배치라도 전역 최소점으로 못가게되는 경우도 있긴하다.

 

손실 함수가 매우 복잡하고 고차원적인 경우, 손실 표면에는 많은 지역 최소점, 안장점, 플라토(plateau, 평평한 영역) 등이 존재할 수 있기 때문.

  • 안장점(saddle point)은 다변수 함수에서 일부 방향으로는 최소값, 다른 방향으로는 최대값을 가지는 점을 말한다. 즉, 그 지점에서의 도함수(미분값)는 0이지만, 그 지점이 전역 최소점이나 전역 최대점은 아닌 경우임.

 

그리고 데이터의 차원이 매우 높은 경우, 차원의 저주(curse of dimensionality)로 인해 공간의 대부분이 빈 공간이 되며, 이는 그라디언트 기반 최적화를 어렵게 만든다.

 

고차원에서는 데이터 포인트 간의 거리가 멀어져서 그라디언트가 효과적으로 전역 최소점을 가리키지 못할 수 있으므로.

 

 

Q) 데이터 샘플이 메모리 크기를 넘어설 정도로 거대할 때 사용하는 그레디언트 체크포인팅 기법은 뭐야?

 

대용량 모델을 훈련할 때 메모리 사용을 최적화하기 위한 기술임.

 

특히 딥 러닝에서 신경망의 전방향 계산(forward pass) 중 생성되는 중간 계산 결과들을 저장하는 대신, 필요할 때 다시 계산함으로써 메모리 사용량을 줄이는 방법이다.

 

일반적으로 딥 러닝 모델을 훈련할 때, 각 레이어의 입력과 출력 값을 저장해야 역전파(backpropagation) 동안 그라디언트를 효율적으로 계산할 수 있다.

 

하지만 이러한 중간 계산 값들을 모두 저장하는 것은 메모리 사용량을 크게 증가시킨다.

 

그라디언트 체크포인팅은 이러한 중간 계산 값들을 모두 저장하지 않고, 대신 필요한 시점에 다시 계산(recompute)함으로써 메모리 사용을 최소화한다.

 

 

Q) 분산학습의 데이터 병렬 처리에서 모델이 여러 머신에 복제하면 배치가 매우 커지는 문제가 발생할 수 있다는게 무슨 뜻이야?

 

데이터 병렬 처리를 하면 큰 데이터를 나눠서 학습을 하게 되니까 단일 모델과 서버로 학습하는 것보다 더 빠르게 학습할 수 있음.

 

이걸 속도를 더 내기 위해서 배치 크기를 올렸을 때 발생하는 문제를 말하는듯.

 

 

Q) 하이퍼파라미터인 학습률을 높이면 무슨 문제가 생겨?

 

학습률이 너무 높으면, 모델이 최적의 파라미터로 수렴하기 어려워질 수 있다. 이는 그레디언트 업데이트가 과도하게 크기 때문에, 모델 파라미터가 최적점을 넘어서서 계속 요동치게 되는 현상 때문임.

 

이런 현상은 손실 함수(loss function)에서 최소값을 찾는 과정에서 파라미터가 계속 크게 변동하면서 최소값을 지나쳐버리는 것으로 볼 수 있는 것.

 

그리고 손실 함수가 발산할 수도 있다. 즉, 손실 값이 감소하는 대신 증가하게 되며, 이는 모델의 성능이 점차 나빠지는 결과를 초래함.

 

이 경우, 그레디언트의 방향이 최소값을 향하더라도 그 크기가 너무 커서 오히려 최적점에서 멀어지게 되는 현상임.

 

 

Q) 데이터 병렬 처리에서 동기식으로 수렴하는 방법과 비동기식으로 수렴하도록 만드는 방법이 있어?

 

맞다. 각각 장단점을 보자.

 

동기식 수렴 방법:

  • 동기식 수렴 방법에서는 모든 워커 또는 머신이 데이터의 각 배치에 대해 처리를 완료하고 그레디언트를 계산한 후, 중앙 서버나 파라미터 서버에 이 그레디언트를 보낸다. 서버는 모든 워커로부터 그레디언트를 수집하여 평균을 내고, 이 평균화된 그레디언트를 사용하여 전역 모델의 파라미터를 업데이트한다. 그 후, 업데이트된 모델 파라미터가 모든 워커에게 다시 전송되어 다음 반복 학습 과정에 사용된다.

 

동기식 수렴 방법 장점:

  • 비동기식 보다 안정적으로 수렴한다.

 

동기식 수렴 방법 단점:

  • 모든 서버의 작업을 기다려야하므로 가장 느린 워커에 의해 전체 학습 속도가 제한될 수 있다.

 

비동기식 수렴 방법:

  • 각 워커가 독립적으로 데이터 배치를 처리하고 그레디언트를 계산한 후, 즉시 중앙의 모델 파라미터를 업데이트한다. 워커들은 다른 워커의 완료를 기다리지 않고 각자의 속도로 학습을 진행한다. 이 방식은 워커가 업데이트한 그레디언트를 중앙 서버가 받아 즉시 모델을 업데이트하며, 이 업데이트는 다른 워커들에게도 반영되는 방법이다.

 

비동기식 수렴 방법 장점:

  • 학습 과정이 워커 간의 지연에 덜 민감하며, 전체 학습 속도가 빠르다.
  • 대규모 분산 환경에서 효율적으로 작동할 수 있다.

 

비동기식 수렴 방법 단점:

  • 업데이트 충돌로 인해 모델의 수렴이 불안정할 수 있다.
  • 최종 결과는 동기식 수렴보다 성능이 안나올 수 있다고 함. (근데 결과는 그렇게 차이나지 않는다는듯. 충돌이 자주 발생하지는 않아서.)

 

 

Q) 모델 병렬 처리 중에 파이프라인 병렬 처리라는 게 있음?

 

있음.

 

큰 규모의 신경망 모델을 다룰 때 사용되는 기술임.

 

파이프라인 병렬 처리는 큰 신경망을 여러 개의 세그먼트로 나눔.

 

각 세그먼트는 신경망의 연속적인 레이어들로 구성되며, 각기 다른 처리 장치에 할당되는데 학습 과정에서 이 세그먼트들은 파이프라인의 각 단계처럼 연속적으로 데이터를 처리하며, 이전 단계에서의 출력이 다음 단계의 입력으로 전달되면서 처리되는 것.

 

 

모델 오프라인 평가

모델 오프라인 평가는 배포 전에 모델을 평가하는 걸 말함.

 

여기서는 모델을 평가하는 다양한 방법들에 대해서 봄.

 

 

Q) 모델을 제대로 평가하지 못하면 무슨 일이 일어나는데?

  • 적합한 모델 선택이 어려워짐. 어느 모델이 좋은지 모르게 되니까.
  • 별로 좋지 않은 모델을 프로덕션 환경에 배포하게 된다.

 

 

베이스라인 평가 방법

모델의 성능이 좋은 것처럼 보이나 별로 유의미하지 않는 경우도 있음.

 

예시로 모델 분류 성능이 90%라고 한다치자, 근데 하나의 클래스가 대부분이라서 그 클래스로 예측만해도 90% 확률이 나올 수 있음.

 

그러므로 ML 모델의 성능을 따질 때는 기본 베이스라인의 성능에 비해서 어느정도 우월한지를 평가해야한다.

 

베이스라인 평가 방법은 다양하게 있음:

  • 무작위 베이스라인
  • 단순 휴리스틱
  • 0규칙 베이스라인
  • 인간에 의한 베이스라인
  • 기존 솔루션

무작위 베이스라인:

  • 무작위 값으로 예측을 하는 것을 말함. 내가 만든 ML 시스템은 이것보다 성능이 우월해야하니까.

단순 휴리스틱:

  • 휴리스틱 로직으로 예측을 하는 걸 말함.

0규칙 베이스라인

  • 가장 자주 등장하는 데이터/클래스 값으로 예측을 하는 걸 말함.

인간에 의한 베이스라인:

  • 인간의 예측과 비교하는 걸 말함. 때로는 인간보다 우위에 있어야만 유의미한 ML 시스템이 있으니까. (e.g 자율주행 시스템)

기존 솔루션:

  • ML 솔루션을 도입하기 전 기존에 처리하던 방식을 말함. 이것보다 우위에 있어야 하니.

 

 

Q) 모델이 베이스라인 보다 우위에 있더라도 별로 쓸모 없는 경우도 있는거 아님?

 

맞다.

 

자율주행 시스템만 하더라도 다른 베이스라인보다 우위에 있더라도 인간보다 우위를 점하지 못하면 쓸모없게된다.

 

그러니까 모델이 어느 선을 넘었을 때부터 유용한지를 생각해봐야하고 그 기준을 뛰어넘어야함.

 

 

Q) 그러면 모델의 유용함을 따지기 위해서는 성능이 중요한 요소인거네?

 

일부 맞다.

 

모델의 유용함을 따지는데는 성능만 있는게 아니긴 함. 성능 보다는 빠른 추론이 중요한 경우도 있음.

 

예시:

  • 텍스트 자동 입력 완성:
    • 모델의 예측이 틀리더라도 괜찮음. 결과적으로 기존 타이핑보다 빠르게 작성할 수 있도록 도와주면 됨. 이 시스템에서 추론이 느려지게 되면 유용하지 않음.
  • ML 모델을 온라인 게임에서 사용하는 경우:
    • 실시간 온라인 게임에서는 모델의 움직임이 빨라야한다.

 

 

ML 모델 평가 방법

여기서는 이제 베이스라인 평가 방법 말고 모델을 프로덕션에 배포할만한지를 테스트 하는 방법에 대해 알아보자.

 

학교에서는 ML 모델을 평가할 때 단순히 성능만가지고 테스트 하지만 프로덕션에서 서비스로 ML 을 배포하는 경우에는 이것 말고도 여러가지 조건이 있다:

  • 강견성:
    • 모델이 입력 데이터의 작은 변화나 노이즈에 대해 얼마나 잘 견디는지를 나타냄.
    • 예를 들어, 이미지 인식 모델이 이미지에 약간의 노이즈가 추가되거나 조명이 바뀌어도 여전히 정확하게 객체를 인식할 수 있어야 한다.
  • 공정성:
    • 모델의 예측이 모든 개인이나 그룹에 대해 편향되지 않고 공평하게 이루어지는지를 평가하는 것.
    • 주로 소수 민족, 성별, 연령 등의 다양한 인구 통계적 그룹 간에 차별이 발생하지 않도록 하는 것을 목표로 한다.
  • 개연성 있는 결과를 내놓는지:
    • 모델의 예측이나 결정이 인간의 직관이나 이해와 일치하는지를 평가한다. 모델이 내놓는 결과가 실제와 잘 일치하고, 그 결과를 사용자가 이해하고 설명할 수 있어야 한다.
    • 예를 들어, 의료 진단 모델이 특정 증상에 대해 진단을 내릴 때, 그 진단이 의학적으로 타당하고 이해할 수 있어야 한다.
  • 보정이 잘 되는지:
    • 모델의 예측 확률이 실제 발생 확률과 일치하는 정도를 의미한다.
    • 보정이 낮은 모델은 가치를 제공해주지 못할거니까 이를 보정해줘야함.
    • 예를 들어, 모델이 어떤 사건의 발생 확률을 70%라고 예측했다면, 실제로 100번의 사건 중 약 70번은 그 사건이 발생해야 한다. 잘 보정된 모델은 믿을 수 있는 확률 추정치를 제공함으로써, 의사 결정 과정에서 중요한 역할을 할 것.
    • 보정을 하기 위해선 모델이 예측한 값과 항께 실제 정답도 알아야하는데 피드백을 받을 수 없다면 어렵긴하다. 그래서 피드백을 받을 수 있는 구조를 설계해둬야할듯.

여기서는 이런 특성들을 테스트하는 방법에 대해 보자.

 

 

Q) 보정이 잘 되는지 확인하려면 모델의 예측을 확률로 표현해야하는데 이건 어떻게 함?

 

Platt Scaling 을 사용하면 된다. 이는 sklearn 에서도 구현되어 있음.

 

Platt Scaling 은 주로 서포트 벡터 머신(SVM)과 같이 기본적으로 확률을 출력하지 않는 모델의 예측 결과를 확률로 변환하기 위해 사용됨.

 

 

교란 테스트

모델의 강견성을 테스트 하기 위해 학습 데이터에 교란을 넣어서 테스트 하는 방법을 말함.

 

이걸 하는 이유는 모델의 학습 데이터와 실제 프로덕션에서 만나는 데이터와는 괴리가 있기 때문임. 실제 프로덕션에서 만나는 데이터가 훨씬 잡음이 많음.

  • 예시: 기침 소리고 코로나를 판단하는 시스템이 있다고 가정해보자. 실제 프로덕션에서 만나는 기침 소리는 마이크 품질마다 다를 거고, 배경 음악이 담겨져 있거나, 바로 기침하지 않고 좀 뜸들였다가 기침하는 경우도 있을거임.

그래서 테스트 데이터에 약간 변화를 줘서 테스트를 해봐야함.

 

생각해보면 전통적인 소프트웨어에서 테스트 케이스를 작성하는 것과 유사하게 ML 에서는 테스트 데이터를 잘 만들어두는게 중요한듯.

 

 

Q) 이런 교란 데이터를 만들 수 있는 프레임워크나 도구같은 것들이 있어?

 

Tensorflow 나 Pytorch 에서 이런 기능들을 지원해주는 것 같다.

 

 

불변성 테스트

모델의 공정성을 테스트 하기 위해 학습 데이터에서 약간씩 데이터를 변경해보고 테스트하는 걸 말함.

 

대출이 나오는지, 안나오는지 확인하는 ML 시스템에서 단지 인종 때문에 대출이 안나온다고 한다면 공정하지 않을 것.

 

불변성 테스트를 하는 방법은 나머지 입력 데이터는 동일하게 맞춘 상태에서 예측과 크게 연관이 없는 데이터를 바꿔서 테스트를 해보는 거임.

 

이것보다 더 좋은 방법은 피처에서 불필요한 정보를 미리 제거해두는게 중요함.

 

 

Q) 불변성 테스트를 지원하는 도구는?

 

Microsoft Fairlearn 이 있다고 함.

 

데이터에서 민감한 특성을 변형하고 모델의 반응을 테스트하는 데 사용할 수 있는 Python 라이브러리임.

 

사용자는 테스트 데이터의 특정 속성 값을 변경하여 모델의 예측이 어떻게 변하는지 관찰할 수 있고, 이를 통해 모델이 특정 속성에 과도하게 의존하고 있는지 여부를 판단할 수 있음.

 

물론 Python의 Pandas 라이브러리와 NumPy를 사용하여 데이터셋을 직접 조작하고 필요에 따라 특성을 변형하는 방법도 있음.

 

 

방향 예상 테스트

모델의 예측과 관련된 입력을 변경했을 때 올바르게 출력이 변경되는지 확인하는거임.

 

 

신뢰도 측정

모델이 올바르지 않은 예측까지 사용자에게 보여주면 안되는 경우가 있을 수 있음.

 

이 경우를 대비하기 위해서 신뢰도를 측정하고 이 임계값 이상일 경우에만 사용자에게 보여주도록 하는 방법임.

 

 

슬라이스 기반 평가

이 방법은 모델의 성능을 전체 정확도와 같은 지표로 확인하지 말고 데이터를 슬라이스로 하위 집합으로 분류해서 해당 집합에서 얼마나 성능이 잘 나오는지 확인하는 방법임.

 

이 방법이 중요한 이유는 특정 그룹 예측이 중요한 경우가 있기 때문임.

 

다수 클래스 에측보다는 소수 클래스 예측이 중요한 경우가 있기 때문.

 

 

Q) 슬라이스를 하려면 데이터를 분류해야할텐데 이는 어떻게 하나?

  • 도메인 지식을 가지고 휴리스틱하게 분류하는 방법도 있음. (e.g 모바일 사용자와 데스크탑 사용자 구분)
  • Slice Finder 알고리즘을 이용해서 데이터를 분류하는 방법도 있다.
  • 아니면 잘못 판단된 데이터가 있다면 이를 분석하다 보면 데이터 분류가 보이는 경우도 있음.

'Machine Learning' 카테고리의 다른 글

데이터 분포 시프트와 모니터링  (0) 2024.04.25
모델 배포와 예측 서비스  (0) 2024.04.21
피처 엔지니어링  (0) 2024.04.11
훈련 데이터  (0) 2024.04.05
데이터 엔지니어링 기초  (0) 2024.04.03

+ Recent posts