[Designing Machine Learning Systems] 데이터 분포 시프트와 모니터링
모델 배포 후에도 이슈를 탐지하기 위해 성능을 지속적으로 모니터링해야 하며 발생한 이슈를 수정하는 업데이트를 계속 배포해야 한다.
8, 9장에서는 프로덕션 환경에서 모델을 유지 관리하기 위한 필수 항목을 다룬다.
8장에서는 개발 중에 뛰어난 성능을 보인 ML 모델이 프로덕션 환경에서 실패하는 이유를 살펴본다. 그리고 까다로운 문제인 데이터 분포 시프트를 살펴본다.
8.1 머신러닝 시스템 장애 원인
장애는 시스템에 대한 기대치가 한 가지 이상 어긋날 때 일어난다.
ML 시스템에서는 운영 지표와 ML 성능 지표 모두 신경 써야 한다.
운영상 기대치를 어기는 문제를 감지하기는 쉽지만 ML 성능상 기대치를 어기는 문제는 감지하기 어렵다.
프로덕션 환경에서 ML 시스템 장애를 효과적으로 탐지하고 수정하려면 개발 중에 잘 작동하는 모델이 프로덕션 환경에서는 왜 실패하는지 이해해야 한다.
8.1.1 소프트웨어 시스템 장애
소프트웨어 시스템 장애는 ML에 속하지 않는 시스템에서 발생하는 장애이다.
- 의존성 장애
- 배포 실패
- 하드웨어 오류
- 다운타임 또는 충돌
ML과 관련되지 않은 오류라도 잘 숙지해야 한다. 구글에서 대규모 ML 파이프라인이 중단된 사례 96건을 조사한 결과 그중 60건은 분산 시스템과 관련되거나 데이터 파이프라인과 관련되었다.
8.1.2 머신러닝 한정 장애
ML 한정 장애는 ML 시스템과 관련된 장애이다.
ML 한정 장애는 전체 장애에서 차지하는 비중은 낮지만 탐지하거나 수정하기 어렵고 위험하다.
프로덕션 환경 데이터가 훈련 데이터와 다른 경우
ML 교과 과정 중 먼저 배우는 것 중 하나는 훈련 데이터와 본 적 없는 데이터가 유사한 분포에서 나와야 한다는 점이다. 본 적 없는 데이터와 훈련 데이터가 동일한 정상 분포에서 추출됐다는 가정이다.
이 가정은 대개 올바르지 않다. 실제 데이터에 내재된 분포는 훈련 데이터에 내재된 분포와 같지 않을 수 있고(훈련-서빙 편향), 현실 세계는 정상성을 갖지 않는다. 모든 것은 변하며 데이터 분포는 시프트한다. 그 원인은 갑작스런 이벤트의 발생, 점진적인 변화, 계절성 등 다양하다.
모니터링 대시보드에서 데이터 시프트처럼 보이는 것들은 사실 대부분 내부 오류이다.
에지 케이스
에지 케이스란 너무 극단적이어서 모델이 치명적인 실수를 하게 되는 데이터 샘플을 말한다. 보통 동일한 분포에서 나온 데이터 샘플이지만, 모델이 잘 작동하지 않는 데이터 샘플 수가 급증했다면 내재된 데이터의 분포가 시프트하지 않았나 의심해볼 수 있다.
에지 케이스와 이상치
이 책에서 이상치란 다른 데이터 포인트와 성질이 크게 다른 데이터 포인트를 의미한다. 한편 에지 케이스는 성능을 의미하며, 다른 데이터 포인트보다 모델 성능이 크게 뒤떨어지는 데이터 포인트이다. 이상치도 모델 성능이 저조한 원인이 될 수 있으므로 에지 케이스에 포함되기도 한다.
예륻 들어, 고속도로에서 무단 횡단하는 사람은 이상치이나, 자율주행차가 그러한 사람을 정확하게 탐지하고 적절히 반응한다면 에지 케이스는 아니다.
퇴행성 피드백 루프
피드백 루프는 예측값을 제시한 다음 예측값에 대한 피드백이 되돌아올 때까지 걸리는 시간을 의미한다. 피드백은 자연 레이블을 추출해 모델 성능을 평가하고 다음번 훈련을 반복하는 데 사용 가능하다.
퇴행성 피드백 루프는 예측 자체가 피드백에 영향을 미치고, 이 피드백이 모델의 다음번 반복 학습에 영향을 미칠 때 발생한다. 모델을 추천했던 영상을 사용자는 자주 클릭하게 되고, 이것이 이후 모델 학습에 활용되어 특정 영상에 편향된 예측을 하게 되는 사례를 생각하면 이해하기 편하다.
특정 피처, 가령 이력서를 심사할 때 대학이라든지 구글에서 근무 같은 요소에 편향되게 되면, 이후에는 해당 특징을 가진 사람만 선발되게끔 유도할 수 있다. 이런 경우에는 각 피처의 중요도를 측정하면 편향을 감지하는데 도움이 된다.
퇴행성 피드백 루프 감지
시스템이 오프라인인 경우에는 퇴행성 루프를 감지하기 어렵다. 배포 전까지는 사용자가 존재하지 않기 때문이다.
추천 시스템에서는 시스템이 오프라인일 때도 시스템 출력 인기도의 다양성을 측정해 퇴행성 피드백 루프를 감지할 수 있다.
시스템 출력이 단조로울수록(특정 인기 게시물만 추천할수록) 편향되었겠거니 짐작할 수 있다.
퇴행성 피드백 루프 교정
무작위화를 사용하는 것과 위치 피처를 사용하는 방식이 대표적이다.
무작위화는 무작위 항목을 보여주고 그에 대한 사용자 피드백을 받아서 항목의 실제 경쟁력을 결정한다. 무작위화는 다양성을 개선하는 한편 사용자 경험을 저하한다. 이를 개선하고자 허용 가능한 예측 정확도 손실 폭을 정해놓고 그 안에서 항목 다양성을 높이려는 시도가 있다.
예측값이 보여지는 위치가 피드백에 어떤 식으로든 영향을 미치는 경우 위치 피처를 사용해 위치 정보를 인코딩할 수 있다. 위치 피처는 숫자 혹은 부울이다.
훈련 데이터에 ‘최상단 추천 여부’ 피처를 추가하여 모델을 학습시킨 후 추론할 때는 노래가 추천되는 위치에 상관없이 사용자가 노래를 클릭할지 예측하는 것이 목표이므로 최상단 위치 피처 값을 ‘아니오’로 설정한다. 모델은 최상단 추천 여부가 클릭 여부에 얼마나 영향을 미치는지 학습하지만, 추론 시에는 위치 피처 값을 고정하여 영향이 가지 않게 유도한다. 이것은 단순한 예시이며 퇴행성 피드백 루프를 방지하기에 충분하지 않을 수 있다.
보다 정교한 해결 방법은 두 가지 모델을 사용하는 것이다. 첫 번째 모델은 추천이 보이는 위치를 고려해 사용자가 추천을 살펴보고 선택을 고려할 확률을 예측한다. 그리고 두 번째 모델은 사용자가 살펴보고 선택을 고려한 항목을 최종적으로 클릭할 확률을 예측한다. 두 번째 모델을 위치와 전혀 관련이 없다.
8.2 데이터 분포 시프트
데이터 분포 시프트는 지도 학습에서 모델이 동작하는 데이터가 시간에 따라 변하는 현상으로, 이에 따라 모델 예측도 시간이 지날수록 덜 정확해진다. 모델이 훈련된 데이터의 분포를 원본 분포라고 하며 모델이 추론을 실행하는 데이터의 분포를 대상 분포라고 한다.
8.2.1 데이터 분포 시프트 유형
다양한 데이터 시프트 유형에 대한 논의는 상당히 수학적이며 대부분은 연구하는 입장에 한해 유용한 내용이다.
다양한 데이터 시프트 유형을 논의하기 전 몇 가지 수학적 표기법을 정의하자.
()
모델에 대한 입력: \(X\)
모델의 출력: \(Y\)
\(P(Y|X)\) 는 입력이 주어졌을 때 출력의 조건부 확률을 나타낸다. \(P(X)\) 는 입력의 확률 밀도 함수를 나타내며 \(P(Y)\) 는 출력의 확률 밀도 함수를 나타낸다.
공변량 시프트(Covariate shift)
\(P(X)\)가 변하지만 \(P(Y|X)\)는 동일하게 유지된다. (\(P(X, Y) = P(Y|X)P(X)\))
입력의 분포는 변하지만 입력이 주어졌을 때 출력의 조건부 확률은 동일하게 유지된다.
레이블 시프트(Label shift)
\(P(Y)\)가 변하지만 \(P(X|Y)\)는 동일하게 유지된다. (\(P(X, Y) = P(X|Y)P(Y)\))
사전 시프트, 사전 확률 시프트, 목표 시프트라고도 한다. 출력 분포가 변하지만 주어진 출력에 대한 입력 분포는 동일하게 유지되는 경우이다.
개념 드리프트(Concept drift)
\(P(Y|X)\)가 변하지만 \(P(X)\)는 동일하게 유지된다. (\(P(X, Y) = P(Y|X)P(X)\))
사후 시프트라고도 한다. 입력 분포가 동일하게 유지되지만 정해진 입력에 대한 출력의 조건부 분포가 변하는 경우이다.
8.2.2 일반적인 데이터 분포 시프트
현실에서 모델 성능을 저하할 수 있는 몇 가지 변화 유형
- 피처 변화: 신규 피처가 추가되거나, 이전 피처가 제거되거나, 피처 값의 가능한 범위가 변한 경우
- 레이블 스키마 변화: \(Y\) 값의 가능한 범위가 변하는 경우
여러 유형의 시프트가 동시에 발생할 수도 있다.
8.2.3 데이터 분포 시프트 감지
모델의 정확도 관련 지표를 모니터링하면서 변화를 확인하는 방법
관심 있는 분포를 모니터링할 수도 있다. 일반적인 관심 분포는 \(P(X)\), \(P(Y)\), \(P(X|Y)\), \(P(Y|X)\) 이다.
대부분의 드리프트 감지 방법은 입력 분포, 특히 피처 분포의 변화를 감지하는 데 중점을 둔다.
통계적 방법
기술통계량을 비교하는 것. 보통은 이러한 지표만으로는 충분하지 않다. 요약 통계량이 달라지면 데이터 시프트가 일어났으리라 확신할 수 있지만, 유사하더라도 시프트가 없으리라는 보장은 없다.
보다 정교한 방법은 2-표본 가설 검정, 줄여서 2-표본 검정을 사용해 두 모집단(데이터셋) 간의 차이를 통계적으로 유의한지 확인하는 방법이다.
기본 2-표본 검정은 KS 또는 KS 검정이라고도 하는 콜모고로프-스미르노프 검정이다. 비모수 통계 검정이라 내재 분포에 대한 가정을 두지 않지만 1차원 데이터에만 적용할 수 있다고 한다(레이블 또는 예측 시프트를 감지하는 데 유용).
Alibi Detect는 다양한 드리프트 감지 알고리즘을 구현한 훌륭한 오픈 소스 패키지이다.
시프트를 감지하기 위한 시간 척도 윈도
변화는 서로 다른 속도로 발생하며 갑작스러운 변화는 느리고 점진적인 변화보다 감지하기 쉽다.
공간적 시프트는 접속 지점이 달라짐에 따라 발생하는 시프트로, 새로운 사용자 집단이 생기거나 다른 유형의 디바이스에 애플리케이션이 제공되는 경우가 있다.
시간적 시프트는 시간이 지남에 따라 발생하는 시프트이다. 계절성에 의한 변화는 감지하기 어렵다. 누적 통계인지 슬라이딩 통계인지 구분해야 한다.
(리프트 엔지니어링의 훌륭한 사례 연구: 시계열 분해에 관심이 있다면 참고)
많은 회사에서 훈련 데이터 분포를 기본 분포로 사용하며 특정 세분화 수준(시간별, 일별)로 프로덕션 데이터 분포를 모니터링한다.
8.2.4 데이터 분포 시프트 해결
모델이 프로덕션 환경의 새로운 분포에서 잘 작동하도록 하는 세 가지 주요 접근법이 있다.
첫 번째는 대규모 데이터셋으로 모델을 훈련하는 방법이다.
두 번째는 새로운 레이블을 요구하지 않으면서 훈련된 모델을 대상 분포에 적응시키는 방법이다.
세 번째는 대상 분포에서 레이블이 지정된 데이터를 가져와 모델을 재훈련하는 방법이다. 이전 데이터와 신규 데이터를 모두 합쳐 모델을 처음부터 다시 훈련하거나 신규 데이터로 기존 모델 훈련을 이어나가는 일을 의미한다.
데이터 분포 시프트를 꼭 시프트가 발생하고 나서 해결하라는 법은 없다.(피처 시프트를 줄이기 위해 범주형으로 전환한다든지)
시스템이 시프트에 더 쉽게 적응하도록 설계할 수 있다.(가격 예측 모델을 학습시킬때, 가격이 빠르게 변하는 대도시 용 모델과 소도시용 모델을 분리)
오늘날 많은 ML 장애는 사람의 실수로 발생한다. 항상 ML 솔루션이 필요한 것은 아니다.
8.3 모니터링과 관찰 가능성
모니터링과 관찰 가능성은 때때로 같은 의미로 쓰이지만 엄연히 다르다.
모니터링은 문제가 발생했을 때 판단에 도움이 될 수 있는 다양한 지표를 추적, 측정, 기록하는 작업을 말한다.
관찰 가능성은 시스템에 대한 가시성을 제공하는 방식으로 시스템을 설정하는 것을 의미하며, 이때 가시성은 무엇이 잘못됐는지 조사하는 데 도움이 된다.
모니터링에서 가장 중요한 것은 지표이다. 가장 중요한 것은 운영 지표이고, ML 모델의 상태를 알려주는 ML 관련 지표도 중요하다.
8.3.1 머신러닝 관련 지표
ML 관련 지표 중에는 모니터링해야 하는 네 가지 아티팩트로 모델 정확도 관련 지표, 예측값, 피처, 원시 입력값이 있다.
정확도 관련 지표 모니터링
일부 피드백으로 자연 레이블을 추론하고, 이것으로 모델의 정확도 관련 지표를 계산할 수 있다. 정확도 관련 지표는 모델 성능 저하 여부를 확인하는 데 가장 직접적으로 도움이 되는 지표이다.
예측값 모니터링
분포 시프트 감지를 위해 예측값을 모니터링하기도 한다.
예측값으로 ‘아니요’가 비정상적으로 계속 나오는 등 이상한 일을 모니터링하기도 한다.
피처 모니터링
피처 모니터링의 첫 단계는 피처 검증이다. 피처가 기대하는 스키마를 잘 따르는지 확인한다.
다음은 특정 피처에 대해 확인해볼 수 있는 몇 가지 사항이다.
- 피처의 최솟값, 최댓값 혹은 중앙값이 허용 가능한 범위 내에 있는가?
- 피처 값이 정규 표현식 형식을 만족하는가?
- 모든 피처 값이 미리 정의된 집합에 속하는가?
- 두 피처 값 간에 상정한 대소 관계를 만족하는가?
피처 검증에 가장 많이 사용되는 라이브러리는 Great Expectations와 Deequ이다.
피처 모니터링 수행 시 네 가지 주요 문제는 다음과 같다.
- 회사에서 운영하는 프로덕션 환경 모델이 수백 개일 수 있으며 각 모델은 보통 피처를 수백 개 사용한다.
- 추적 기능은 디버깅에는 유용하지만 모델 성능 저하를 감지하는 데는 그다지 유용하지 않다.
- 피처 추출은 종종 다양한 서비스에서 다양한 라이브러리를 사용해 다양한 단계에서 이뤄진다.
- 피처가 따르는 스키마가 시간에 따라 바뀔 수 있다.
원시 입력 모니터링
처리 단계에서 문제가 발생하기도 한다. 그렇다면 원시 입력이 처리되기 전에 모니터링하면 어떨까?
원시 입력 모니터링은 데이터 플랫폼 팀이 주로 담당하기 때문에 책에서 다루지 않는다.
8.3.2 모니터링 도구
모니터링 시스템 사용자 관점으로 도구 집합을 살펴본다. 도구 집합에는 로그, 대시보드, 경고가 있다.
로그
로그 양은 매우 빠르게, 매우 커질 수 있다. 또한 사건 발생을 감지하는 일보다 문제가 어느 지점인지 찾아내는 일이 더 어렵다. 그러므로 이벤트를 로깅할 때는 가능한 한 나중에 찾기 쉽도록 해야 한다.
로그가 너무 커지고 관리하기 어려워지면서 기업에서 로그를 관리하고 분석하는 데 유용한 도구가 다양하게 개발되었다.
로그가 너무 커지면서 ML을 사용해 로그를 분석하는 일도 흔해졌다.
많은 기업에서 로그를 배치 처리한다.
이상 현상이 발생하는 즉시 발견하려면 이벤트가 로깅되는 동시에 처리될 수 있어야 한다. 이러면 로그 처리는 스트림 처리 문제가 된다.
대시보드
숫자를 보면 의미를 파악하기 힘들지만 그래프로 시각화하면 숫자 사이 관계를 알게 되는 경우가 있다. 지표를 시각화하는 대시보드는 모니터링에 필수적이다.
그래프는 지표를 이해하는 데 유용하지만 그래프 외에 경험과 통계적 지식 또한 필요하다.
특정 작업에 필요한 상위 수준 정보를 보여주기 위해서는 올바른 지표를 선택하거나 하위 수준 지표를 추상화하는 작업이 중요하다.
경고
경고는 다음 세 가지 구성 요소로 이뤄진다.
경고 정책: 경고가 발생할 조건을 지정한다.
알림 채널: 조건이 충족되면 알림을 받을 사람을 지정한다.
경고 설명: 경고를 받은 사람이 무슨 일이 일어나고 있는지 이해하는 데 도움을 준다.
중요한 경고만 될 수 있도록 조건을 의미 있게 설정하는 것이 중요하다.
8.3.3 관찰 가능성
시스템 외부 출력을 모니터링해서 시스템 내부에 문제가 ‘언제’ 발생했는지 파악할 뿐이며, 외부 출력이 문제가 ‘무엇’인지 파악하는 데 도움이 된다는 보장이 없다.
관찰 가능성은 이 문제를 해결하는 데 사용하는 용어이다. ‘런타임에 시스템에서 수집한 출력을 사용해 소프트웨어의 복잡한 동작을 이해하는 데 더 나은 가시성을 제공’함을 의미한다. 즉, 시스템 런타임에 대한 충분한 정보를 수집하고 분석하는 방식으로 시스템을 계측하는 것이다.
시스템 출력을 태그와 기타 식별 키워드를 사용해 로깅하면 나중에 출력을 데이터의 서로 다른 차원에 따라 슬라이싱하거나 격자로 추출해낼 수 있다.
ML에서 관찰 가능성은 해석 가능성을 포함한다.
8.4 정리
장애를 소프트웨어 시스템 장애와 ML 관련 장애라는 두 가지 유형으로 구분했다.
ML 관련 장애의 세 가지 주요 원인, 즉 훈련 데이터와 상이한 프로덕션 환경 데이터, 에지 케이스, 퇴행성 피드백 루프를 알아보았다.
데이터 분포 시프트를 다루며 공변량 시프트, 레이블 시프트, 개념 드리프트라는 세 가지 시프트 유형을 살펴보았다.
변화를 감지하려면 배포된 시스템을 모니터링해야 하고, 모니터링에서 가장 중요한 것은 지표이다.
모니터링이 어려운 이유는 지표 연산 비용이 저렴하더라도 지표를 이해하기는 간단하지 않기 때문이다.