대회 · 2026

Global Quantum AI 회고

72팀 중 44위, 검증은 정확했고 목표가 틀렸다

· 저장소

검증 체계는 정확했다. 틀린 것은 그 체계를 겨눈 방향이었다.

1인 팀 softkleenex1217로 제3회 Global Quantum AI Competition 1st Challenge에 참가했다. 최종 결과는 72팀 중 44위, balanced accuracy 0.82였다. 2nd Challenge 진출선은 0.83이었으니 표시 점수로는 한 칸 차이였다.

제약이 문제를 다르게 만든다

8개 실수 feature를 가진 설문형 tabular 데이터의 두 잠재 class를 분류하는 양자 회로를 설계하는 과제였다. 평가는 비공개 6,000행에 대한 balanced accuracy다. 여기까지는 평범하지만, 규정이 문제를 완전히 다른 것으로 바꿔 놓았다.

  • qubit 2~8개, circuit depth 50 이하, entangling gate 1~80개
  • 측정은 단 하나의 qubit, shots는 1,024로 고정
  • participant-side preprocessing 전면 금지. PCA, 정규화, 표준화, 증강 모두 불가
  • rotation angle은 단일 feature affine 형태만 허용. theta_bias + theta_weight * x_i가 전부다

마지막 조항이 결정적이다. x_i * x_j도, x_i^2도, feature 간 합·차도 쓸 수 없다. 회로 밖에서 계산한 어떤 값도 각도에 넣을 수 없다. 즉 feature 사이의 상호작용을 만들 수 있는 통로가 entangling gate와 회로의 구조뿐이다. 고전 모델이라면 한 줄로 끝날 일을 회로 배치로 풀어야 한다.

최종 회로

제출한 것은 2-qubit data re-uploading 회로다. 같은 raw feature를 회로의 여러 위치에 반복 입력해서 깊이를 표현력으로 바꾸는 구조다.

q0   RY, RX                        (데이터 없이 학습 회전만)
     RZ(w·x) → RY → RX             × 15 블록
q1   RZ(w·x) → RY                  × 8 블록
--------------------------------------------------
     CZ(q0, q1) → RX(q0) → RY(q0) → measure q0

q0는 16개 블록이다. 첫 블록은 데이터 인코딩 없이 학습 회전만 적용하고, 이어지는 15개 블록이 feature를 순서 [0,3,4,1,7,5,6,5,7,6,0,4,3,1,2]로 재업로드한다. 8개 feature 중 7개가 두 번, x_2만 한 번 등장한다. q1은 같은 feature를 역순으로 인코딩해서 반대 방향으로 정보를 쌓는다. 두 branch를 CZ 하나로 얽고, 그 뒤에 RX와 RY readout을 붙여 측정 basis까지 학습시켰다.

depth 49, 2 qubits, CZ 1개, 학습 parameter 64개, threshold 0.47. private balanced accuracy는 0.820246이었다.

CZ를 하나만 쓴 것은 예산을 아낀 게 아니다. entangler를 늘린 모든 변형 — CX echo, 추가 CZ, star 구조, 4-qubit 병렬 — 이 교차검증에서 재현되지 않아서다.

depth 50을 49로 줄인 방법

규정 §8의 순위 tie-break는 ① 점수 ② depth 낮을수록 ③ 2-qubit gate 수 ④ 제출 시각 순이다. 같은 0.82라도 회로가 얕으면 위로 간다.

원래 회로는 depth 50이었다. 그런데 q0의 첫 번째 RZ가 초기 상태 |0>에 대해 global phase로만 작용한다. 측정 확률에 아무 영향이 없다. 재학습 없이 그 gate 하나를 지웠다.

  • 전체 train probability 최대 차이: 3.33e-16
  • QASM ↔ JAX 512-sample 최대 오차: 1.78e-15

점수를 그대로 보존하면서 tie-break 지표만 개선한 셈이다. 실제로 서버 Raw BA는 0.820246으로 소수점 여섯 자리까지 동일하게 유지됐다.

검증 체계는 잘 작동했다

이 대회에서 가장 잘한 것을 꼽으라면 검증 절차다. 점수가 0.005 단위로 갈리는 문제라 교차검증 노이즈에 속으면 끝이었다.

  • exact-feature grouping: 동일한 feature vector를 하나의 group으로 묶어 StratifiedGroupKFold를 적용했다. train에 중복 행이 있어 일반 KFold는 누수를 일으켰다.
  • paired 비교: 후보와 control이 같은 split seed, 같은 초기값, 같은 optimizer 예산을 쓴다. 절대값이 아니라 짝지어진 차이를 본다.
  • restart는 training loss로 선택했다. validation 점수로 restart를 고르면 그 자체가 선택 누수다.
  • 세 지표 동시 확인: cross-fit 정확도, 공통 threshold 정확도, 1,024-shot p05가 같은 방향으로 움직여야 통과.
  • 선택용 split과 확인용 split을 분리했다. 선택에 쓴 split은 확인에 쓰지 않는다.
  • 모든 후보에 대해 결과를 보기 전에 승격 기준을 문서에 고정했고, 미달한 후보를 seed나 예산 변형으로 되살리지 않았다.

효과는 숫자로 확인됐다. 로컬 OOF와 서버 private 점수의 차이는 매 제출 +0.0015 이내였고, 마지막 두 제출에서는 +0.0008 이내로 좁혀졌다.

제출 로컬 OOF private Raw 차이
07-15 0.812975 0.814394 +0.001419
07-16 0.819482 0.820246 +0.000764
07-22 0.819482 0.820246 +0.000764

07-16과 07-22가 같은 값인 것은 오기가 아니다. 07-22는 같은 회로를 depth 49로 줄여 다시 낸 제출이고, 앞서 확인했듯 점수가 6자리까지 보존됐다.

209개 후보를 탐색하면서도 과적합된 후보를 서버로 보내지 않았다. 이 부분은 이전 대회의 실패에서 배운 것을 제대로 적용했다.

그런데 목표가 틀렸다

문제는 다른 곳에 있었다. 이 워크스페이스는 목표를 0.90으로 유지했다.

최종 리더보드를 보고 나서야 알았다. 72팀 중 최고점이 0.84였다. 0.85 이상은 아무도 없었다.

점수 팀 수 순위
0.84 5 1–5
0.83 9 6–14
0.82 33 15–47
0.81 이하 25 48–72

0.90은 애초에 도달 가능한 범위 밖이었다. 그런데 이 목표가 단순히 "높은 꿈"으로 끝나지 않았다는 게 진짜 문제다. 승격 기준을 그 목표에서 역산했기 때문이다.

"현재 0.82, 목표 0.90 → 격차가 크다 → 미세 조정으로는 안 된다 → 새 아키텍처가 필요하다." 이 추론에 따라 8-qubit TTN, sequential MPS, star/fusion, 3-qubit residual 같은 대규모 구조 탐색을 반복했고 전부 실패했다. 동시에 후보의 "절대 승격선"도 같이 높아졌다.

그 기준에 걸려 중단한 후보 중에 이런 것들이 있었다.

  • v200 (q1 auxiliary output axis): paired delta +0.010009 / +0.000642 / +0.001453 — 세 지표 전부 양수
  • v206 (pairwise AUC objective): paired delta +0.012642 / +0.003121 / +0.001741 — 세 지표 전부 양수

둘 다 control보다 나았지만 "절대선 미달"로 중단했다. 실제로 필요했던 개선폭은 +0.005였다. Raw BA 0.820246에서 0.83 표시에 필요한 0.825까지의 거리다.

목표를 틀리게 잡으면 승격 기준도 함께 틀린다. 그리고 잘 만든 검증 체계일수록 틀린 기준을 더 엄격하게 집행한다.

0.82에 33팀이 몰렸다

또 하나 놓친 것이 있다. 72팀 중 33팀이 정확히 같은 0.82를 받았고, 나는 그중 30번째였다.

표시 점수가 소수 둘째 자리에서 끊기니 이렇게 된다. 그리고 동점자 사이의 순위는 depth와 gate 수가 가른다. 0.82 구간의 제출 시각이 순위와 무관하게 뒤섞여 있는 걸 보면, 같은 점수에서 우리보다 훨씬 얕은 회로를 낸 팀이 많았다고 보는 게 자연스럽다.

내 회로는 depth 49였다. 50에서 49로 줄인 판단은 방향이 옳았지만 폭이 부족했다. 탐색 예산의 대부분을 점수 향상에 쓰고 depth 축소는 "동점일 때의 보조 지표" 정도로 다뤘다.

점수가 클러스터에 묶이는 대회에서 depth는 보조 지표가 아니라 독립적인 순위 축이다. 0.82를 유지하면서 depth를 30까지 줄이는 연구는, 0.83을 노리는 연구만큼의 가치가 있었다.

그리고 마지막 11일을 쓰지 않았다

가장 단순하고 가장 아픈 실패다.

  • 마지막 제출: 07-22
  • 마지막 연구 기록: 07-27
  • 마감: 08-07

11일과 하루 3회씩 최대 33회의 제출 기회를 쓰지 않았다. 인계 문서에는 다음에 실행할 실험(v209)의 설계가 구체적으로 적혀 있었는데도 그렇다.

구조적 원인이 있다. 일정은 규정 문서 안에만 있었고, 매 세션의 진입점 문서에는 D-day가 없었다. 진입점에는 "현재 최고 점수"와 "반복하지 않을 탐색 목록"만 있었다. 그 목록은 세션마다 길어졌지만 "남은 시간에 무엇을 할지"는 매번 한 줄로 줄어들었다.

탐색 공간을 좁히는 데는 효과적이었다. 그런데 좁히기만 하는 문서는 언젠가 할 일이 없어진 것처럼 보인다.

다시 참가한다면

  1. 목표를 외부 근거로 잡는다. 이전 회차 상위 점수, 초반 리더보드 분포 같은 관측값에서 시작한다. 희망에서 역산한 목표는 승격 기준을 오염시킨다.
  2. tie-break 지표를 1급 목표로 둔다. 점수가 둘째 자리에서 끊기는 대회라면 depth 축소에 별도 예산을 배정한다.
  3. 진입점 문서 맨 위에 D-day와 남은 제출 횟수를 적는다. 규정 문서에만 있는 일정은 없는 것과 같다.
  4. "양수인데 기준 미달"인 후보를 따로 모아 둔다. 개별로는 부족해도 목표가 재조정되면 즉시 꺼낼 수 있는 후보 풀이 된다.
  5. 사전등록과 구제 금지 원칙은 그대로 유지한다. 이건 잘 작동했다.

남은 것

209개 후보의 사전등록 기준과 기각 사유, 178개 테스트, 규정 준수 검증 파이프라인, QASM↔JAX 확률 일치 검사가 남았다. 실패한 방향의 기록이 성공한 방향보다 훨씬 많고, 그게 이 아카이브의 실질적인 내용이다.

한 가지 더 남았다. 고전 HGB baseline이 평균 0.820540으로 제출 회로와 거의 같은 범위였다. 33팀이 0.82에 몰린 것과 합쳐서 보면, 이 문제 자체의 정보 상한이 0.82~0.84 부근이었을 가능성이 크다. 그렇다면 상위권과의 차이는 모델의 표현력이 아니라 그 좁은 구간을 짜내는 방식에 있었을 것이다.

검증을 정확하게 만드는 법은 지난 대회에서 배웠고 이번에 잘 썼다. 이번에 배운 것은 그다음이다. 정확한 자를 들고 있어도, 어디를 재야 하는지 틀리면 소용이 없다.