SSAFY 16기 2회차 AI 챌린지: 한국어 이미지 객관식 질의응답
이미지 속 글자를 읽어서 네 개의 선택지 가운데 정답 하나를 고르는 한국어 VQA 모델
SSAFY 16기 2회차 AI 챌린지에 팀 Astralopithecus가 제출한 결과물 저장소입니다.
Public 0.97765를 기록했습니다.
팀 이름 Astralopithecus는 ChatGPT의 Astra와 Australopithecus(오스트랄로피테쿠스)를 합친 이름입니다.
| 이름 | GitHub | 역할 |
|---|---|---|
| 이준혁 | @bnbong | 팀장, 파이프라인 설계, Colab 27B 학습, 전체 통합 |
| 유수정 | @ysj120808 | 평가, 제출 파일 검사, 확률 결합 |
| 김창혁 | @rlckdur123 | 프롬프트 비교, OCR 실험, 오답 유형 분류 |
| 조수빈 | @217user217 | 데이터 감사, 고정 분할 확정, 오답 라벨 점검 |
| 이유림 | @steaksteak25-design | 공통 학습 코드, 9B 실험, OCR 엔진 비교 |
fold 0은 train을 이미지 기준으로 나눈 고정 검증셋 1,344문항에서 잰 정확도이고, Public은 Kaggle 공개 리더보드 점수입니다. 전체 후보와 판단 근거는 docs/submission_report.md에 정리되어 있습니다.
| 후보 | 설정 | fold 0 | Public |
|---|---|---|---|
| 3B zero-shot | Qwen2.5-VL-3B, 프롬프트 p2 | 0.9144 | 0.89871 |
| 27B zero-shot | Qwen3.5-27B, 프롬프트 v1 | 0.9539 | 0.95889 |
| 확대 LoRA p2 (A) | Qwen3.5-27B, 이미지 확대, p2, fold 1~4 (5,358) | 0.9688 | 0.96931 |
| 확대 전체 데이터 p2 (B) | Qwen3.5-27B, 이미지 확대, p2, 전체 (6,690) | 검증 불가 | 0.96901 |
| Gemma 4 zero-shot | Gemma-4-31B-it, 시각 토큰 1,120, p2 | 0.9695 | 0.96484 |
| Gemma 4 QLoRA | Gemma-4-31B-it, nf4 QLoRA, 시각 토큰 1,120, p2, fold 1~4 (5,358) | 0.9747 | 단독 미제출 |
| 세 모델 가중 결합 (QLoRA) | A 0.3 + B 0.3 + Gemma 4 QLoRA 0.4 | 검증 불가 | 0.97765 (최종 1순위) |
| 네 모델 가중 결합 | A 0.3 + B 0.3 + Gemma 4 QLoRA 0.2 + Gemma 4 전체 QLoRA 0.2 | 검증 불가 | 0.97765 (최종 2순위) |
- 모델과 학습: Qwen3.5-27B를 bf16으로 올리고 언어 경로에만 LoRA를 붙였습니다. 정답 글자 한 개에만 손실을 거는 answer-only 방식으로 학습했고, 비전 인코더는 학습하지 않았습니다.
- 프롬프트 p2: 이미지 속 글자를 먼저 읽으라고 지시하는 프롬프트
v2_read_text를 fold 0에서 비교해 골랐습니다. - 이미지 확대: processor의
min_pixels를 올려 작은 이미지를 확대해 넣었습니다. zero-shot 기준으로 fold 0 정확도가 0.9591에서 0.9635로 올랐습니다. - 확률 가중 결합: 모델마다 낸 선택지별 확률을 가중 평균했습니다. 과신이 심한 Gemma의 가중치 0.4는 fold 0 곡선을 보고 미리 고정한 값이며, Public 점수를 보고 고른 값이 아닙니다.
- Gemma nf4 QLoRA: Gemma-4-31B-it는 bf16으로는 A100 80GB 한 장에서 학습할 수 없어서, 가중치를 nf4로 양자화하고 LoRA adapter만 학습했습니다. 학습 peak VRAM은 약 32GB였습니다.
| 경로 | 내용 |
|---|---|
vqa/ |
학습과 추론, 평가, 제출을 담당하는 공통 파이썬 패키지입니다. |
configs/ |
모델과 정밀도, 해상도별 학습 설정 YAML 파일입니다. |
scripts/ |
분할 생성과 예측 비교, 확률 결합, 제출 검사를 수행하는 스크립트입니다. |
notebooks/ |
Colab과 실습실 PC에서 쓴 진입점 노트북입니다. |
results/ |
실행을 마친 노트북 사본과 날짜별 실험 기록입니다. |
docs/ |
제출 보고서와 참고 기록입니다. |
experiments/ |
최종 파이프라인에 들어가지 않은 팀원들의 실험 코드입니다. |
tests/ |
프롬프트와 라벨 마스킹, 평가와 제출 경로를 검증하는 pytest 모음입니다. |
artifacts/data/ |
고정 분할 파일과 id 목록, 라벨 점검 결과입니다. |
fold_csv_files/ |
팀이 확정한 fold 분할을 id 단위로 담은 CSV입니다. |
대회 원본 데이터(이미지와 CSV), 모델 checkpoint와 LoRA adapter 가중치, 제출 CSV는 라이선스와 용량 문제 때문에 이 저장소에 포함하지 않았습니다.
| 문서 | 내용 |
|---|---|
docs/submission_report.md |
대회 제출 보고서를 결과 기록 목적으로 축약한 문서입니다. |
results/README.md |
날짜별 실험의 설정과 측정값, 채택 여부를 정리한 기록입니다. |
