Post

학생 손글씨 풀이에서 오개념 찾기 ① — 읽고 나서 진단하기, 그리고 잘 읽는 리더가 진단을 망친 이유

학생 손글씨 풀이에서 오개념 찾기 ① — 읽고 나서 진단하기, 그리고 잘 읽는 리더가 진단을 망친 이유

Kaggle의 Misconception Detection in K-12 Student Workings(주최 CoLearn) 대회에 참가했습니다. 대회 첫 이틀의 결과는 public LB 1위(0.647)입니다. 아직 대회 초반이라 이 순위는 금방 바뀔 수 있습니다. 대회 자체(데이터·라벨·평가·규칙)는 ⓪편 대회 개요에 정리했습니다. 이 글은 문제를 어떻게 쪼갰는지, 그리고 그 과정에서 가장 의외였던 관찰을 정리합니다.

대회 진행 중이라 코드는 싣지 않습니다. 대회 데이터는 아동의 학습지 사진이라 이미지·예시 풀이도 싣지 않습니다. 수치는 모두 직접 잰 값이고, 추정은 추정이라고 적었습니다.

1. 문제

인도네시아 4~12학년 학생이 휴대폰으로 찍은 손글씨 수학 풀이 사진 한 장과 문제·정답이 주어집니다. 이 풀이의 근원 오개념(root misconception)을 교사들이 만든 75개 코드 중에서 고르거나, 큰 오류가 없으면 NONE이라고 답해야 합니다. “근원”은 처음 틀린 곳이 아니라 나머지 풀이가 그 오류를 따라간 출발점입니다.

  • 학습 1,500장, 테스트 3,498장, 라벨 없는 풀이 50,000장
  • 지표는 MAP@3: 1순위가 맞으면 1점, 2순위 0.5점, 3순위 0.33점
  • 학습 데이터에만 사람이 만든 줄 단위 전사가 있습니다. 테스트는 사진뿐이라 손글씨를 읽는 것부터 과제입니다
  • 호스트 규정상 최종 추론에 외부 API를 쓸 수 없습니다. 오픈 웨이트 모델로 오프라인에서 재현 가능해야 합니다

2. 데이터에서 먼저 본 것

라벨을 훑다가 가장 먼저 눈에 띈 건 “학생의 최종 답이 맞았는가” 하나가 NONE을 거의 결정한다는 점이었습니다.

최종 답행 수그중 NONE
정답517487 (94%)
오답98319 (2%)

또 테스트 문항의 96%가 학습에도 있습니다. 같은 문제를 다른 학생이 푼 것입니다. 그래서 첫 제출은 이미지를 아예 보지 않고 “이 문항에서 자주 나온 오개념”을 순서대로 내는 사전분포였습니다. 이것만으로 LB 0.511이 나왔습니다.

3. 읽기와 진단을 나눴다

이미지를 바로 코드로 바꾸는 대신 두 단계로 나눴습니다.

  1. 리더(VLM): 사진 → 줄 단위 전사(L1 | …)
  2. 진단기(LLM): 문제 + 정답 + 전사 → 76개 후보(75개 코드 + NONE) 각각의 로그확률

진단기는 Qwen3-8B를 4bit QLoRA로 학습했습니다. 프롬프트에는 75개 코드의 이름과 설명을 전부 넣었습니다(약 3.3k 토큰). 답을 생성하게 하지 않고, 후보 코드 문자열 76개의 시퀀스 확률을 직접 계산해서 순위를 매깁니다. 학습 예시가 1건뿐인 코드가 13개라서, 분류 헤드보다는 코드 설명을 읽고 고르는 쪽이 나을 거라고 판단했습니다(추정).

먼저 사람이 만든 전사를 넣었을 때의 상한을 쟀습니다.

진단기 입력fold 0fold 1
사람 전사0.6340.597
사람 전사 + 문항 사전분포0.6630.606

손글씨를 완벽하게 읽어도 0.6대입니다. 호스트가 블로그에 공개한 실험(전사 텍스트를 입력으로 준 평가에서 파인튜닝 모델 top-1 63~66%)과도 맞습니다. 진단 자체가 어려운 문제입니다.

4. 의외였던 것: 더 잘 읽는 리더가 진단을 망쳤다

리더 후보는 두 개였습니다.

  • A: Qwen3-VL-32B를 그대로(zero-shot) 사용
  • B: Qwen3-VL-8B를 사람 전사 1,500건으로 LoRA 파인튜닝. 학습에 안 쓴 절반으로 2-fold OOF

글자 오류율(CER)로 보면 B가 확실히 낫습니다. 그런데 같은 진단기에 넣어 보면 순서가 뒤집힙니다.

fold 0CER (중앙값)진단 MAP@3
사람 전사00.634
A: zero-shot 32B0.370.613
B: 파인튜닝 8B0.3250.582

제 해석은 이렇습니다(검증 전이라 추정입니다). 파인튜닝한 리더는 “학생들이 보통 쓰는 풀이”를 학습했기 때문에, 애매한 글자를 그럴듯한 쪽, 즉 맞는 쪽으로 읽는 경향이 생깁니다. 일반 OCR에서는 그게 장점이지만, 이 과제의 단서는 바로 학생이 틀리게 쓴 그 숫자 하나입니다. 평균 글자 정확도가 올라가도 진단에 중요한 몇 글자를 고쳐 읽어 버리면 진단은 나빠집니다.

교훈은 단순합니다. 중간 단계 지표(CER)로 리더를 고르면 안 되고, 최종 과제 점수로 골라야 합니다.

5. 두 리더는 서로를 보완한다

다행히 두 리더가 틀리는 지점이 다릅니다. 각 전사로 낸 진단기 점수를 평균하고 문항 사전분포를 더하면:

fold 0 구성MAP@3
A 전사0.613
B 전사0.582
A, B 평균0.615
A, B 평균 + 사전분포(w=1)0.643

첫 VLM 기반 제출(B 전사, 진단기 2개 fold, 사전분포)은 LB 0.647로 1위가 됐습니다. OOF 추정(~0.635)과 LB가 가깝게 나와서, 지금의 검증 방식을 어느 정도 믿어도 될 것 같습니다.

6. 다음 단계

  • 진단기를 Qwen3-14B로 키우고, 학습 때부터 사람 전사 + 두 리더의 전사를 섞어 노이즈 섞인 입력에 익숙하게 만들기 (진행 중)
  • 최신 Qwen3.8-27B를 세 번째 리더로 추가
  • 라벨 없는 50,000장 활용: 의사라벨, 리더 추가 학습
  • 리더 평가 기준을 CER에서 “진단 점수”로 바꾸고, 학생 오류를 보존하도록 리더 학습 목표를 조정

대회 마감은 11월 17일입니다. 의미 있는 진전이 생기면 이어서 쓰겠습니다.

이어지는 글: ②편 — 같은 문항 예시, 모범 풀이, 추론형 리랭커로 0.75까지

This post is licensed under CC BY 4.0 by the author.