모델 드리프트
Model Drift
개념
만들 때는 잘 맞히던 모델이 바깥 상황이 바뀌면서 예측이 점점 빗나가는 현상입니다.
등장 배경
모델을 한 번 만들어 점수를 재고 나면 그 점수가 그대로 간다고 여기던 시절이 있었습니다. 배포한 뒤로 코드를 건드린 사람이 없으니, 오늘 열 건 중 아홉 건을 맞히면 다음 달에도 아홉 건을 맞힐 것 같았습니다.
그러다 고객 문의가 먼저 들어옵니다. 페이지덱에서 스팸 계정을 자동으로 잠그는 기능이 반년 전에는 잘 돌았는데, 요즘은 멀쩡한 팀 계정이 자꾸 잠겨 환불 요청까지 붙습니다. 태오가 배포 이력을 뒤져도 그사이 바뀐 줄이 없습니다. 아무도 고치지 않았는데 결과만 나빠졌으니 되돌릴 대상조차 없습니다.
모델 드리프트는 이 난처한 자리에 붙인 이름입니다. 움직인 쪽은 모델이 아니라 모델 바깥입니다. 스팸을 보내는 쪽이 수법을 바꿨고, 그사이 페이지덱에 템플릿 공유 기능이 붙어 초대 메일을 하루에 수백 통 보내는 정상 팀이 생겼습니다. 모델은 반년 전의 세상을 기준으로 판단을 이어 가고 있었을 뿐입니다. 이름이 생기고 나서야 팀은 무뎌진 모델을 고장이 아니라 낡음으로 다루게 됐고, 매번 범인을 찾는 대신 주기적으로 다시 재게 됐습니다.
작동 방식
모델은 학습할 때 본 데이터에서 규칙을 뽑아 굳혀 두고, 새로 들어온 값을 그 규칙에 넣어 답을 냅니다. 들어오는 값이 규칙을 만들 때의 모습에서 멀어지면 답이 빗나가기 시작합니다.
학습 데이터는 모델을 가르치는 데 쓴 과거 기록이고, 피처는 그 기록에서 뽑아낸 개별 입력 값입니다. 스팸 판정이라면 계정 하나에 대해 가입 후 경과일, 하루 평균 초대 메일 수, 바깥 링크 비율 같은 숫자 묶음이 피처입니다. 모델이 보는 세상은 이 숫자 묶음이 전부입니다.
어긋나는 방식은 둘로 갈립니다.
- 들어오는 값 자체가 달라집니다. 학습할 때는 하루 초대 메일이 3통인 계정이 대부분이었는데, 템플릿 공유 기능이 붙은 뒤로 하루 200통을 보내는 정상 팀이 흔해졌습니다. 모델은 200통을 여전히 스팸 신호로 읽습니다.
- 값과 정답 사이의 관계가 달라집니다. 숫자 분포는 그대로인데 같은 숫자가 뜻하는 바가 바뀐 경우입니다. 예전에는 바깥 링크 비율이 높으면 스팸이었지만, 스팸 쪽이 링크를 본문 대신 첨부 파일에 숨기기 시작하면 링크 비율이 낮은 스팸이 늘어납니다.
앞쪽은 들어온 값만 봐도 알아챌 수 있고, 뒤쪽은 정답을 알아야 알아챌 수 있습니다. 잠근 계정이 실제로 스팸이었는지는 고객이 이의를 제기하거나 사람이 확인해 줘야 확정되므로 며칠에서 몇 주가 밀립니다. 그래서 뒤쪽은 늘 늦게 드러납니다.
떨어지는 속도도 한결같지 않습니다. 새 기능 출시처럼 하루 만에 꺾이기도 하고, 사용자 습관이 서서히 바뀌어 반년에 걸쳐 2~3퍼센트씩 내려가기도 합니다. 뒤쪽이 더 위험합니다. 어느 날도 이상해 보이지 않는데 1년 뒤에 보면 90퍼센트이던 정확도가 74퍼센트입니다.
쓰이는 곳
한 번 만들고 끝내는 모델이 아니라 매일 돌아가는 모델을 두고 쓰는 말입니다. 스팸 판정처럼 상대가 수법을 바꾸는 자리, 추천처럼 유행이 도는 자리, 수요 예측처럼 계절과 경기가 끼어드는 자리에서 특히 빨리 나타납니다.
그래서 운영 쪽에서는 성능을 한 번 재고 마는 대신 계속 지켜보는 장치를 겁니다. 학습과 배포와 감시를 사람 손 없이 굴러가게 묶어 둔 체계인 MLOps의 대표적인 항목이 드리프트 감시입니다. 보는 것은 보통 셋입니다.
- 들어오는 값의 분포입니다. 하루 평균 초대 메일 수의 중앙값이 3에서 12로 올라갔다면 정답을 기다리지 않고도 바로 신호를 잡습니다.
- 모델이 내놓는 답의 분포입니다. 스팸으로 잡히는 비율이 하루 0.8퍼센트였다가 4퍼센트가 되면 바깥에서 무슨 일이 생겼다는 뜻입니다.
- 실제 성적입니다. 정밀도와 재현율을 씁니다. 스팸이라고 잡은 것 중 진짜가 몇 퍼센트인지가 정밀도, 실제 스팸 중 몇 퍼센트를 잡았는지가 재현율입니다.
신호가 잡히면 최근 기록으로 학습 데이터를 다시 모아 새로 학습시킵니다. 언제부터의 기록을 쓸지가 실제 판단입니다. 최근 한 달만 쓰면 바뀐 세상은 잘 따라가지만 드물게 나타나는 옛 스팸 수법을 잊고, 2년치를 다 쓰면 반대가 됩니다. 페이지덱은 최근 6개월을 쓰되 지난 2년의 스팸 사례를 따로 남겨 섞는 방식으로 잡았습니다.
실무 용례
"정확도가 지난달부터 계속 내려가는데 코드는 그대로예요. 드리프트 같습니다."
모델을 고친 게 아니라 들어오는 데이터가 바뀌었을 가능성을 먼저 보자는 말입니다.
"이번 기능 출시하면 입력 분포가 확 바뀌어요. 재학습 일정 미리 잡아 두죠."
드리프트를 사고가 난 뒤에 수습하지 말고 출시 계획에 미리 끼워 넣자는 제안입니다.
"성능은 아직 안 떨어졌는데 입력 쪽 경보가 먼저 울렸어요."
예측이 틀리기 시작하기 전에 조짐만 잡힌 상태라는 뜻입니다.
페이지덱에서는 매주 월요일에 지현이 스팸 판정 대시보드를 봅니다. 지난주에 잠긴 계정 수, 그중 고객이 이의를 제기해 풀어 준 건수, 사람이 확인한 표본의 정밀도가 한 화면에 있습니다. 풀어 준 건수가 두 주 연속 늘면 태오에게 넘어가고, 태오는 코드 이력보다 먼저 입력 값의 분포를 지난 분기와 겹쳐 봅니다.
지난 분기에는 이 순서 덕분에 원인이 반나절 만에 나왔습니다. 템플릿 공유 기능을 쓰는 팀의 초대 메일 수가 다른 계정보다 스무 배쯤 높았고, 모델은 그 숫자만 보고 스팸으로 읽고 있었습니다. 모델을 갈아 끼우는 대신 그 기능을 쓰는 계정의 최근 기록을 채워 넣고 다시 학습시키는 것으로 끝났습니다.
흔한 오해
모델이 오래돼서 성능이 떨어졌다고 읽는 경우가 가장 많습니다. 사람이 쓰는 물건은 대개 시간이 지나면 닳으니 자연스러운 짐작입니다. 하지만 모델은 저장된 숫자 덩어리라서 그 자체로는 한 해가 지나도 똑같이 동작합니다. 바뀐 쪽은 들어오는 데이터입니다. 이 오해를 품고 있으면 더 좋은 모델로 갈아 끼우는 쪽으로 손이 가고, 새 모델도 옛날 학습 데이터로 배우니 두 달 뒤에 같은 자리로 돌아옵니다. 고칠 대상은 모델이 아니라 모델이 배운 기록입니다.
정확도가 유지되니 드리프트가 없다고 읽는 것도 흔합니다. 성능 숫자는 정답이 붙은 뒤에야 계산되는데, 그 정답은 며칠에서 몇 주 뒤에 옵니다. 들어오는 값은 3주 전에 변했는데 성능 그래프는 아직 평평한 구간이 생깁니다. 그 사이에 잘못 잠긴 계정은 이미 해지 화면을 보고 있습니다.
자주 헷갈리는 용어
| 용어 | 언제 생기는가 | 모델 드리프트와의 차이 |
|---|---|---|
| 과적합 | 학습하는 시점 | 만들 때부터 이미 못 맞히는 상태입니다. 학습 데이터에서 98점을 받고 실제 계정에서 71점을 받는 모델이 여기 해당합니다. 드리프트는 처음에는 실제 계정에서도 잘 맞히다가 나중에 내려갑니다 |
같이 보면 좋은 페이지
마지막 업데이트 2026-09-16