틀리는 두 가지 방식
ML 모델 평가가 직업이라면 정밀도와 재현율의 차이는 익숙할 것입니다. 그렇지 않다면 쉽지 않습니다.
예시로 이해하는 편이 좋습니다.
RAG 파이프라인을 만들고 벡터 저장소에서 매우 신뢰할 수 있는 검색을 구현한다고 합시다. 먼저 정해야 할 것 중 하나는 몇 개의 청크를 가져올지, 즉 top_k입니다.
청크 3개를 가져오면 모두 관련성이 높을 가능성이 큽니다. 하지만 4위나 10위의 관련 청크를 놓칠 수 있습니다. 필요한 자료가 빠지는 셈입니다.
top_k를 50으로 올려 해결할 수도 있습니다. 관련 자료를 모두 찾겠지만 무관한 내용도 많이 가져옵니다. 벡터 저장소에서 필요한 청크를 모두 검색했어도 LLM이 무관한 내용이 섞인 “시끄러운” 정보를 반환할 가능성이 높아집니다.
이 상충 관계를 정밀도와 재현율이라고 부릅니다.
상위 3개 검색은 가져온 내용의 관련성이 높으므로 정밀도가 높습니다. 핵심에 맞습니다. 하지만 놓친 내용이 있으므로 재현율은 낮습니다.
반면 상위 50개 검색은 모두 찾으므로 재현율이 높지만, 불필요한 것도 많이 가져와 정밀도는 낮습니다.
정밀도와 재현율은 탐지 작업을 하는 모든 시스템에 등장합니다. 무엇인가 탐지하는 시스템은 X를 탐지했는지 참 또는 거짓으로 판단합니다. 그 과정에서 맞을 수도 틀릴 수도 있습니다.
뒤에서 혼동 행렬을 설명할 때 더 살펴보겠습니다.
네, 헷갈립니다. 그래서 왜 정밀도와 재현율을 굳이 구분하는지 먼저 이해하는 편이 낫습니다. 짧게 답하면 정확도만 측정하면 오해하기 쉽기 때문입니다.
정확도만으로는 왜 오해하기 쉬울까요?
탐지기가 사례 100개를 봅니다. 그중 10개에 찾아야 할 이벤트가 있습니다. 그런데 100개 모두에 “이벤트 없음”을 반환합니다. 이벤트가 없는 경우를 90% 맞혔으므로 이 테스트에서 90%를 받습니다.
하지만 존재해서 반드시 잡아야 했던 이벤트에 대해서는 0%입니다.
건물 입구의 경비원을 생각해 보세요. 방문자 100명 중 1명만 위험하다면 모두 통과시키는 경비원은 올바른 사람을 들이는 기준으로 “99% 정답”입니다. 하지만 잘못된 사람을 막는 성과로 측정하면 0%입니다. 그 경비원의 일은 위험한 한 명을 잡는 것이기 때문입니다.
데이터셋이 한 결과에 크게 치우치면 모든 판단에서 무작위로 추측하는 모델도 우연히 높은 점수를 받아 문서상으로 정확해 보일 수 있습니다. 하지만 실제로 예측해야 할 것을 예측하는 데 실패합니다.
이벤트부터 정하기
저는 시스템의 탐지 작업을 정의하기 전에는 정밀도와 재현율을 분석하지 않는 편이 도움이 되었습니다. 두 지표는 수행할 작업에 따라 달라집니다.
참 양성에 해당하는 경우부터 시작합니다.
스팸 필터라면 “이 이메일은 스팸이다”가 참 양성 이벤트입니다. 연기 감지기라면 “연기가 있다”입니다.
이것이 표시해야 할 이벤트입니다. 여기까지는 괜찮습니다.
시스템에 작업이 두 개라면 어떨까요? 자동 발화 종료 감지도 하는 AI 음성 인식 모델이라면 표시할 이벤트가 “사용자가 말하기 시작했다”와 “사용자가 말을 멈췄다”일 수 있습니다. 말을 멈춘 것과 발화 차례를 끝낸 것은 다릅니다. 각 이벤트마다 별도의 정밀도와 재현율 점수가 필요합니다.
양성은 시스템이 이벤트가 발생했다고 판단했다는 뜻입니다. 탐지 작업의 한쪽을 가리키는 라벨이지 가치 판단이 아닙니다.
| 실제로 발화가 있었음 | 실제로 발화가 없었음 | |
|---|---|---|
| 시스템이 발화를 감지함 | 참 양성 (TP) | 거짓 양성 (FP) |
| 시스템이 발화를 감지하지 않음 | 거짓 음성 (FN) | 참 음성 (TN) |
이 표를 혼동 행렬이라고 부릅니다. 특정 이벤트에 대해 실제로 일어난 일과 시스템의 판단을 비교해 가능한 모든 탐지 결과를 보여줍니다.
지표를 고르기 전에 네 가지를 물어보세요.
- 시스템은 어떤 이벤트를 탐지해야 하나요?
- 무엇을 시스템의 감지로 간주하나요?
- 거짓 양성은 어떤 모습인가요?
- 거짓 음성은 어떤 모습인가요?
분모부터 시작하기
정밀도와 재현율의 차이는 분모부터 보면 이해하기 쉬웠습니다.
정밀도
정밀도의 분모는 모델이 양성이라고 예측한 전체입니다. 맞은 예측과 틀린 예측을 합친 값, 즉 참 양성 + 거짓 양성입니다.
분자는 예측 중 맞은 것, 참 양성의 수입니다.
따라서 공식은 다음과 같습니다. 코드 형식의 수식과 낭독용 문자열은 원문을 유지합니다.
precision = true positives / (true positives + false positives)
“발화 시작” 이벤트를 생각해 보세요. 오디오 샘플 100개가 있습니다. 필터는 80개에서 발화가 시작되었다고 판단했지만, 그중 실제로 발화 시작이 있던 것은 60개입니다.
참 양성은 60입니다. 거짓 양성은 80 - 60 = 20입니다. 따라서 다음과 같습니다.
precision = 60 / (60 + 20) = 75%
정밀도가 낮으면 다른 소리나 침묵을 발화로 잘못 판단합니다.
정밀도는 모델이 맞힌 것과, 맞힌 것에 잘못 판단한 것을 더한 값의 비율입니다.
재현율
재현율의 분모는 실제로 존재하는 양성의 전체 수, 잡은 것과 놓친 것의 합입니다. 참 양성 + 거짓 음성이므로 모델이 찾았는지와 관계없이 실제 이벤트가 모두 들어갑니다.
분자는 정밀도와 같은 참 양성입니다.
recall = true positives / (true positives + false negatives)
재현율은 모델이 맞힌 것과, 맞힌 것에 잡았어야 하지만 놓친 것을 더한 값의 비율입니다.
같은 발화 탐지 예시에서 참 양성은 60입니다. 모델이 실제 이벤트를 모두 잡고 그보다 더 많이 감지했으므로 거짓 음성은 0입니다.
따라서 다음과 같습니다.
recall = 60 / (60 + 0) = 100%
이 예시는 재현율의 가치를 잘 보여주지 못하므로 바꿔보겠습니다. 오디오 샘플 100개가 있고 모델이 50개에서 발화 시작을 감지했습니다. 실제 발화 시작이 있는 샘플은 60개라고 합시다.
참 양성은 50, 거짓 음성은 60 - 50 = 10입니다. 모델이 발화 시작 10개를 놓친 것입니다.
그러면 다음과 같습니다.
recall = 50 / (50 + 10) = 83%
precision = 50 / (50 + 0) = 100%
바뀐 예시에서는 거짓 양성이 0이므로 정밀도가 100%입니다.
단순한 정확도 측정과 어떻게 다른지도 보세요.
accuracy = (true positives + true negatives) / all samples
각 판단의 비용이 비슷하고 평가 데이터가 프로덕션을 대표할 때 정확도를 사용하세요. 하지만 목표 이벤트가 드물거나 두 종류의 오류 비용이 다르다면 혼동 행렬을 기준으로 보고하는 것이 성능을 이해하는 데 큰 차이를 만듭니다.
수학 공식과 파생 지표를 더 살펴보고 싶다면 위키백과 전체 항목을 참고하세요.
정밀도와 재현율의 상충 관계
위 예시에서 실제 상충 관계를 볼 수 있습니다. 하나를 높이면 다른 하나가 낮아지는 경향이 있습니다.
처음의 검색 예시가 이유를 보여줍니다. 문서를 더 가져오면 재현율은 오르지만 정밀도는 떨어집니다. 적게 가져오면 정밀도는 오르지만 재현율은 떨어집니다.
실제로 대부분의 모델은 탐지에 대해 0과 1 사이의 신뢰도 점수를 냅니다. 모델이 얼마나 확신하는지 나타내는 값입니다. 임계값은 “0.7보다 높은 것은 양성으로 표시”처럼 직접 고르는 기준선입니다.
보청기의 음량 조절과 비슷합니다. 감도를 높이면 모든 대화를 듣지만 에어컨, 교통 소리, 옆집 TV도 들립니다. 낮추면 크고 또렷한 말만 듣지만 조용한 목소리를 놓칩니다.
임계값을 높이면 거짓 양성이 줄고 정밀도가 올라갑니다.
임계값을 낮추면 실제 사례를 더 많이 잡아 거짓 음성이 줄고 재현율이 올라갑니다.
Cartesia의 Ink-2처럼 파레토 프런티어에 있는 모델은 이 상충 관계의 균형을 최적으로 맞춥니다.
음성 AI에 적용하기
음성 AI에는 여러 탐지와 예측 작업이 있습니다. 하나의 정확도 수치로 모두 평가하지 마세요.
음성 활동 감지, VAD는 오디오 구간에 발화가 있는지 판단합니다. 테스트 데이터에 발화 프레임보다 침묵 프레임이 훨씬 많을 수 있습니다. 매번 침묵이라고 예측하면 모든 발화를 놓쳐도 정확해 보입니다. 발화 정밀도와 재현율을 측정하세요. 발화를 얼마나 자주 올바르게 감지하고 얼마나 자주 놓치는지 보고하세요.
발화 차례 감지는 화자가 대화 차례를 잡거나 넘기는 시점을 판단합니다. 시작과 끝 이벤트는 별도 지표가 필요합니다. 아래에서는 Ink-2 ASR 발화 이벤트 두 가지를 사용합니다.
turn_start: 사용자가 말하기 시작했나요?
목표 이벤트는 “사용자가 말하기 시작했다”입니다. 시스템은 turn_start 이벤트를 내보낼 때 감지한 것으로 간주합니다.
- 거짓 양성: 키보드 소음, 배경 대화, 마이크로 새어 들어온 소리, 에이전트 자체 오디오에
turn_start를 내보냅니다. - 거짓 음성: 사용자가 말하기 시작했는데 시스템이 놓칩니다.
turn_start 정밀도가 낮으면 사용자 이외의 오디오에 반응합니다. turn_start가 재생을 멈춘다면 거짓 양성은 잘못된 끼어들기를 만듭니다.
turn_start 재현율이 낮으면 실제 발화가 나머지 파이프라인에 전달되지 않을 수 있습니다.
turn_end: 화자가 말을 끝냈나요?
목표 이벤트는 “사용자가 자신의 발화 차례를 끝냈다”입니다. 시스템이 turn_end를 내보내면 감지한 것으로 간주하고 애플리케이션이 응답할 수 있습니다.
- 거짓 양성: 사용자가 계속 말하려는데
turn_end를 내보냅니다. - 거짓 음성: 사용자가 끝냈지만 시스템이 계속 기다립니다.
turn_end 정밀도가 낮으면 생각하거나 문장을 고치거나 숨을 쉬는 잠깐의 멈춤 뒤에 사용자의 말을 끊을 수 있습니다. 재현율이 낮으면 사용자가 말을 끝낸 뒤 불필요한 침묵이 생깁니다.
두 이벤트 모두 예측 타임스탬프와 라벨의 타임스탬프가 어느 정도 일치해야 정답인지 정의하세요. 점수를 계산하기 전에 대상 화자, 겹치는 발화와 배경 오디오의 라벨링 방법, “끝났다”의 의미를 정하세요.
실패를 기준으로 지표 고르기
turn_start와turn_end의 정밀도와 재현율을 따로 보고하세요.- 제품에서 어떤 오류가 더 비싼지에 따라 임계값을 고르세요.
- 전체 점수뿐 아니라 거짓 양성과 거짓 음성 예시를 살펴보세요.
- 정확도는 참고 정보로 쓰고 평가 전체로 삼지 마세요.
다음에 모델이 정확도 90%를 보고하면 무엇을 탐지했는지, 그 이벤트가 얼마나 자주 발생했는지, 점수 뒤에 어떤 오류가 숨었는지 물어보세요.
