LabHub
学习 学习路径 课程

AI瘦身失败事件

这个差异能复现吗 — 如何测量准确率损失

在 LabHub 中继续学习

한국어 원문으로 표시합니다.

목표

같은 시험 표본에서 FP32 원본·이전 배포본·정수 후보 셋을 돌려 예측과 출력값을 남기고, 정확도 차이가 재현되는 차이인지 따지는 도구 acccmp.py 를 만든다. 구간·쌍 비교·뒤집힌 표본·출력 차이를 각각 재고, 기준선을 둘로 두어 판정을 내린다.

왜 중요한가

"정확도가 0.3% 떨어졌다" 는 그 자체로는 판단 근거가 아니다. 표본 400개에서 정확도 하나의 95% 구간은 폭이 8퍼센트포인트에 가깝다. 두 모델을 따로 재어 뺀 값으로는 이보다 작은 차이를 말할 수 없다. 말할 수 있게 하는 것은 같은 표본이다. 두 모델이 같은 입력을 보았다면, 둘 다 맞힌 표본과 둘 다 틀린 표본은 판정에 쓸 수 없고 한쪽만 맞힌 표본만 정보가 된다. 그 갈린 건수가 실제 분모다. 기준선도 하나가 아니다. FP32 원본은 양자화가 얼마나 깎았는지를 답하고, 이전 배포본은 지금 돌고 있는 것보다 나빠지는지를 답한다. 두 답이 다른 방향일 수 있으므로 둘 다 적는다. 그리고 출력 차이와 과제 지표는 다르다. 최대 절대 오차가 크게 나와도 정확도는 그대로일 수 있고 그 반대도 있다. 결정 경계에서 먼 표본은 출력이 흔들려도 답이 안 바뀌기 때문이다. 채점기는 여러분이 적은 숫자를 믿지 않는다. 매번 다른 씨앗과 표본 수로 자기 예측표를 차려 여러분의 도구를 실제로 실행하고 같은 계산을 다시 해 대조한다. 1단계는 여러분이 남긴 씨앗으로 시험 입력을 다시 만들어 여러분의 모델을 직접 돌려 본다.

단계

  1. /root/acc/gen_eval.py 를 만들어 실행해 모델 셋과 /root/acc/preds.json, /root/acc/eval_seed.json 을 만드세요.
  2. /root/acc/acccmp.pysummary 를 만들어 표본 수와 실행별 정확도를 내게 하세요.
  3. interval 을 더해 정확도 하나의 95% 구간을 Wilson 점수 구간으로 내게 하세요.
  4. paired 를 더해 같은 표본에서 2x2 로 갈린 건수와 쌍 비교 통계량을 내게 하세요.
  5. flips 를 더해 뒤집힌 예측만 방향별로 세게 하세요.
  6. outputs 를 더해 출력값 차이(최대 절대 오차·평균 절대 오차·코사인)를 내게 하세요.
  7. baseline 을 더해 기준선 둘을 각각 견주게 하고, 여러분 자료의 판정을 /root/acc/verdict.json 에 적으세요.
  8. /root/acc/accuracy_report.md 를 네 절로 쓰세요.

참고

세 판을 같은 표본에서 돌려 예측을 남기기

/root/acc/gen_eval.py 를 만들어 실행해 /root/acc 아래 fp32.onnx·prev.onnx·int8.onnx/root/acc/preds.json, /root/acc/eval_seed.json 을 만드세요. 시험 입력과 정답표는 참고 절의 씨앗 규칙을 그대로 따릅니다.

모델은 onnx.helper 로 MatMul + Add + Relu 를 이어 붙여 짓습니다. prev.onnxquantize_dynamic, int8.onnxquantize_staticCalibrationDataReader 를 넘겨 만듭니다. 정답표를 FP32 출력에서 만들되 잡음을 더하는 이유는, 정확도가 1.0 이면 어떤 차이도 보이지 않기 때문입니다. logits 는 float() 로 그대로 적고 반올림하지 마세요.

표본 수와 정확도를 한 자리에 모으기

/root/acc/acccmp.pysummary <preds.json> 을 만들어 표본 수와 실행별 정답 건수·정확도를 JSON 으로 내게 하세요.

합계부터 내지 말고 표본마다 맞았는지를 참·거짓 목록으로 남기세요. 뒤 단계의 쌍 비교와 뒤집힘 세기가 전부 이 목록 위에서 이루어집니다. 실행 이름은 정렬해 담습니다.

정확도 하나에 구간을 붙이기

interval <preds.json> <run> 을 더해 그 실행의 정확도에 95% Wilson 점수 구간을 붙여 내게 하세요. run·n·correct·accuracy·center·low·high·half_width 를 담습니다.

z 는 1.96 으로 고정합니다. Wilson 구간의 중심은 표본 비율 p 가 아니라 0.5 쪽으로 조금 당겨진 값입니다. 그래서 low 와 high 는 p 를 가운데 두지 않습니다. 정확도가 0이나 1이어도 폭이 0이 되지 않는 것이 이 구간을 쓰는 이유입니다.

같은 표본에서 쌍으로 견주기

paired <preds.json> <a> <b> 를 더해 2x2 표(both_correct·only_a·only_b·both_wrong)와 delta·discordant·statistic·significant 를 내게 하세요.

둘 다 맞힌 표본과 둘 다 틀린 표본은 두 모델을 가르지 못합니다. 판정의 분모는 n 이 아니라 갈린 건수입니다. 통계량은 참고 절의 식을 그대로 쓰고, 갈린 건수가 0이면 0.0 으로 둡니다.

뒤집힌 예측만 방향별로 세기

flips <preds.json> <a> <b> 를 더해 changed·to_wrong·to_right·changed_both_wrong·top_flip 을 내게 하세요.

changed 는 나머지 셋의 합입니다. 이 항등식이 안 맞으면 어딘가를 두 번 셌거나 빠뜨린 것입니다. 틀린 답이 다른 틀린 답으로 바뀐 건수는 정확도에 영향이 없지만 사용자 눈에는 답이 바뀐 것으로 보입니다.

출력 차이와 과제 지표를 갈라 재기

outputs <preds.json> <a> <b> 를 더해 max_abs_error·mean_abs_error·cos_min·cos_mean·argmax_changed 를 내게 하세요.

출력이 많이 움직였다고 결정이 바뀌는 것은 아닙니다. 결정 경계에서 먼 표본은 출력이 흔들려도 답이 그대로입니다. 두 값을 한 응답에 담아 나란히 보면 그 관계가 눈에 들어옵니다.

기준선을 둘로 두고 판정하기

baseline <preds.json> <run> 을 더해 나머지 실행을 각각 기준선으로 삼아 견주게 하고, 여러분 자료의 판정을 /root/acc/verdict.json 에 참고 절의 키로 적으세요.

원본과 이전 배포본의 답이 다른 방향일 수 있습니다. worst 는 delta 가 가장 작은 기준선이고 동률이면 이름이 앞선 쪽입니다. 판정 규칙은 참고 절에 고정돼 있으니 그대로 옮기고, reason 에는 왜 그렇게 되었는지 한 줄로 적으세요.

읽는 사람이 판단할 수 있게 적기

/root/acc/accuracy_report.md## 무엇을 견주었나 ## 같은 표본에서 본 차이 ## 이 차이가 재현되는가 ## 판정과 한계 네 절로 쓰세요. 표본 수·갈린 건수·판정이 숫자와 낱말로 본문에 들어가야 합니다.

숫자를 적을 때는 어디서 나온 숫자인지 함께 적으세요. 한계 절에는 이 판정이 말하지 않는 것을 적습니다 — 이 실습은 시간도 메모리도 재지 않았고, 시험 표본 하나에서만 본 것입니다.