LabHub
배우기 러닝패스 코스

The AI Diet Gone Wrong

Is This Difference Reproducible? Measuring Accuracy Loss

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## 무엇을 견주었나 ## 같은 표본에서 본 차이 ## 이 차이가 재현되는가 ## 판정과 한계 네 절로 쓰세요. 표본 수·갈린 건수·판정이 숫자와 낱말로 본문에 들어가야 합니다.

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