Qwen 4B 강화학습 실험에서 점수를 올린 것은 학습 시간이 아니라 과제 선별이었습니다, 작은 모델을 튜닝하는 팀이 먼저 만들 것은 네 번 풀려 가끔만 맞히는 문제 목록입니다 | DAKER 커뮤니티

작은 모델을 강화학습으로 키울 때 점수를 움직이는 것은 GPU 시간보다 어떤 과제를 고르느냐였습니다. 유튜브 채널 Prompt Engineering이 10월 17일 공개한 16분짜리 실험 영상 「I Trained Qwen 4B With RL to Catch Qwen 27B」는 Qwen3.5-4B를 GRPO로 학습시켜 394문항 시험 점수를 51.8%에서 58.4%로 올렸고, 같은 계열 27B 모델(64.0%)과의 격차를 절반 넘게 줄였습니다. 이 글은 영상과 함께 공개된 GitHub 저장소의 수치를 기준으로 무엇이 효과가 있었고 무엇이 효과가 없었는지 정리하고, 데이터 분석형 과제로 소형 모델을 튜닝하려는 참가자가 오늘 해 볼 일을 하나로 좁힙니다.

따뜻한 회색 벽 앞 나무 책상 위의 실사풍 생성 이미지. 가운데 놋쇠 양팔 저울의 왼쪽 접시에는 빈 흰 카드 묶음이, 오른쪽 접시에는 작은 금속 추가 놓여 있고, 앞에는 빨간 채점용 펜이, 오른쪽 뒤에는 작은 은색 미니 컴퓨터 두 대가 흐릿하게 보이며 오른쪽 위에 DAKER 공식 로고가 있습니다
설명용 생성 이미지입니다.

Qwen 4B 강화학습 실험이 확인하려던 질문

질문은 단순합니다. 공개된 강화학습 환경을 개인 장비에서 돌려 4B 모델을 약 여섯 배 큰 27B 모델 가까이 끌어올릴 수 있느냐입니다. 영상 진행자는 128GB 통합 메모리를 갖춘 NVIDIA DGX Spark 두 대를 썼고, 모델 전체를 다시 학습하는 대신 LoRA 어댑터만 학습했습니다. 학습 방법은 TRL 라이브러리의 GRPO 트레이너이고, 과제는 Hugging Face FineEnvs가 공개한 SmolDataEnvs입니다.

SmolDataEnvs 데이터셋 카드에 따르면 이 데이터셋은 Kaggle 데이터셋 471개에서 뽑은 데이터 분석 문제 5,394개로 구성되어 있습니다. 학습용 5,000개, 평가용 144개, 테스트용 250개로 나뉘고, 평가·테스트 쪽은 쉬운 문제 비율이 11~13%, 어려운 문제 비율이 38~40%로 학습용보다 일부러 어렵게 만들어져 있습니다. 실험의 394문항 시험은 이 평가용과 테스트용을 합친 것이고, 그중 87문항은 학습 때 한 번도 보지 않은 데이터셋에서 나온 문제입니다.

강화학습 환경은 정답지가 딸린 연습 시험과 같습니다. 모델이 과제를 풀고, 무언가가 그 답을 채점합니다.

영상은 환경을 세 가지 요소로 설명합니다. 모델이 아무것도 망가뜨릴 수 없는 샌드박스, 파일을 살펴보고 Python을 실행할 수 있는 터미널 도구, 그리고 최종 답을 정답지와 비교하는 채점기입니다. 맞으면 보상 1, 틀리면 보상 0이고, 모델이 받는 피드백은 이 보상이 전부입니다. 예를 들어 비디오 게임 판매량 표를 주고 총판매량이 가장 많은 퍼블리셔를 묻는 문제의 정답은 Nintendo입니다.

채점기가 허술하면 모델은 답을 부풀리는 법을 배웁니다

이 실험에서 가장 먼저 손본 것은 모델이 아니라 채점기였습니다. 저장소 README에 따르면 데이터셋에 딸린 기본 채점기는 답에서 처음 발견한 숫자만 읽기 때문에, 정답이 42일 때 모델이 42, yes라고 써도 통과합니다. 이런 채점기로 학습하면 모델은 정답 주변에 말을 덧붙여 통과 확률을 높이는 쪽으로 움직일 수 있고, 이것이 보상 해킹입니다.

모델은 여러분이 의도한 것이 아니라 채점기가 보상하는 것을 배웁니다.

그래서 진행자는 독립적인 엄격 채점기(checker_v2.py)를 새로 써서 보상으로 쓰고, 기존의 관대한 채점기는 가중치 0으로 함께 기록해 보상 해킹 경보로 활용했습니다. 영상과 README에 나온 모든 점수는 엄격 채점기 기준의 pass@1입니다. 결과적으로 관대한 채점기만 통과한 답은 정답에 근접한 숫자 수준에 머물렀고, 말을 덧붙여 부풀린 답은 없었다고 README는 적고 있습니다.

샌드박스 설계도 구체적입니다. DGX Spark에서는 Docker를 쓰고, 모델이 실행하는 명령마다 네트워크와 권한이 없고 루트 파일 시스템이 읽기 전용인 일회용 컨테이너를 띄우며, 해당 과제의 입력 파일만 마운트합니다. macOS에서는 sandbox-exec을 씁니다. 모델에게 터미널을 주는 학습이라면 채점기와 함께 이 격리 수준을 먼저 정해 두는 편이 안전합니다.

GRPO는 가끔 맞히는 과제에서만 배웁니다

GRPO는 과제마다 여러 번 답을 생성해 그룹 평균보다 나은 시도를 강화하고, 못한 시도를 억제합니다. 영상의 설정은 과제당 8번 시도이고, TRL 문서에서도 num_generations 기본값은 8입니다. 여기서 핵심은 8번이 모두 맞거나 모두 틀리면 평균보다 나은 시도가 없으므로 그 과제에서 배우는 것이 전혀 없다는 점입니다.

모델은 항상 맞히거나 항상 틀리는 과제가 아니라, 가끔 맞히는 과제에서만 배웁니다.

무작위로 고른 과제로 40스텝 학습했을 때 점수는 51.8%에서 54.1%로 올랐지만, 통계 검정 결과는 p = 0.29로 우연과 구분되지 않았습니다. README는 이때 GRPO 그룹의 55~70%가 전부 정답이거나 전부 오답이어서 기울기가 생기지 않았다고 설명합니다. 학습 시간 대부분이 아무것도 배우지 않는 데 쓰인 셈입니다. TRL은 이 비율을 frac_reward_zero_std라는 지표로 기록하므로, 직접 학습을 돌린다면 이 값부터 확인하는 것이 좋습니다.

과제 선별 하나로 점수가 우연을 넘어섰습니다

진행자는 학습 전에 후보 과제 999개를 모델에게 4번씩 풀게 하고, 4번 중 일부만 맞힌 240개만 남겼습니다. 모델 능력의 경계에 있는 과제만 고른 것입니다. 이 과제들로 120스텝, 19.1시간을 학습하자 시험 점수는 58.4%가 되었고, 대응표본 McNemar 검정 p = 0.001로 우연이라 보기 어려운 개선이 나왔습니다. 처음 보는 데이터셋 87문항에서도 52.9%에서 58.6%로 올랐습니다.

영상은 이 개선이 운인지 확인하는 방법도 보여 줍니다. 학습 전후 모델을 문항별로 비교해 새로 맞힌 문항과 새로 틀린 문항의 수를 세는 것입니다. 학습이 아무 효과가 없다면 두 묶음의 크기가 비슷해야 하는데, 이 실험에서는 새로 맞힌 쪽이 훨씬 컸습니다. 대회에서 리더보드 점수 몇 점 차이를 두고 판단할 때도 그대로 쓸 수 있는 점검법입니다.

모델394문항 시험처음 보는 데이터셋 87문항
Qwen3.5-4B 학습 전51.8%52.9%
무작위 과제 강화학습 40스텝54.1% (p = 0.29)공개 값 없음
선별한 경계 과제 강화학습 120스텝58.4% (p = 0.001)58.6%
그 뒤 강화학습 추가58.1%54.0%
27B 풀이 기록으로 증류58.1%57.5%
증류 후 강화학습58.6%62.1%
Qwen3.5-27B-FP8 (목표)64.0%64.4%

표의 수치는 모두 저장소 README에 공개된 값이며, 엄격 채점기 기준 pass@1과 greedy 디코딩 결과입니다.

강화학습이 가르친 것은 분석이 아니라 끝까지 답을 쓰는 습관이었습니다

점수 상승의 내용을 들여다보면 모델이 데이터 분석을 새로 배운 것은 아니었습니다. README에 따르면 답을 쓰지 못하고 끝난 에피소드가 99개에서 72개로 줄었고, 이름을 묻는 140문항에서 이름 대신 숫자를 적은 경우가 17개에서 6개로 줄었습니다. 바뀐 것은 작업을 끝내는 습관과 질문이 요구한 형식으로 답하는 습관입니다.

영상 속 사례가 이를 잘 보여 줍니다. 앞의 비디오 게임 문제에서 학습 전 모델은 분석을 제대로 해서 답변에 Nintendo까지 언급했지만, 정답 파일에는 판매량 숫자를 적어 0점을 받았습니다. 학습 후 모델은 상위 다섯 퍼블리셔를 다시 확인한 뒤 Nintendo를 적었습니다. 헤더 행이 없는 파일에서 플레이 시간이 가장 긴 게임을 묻는 문제에서는 학습 전 모델이 같은 명령을 그대로 반복하다 시도 횟수를 다 써 버렸고, 학습 후 모델은 열 구조를 파악해 Dota 2를 더 적은 단계로 찾아냈습니다.

잃은 것도 있습니다. 계산은 맞게 하고도 정답지가 백분율을 원하는 문제에 분수를 적어 틀린 사례가 영상에 나옵니다. 대회 제출 파일의 형식 오류로 점수를 잃어 본 참가자라면 익숙한 실패입니다. 모델의 능력보다 출력 형식이 점수를 좌우하는 구간이 생각보다 넓다는 뜻입니다.

점수가 58% 근처에서 멈춘 이유와 증류라는 우회로

같은 방식으로 새 과제를 선별해 강화학습을 더 돌렸지만 점수는 58.1%로 오르지 않았고, 처음 보는 데이터셋에서는 54.0%로 오히려 내려갔습니다. README는 천장이 기본 모델에 있다고 설명합니다. 학습 전 4B 모델은 학습 과제의 62.3%를 한 번에 풀었고, 4번 안에는 72.9%를 풀었습니다. 강화학습은 모델이 가끔 해내는 일을 더 자주 해내게 만드는 방법이라서, 이 차이를 다 쓰고 나면 더 갈 곳이 없다는 해석입니다.

강화학습은 모델이 이미 가끔은 해내는 것을 날카롭게 다듬습니다. 그 여지를 다 쓰면 점수는 움직이지 않습니다.

진행자가 다음으로 택한 방법은 증류입니다. 27B 모델에게 학습 과제를 풀게 하고, 정답을 맞힌 풀이 기록만 모아 4B 모델을 지도학습으로 미세조정했습니다. 점수 자체는 58.1%로 비슷했지만 모델이 일하는 방식이 27B와 닮아 갔다고 영상은 설명합니다. 데이터 스케일링 방식 두 가지 중 어느 쪽 오차가 낮은지 묻는 문제에서, 강화학습 모델은 머신러닝 모델을 하나씩 계속 바꿔 가며 시도했지만 증류 모델은 깔끔한 비교 한 번으로 답했습니다.

증류 모델이 강화학습 모델이 못 풀던 문제를 일부 풀기 시작하자, 그 위에 강화학습을 한 번 더 얹었습니다. 이 조합은 394문항 시험에서는 58.6%로 다른 방법과 비슷했지만, 처음 보는 데이터셋 87문항에서는 62.1%(학습 전 대비 p = 0.04)로 소형 모델 중 가장 좋았습니다. 미국 농무부 데이터에서 가장 흔한 사과 품종을 묻는 문제에서 학습 전 모델과 강화학습 모델은 사과가 아닌 오렌지 품종을 답했고, 최종 모델은 사과만 먼저 걸러 낸 뒤 27B와 같은 정답 Red Delicious를 적었습니다.

직접 돌려 보기 전에 알아 둘 조건과 한계

저장소는 Apache-2.0 라이선스로 하네스, 샌드박스, 엄격 채점기, 학습 스크립트, 시험 결과를 공개합니다. 재현에는 Docker가 되는 NVIDIA GPU 장비, Python 3.11 이상, 과제 파일용 약 20GB 디스크가 필요하고, 학습 이미지는 DGX Spark용 aarch64 빌드입니다. 사용한 버전은 TRL 1.14.0, PEFT 0.21.0, Transformers 5.15.0, vLLM 0.27.1로 고정되어 있습니다. 과제 입력 파일은 Kaggle 데이터셋마다 라이선스가 달라 저장소에 포함되지 않고 스크립트로 내려받는 구조입니다.

README의 DGX Spark 운영 메모도 참고할 만합니다. vLLM은 샘플링할 때 repetition_penalty를 적용하지만 트레이너의 로그 확률에는 반영되지 않아서, 1.05로 두었을 때 토큰당 차이가 0.06 nats였고 1.0으로 바꾸자 0.012로 줄었다고 합니다. 통합 메모리는 메모리 부족 시 깔끔하게 종료되지 않으므로 사용 가능 메모리가 5GB 아래로 계속 머물면 학습을 멈추게 해 두었습니다.

진행자 스스로도 결과를 조심해서 받아들이라고 말합니다. 모델 하나로 한 제한적인 실험이고, 최종 모델도 27B에는 아직 미치지 못합니다. 영상 중간에는 스폰서 광고 구간이 있으며, 이 글은 그 구간의 내용을 다루지 않습니다. 학습 데이터를 늘리고 다른 강화학습 기법을 더하면 27B에 닿을 수 있다는 부분은 진행자의 전망이고 검증된 결과는 아닙니다.

오늘 할 일: 과제를 네 번씩 풀려 보고 가끔 맞히는 문제만 추립니다

대회 데이터로 소형 모델을 미세조정하든, 에이전트에게 정답 파일을 쓰게 하는 과제를 설계하든, 이 실험에서 바로 가져갈 수 있는 행동은 하나입니다. 지금 쓰는 모델에게 후보 과제를 4번씩 풀게 하고, 정답 횟수를 기준으로 과제를 세 묶음으로 나누는 것입니다. 저장소의 재현 절차도 후보 1,000개를 선별해 가끔만 푸는 과제를 남기는 단계에서 학습을 시작합니다.

  1. 채점 함수를 먼저 엄격하게 씁니다. 정답 형식(이름, 숫자, 백분율, 목록)을 문항별로 정하고, 관대한 채점 결과는 따로 기록해 두 결과가 갈리는 문항을 경보로 봅니다.
  2. 후보 과제마다 4번씩 실행해 정답 횟수를 셉니다. 4번 모두 맞힌 과제와 한 번도 못 맞힌 과제는 학습 목록에서 빼고, 1~3번 맞힌 과제만 남깁니다.
  3. 한 번에 맞힌 비율과 4번 안에 맞힌 비율을 함께 적습니다. 두 값의 차이가 강화학습으로 얻을 수 있는 여지의 대략적인 크기입니다.
  4. 학습 뒤에는 문항별로 새로 맞힌 문항과 새로 틀린 문항의 수를 비교해 개선이 우연인지 확인합니다.

이 실험에서 무작위 과제 40스텝은 우연과 구분되지 않았고, 선별한 240개 과제는 우연을 넘는 개선을 만들었습니다. 여러분의 과제 목록에서 모델이 4번 중 1~3번만 맞히는 문제는 몇 개나 됩니까?

출처